PluginProbe
Polylang / 3.0.5
Polylang v3.0.5
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
polylang / include / language.php

language.php in Polylang 3.0.5, at include/language.php

485 lines 11.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * @package Polylang
4 */
5
6 /**
7 * A language object is made of two terms in 'language' and 'term_language' taxonomies.
8 * Manipulating only one object per language instead of two terms should make things easier.
9 *
10 * @since 1.2
11 */
12 class PLL_Language {
13 /**
14 * Id of the term in 'language' taxonomy.
15 *
16 * @var int
17 */
18 public $term_id;
19
20 /**
21 * Language name. Ex: English.
22 *
23 * @var string
24 */
25 public $name;
26
27 /**
28 * Language code used in url. Ex: en.
29 *
30 * @var string
31 */
32 public $slug;
33
34 /**
35 * Order of the language when displayed in a list of languages.
36 *
37 * @var int
38 */
39 public $term_group;
40
41 /**
42 * Term taxonomy id in 'language' taxonomy.
43 *
44 * @var int
45 */
46 public $term_taxonomy_id;
47
48 /**
49 * Number of posts and pages in that language.
50 *
51 * @var int
52 */
53 public $count;
54
55 /**
56 * Id of the term in 'term_language' taxonomy.
57 *
58 * @var int
59 */
60 public $tl_term_id;
61
62 /**
63 * Term taxonomy id in 'term_language' taxonomy.
64 *
65 * @var int
66 */
67 public $tl_term_taxonomy_id;
68
69 /**
70 * Number of terms in that language.
71 *
72 * @var int
73 */
74 public $tl_count;
75
76 /**
77 * WordPress language locale. Ex: en_US.
78 *
79 * @var string
80 */
81 public $locale;
82
83 /**
84 * 1 if the language is rtl, 0 otherwise.
85 *
86 * @var int
87 */
88 public $is_rtl;
89
90 /**
91 * W3C locale.
92 *
93 * @var string.
94 */
95 public $w3c;
96
97 /**
98 * Facebook locale.
99 *
100 * @var string.
101 */
102 public $facebook;
103
104 /**
105 * Home url in this language.
106 *
107 * @var string
108 */
109 public $home_url;
110
111 /**
112 * Home url to use in search forms.
113 *
114 * @var string
115 */
116 public $search_url;
117
118 /**
119 * Host corresponding to this language.
120 *
121 * @var string
122 */
123 public $host;
124
125 /**
126 * Id of the post storing strings translations.
127 *
128 * @var int
129 */
130 public $mo_id;
131
132 /**
133 * Id of the page on front in this language ( set from pll_languages_list filter ).
134 *
135 * @var int
136 */
137 public $page_on_front;
138
139 /**
140 * Id of the page for posts in this language ( set from pll_languages_list filter ).
141 *
142 * @var int
143 */
144 public $page_for_posts;
145
146 /**
147 * Code of the flag.
148 *
149 * @var string
150 */
151 public $flag_code;
152
153 /**
154 * Url of the flag.
155 *
156 * @var string
157 */
158 public $flag_url;
159
160 /**
161 * Html markup of the flag.
162 *
163 * @var string
164 */
165 public $flag;
166
167 /**
168 * Url of the custom flag if it exists.
169 *
170 * @var string
171 */
172 public $custom_flag_url;
173
174 /**
175 * Html markup of the custom flag if it exists.
176 *
177 * @var string
178 */
179 public $custom_flag;
180
181 /**
182 * Constructor: builds a language object given its two corresponding terms in 'language' and 'term_language' taxonomies.
183 *
184 * @since 1.2
185 *
186 * @param WP_Term|array $language Term in 'language' taxonomy or language object properties stored as an array.
187 * @param WP_Term $term_language Corresponding 'term_language' term.
188 */
189 public function __construct( $language, $term_language = null ) {
190 if ( empty( $term_language ) ) {
191 // Build the object from all properties stored as an array.
192 foreach ( $language as $prop => $value ) {
193 $this->$prop = $value;
194 }
195 } else {
196 // Build the object from taxonomy terms.
197 $this->term_id = (int) $language->term_id;
198 $this->name = $language->name;
199 $this->slug = $language->slug;
200 $this->term_group = (int) $language->term_group;
201 $this->term_taxonomy_id = (int) $language->term_taxonomy_id;
202 $this->count = (int) $language->count;
203
204 $this->tl_term_id = (int) $term_language->term_id;
205 $this->tl_term_taxonomy_id = (int) $term_language->term_taxonomy_id;
206 $this->tl_count = (int) $term_language->count;
207
208 // The description field can contain any property.
209 $description = maybe_unserialize( $language->description );
210 foreach ( $description as $prop => $value ) {
211 'rtl' == $prop ? $this->is_rtl = $value : $this->$prop = $value;
212 }
213
214 $this->mo_id = PLL_MO::get_id( $this );
215
216 $languages = include POLYLANG_DIR . '/settings/languages.php';
217 $this->w3c = isset( $languages[ $this->locale ]['w3c'] ) ? $languages[ $this->locale ]['w3c'] : str_replace( '_', '-', $this->locale );
218 if ( isset( $languages[ $this->locale ]['facebook'] ) ) {
219 $this->facebook = $languages[ $this->locale ]['facebook'];
220 }
221 }
222 }
223
224 /**
225 * Get the flag informations:
226 *
227 * @since 2.6
228 *
229 * @param string $code Flag code.
230 * @return array {
231 * Flag informations.
232 *
233 * @type string $url Flag url.
234 * @type string $src Optional, src attribute value if different of the url, for example if base64 encoded.
235 * @type int $width Optional, flag width in pixels.
236 * @type int $height Optional, flag height in pixels.
237 * }
238 */
239 public static function get_flag_informations( $code ) {
240 $flag = array( 'url' => '' );
241
242 // Polylang builtin flags.
243 if ( ! empty( $code ) && file_exists( POLYLANG_DIR . ( $file = '/flags/' . $code . '.png' ) ) ) {
244 $flag['url'] = plugins_url( $file, POLYLANG_FILE );
245
246 // If base64 encoded flags are preferred.
247 if ( ! defined( 'PLL_ENCODED_FLAGS' ) || PLL_ENCODED_FLAGS ) {
248 list( $flag['width'], $flag['height'] ) = getimagesize( POLYLANG_DIR . $file );
249 $file_contents = file_get_contents( POLYLANG_DIR . $file ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents
250 $flag['src'] = 'data:image/png;base64,' . base64_encode( $file_contents ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode
251 }
252 }
253
254 /**
255 * Filters flag informations:
256 *
257 * @since 2.4
258 *
259 * @param array $flag {
260 * Information about the flag.
261 *
262 * @type string $url Flag url.
263 * @type string $src Optional, src attribute value if different of the url, for example if base64 encoded.
264 * @type int $width Optional, flag width in pixels.
265 * @type int $height Optional, flag height in pixels.
266 * }
267 * @param string $code Flag code.
268 */
269 $flag = apply_filters( 'pll_flag', $flag, $code );
270
271 $flag['url'] = esc_url_raw( $flag['url'] );
272
273 if ( empty( $flag['src'] ) ) {
274 $flag['src'] = esc_url( set_url_scheme( $flag['url'], 'relative' ) );
275 }
276
277 return $flag;
278 }
279
280 /**
281 * Sets flag_url and flag properties.
282 *
283 * @since 1.2
284 *
285 * @return void
286 */
287 public function set_flag() {
288 $flags = array( 'flag' => self::get_flag_informations( $this->flag_code ) );
289
290 // Custom flags?
291 $directories = array(
292 PLL_LOCAL_DIR,
293 get_stylesheet_directory() . '/polylang',
294 get_template_directory() . '/polylang',
295 );
296
297 foreach ( $directories as $dir ) {
298 if ( file_exists( $file = "{$dir}/{$this->locale}.png" ) || file_exists( $file = "{$dir}/{$this->locale}.jpg" ) || file_exists( $file = "{$dir}/{$this->locale}.svg" ) ) {
299 $flags['custom_flag']['url'] = content_url( '/' . str_replace( WP_CONTENT_DIR, '', $file ) );
300 break;
301 }
302 }
303
304 /**
305 * Filters the custom flag informations.
306 *
307 * @param array $flag {
308 * Information about the custom flag.
309 *
310 * @type string $url Flag url.
311 * @type string $src Optional, src attribute value if different of the url, for example if base64 encoded.
312 * @type int $width Optional, flag width in pixels.
313 * @type int $height Optional, flag height in pixels.
314 * }
315 * @param string $code Flag code.
316 *
317 * @since 2.4
318 */
319 $flags['custom_flag'] = apply_filters( 'pll_custom_flag', empty( $flags['custom_flag'] ) ? null : $flags['custom_flag'], $this->flag_code );
320
321 if ( ! empty( $flags['custom_flag']['url'] ) ) {
322 if ( empty( $flags['custom_flag']['src'] ) ) {
323 $flags['custom_flag']['src'] = esc_url( set_url_scheme( $flags['custom_flag']['url'], 'relative' ) );
324 }
325
326 $flags['custom_flag']['url'] = esc_url_raw( $flags['custom_flag']['url'] );
327 } else {
328 unset( $flags['custom_flag'] );
329 }
330
331 /**
332 * Filters the flag title attribute.
333 * Defaults to the language name.
334 *
335 * @since 0.7
336 *
337 * @param string $title The flag title attribute.
338 * @param string $slug The language code.
339 * @param string $locale The language locale.
340 */
341 $title = apply_filters( 'pll_flag_title', $this->name, $this->slug, $this->locale );
342
343 foreach ( $flags as $key => $flag ) {
344 $this->{$key . '_url'} = empty( $flag['url'] ) ? '' : $flag['url'];
345
346 /**
347 * Filters the html markup of a flag.
348 *
349 * @since 1.0.2
350 *
351 * @param string $flag Html markup of the flag or empty string.
352 * @param string $slug Language code.
353 */
354 $this->{$key} = apply_filters(
355 'pll_get_flag',
356 self::get_flag_html( $flag, $title, $this->name ),
357 $this->slug
358 );
359 }
360 }
361
362 /**
363 * Get HTML code for flag.
364 *
365 * @since 2.7
366 *
367 * @param array $flag Flag properties: src, width and height.
368 * @param string $title Optional title attribute.
369 * @param string $alt Optional alt attribute.
370 * @return string
371 */
372 public static function get_flag_html( $flag, $title = '', $alt = '' ) {
373 if ( empty( $flag['src'] ) ) {
374 return '';
375 }
376
377 $alt_attr = empty( $alt ) ? '' : sprintf( ' alt="%s"', esc_attr( $alt ) );
378 $width_attr = empty( $flag['width'] ) ? '' : sprintf( ' width="%s"', (int) $flag['width'] );
379 $height_attr = empty( $flag['height'] ) ? '' : sprintf( ' height="%s"', (int) $flag['height'] );
380
381 $style = '';
382 $sizes = array_intersect_key( $flag, array_flip( array( 'width', 'height' ) ) );
383
384 if ( ! empty( $sizes ) ) {
385 array_walk(
386 $sizes,
387 function ( &$value, $key ) {
388 $value = sprintf( '%s: %dpx;', esc_attr( $key ), (int) $value );
389 }
390 );
391 $style = sprintf( ' style="%s"', implode( ' ', $sizes ) );
392 }
393
394 return sprintf(
395 '<img src="%s"%s%s%s%s />',
396 $flag['src'],
397 $alt_attr,
398 $width_attr,
399 $height_attr,
400 $style
401 );
402 }
403
404 /**
405 * Returns the html of the custom flag if any, or the default flag otherwise.
406 *
407 * @since 2.8
408 *
409 * @return string
410 */
411 public function get_display_flag() {
412 return empty( $this->custom_flag ) ? $this->flag : $this->custom_flag;
413 }
414
415 /**
416 * Returns the url of the custom flag if any, or the default flag otherwise.
417 *
418 * @since 2.8
419 *
420 * @return string
421 */
422 public function get_display_flag_url() {
423 return empty( $this->custom_flag_url ) ? $this->flag_url : $this->custom_flag_url;
424 }
425
426 /**
427 * Updates post and term count.
428 *
429 * @since 1.2
430 *
431 * @return void
432 */
433 public function update_count() {
434 wp_update_term_count( $this->term_taxonomy_id, 'language' ); // Posts count.
435 wp_update_term_count( $this->tl_term_taxonomy_id, 'term_language' ); // Terms count.
436 }
437
438 /**
439 * Set home_url and search_url properties.
440 *
441 * @since 1.3
442 *
443 * @param string $search_url Home url to use in search forms.
444 * @param string $home_url Home url.
445 * @return void
446 */
447 public function set_home_url( $search_url, $home_url ) {
448 $this->search_url = $search_url;
449 $this->home_url = $home_url;
450 }
451
452 /**
453 * Sets the scheme of the home url and the flag urls.
454 *
455 * This can't be cached across pages.
456 *
457 * @since 2.8
458 *
459 * @return void
460 */
461 public function set_url_scheme() {
462 $this->home_url = set_url_scheme( $this->home_url );
463 $this->search_url = set_url_scheme( $this->search_url );
464
465 // Set url scheme, also for the flags.
466 $this->flag_url = set_url_scheme( $this->flag_url );
467 if ( ! empty( $this->custom_flag_url ) ) {
468 $this->custom_flag_url = set_url_scheme( $this->custom_flag_url );
469 }
470 }
471
472 /**
473 * Returns the language locale.
474 * Converts WP locales to W3C valid locales for display.
475 *
476 * @since 1.8
477 *
478 * @param string $filter Either 'display' or 'raw', defaults to raw.
479 * @return string
480 */
481 public function get_locale( $filter = 'raw' ) {
482 return 'display' === $filter ? $this->w3c : $this->locale;
483 }
484 }
485