* @since 1.45.0 */ namespace AdvancedAds\Admin; defined( 'ABSPATH' ) || exit; /** * This class defines a promo box and checks your translation site's API for stats about it. * * @copyright Yoast i18n https://github.com/Yoast/i18n-module * * phpcs:disable WordPress.WP.I18n.NonSingularStringLiteralDomain */ class Translation_Promo { /** * Your translation site's logo. * * @var string */ private $glotpress_logo; /** * Your translation site's name. * * @var string */ private $glotpress_name; /** * Your translation site's URL. * * @var string */ private $glotpress_url; /** * The URL to actually do the API request to. * * @var string */ private $api_url; /** * Hook where you want to show the promo box. * * @var string */ private $hook; /** * Will contain the site's locale. * * @access private * @var string */ private $locale; /** * Will contain the locale's name, obtained from your translation site. * * @access private * @var string */ private $locale_name; /** * Will contain the percentage translated for the plugin translation project in the locale. * * @access private * @var int */ private $percent_translated; /** * Name of your plugin. * * @var string */ private $plugin_name; /** * Project slug for the project on your translation site. * * @var string */ private $project_slug; /** * URL to point to for registration links. * * @var string */ private $register_url; /** * Your plugins textdomain. * * @var string */ private $textdomain; /** * Indicates whether there's a translation available at all. * * @access private * @var bool */ private $translation_exists; /** * Indicates whether the translation's loaded. * * @access private * @var bool */ private $translation_loaded; /** * Constructs the i18n module for wordpress.org. * * Required fields are the 'textdomain', 'plugin_name' and 'hook'. * * @param array $args The settings for the i18n module. * @param bool $show_translation_box Whether the translation box should be shown. */ public function __construct( $args, $show_translation_box = true ) { if ( ! is_admin() ) { return; } $args = $this->set_defaults( $args ); $this->locale = $this->get_admin_locale(); if ( $this->is_default_language( $this->locale ) ) { return; } $this->init( $args ); if ( $show_translation_box ) { add_action( $this->hook, [ $this, 'promo' ] ); } $this->set_api_url( $args['textdomain'] ); } /** * Returns whether the language is en_US. * * @param string $language The language to check. * * @return bool Returns true if the language is en_US. */ protected function is_default_language( $language ) { return 'en_US' === $language; } /** * Returns the locale used in the admin. * * WordPress 4.7 introduced the ability for users to specify an Admin language * different from the language used on the front end. This checks if the feature * is available and returns the user's language, with a fallback to the site's language. * Can be removed when support for WordPress 4.6 will be dropped, in favor * of WordPress get_user_locale() that already fallbacks to the site’s locale. * * @returns string The locale. */ private function get_admin_locale() { if ( function_exists( 'get_user_locale' ) ) { return get_user_locale(); } return get_locale(); } /** * This is where you decide where to display the messages and where you set the plugin specific variables. * * @access private * * @param array $args Contains the settings for the class. */ private function init( $args ) { foreach ( $args as $key => $arg ) { $this->$key = $arg; } } /** * Check whether the promo should be hidden or not. * * @access private * * @return bool */ private function hide_promo() { $hide_promo = get_transient( 'yoast_i18n_' . $this->project_slug . '_promo_hide' ); if ( ! $hide_promo ) { if ( filter_input( INPUT_GET, 'remove_i18n_promo', FILTER_VALIDATE_INT ) === 1 ) { // No expiration time, so this would normally not expire, but it wouldn't be copied to other sites etc. set_transient( 'yoast_i18n_' . $this->project_slug . '_promo_hide', true ); $hide_promo = true; } } return $hide_promo; } /** * Returns the i18n_promo message from the i18n_module. Returns en empty string if the promo shouldn't be shown. * * @access public * * @return string The i18n promo message. */ public function get_promo_message() { if ( ! $this->is_default_language( $this->locale ) && ! $this->hide_promo() ) { return $this->promo_message(); } return ''; } /** * Generates a promo message. * * @access private * * @return bool|string $message */ private function promo_message() { $this->translation_details(); $message = false; if ( $this->translation_exists && $this->translation_loaded && $this->percent_translated < 90 ) { /* translators: 1: language name; 3: completion percentage; 4: link to translation platform. */ $message = __( 'As you can see, there is a translation of this plugin in %1$s. This translation is currently %3$d%% complete. We need your help to make it complete and to fix any errors. Please register at %4$s to help complete the translation to %1$s!', $this->textdomain ); } elseif ( ! $this->translation_loaded && $this->translation_exists ) { /* translators: 1: language name; 2: plugin name; 3: completion percentage; 4: link to translation platform. */ $message = __( 'You\'re using WordPress in %1$s. While %2$s has been translated to %1$s for %3$d%%, it\'s not been shipped with the plugin yet. You can help! Register at %4$s to help complete the translation to %1$s!', $this->textdomain ); } elseif ( ! $this->translation_exists ) { /* translators: 2: plugin name; 4: link to translation platform. */ $message = __( 'You\'re using WordPress in a language we don\'t support yet. We\'d love for %2$s to be translated in that language too, but unfortunately, it isn\'t right now. You can change that! Register at %4$s to help translate it!', $this->textdomain ); } $registration_link = sprintf( '%2$s', esc_url( $this->register_url ), esc_html( $this->glotpress_name ) ); $message = sprintf( esc_html( $message ), esc_html( $this->locale_name ), esc_html( $this->plugin_name ), (int) $this->percent_translated, $registration_link ); if ( $message ) { $message = '
' . $message . '
' . esc_html__( 'Register now »', $this->textdomain ) . '
'; } return $message; } /** * Returns a button that can be used to dismiss the i18n-message. * * @access private * * @return string */ public function get_dismiss_i18n_message_button() { return sprintf( /* translators: %1$s is the notification dismissal link start tag, %2$s is the link closing tag. */ esc_html__( '%1$sPlease don\'t show me this notification anymore%2$s', $this->textdomain ), '', '' ); } /** * Sets the default values for wordpress.org * * @param array $args The arguments to set defaults for. * * @return array The arguments with the arguments set. */ private function set_defaults( $args ) { if ( ! isset( $args['glotpress_logo'] ) ) { $args['glotpress_logo'] = 'https://plugins.svn.wordpress.org/' . $args['textdomain'] . '/assets/icon-128x128.png'; } if ( ! isset( $args['register_url'] ) ) { $args['register_url'] = 'https://translate.wordpress.org/projects/wp-plugins/' . $args['textdomain'] . '/'; } if ( ! isset( $args['glotpress_name'] ) ) { $args['glotpress_name'] = 'Translating WordPress'; } if ( ! isset( $args['project_slug'] ) ) { $args['project_slug'] = $args['textdomain']; } return $args; } /** * Outputs a promo box. * * @access public */ public function promo() { $message = $this->get_promo_message(); if ( $message ) { echo '