PluginProbe
Polylang / 3.7.7
Polylang v3.7.7
3.8.9 3.8.8 3.8.7 3.8.6 3.8.5 3.8.4 3.8.3 2.7 2.7.0.1 2.7.1 2.7.2 2.7.3 2.7.4 2.8 2.8.1 2.8.2 2.8.3 2.8.4 2.9 2.9.1 2.9.2 3.0 3.0.1 3.0.2 3.0.3 All 233 releases
← All changes | include/olt-manager.php +40 -180 2.7.23.7.7 View file →
@@ -1,23 +1,28 @@
1 1 <?php
2 +/**
3 + * @package Polylang
4 + */
2 5
3 6 /**
4 - * It is best practice that plugins do nothing before plugins_loaded is fired
5 - * so it is what Polylang intends to do
6 - * but some plugins load their text domain as soon as loaded, thus before plugins_loaded is fired
7 - * this class differs text domain loading until the language is defined
8 - * either in a plugins_loaded action or in a wp action ( when the language is set from content on frontend )
7 + * It is best practice that plugins do nothing before `plugins_loaded` is fired.
8 + * So it is what Polylang intends to do.
9 + * But some plugins load their textdomain as soon as loaded, thus before `plugins_loaded` is fired.
10 + * This class defers textdomain loading until the language is defined either in a `plugins_loaded` action
11 + * or in a `wp` action (when the language is set from content on frontend).
9 12 *
10 13 * @since 1.2
11 14 */
12 15 class PLL_OLT_Manager {
13 - protected static $instance; // For singleton
14 - protected $default_locale;
15 - protected $list_textdomains = array(); // All text domains
16 - public $labels = array(); // Post types and taxonomies labels to translate
16 + /**
17 + * Singleton instance
18 + *
19 + * @var PLL_OLT_Manager|null
20 + */
21 + protected static $instance;
17 22
18 23 /**
19 - * Constructor: setups relevant filters
24 + * Constructor: setups relevant filters.
20 25 *
21 26 * @since 1.2
22 27 */
23 28 public function __construct() {
@@ -24,24 +29,18 @@
24 29 // Allows Polylang to be the first plugin loaded ;-)
25 30 add_filter( 'pre_update_option_active_plugins', array( $this, 'make_polylang_first' ) );
26 31 add_filter( 'pre_update_option_active_sitewide_plugins', array( $this, 'make_polylang_first' ) );
27 32
28 - // Overriding load text domain only on front since WP 4.7
29 - // FIXME test get_user_locale for backward compatibility with WP < 4.7
30 - if ( is_admin() && ! Polylang::is_ajax_on_front() && function_exists( 'get_user_locale' ) ) {
33 + // Overriding load text domain only on front since WP 4.7.
34 + if ( ( is_admin() && ! Polylang::is_ajax_on_front() ) || Polylang::is_rest_request() ) {
31 35 return;
32 36 }
33 37
34 - // Saves the default locale before we start any language manipulation
35 - $this->default_locale = get_locale();
38 + // Filters for text domain management.
39 + add_filter( 'load_textdomain_mofile', '__return_empty_string' );
36 40
37 - // Filters for text domain management
38 - add_filter( 'load_textdomain_mofile', array( $this, 'load_textdomain_mofile' ), 10, 2 );
39 - add_filter( 'gettext', array( $this, 'gettext' ), 10, 3 );
40 - add_filter( 'gettext_with_context', array( $this, 'gettext_with_context' ), 10, 4 );
41 -
42 - // Loads text domains
43 - add_action( 'pll_language_defined', array( $this, 'load_textdomains' ), 2 ); // After PLL_Frontend::pll_language_defined
41 + // Loads text domains.
42 + add_action( 'pll_language_defined', array( $this, 'load_textdomains' ), 2 ); // After PLL_Frontend::pll_language_defined.
44 43 add_action( 'pll_no_language_defined', array( $this, 'load_textdomains' ) );
45 44 }
46 45
47 46 /**
@@ -48,9 +47,9 @@
48 47 * Access to the single instance of the class
49 48 *
50 49 * @since 1.7
51 50 *
52 - * @return object
51 + * @return PLL_OLT_Manager
53 52 */
54 53 public static function instance() {
55 54 if ( empty( self::$instance ) ) {
56 55 self::$instance = new self();
@@ -59,184 +58,45 @@
59 58 return self::$instance;
60 59 }
61 60
62 61 /**
63 - * Loads text domains
62 + * Loads textdomains.
64 63 *
65 64 * @since 0.1
65 + *
66 + * @return void
66 67 */
67 68 public function load_textdomains() {
68 - // Our load_textdomain_mofile filter has done its job. let's remove it before calling load_textdomain
69 - remove_filter( 'load_textdomain_mofile', array( $this, 'load_textdomain_mofile' ), 10, 2 );
70 - remove_filter( 'gettext', array( $this, 'gettext' ), 10, 3 );
71 - remove_filter( 'gettext_with_context', array( $this, 'gettext_with_context' ), 10, 4 );
72 - $new_locale = get_locale();
69 + // Our load_textdomain_mofile filter has done its job. let's remove it to enable translation.
70 + remove_filter( 'load_textdomain_mofile', '__return_empty_string' );
73 71
74 - // Don't try to save time for en_US as some users have theme written in another language
75 - // Now we can load all overridden text domains with the right language
76 - if ( ! empty( $this->list_textdomains ) ) {
72 + $GLOBALS['l10n'] = array();
73 + $new_locale = get_locale();
77 74
78 - // Since WP 4.7 we need to reset the internal cache of _get_path_to_translation when switching from any locale to en_US
79 - // See WP_Locale_Switcher::change_locale()
80 - // FIXME test _get_path_to_translation for backward compatibility with WP < 4.7
81 - if ( function_exists( '_get_path_to_translation' ) ) {
82 - _get_path_to_translation( null, true );
83 - }
75 + load_default_textdomain( $new_locale );
84 76
85 - foreach ( $this->list_textdomains as $textdomain ) {
86 - // Since WP 4.6, plugins translations are first loaded from wp-content/languages
87 - if ( ! load_textdomain( $textdomain['domain'], str_replace( "{$this->default_locale}.mo", "$new_locale.mo", $textdomain['mo'] ) ) ) {
88 - // Since WP 3.5 themes may store languages files in /wp-content/languages/themes
89 - if ( ! load_textdomain( $textdomain['domain'], WP_LANG_DIR . "/themes/{$textdomain['domain']}-$new_locale.mo" ) ) {
90 - // Since WP 3.7 plugins may store languages files in /wp-content/languages/plugins
91 - load_textdomain( $textdomain['domain'], WP_LANG_DIR . "/plugins/{$textdomain['domain']}-$new_locale.mo" );
92 - }
93 - }
94 - }
95 - }
96 -
97 - // First remove taxonomies and post_types labels that we don't need to translate
98 - $taxonomies = get_taxonomies( array( '_pll' => true ) );
99 - $post_types = get_post_types( array( '_pll' => true ) );
100 -
101 - // We don't need to translate core taxonomies and post types labels when setting the language from the url
102 - // As they will be translated when registered the second time
103 - if ( ! did_action( 'setup_theme' ) ) {
104 - $taxonomies = array_merge( get_taxonomies( array( '_builtin' => true ) ), $taxonomies );
105 - $post_types = array_merge( get_post_types( array( '_builtin' => true ) ), $post_types );
106 - }
107 -
108 - // Translate labels of post types and taxonomies
109 - foreach ( array_diff_key( $GLOBALS['wp_taxonomies'], array_flip( $taxonomies ) ) as $tax ) {
110 - $this->translate_labels( $tax );
111 - }
112 - foreach ( array_diff_key( $GLOBALS['wp_post_types'], array_flip( $post_types ) ) as $pt ) {
113 - $this->translate_labels( $pt );
114 - }
115 -
116 - // Act only if the language has not been set early ( before default textdomain loading and $wp_locale creation )
117 - if ( did_action( 'after_setup_theme' ) ) {
118 - // Reinitializes wp_locale for weekdays and months
77 + // Act only if the language has not been set early (before default textdomain loading and $wp_locale creation).
78 + if ( ! empty( $GLOBALS['wp_locale'] ) ) {
79 + // Reinitializes wp_locale for weekdays and months.
119 80 unset( $GLOBALS['wp_locale'] );
120 81 $GLOBALS['wp_locale'] = new WP_Locale();
121 82 }
122 83
123 - /**
124 - * Fires after the post types and taxonomies labels have been translated
125 - * This allows plugins to translate text the same way we do for post types and taxonomies labels
126 - *
127 - * @since 1.2
128 - *
129 - * @param array $labels list of strings to trnaslate
130 - */
131 - do_action_ref_array( 'pll_translate_labels', array( &$this->labels ) );
132 -
133 - // Free memory
134 - unset( $this->default_locale, $this->list_textdomains, $this->labels );
135 - }
136 -
137 - /**
138 - * FIXME: Backward compatibility with Polylang for WooCommerce < 0.3.4
139 - * To remove in Polylang 2.1
140 - *
141 - * @since 0.1
142 - *
143 - * @param bool $bool not used
144 - * @param string $domain text domain name
145 - * @param string $mofile translation file name
146 - * @return bool
147 - */
148 - public function mofile( $bool, $domain, $mofile ) {
149 - return $bool;
150 - }
151 -
152 - /**
153 - * Saves all text domains in a table for later usage
154 - * It replaces the 'override_load_textdomain' filter used since 0.1
155 - *
156 - * @since 2.0.4
157 - *
158 - * @param string $mofile translation file name
159 - * @param string $domain text domain name
160 - * @return bool
161 - */
162 - public function load_textdomain_mofile( $mofile, $domain ) {
163 - // On multisite, 2 files are sharing the same domain so we need to distinguish them
164 - if ( 'default' === $domain && false !== strpos( $mofile, '/ms-' ) ) {
165 - $this->list_textdomains['ms-default'] = array( 'mo' => $mofile, 'domain' => $domain );
166 - } else {
167 - $this->list_textdomains[ $domain ] = array( 'mo' => $mofile, 'domain' => $domain );
84 + if ( ! empty( $GLOBALS['wp_locale_switcher'] ) ) {
85 + /** This action is documented in wp-includes/class-wp-locale-switcher.php */
86 + do_action( 'change_locale', $new_locale );
168 87 }
169 - return ''; // Hack to prevent WP loading text domains as we will load them all later
170 - }
171 88
172 - /**
173 - * Saves post types and taxonomies labels for a later usage
174 - *
175 - * @since 0.9
176 - *
177 - * @param string $translation not used
178 - * @param string $text string to translate
179 - * @param string $domain text domain
180 - * @return string unmodified $translation
181 - */
182 - public function gettext( $translation, $text, $domain ) {
183 - if ( is_string( $text ) ) { // Avoid a warning with some buggy plugins which pass an array
184 - $this->labels[ $text ] = array( 'domain' => $domain );
185 - }
186 - return $translation;
89 + do_action_deprecated( 'pll_translate_labels', array(), '3.7', 'change_locale' );
187 90 }
188 91
189 92 /**
190 - * Saves post types and taxonomies labels for a later usage
93 + * Allows Polylang to be the first plugin loaded ;-).
191 94 *
192 - * @since 0.9
193 - *
194 - * @param string $translation not used
195 - * @param string $text string to translate
196 - * @param string $context some comment to describe the context of string to translate
197 - * @param string $domain text domain
198 - * @return string unmodified $translation
199 - */
200 - public function gettext_with_context( $translation, $text, $context, $domain ) {
201 - $this->labels[ $text ] = array( 'domain' => $domain, 'context' => $context );
202 - return $translation;
203 - }
204 -
205 - /**
206 - * Translates post types and taxonomies labels once the language is known
207 - *
208 - * @since 0.9
209 - *
210 - * @param object $type either a post type or a taxonomy
211 - */
212 - public function translate_labels( $type ) {
213 - // Use static array to avoid translating several times the same ( default ) labels
214 - static $translated = array();
215 -
216 - foreach ( $type->labels as $key => $label ) {
217 - if ( is_string( $label ) && isset( $this->labels[ $label ] ) ) {
218 - if ( empty( $translated[ $label ] ) ) {
219 - // PHPCS:disable WordPress.WP.I18n
220 - $type->labels->$key = $translated[ $label ] = isset( $this->labels[ $label ]['context'] ) ?
221 - _x( $label, $this->labels[ $label ]['context'], $this->labels[ $label ]['domain'] ) :
222 - __( $label, $this->labels[ $label ]['domain'] );
223 - // PHPCS:enable
224 - }
225 - else {
226 - $type->labels->$key = $translated[ $label ];
227 - }
228 - }
229 - }
230 - }
231 -
232 - /**
233 - * Allows Polylang to be the first plugin loaded ;- )
234 - *
235 95 * @since 1.2
236 96 *
237 - * @param array $plugins list of active plugins
238 - * @return array list of active plugins
97 + * @param string[] $plugins List of active plugins.
98 + * @return string[] List of active plugins.
239 99 */
240 100 public function make_polylang_first( $plugins ) {
241 101 if ( $key = array_search( POLYLANG_BASENAME, $plugins ) ) {
242 102 unset( $plugins[ $key ] );