Diff: STRATO-apps/wordpress_03/app/wp-includes/class-wp-locale-switcher.php
Keine Baseline-Datei – Diff nur gegen leer.
1
-
1
+
<?php
2
+
/**
3
+
* Locale API: WP_Locale_Switcher class
4
+
*
5
+
* @package WordPress
6
+
* @subpackage i18n
7
+
* @since 4.7.0
8
+
*/
9
+
10
+
/**
11
+
* Core class used for switching locales.
12
+
*
13
+
* @since 4.7.0
14
+
*/
15
+
#[AllowDynamicProperties]
16
+
class WP_Locale_Switcher {
17
+
/**
18
+
* Locale switching stack.
19
+
*
20
+
* @since 6.2.0
21
+
* @var array
22
+
*/
23
+
private $stack = array();
24
+
25
+
/**
26
+
* Original locale.
27
+
*
28
+
* @since 4.7.0
29
+
* @var string
30
+
*/
31
+
private $original_locale;
32
+
33
+
/**
34
+
* Holds all available languages.
35
+
*
36
+
* @since 4.7.0
37
+
* @var string[] An array of language codes (file names without the .mo extension).
38
+
*/
39
+
private $available_languages;
40
+
41
+
/**
42
+
* Constructor.
43
+
*
44
+
* Stores the original locale as well as a list of all available languages.
45
+
*
46
+
* @since 4.7.0
47
+
*/
48
+
public function __construct() {
49
+
$this->original_locale = determine_locale();
50
+
$this->available_languages = array_merge( array( 'en_US' ), get_available_languages() );
51
+
}
52
+
53
+
/**
54
+
* Initializes the locale switcher.
55
+
*
56
+
* Hooks into the {@see 'locale'} and {@see 'determine_locale'} filters
57
+
* to change the locale on the fly.
58
+
*
59
+
* @since 4.7.0
60
+
*/
61
+
public function init() {
62
+
add_filter( 'locale', array( $this, 'filter_locale' ) );
63
+
add_filter( 'determine_locale', array( $this, 'filter_locale' ) );
64
+
}
65
+
66
+
/**
67
+
* Switches the translations according to the given locale.
68
+
*
69
+
* @since 4.7.0
70
+
*
71
+
* @param string $locale The locale to switch to.
72
+
* @param int|false $user_id Optional. User ID as context. Default false.
73
+
* @return bool True on success, false on failure.
74
+
*/
75
+
public function switch_to_locale( $locale, $user_id = false ) {
76
+
$current_locale = determine_locale();
77
+
if ( $current_locale === $locale ) {
78
+
return false;
79
+
}
80
+
81
+
if ( ! in_array( $locale, $this->available_languages, true ) ) {
82
+
return false;
83
+
}
84
+
85
+
$this->stack[] = array( $locale, $user_id );
86
+
87
+
$this->change_locale( $locale );
88
+
89
+
/**
90
+
* Fires when the locale is switched.
91
+
*
92
+
* @since 4.7.0
93
+
* @since 6.2.0 The `$user_id` parameter was added.
94
+
*
95
+
* @param string $locale The new locale.
96
+
* @param false|int $user_id User ID for context if available.
97
+
*/
98
+
do_action( 'switch_locale', $locale, $user_id );
99
+
100
+
return true;
101
+
}
102
+
103
+
/**
104
+
* Switches the translations according to the given user's locale.
105
+
*
106
+
* @since 6.2.0
107
+
*
108
+
* @param int $user_id User ID.
109
+
* @return bool True on success, false on failure.
110
+
*/
111
+
public function switch_to_user_locale( $user_id ) {
112
+
$locale = get_user_locale( $user_id );
113
+
return $this->switch_to_locale( $locale, $user_id );
114
+
}
115
+
116
+
/**
117
+
* Restores the translations according to the previous locale.
118
+
*
119
+
* @since 4.7.0
120
+
*
121
+
* @return string|false Locale on success, false on failure.
122
+
*/
123
+
public function restore_previous_locale() {
124
+
$previous_locale = array_pop( $this->stack );
125
+
126
+
if ( null === $previous_locale ) {
127
+
// The stack is empty, bail.
128
+
return false;
129
+
}
130
+
131
+
$entry = end( $this->stack );
132
+
$locale = is_array( $entry ) ? $entry[0] : false;
133
+
134
+
if ( ! $locale ) {
135
+
// There's nothing left in the stack: go back to the original locale.
136
+
$locale = $this->original_locale;
137
+
}
138
+
139
+
$this->change_locale( $locale );
140
+
141
+
/**
142
+
* Fires when the locale is restored to the previous one.
143
+
*
144
+
* @since 4.7.0
145
+
*
146
+
* @param string $locale The new locale.
147
+
* @param string $previous_locale The previous locale.
148
+
*/
149
+
do_action( 'restore_previous_locale', $locale, $previous_locale[0] );
150
+
151
+
return $locale;
152
+
}
153
+
154
+
/**
155
+
* Restores the translations according to the original locale.
156
+
*
157
+
* @since 4.7.0
158
+
*
159
+
* @return string|false Locale on success, false on failure.
160
+
*/
161
+
public function restore_current_locale() {
162
+
if ( empty( $this->stack ) ) {
163
+
return false;
164
+
}
165
+
166
+
$this->stack = array( array( $this->original_locale, false ) );
167
+
168
+
return $this->restore_previous_locale();
169
+
}
170
+
171
+
/**
172
+
* Whether switch_to_locale() is in effect.
173
+
*
174
+
* @since 4.7.0
175
+
*
176
+
* @return bool True if the locale has been switched, false otherwise.
177
+
*/
178
+
public function is_switched() {
179
+
return ! empty( $this->stack );
180
+
}
181
+
182
+
/**
183
+
* Returns the locale currently switched to.
184
+
*
185
+
* @since 6.2.0
186
+
*
187
+
* @return string|false Locale if the locale has been switched, false otherwise.
188
+
*/
189
+
public function get_switched_locale() {
190
+
$entry = end( $this->stack );
191
+
192
+
if ( $entry ) {
193
+
return $entry[0];
194
+
}
195
+
196
+
return false;
197
+
}
198
+
199
+
/**
200
+
* Returns the user ID related to the currently switched locale.
201
+
*
202
+
* @since 6.2.0
203
+
*
204
+
* @return int|false User ID if set and if the locale has been switched, false otherwise.
205
+
*/
206
+
public function get_switched_user_id() {
207
+
$entry = end( $this->stack );
208
+
209
+
if ( $entry ) {
210
+
return $entry[1];
211
+
}
212
+
213
+
return false;
214
+
}
215
+
216
+
/**
217
+
* Filters the locale of the WordPress installation.
218
+
*
219
+
* @since 4.7.0
220
+
*
221
+
* @param string $locale The locale of the WordPress installation.
222
+
* @return string The locale currently being switched to.
223
+
*/
224
+
public function filter_locale( $locale ) {
225
+
$switched_locale = $this->get_switched_locale();
226
+
227
+
if ( $switched_locale ) {
228
+
return $switched_locale;
229
+
}
230
+
231
+
return $locale;
232
+
}
233
+
234
+
/**
235
+
* Load translations for a given locale.
236
+
*
237
+
* When switching to a locale, translations for this locale must be loaded from scratch.
238
+
*
239
+
* @since 4.7.0
240
+
*
241
+
* @global Mo[] $l10n An array of all currently loaded text domains.
242
+
*
243
+
* @param string $locale The locale to load translations for.
244
+
*/
245
+
private function load_translations( $locale ) {
246
+
global $l10n;
247
+
248
+
$domains = $l10n ? array_keys( $l10n ) : array();
249
+
250
+
load_default_textdomain( $locale );
251
+
252
+
foreach ( $domains as $domain ) {
253
+
// The default text domain is handled by `load_default_textdomain()`.
254
+
if ( 'default' === $domain ) {
255
+
continue;
256
+
}
257
+
258
+
/*
259
+
* Unload current text domain but allow them to be reloaded
260
+
* after switching back or to another locale.
261
+
*/
262
+
unload_textdomain( $domain, true );
263
+
get_translations_for_domain( $domain );
264
+
}
265
+
}
266
+
267
+
/**
268
+
* Changes the site's locale to the given one.
269
+
*
270
+
* Loads the translations, changes the global `$wp_locale` object and updates
271
+
* all post type labels.
272
+
*
273
+
* @since 4.7.0
274
+
*
275
+
* @global WP_Locale $wp_locale WordPress date and time locale object.
276
+
* @global PHPMailer\PHPMailer\PHPMailer $phpmailer
277
+
*
278
+
* @param string $locale The locale to change to.
279
+
*/
280
+
private function change_locale( $locale ) {
281
+
global $wp_locale, $phpmailer;
282
+
283
+
$this->load_translations( $locale );
284
+
285
+
$wp_locale = new WP_Locale();
286
+
287
+
WP_Translation_Controller::get_instance()->set_locale( $locale );
288
+
289
+
if ( $phpmailer instanceof WP_PHPMailer ) {
290
+
$phpmailer->setLanguage();
291
+
}
292
+
293
+
/**
294
+
* Fires when the locale is switched to or restored.
295
+
*
296
+
* @since 4.7.0
297
+
*
298
+
* @param string $locale The new locale.
299
+
*/
300
+
do_action( 'change_locale', $locale );
301
+
}
302
+
}
303
+