<?php
/**
* @package Polylang
*/
/**
* It is best practice that plugins do nothing before `plugins_loaded` is fired.
* So it is what Polylang intends to do.
* But some plugins load their textdomain as soon as loaded, thus before `plugins_loaded` is fired.
* This class defers textdomain loading until the language is defined either in a `plugins_loaded` action
* or in a `wp` action (when the language is set from content on frontend).
*
* @since 1.2
*/
class PLL_OLT_Manager {
/**
* Singleton instance
*
* @var PLL_OLT_Manager|null
*/
protected static $instance;
/**
* Constructor: setups relevant filters.
*
* @since 1.2
*/
public function __construct() {
// Allows Polylang to be the first plugin loaded ;-)
add_filter( 'pre_update_option_active_plugins', array( $this, 'make_polylang_first' ) );
add_filter( 'pre_update_option_active_sitewide_plugins', array( $this, 'make_polylang_first' ) );
// Overriding load text domain only on front since WP 4.7.
if ( ( is_admin() && ! Polylang::is_ajax_on_front() ) || Polylang::is_rest_request() ) {
return;
}
// Filters for text domain management.
add_filter( 'load_textdomain_mofile', '__return_empty_string' );
// 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 PLL_OLT_Manager
*/
public static function instance() {
if ( empty( self::$instance ) ) {
self::$instance = new self();
}
return self::$instance;
}
/**
* Loads textdomains.
*
* @since 0.1
*
* @return void
*/
public function load_textdomains() {
// Our load_textdomain_mofile filter has done its job. let's remove it to enable translation.
remove_filter( 'load_textdomain_mofile', '__return_empty_string' );
$GLOBALS['l10n'] = array();
$new_locale = get_locale();
load_default_textdomain( $new_locale );
// Act only if the language has not been set early (before default textdomain loading and $wp_locale creation).
if ( ! empty( $GLOBALS['wp_locale'] ) ) {
// Reinitializes wp_locale for weekdays and months.
unset( $GLOBALS['wp_locale'] );
$GLOBALS['wp_locale'] = new WP_Locale();
}
if ( ! empty( $GLOBALS['wp_locale_switcher'] ) ) {
/** This action is documented in wp-includes/class-wp-locale-switcher.php */
do_action( 'change_locale', $new_locale );
}
do_action_deprecated( 'pll_translate_labels', array(), '3.7', 'change_locale' );
}
/**
* Allows Polylang to be the first plugin loaded ;-).
*
* @since 1.2
*
* @param string[] $plugins List of active plugins.
* @return string[] 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;
}
}