PluginProbe
Bogo / 2.7
Bogo v2.7
3.9.3 trunk 1.0 1.1 2.0 2.0.1 2.1 2.1.1 2.1.2 2.1.3 2.2 2.3 2.4 2.4.1 2.4.2 2.4.3 2.5 2.6 2.6.1 2.7 2.8 2.8.1 2.9 3.0 3.0.1 All 52 releases
bogo / includes / functions.php

functions.php in Bogo 2.7, at includes/functions.php

557 lines 14.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 function bogo_languages() {
4 static $languages = array();
5 static $textdomain_loaded = false;
6
7 if ( $languages && $textdomain_loaded ) {
8 return apply_filters( 'bogo_languages', $languages );
9 }
10
11 $languages = array(
12 'af' => __( 'Afrikaans', 'bogo' ),
13 'am' => __( 'Amharic', 'bogo' ),
14 'an' => __( 'Aragonese', 'bogo' ),
15 'ar' => __( 'Arabic', 'bogo' ),
16 'ary' => __( 'Moroccan Arabic', 'bogo' ),
17 'as' => __( 'Assamese', 'bogo' ),
18 'az' => __( 'Azerbaijani', 'bogo' ),
19 'azb' => __( 'South Azerbaijani', 'bogo' ),
20 'be_BY' => __( 'Belarusian', 'bogo' ),
21 'bg_BG' => __( 'Bulgarian', 'bogo' ),
22 'bn_BD' => __( 'Bangla', 'bogo' ),
23 'bn_IN' => __( 'Indian Bengali', 'bogo' ),
24 'bo' => __( 'Tibetan', 'bogo' ),
25 'bs_BA' => __( 'Bosnian', 'bogo' ),
26 'ca' => __( 'Catalan', 'bogo' ),
27 'ceb' => __( 'Cebuano', 'bogo' ),
28 'ckb' => __( 'Central Kurdish', 'bogo' ),
29 'co' => __( 'Corsican', 'bogo' ),
30 'cs_CZ' => __( 'Czech', 'bogo' ),
31 'cy' => __( 'Welsh', 'bogo' ),
32 'da_DK' => __( 'Danish', 'bogo' ),
33 'de_DE' => __( 'German', 'bogo' ),
34 'de_DE_formal' => __( 'German (Formal)', 'bogo' ),
35 'de_CH' => __( 'German (Switzerland)', 'bogo' ),
36 'dv' => __( 'Dhivehi', 'bogo' ),
37 'el' => __( 'Greek', 'bogo' ),
38 'en_US' => __( 'English (United States)', 'bogo' ),
39 'en_AU' => __( 'English (Australia)', 'bogo' ),
40 'en_CA' => __( 'English (Canada)', 'bogo' ),
41 'en_GB' => __( 'English (UK)', 'bogo' ),
42 'en_NZ' => __( 'English (New Zealand)', 'bogo' ),
43 'en_ZA' => __( 'English (South Africa)', 'bogo' ),
44 'eo' => __( 'Esperanto', 'bogo' ),
45 'es_ES' => __( 'Spanish (Spain)', 'bogo' ),
46 'es_AR' => __( 'Spanish (Argentina)', 'bogo' ),
47 'es_CL' => __( 'Spanish (Chile)', 'bogo' ),
48 'es_CO' => __( 'Spanish (Colombia)', 'bogo' ),
49 'es_GT' => __( 'Spanish (Guatemala)', 'bogo' ),
50 'es_MX' => __( 'Spanish (Mexico)', 'bogo' ),
51 'es_PE' => __( 'Spanish (Peru)', 'bogo' ),
52 'es_VE' => __( 'Spanish (Venezuela)', 'bogo' ),
53 'et' => __( 'Estonian', 'bogo' ),
54 'eu' => __( 'Basque', 'bogo' ),
55 'fa_IR' => __( 'Persian', 'bogo' ),
56 'fi' => __( 'Finnish', 'bogo' ),
57 'fo' => __( 'Faroese', 'bogo' ),
58 'fr_FR' => __( 'French (France)', 'bogo' ),
59 'fr_BE' => __( 'French (Belgium)', 'bogo' ),
60 'fr_CA' => __( 'French (Canada)', 'bogo' ),
61 'fy' => __( 'Frisian', 'bogo' ),
62 'ga' => __( 'Irish', 'bogo' ),
63 'gd' => __( 'Scottish Gaelic', 'bogo' ),
64 'gl_ES' => __( 'Galician', 'bogo' ),
65 'gu' => __( 'Gujarati', 'bogo' ),
66 'haz' => __( 'Hazaragi', 'bogo' ),
67 'he_IL' => __( 'Hebrew', 'bogo' ),
68 'hi_IN' => __( 'Hindi', 'bogo' ),
69 'hr' => __( 'Croatian', 'bogo' ),
70 'ht' => __( 'Haitian', 'bogo' ),
71 'hu_HU' => __( 'Hungarian', 'bogo' ),
72 'hy' => __( 'Armenian', 'bogo' ),
73 'id_ID' => __( 'Indonesian', 'bogo' ),
74 'is_IS' => __( 'Icelandic', 'bogo' ),
75 'it_IT' => __( 'Italian', 'bogo' ),
76 'ja' => __( 'Japanese', 'bogo' ),
77 'jv_ID' => __( 'Javanese', 'bogo' ),
78 'ka_GE' => __( 'Georgian', 'bogo' ),
79 'kk' => __( 'Kazakh', 'bogo' ),
80 'km_KH' => __( 'Khmer', 'bogo' ),
81 'kn' => __( 'Kannada', 'bogo' ),
82 'ko_KR' => __( 'Korean', 'bogo' ),
83 'li' => __( 'Limburgish', 'bogo' ),
84 'lo' => __( 'Lao', 'bogo' ),
85 'lt_LT' => __( 'Lithuanian', 'bogo' ),
86 'lv' => __( 'Latvian', 'bogo' ),
87 'mg_MG' => __( 'Malagasy', 'bogo' ),
88 'mk_MK' => __( 'Macedonian', 'bogo' ),
89 'ml_IN' => __( 'Malayalam', 'bogo' ),
90 'mn' => __( 'Mongolian', 'bogo' ),
91 'mr' => __( 'Marathi', 'bogo' ),
92 'ms_MY' => __( 'Malay', 'bogo' ),
93 'mt_MT' => __( 'Maltese', 'bogo' ),
94 'my_MM' => __( 'Burmese', 'bogo' ),
95 'nb_NO' => __( 'Norwegian (Bokmål)', 'bogo' ),
96 'ne_NP' => __( 'Nepali', 'bogo' ),
97 'ni_ID' => __( 'Nias', 'bogo' ),
98 'nl_NL' => __( 'Dutch', 'bogo' ),
99 'nl_NL_formal' => __( 'Dutch (Formal)', 'bogo' ),
100 'nn_NO' => __( 'Norwegian (Nynorsk)', 'bogo' ),
101 'oci' => __( 'Occitan', 'bogo' ),
102 'os' => __( 'Ossetic', 'bogo' ),
103 'pa_IN' => __( 'Punjabi', 'bogo' ),
104 'pl_PL' => __( 'Polish', 'bogo' ),
105 'ps' => __( 'Pashto', 'bogo' ),
106 'pt_BR' => __( 'Portuguese (Brazil)', 'bogo' ),
107 'pt_PT' => __( 'Portuguese (Portugal)', 'bogo' ),
108 'ro_RO' => __( 'Romanian', 'bogo' ),
109 'ru_RU' => __( 'Russian', 'bogo' ),
110 'sa_IN' => __( 'Sanskrit', 'bogo' ),
111 'si_LK' => __( 'Sinhala', 'bogo' ),
112 'sk_SK' => __( 'Slovak', 'bogo' ),
113 'sl_SI' => __( 'Slovenian', 'bogo' ),
114 'so_SO' => __( 'Somali', 'bogo' ),
115 'sq' => __( 'Albanian', 'bogo' ),
116 'sr_RS' => __( 'Serbian', 'bogo' ),
117 'sv_SE' => __( 'Swedish', 'bogo' ),
118 'su_ID' => __( 'Sundanese', 'bogo' ),
119 'sw' => __( 'Swahili', 'bogo' ),
120 'ta_IN' => __( 'Tamil', 'bogo' ),
121 'te' => __( 'Telugu', 'bogo' ),
122 'tg' => __( 'Tajik', 'bogo' ),
123 'th' => __( 'Thai', 'bogo' ),
124 'tl' => __( 'Tagalog', 'bogo' ),
125 'tr_TR' => __( 'Turkish', 'bogo' ),
126 'tt_RU' => __( 'Tatar', 'bogo' ),
127 'ug_CN' => __( 'Uighur', 'bogo' ),
128 'uk' => __( 'Ukrainian', 'bogo' ),
129 'ur' => __( 'Urdu', 'bogo' ),
130 'uz_UZ' => __( 'Uzbek', 'bogo' ),
131 'vi' => __( 'Vietnamese', 'bogo' ),
132 'zh_CN' => __( 'Chinese (China)', 'bogo' ),
133 'zh_TW' => __( 'Chinese (Taiwan)', 'bogo' )
134 );
135
136 if ( is_textdomain_loaded( 'bogo' ) ) {
137 $textdomain_loaded = true;
138 }
139
140 asort( $languages, SORT_STRING );
141
142 return apply_filters( 'bogo_languages', $languages );
143 }
144
145 function bogo_get_language( $locale ) {
146 $languages = bogo_languages();
147
148 if ( isset( $languages[$locale] ) )
149 return $languages[$locale];
150
151 return null;
152 }
153
154 function bogo_get_language_native_name( $locale ) {
155 if ( 'en_US' == $locale ) {
156 return 'English (United States)';
157 }
158
159 if ( ! function_exists( 'wp_get_available_translations' ) ) {
160 require_once ABSPATH . 'wp-admin/includes/translation-install.php';
161 }
162
163 static $available_translations = array();
164
165 if ( empty( $available_translations ) ) {
166 $available_translations = wp_get_available_translations();
167 }
168
169 if ( isset( $available_translations[$locale]['native_name'] ) ) {
170 return $available_translations[$locale]['native_name'];
171 }
172
173 return false;
174 }
175
176 function bogo_get_default_locale() {
177 if ( defined( 'WPLANG' ) ) {
178 $locale = WPLANG;
179 }
180
181 if ( is_multisite() ) {
182 if ( defined( 'WP_INSTALLING' )
183 || ( false === $ms_locale = get_option( 'WPLANG' ) ) ) {
184 $ms_locale = get_site_option( 'WPLANG' );
185 }
186
187 if ( $ms_locale !== false ) {
188 $locale = $ms_locale;
189 }
190 } else {
191 $db_locale = get_option( 'WPLANG' );
192
193 if ( $db_locale !== false ) {
194 $locale = $db_locale;
195 }
196 }
197
198 if ( empty( $locale ) ) {
199 $locale = 'en_US';
200 }
201
202 return $locale;
203 }
204
205 function bogo_is_default_locale( $locale ) {
206 $default_locale = bogo_get_default_locale();
207
208 return ! empty( $locale ) && $locale == bogo_get_default_locale();
209 }
210
211 function bogo_available_locales( $args = '' ) {
212 $defaults = array(
213 'exclude' => array(),
214 'exclude_enus_if_inactive' => false,
215 'current_user_can_access' => false );
216
217 $args = wp_parse_args( $args, $defaults );
218
219 $installed_locales = get_available_languages();
220 $installed_locales[] = bogo_get_default_locale();
221
222 $exclude_enus = $args['exclude_enus_if_inactive']
223 && bogo_get_prop( 'enus_deactivated' );
224
225 if ( ! $exclude_enus ) {
226 $installed_locales[] = 'en_US';
227 }
228
229 $installed_locales = array_unique( $installed_locales );
230 $installed_locales = array_filter( $installed_locales );
231
232 $available_locales = array();
233
234 foreach ( $installed_locales as $locale ) {
235 if ( in_array( $locale, (array) $args['exclude'] ) ) {
236 continue;
237 }
238
239 if ( $args['current_user_can_access']
240 && ! current_user_can( 'bogo_access_locale', $locale ) ) {
241 continue;
242 }
243
244 $available_locales[] = $locale;
245 }
246
247 return $available_locales;
248 }
249
250 function bogo_available_languages( $args = '' ) {
251 $defaults = array(
252 'exclude' => array(),
253 'orderby' => 'key',
254 'order' => 'ASC',
255 'current_user_can_access' => false );
256
257 $args = wp_parse_args( $args, $defaults );
258
259 $langs = array();
260
261 $available_locales = bogo_available_locales( $args );
262
263 foreach ( $available_locales as $locale ) {
264 $lang = bogo_get_language( $locale );
265 $langs[$locale] = empty( $lang ) ? "[$locale]" : $lang;
266 }
267
268 if ( 'value' == $args['orderby'] ) {
269 natcasesort( $langs );
270
271 if ( 'DESC' == $args['order'] ) {
272 $langs = array_reverse( $langs );
273 }
274 } else {
275 if ( 'DESC' == $args['order'] ) {
276 krsort( $langs );
277 } else {
278 ksort( $langs );
279 }
280 }
281
282 $langs = apply_filters( 'bogo_available_languages', $langs, $args );
283
284 return $langs;
285 }
286
287 function bogo_is_available_locale( $locale ) {
288 if ( empty( $locale ) ) {
289 return false;
290 }
291
292 static $available_locales = array();
293
294 if ( empty( $available_locales ) ) {
295 $available_locales = bogo_available_locales();
296 }
297
298 return in_array( $locale, $available_locales );
299 }
300
301 function bogo_filter_locales( $locales, $filter = 'available' ) {
302 return array_intersect( $locales, bogo_available_locales() );
303 }
304
305 /**
306 * @see http://www.ietf.org/rfc/bcp/bcp47.txt
307 */
308 function bogo_language_tag( $locale ) {
309 $tag = preg_replace( '/[^0-9a-zA-Z]+/', '-', $locale );
310 $tag = trim( $tag, '-' );
311
312 if ( '-formal' == substr( $tag, -7 ) ) {
313 $tag = substr( $tag, 0, -7 );
314 }
315
316 return apply_filters( 'bogo_language_tag', $tag, $locale );
317 }
318
319 function bogo_lang_slug( $locale ) {
320 $tag = bogo_language_tag( $locale );
321 $slug = $tag;
322
323 if ( false !== $pos = strpos( $tag, '-' ) )
324 $slug = substr( $tag, 0, $pos );
325
326 $variations = preg_grep( '/^' . $slug . '/', bogo_available_locales() );
327
328 if ( 1 < count( $variations ) )
329 $slug = $tag;
330
331 return apply_filters( 'bogo_lang_slug', $slug, $locale );
332 }
333
334 function bogo_get_lang_regex() {
335 $langs = array_map( 'bogo_lang_slug', bogo_available_locales() );
336 $langs = array_filter( $langs );
337
338 if ( empty( $langs ) )
339 return '';
340
341 return '(' . implode( '|', $langs ) . ')';
342 }
343
344 function bogo_get_closest_locale( $var ) {
345 $var = strtolower( $var );
346
347 if ( ! preg_match( '/^([a-z]{2})(?:[_-]([a-z]{2}))?/', $var, $matches ) )
348 return false;
349
350 $language_code = $matches[1];
351 $region_code = isset( $matches[2] ) ? $matches[2] : '';
352
353 $locales = bogo_available_locales();
354
355 if ( $region_code ) {
356 $locale = $language_code . '_' . strtoupper( $region_code );
357
358 if ( false !== array_search( $locale, $locales ) )
359 return $locale;
360 }
361
362 $locale = $language_code;
363
364 if ( false !== array_search( $locale, $locales ) )
365 return $locale;
366
367 if ( $matches = preg_grep( "/^{$locale}_/", $locales ) )
368 return array_shift( $matches );
369
370 return false;
371 }
372
373 function bogo_http_accept_languages() {
374 if ( ! isset( $_SERVER['HTTP_ACCEPT_LANGUAGE'] ) )
375 return false;
376
377 $languages = array();
378
379 foreach ( explode( ',', $_SERVER['HTTP_ACCEPT_LANGUAGE'] ) as $lang ) {
380 $lang = trim( strtolower( $lang ) );
381
382 if ( preg_match( '/^([a-z-]+)(?:;q=([0-9.]+))?$/', $lang, $matches ) ) {
383 $language_tag = $matches[1];
384 $qvalue = isset( $matches[2] ) ? 0 + $matches[2] : 1;
385
386 if ( preg_match( '/^([a-z]{2})(?:-([a-z]{2}))?$/', $language_tag, $matches ) ) {
387 $language_tag = $matches[1];
388
389 if ( isset( $matches[2] ) )
390 $language_tag .= '_' . strtoupper( $matches[2] );
391
392 $languages[$language_tag] = $qvalue;
393 }
394 }
395 }
396
397 natsort( $languages );
398
399 return array_reverse( array_keys( $languages ) );
400 }
401
402 function bogo_url( $url = null, $lang = null ) {
403 if ( ! $lang )
404 $lang = get_locale();
405
406 $args = array(
407 'using_permalinks' => (bool) get_option( 'permalink_structure' ) );
408
409 return bogo_get_url_with_lang( $url, $lang, $args );
410 }
411
412 function bogo_get_url_with_lang( $url = null, $lang = null, $args = '' ) {
413 $defaults = array(
414 'using_permalinks' => true );
415
416 $args = wp_parse_args( $args, $defaults );
417
418 if ( ! $url ) {
419 if ( ! $url = redirect_canonical( $url, false ) ) {
420 $url = is_ssl() ? 'https://' : 'http://';
421 $url .= $_SERVER['HTTP_HOST'];
422 $url .= $_SERVER['REQUEST_URI'];
423 }
424
425 if ( $frag = strstr( $url, '#' ) ) {
426 $url = substr( $url, 0, - strlen( $frag ) );
427 }
428
429 if ( $query = @parse_url( $url, PHP_URL_QUERY ) ) {
430 parse_str( $query, $query_vars );
431
432 foreach ( array_keys( $query_vars ) as $qv ) {
433 if ( ! get_query_var( $qv ) ) {
434 $url = remove_query_arg( $qv, $url );
435 }
436 }
437 }
438 }
439
440 $default_locale = bogo_get_default_locale();
441
442 if ( ! $lang ) {
443 $lang = $default_locale;
444 }
445
446 $use_implicit_lang = apply_filters( 'bogo_use_implicit_lang', true );
447
448 $lang_slug = ( $use_implicit_lang && $lang == $default_locale )
449 ? ''
450 : bogo_lang_slug( $lang );
451
452 $home = set_url_scheme( get_option( 'home' ) );
453 $home = trailingslashit( $home );
454
455 $url = remove_query_arg( 'lang', $url );
456
457 if ( ! $args['using_permalinks'] ) {
458 if ( $lang_slug ) {
459 $url = add_query_arg( array( 'lang' => $lang_slug ), $url );
460 }
461
462 return $url;
463 }
464
465 $available_languages = array_map( 'bogo_lang_slug', bogo_available_locales() );
466
467 $tail_slashed = ( '/' == substr( $url, -1 ) );
468
469 $url = preg_replace(
470 '#^' . preg_quote( $home ) . '((' . implode( '|', $available_languages ) . ')/)?#',
471 $home . ( $lang_slug ? trailingslashit( $lang_slug ) : '' ),
472 trailingslashit( $url ) );
473
474 if ( ! $tail_slashed ) {
475 $url = untrailingslashit( $url );
476 }
477
478 return $url;
479 }
480
481 function bogo_get_lang_from_url( $url = '' ) {
482 if ( ! $url ) {
483 $url = is_ssl() ? 'https://' : 'http://';
484 $url .= $_SERVER['HTTP_HOST'];
485 $url .= $_SERVER['REQUEST_URI'];
486 }
487
488 if ( $frag = strstr( $url, '#' ) )
489 $url = substr( $url, 0, - strlen( $frag ) );
490
491 $home = set_url_scheme( get_option( 'home' ) );
492 $home = trailingslashit( $home );
493
494 $available_languages = array_map( 'bogo_lang_slug', bogo_available_locales() );
495
496 $regex = '#^' . preg_quote( $home ) . '(' . implode( '|', $available_languages ) . ')/#';
497
498 if ( preg_match( $regex, trailingslashit( $url ), $matches ) )
499 return $matches[1];
500
501 if ( $query = @parse_url( $url, PHP_URL_QUERY ) ) {
502 parse_str( $query, $query_vars );
503
504 if ( isset( $query_vars['lang'] )
505 && in_array( $query_vars['lang'], $available_languages ) )
506 return $query_vars['lang'];
507 }
508
509 return false;
510 }
511
512 function bogo_get_prop( $prop ) {
513 $option = get_option( 'bogo' );
514
515 if ( ! is_array( $option ) ) {
516 $option = array();
517 }
518
519 return isset( $option[$prop] ) ? $option[$prop] : '';
520 }
521
522 function bogo_set_prop( $prop, $value ) {
523 $option = get_option( 'bogo' );
524
525 if ( ! is_array( $option ) ) {
526 $option = array();
527 }
528
529 $option[$prop] = $value;
530
531 update_option( 'bogo', $option );
532 }
533
534 function bogo_delete_prop( $prop ) {
535 $option = get_option( 'bogo' );
536
537 if ( ! is_array( $option ) ) {
538 $option = array();
539 }
540
541 if ( isset( $option[$prop] ) ) {
542 unset( $option[$prop] );
543 }
544
545 update_option( 'bogo', $option );
546 }
547
548 function bogo_plugin_url( $path = '' ) {
549 $url = plugins_url( $path, BOGO_PLUGIN );
550
551 if ( is_ssl() && 'http:' == substr( $url, 0, 5 ) ) {
552 $url = 'https:' . substr( $url, 5 );
553 }
554
555 return $url;
556 }
557