PluginProbe
Bogo / 2.8
Bogo v2.8
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.8, at includes/functions.php

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