1: <?php
2: if ( ! defined( 'ABSPATH' ) ) die( "Access denied" );
3:
4: 5: 6:
7:
8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
31: class CMLLanguage {
32:
33: private static $_default_language;
34:
35: private static $_all_languages;
36:
37: private static $_all_enabled;
38:
39: private static $_all_others;
40:
41: private static $_all_by_slug;
42:
43: private static $_current_id;
44:
45: 46: 47:
48: const FLAG_TINY = "tiny";
49:
50: 51: 52:
53: const FLAG_SMALL = "small";
54:
55: 56: 57: 58: 59:
60: public static function get_default() {
61: if( empty( self::$_all_languages ) ) self::get_all();
62:
63: return self::$_default_language;
64: }
65:
66: 67: 68: 69: 70:
71: public static function get_default_id() {
72: return self::get_default()->id;
73: }
74:
75: 76: 77: 78: 79:
80: public static function get_default_slug() {
81: return self::get_default()->cml_language_slug;
82: }
83:
84: 85: 86: 87: 88:
89: public static function get_all() {
90: global $wpdb;
91:
92: 93: 94:
95: if( empty( self::$_all_languages) ) {
96: self::$_all_languages = $wpdb->get_results( sprintf( "SELECT * FROM %s ORDER BY cml_sort_id ", CECEPPA_ML_TABLE ) );
97:
98: $all_languages_by_keys = array();
99: $sorted = array();
100: $enableds = array();
101: $byslug = array();
102: $others = array();
103: foreach( self::$_all_languages as $l ) {
104: $all_languages_by_keys[ $l->id ] = $l;
105: $byslug[ $l->cml_language_slug ] = $l;
106: $sorted[] = $l;
107:
108: if( $l->cml_default == 1 )
109: self::$_default_language = $l;
110: else
111: $others[ $l->id ] = $l;
112:
113: if( $l->cml_enabled == 1 ) $enableds[$l->id] = $l;
114: }
115:
116: if( empty( self::$_default_language ) ) {
117: update_option( "cml_warning_no_default_language", true );
118:
119: self::$_default_language = end( $enableds );
120: }
121:
122: self::$_all_enabled = $enableds;
123: self::$_all_others = $others;
124: self::$_all_languages = $all_languages_by_keys;
125: self::$_all_by_slug = $byslug;
126:
127: if( ! empty( self::$_default_language ) )
128: self::$_current_id = self::$_default_language->id;
129: }
130:
131: return self::$_all_languages;
132: }
133:
134: 135: 136: 137: 138:
139: public static function get_no_default() {
140: if( empty( self::$_all_languages) ) self::get_all();
141:
142: return self::$_all_others;
143: }
144:
145: 146: 147: 148: 149:
150: public static function get_enableds() {
151: if( empty( self::$_all_languages ) ) self::get_all();
152:
153: return self::$_all_enabled;
154: }
155:
156: 157: 158: 159: 160: 161:
162: public static function get_others( $only_enableds = true ) {
163: if( empty( self::$_all_languages ) ) self::get_all();
164:
165: $langs = ( $only_enableds ) ? self::$_all_enabled : self::$_all_languages;
166: unset( $langs[ self::get_current_id() ] );
167:
168: return $langs;
169: }
170:
171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184:
185: public static function get_slugs() {
186: if( empty( self::$_all_languages ) ) self::get_all();
187:
188: return self::$_all_by_slug;
189: }
190:
191: 192: 193: 194: 195:
196: public static function get_current() {
197: if( empty( self::$_all_languages ) ) self::get_all();
198:
199: return self::$_all_languages[ self::$_current_id ];
200: }
201:
202: 203: 204: 205: 206:
207: public static function get_current_id() {
208: return self::get_current()->id;
209: }
210:
211: 212: 213:
214: public static function get_current_slug() {
215: return self::get_current()->cml_language_slug;
216: }
217:
218: 219: 220: 221: 222: 223: 224:
225: public static function get_name( $lang ) {
226: if( empty( self::$_all_languages ) ) self::get_all();
227: if( empty( self::$_default_language ) ) self::get_default();
228: if( ! is_numeric( $lang ) ) $lang = self::get_id_by_slug( $lang );
229:
230: return self::$_all_languages[ $lang ]->cml_language;
231: }
232:
233: 234: 235: 236: 237: 238: 239:
240: public static function get_slug( $lang ) {
241: if( empty( self::$_all_languages ) ) self::get_all();
242: if( empty( self::$_default_language ) ) self::get_default();
243: if( is_object( $lang ) ) $lang = $lang->id;
244:
245: if( $lang == 0 ) return self::$_default_language->cml_language_slug;
246:
247: return @self::$_all_languages[ $lang ]->cml_language_slug;
248: }
249:
250: 251: 252: 253: 254: 255: 256:
257: public static function get_by_id( $id ) {
258: if( empty( self::$_all_languages ) ) self::get_all();
259: if( ! is_numeric( $id ) ) $id = CMLLanguage::get_by_slug( $id );
260:
261: return self::$_all_languages[ $id ];
262: }
263:
264: 265: 266: 267: 268: 269: 270: 271: 272:
273: public static function get_by_slug( $slug, $empty = false ) {
274: if( empty( self::$_all_languages ) ) self::get_all();
275:
276: foreach( self::$_all_languages as $lang ) {
277: if( $lang->cml_language_slug == $slug ) return $lang;
278: }
279:
280: return ( ! $empty ) ? self::get_default() : array();
281: }
282:
283: 284: 285: 286: 287: 288: 289:
290: public static function get_id_by_slug( $slug ) {
291: $lang = self::get_by_slug( $slug );
292:
293: return $lang->id;
294: }
295:
296: 297: 298: 299: 300: 301: 302:
303: public static function get_id_by_locale( $locale ) {
304: $langs = self::get_all();
305:
306: foreach( $langs as $lang ) {
307: if( $lang->cml_locale == $locale ) return $lang;
308: }
309:
310: return null;
311: }
312:
313: 314: 315: 316: 317: 318: 319: 320:
321: public static function get_flag( $lang = null, $size = "small" ) {
322: if( empty( $lang ) ) $lang = self::default_language_id();
323: if( ! is_numeric( $lang ) ) $lang = self::get_id_by_slug( $lang );
324:
325: if( empty( self::$_all_languages ) ) self::get_all();
326:
327: return self::$_all_languages[ $lang ]->cml_flag;
328: }
329:
330: 331: 332: 333: 334: 335: 336: 337: 338: 339: 340:
341: public static function get_flag_src( $lang = null, $size = CML_FLAG_TINY ) {
342: if( empty( self::$_all_languages ) ) self::get_all();
343: if( empty( self::$_default_language ) ) self::get_default();
344: if( $lang == null ) $lang = self::get_default_id();
345: if( ! is_numeric( $lang ) ) $lang = self::get_id_by_slug( $lang );
346:
347: $lang = self::$_all_languages[ $lang ];
348: $flag = $lang->cml_flag;
349:
350: if( $lang->cml_custom_flag == 1 && file_exists( CML_UPLOAD_DIR . "/$size/$flag.png" ) )
351: $url = CML_UPLOAD_URL . "/$size/$flag.png";
352: else
353: $url = CML_PLUGIN_URL . "flags/$size/$flag.png";
354:
355: return esc_url( $url );
356: }
357:
358: 359: 360: 361: 362: 363: 364: 365:
366: public static function get_flag_img( $lang, $size = CML_FLAG_TINY ) {
367: $url = self::get_flag_src( $lang, $size );
368: $name = self::get_name( $lang );
369: $slug = self::get_slug( $lang );
370:
371: return "<img src='$url' border='0' alt='$slug' title='$name' />";
372: }
373:
374: 375: 376: 377: 378:
379: public static function reload() {
380: self::$_all_languages = null;
381: }
382:
383: 384: 385: 386: 387: 388: 389:
390: public static function get_by_post_id( $post_id ) {
391: return CMLPost::get_language_by_id( $post_id );
392: }
393:
394: 395: 396: 397: 398: 399: 400:
401: public static function get_id_by_post_id( $post_id ) {
402: return CMLPost::get_language_id_by_id( $post_id );
403: }
404:
405: 406: 407: 408: 409: 410: 411:
412: public static function is_default( $lang = null) {
413: if( null == $lang ) {
414: $lang = CMLLanguage::get_current_id();
415: } else {
416: if( ! is_numeric( $lang ) ) {
417: $lang = CMLLanguage::get_id_by_slug( $lang );
418: }
419: }
420:
421: return $lang == CMLLanguage::get_default_id();
422: }
423:
424: 425: 426: 427: 428: 429: 430:
431: public static function is_current( $lang ) {
432: if( null == $lang ) {
433: $lang = CMLLanguage::get_current_id();
434: } else {
435: if( ! is_numeric( $lang ) ) {
436: $lang = CMLLanguage::get_id_by_slug( $lang );
437: }
438: }
439:
440: return $lang == CMLLanguage::get_current_id();
441: }
442:
443: 444: 445: 446: 447: 448: 449: 450: 451:
452: public static function set_current( $lang ) {
453: $id = is_object( $lang ) ? $lang->id : $lang;
454:
455: self::$_current_id = $id;
456: }
457: }
458:
459: 460: 461:
462: class CMLTranslations {
463:
464:
465: private static $_translations = array();
466:
467: private static $_keys = array();
468:
469: 470: 471: 472: 473: 474: 475: 476: 477: 478: 479: 480: 481: 482: 483: 484: 485:
486: public static function add( $key, $default, $group ) {
487: global $wpdb;
488:
489: $default = bin2hex( $default );
490: foreach( CMLLanguage::get_all() as $lang ) {
491: $query = sprintf( "SELECT id FROM %s WHERE cml_text = '%s' AND cml_lang_id = %d AND cml_type = '%s'",
492: CECEPPA_ML_TRANSLATIONS,
493: bin2hex( strtolower( $key ) ),
494: $lang->id,
495: $group );
496:
497: $record = $wpdb->get_var( $query );
498: if( empty( $record ) ) {
499: $wpdb->insert( CECEPPA_ML_TRANSLATIONS,
500: array(
501: 'cml_text' => bin2hex( strtolower( $key ) ),
502: 'cml_lang_id' => $lang->id,
503: 'cml_translation' => $default,
504: 'cml_type' => $group
505: ),
506: array(
507: '%s', '%d', '%s', '%s',
508: )
509: );
510: }
511: }
512: }
513:
514: 515: 516: 517: 518: 519: 520: 521: 522: 523: 524: 525: 526: 527: 528: 529: 530: 531: 532: 533: 534: 535: 536: 537: 538: 539: 540:
541: public static function set( $lang, $original, $translated, $type ) {
542: global $wpdb;
543:
544: if( ! is_numeric( $lang ) ) $lang = CMLLanguage::get_id_by_slug( $lang );
545:
546: $wpdb->delete( CECEPPA_ML_TRANSLATIONS,
547: array( "cml_text" => bin2hex( $original ),
548: "cml_type" => $type,
549: "cml_lang_id" => $lang ),
550: array( "%s", "%s", "%d" ) );
551:
552: return $wpdb->insert( CECEPPA_ML_TRANSLATIONS,
553: array( 'cml_text' => bin2hex( $original ),
554: 'cml_lang_id' => $lang,
555: 'cml_translation' => bin2hex( $translated ),
556: 'cml_type' => $type ),
557: array( '%s', '%d', '%s', '%s' ) );
558: }
559:
560: 561: 562: 563: 564: 565: 566: 567: 568: 569: 570: 571: 572: 573: 574: 575: 576: 577: 578: 579: 580: 581: 582: 583: 584: 585: 586:
587: public static function get( $lang, $string, $type = "", $return_empty = false, $ignore_po = false ) {
588: global $wpdb;
589:
590: if( "_" == $type[ 0 ] && ! $return_empty ) {
591: $return_empty = true;
592: }
593:
594:
595: $s = ( $type == "C" ) ? strtolower( $string ) : $string;
596:
597:
598: if( isset( self::$_keys[ $lang ] ) && in_array( sanitize_title( $s ), self::$_keys[ $lang ] ) ) {
599: $index = array_search( sanitize_title( $s ), self::$_keys[ $lang ] );
600: return self::$_translations[ $lang ][ $index ];
601: }
602:
603: if( CML_GET_TRANSLATIONS_FROM_PO &&
604: ! $ignore_po &&
605: file_exists( "cmltrans-" . CMLLanguage::get_current()->cml_locale ) ) {
606: $ret = __( $s, 'cmltrans' );
607:
608:
609:
610: }
611:
612: if( ! is_numeric( $lang ) ) {
613: $lang = CMLLanguage::get_id_by_slug( $lang );
614: }
615:
616: $query = sprintf(" SELECT UNHEX(cml_translation) FROM %s WHERE cml_text = '%s' AND cml_lang_id = %d AND cml_type LIKE '%s'",
617: CECEPPA_ML_TRANSLATIONS, bin2hex( $s ), $lang, "%" . $type . "%" );
618:
619: $return = $wpdb->get_var( $query );
620:
621: if( $return_empty && empty( $return ) ) return "";
622:
623: $return = ( empty( $return ) ) ? $string : html_entity_decode( stripslashes( $return ) );
624:
625: self::$_translations[$lang][] = $return;
626: self::$_keys[ $lang ][] = sanitize_title( $string );
627:
628: return $return;
629: }
630:
631: 632: 633: 634: 635:
636: public static function gettext( $lang, $string, $type, $ignore_po = false ) {
637: $ret = self::get( $lang, $string, $type, true, $ignore_po );
638:
639: if( ! empty( $ret ) ) return $ret;
640:
641:
642: require_once( CML_PLUGIN_PATH . "gettext/gettext.inc" );
643:
644: $locale = CMLLanguage::get_current()->cml_locale;
645:
646:
647: T_setlocale( LC_MESSAGES, $locale );
648:
649:
650: $domain = $locale;
651: T_bindtextdomain( $domain, CML_WP_LOCALE_DIR );
652: T_bind_textdomain_codeset( $domain, 'UTF-8' );
653: T_textdomain( $domain );
654:
655: $ret = T_gettext( $string );
656:
657: return ( empty( $ret ) ) ? $string : html_entity_decode( stripslashes( $ret ) );
658: }
659:
660: 661: 662: 663: 664:
665: public static function delete( $type ) {
666: global $wpdb;
667:
668: $wpdb->delete( CECEPPA_ML_TRANSLATIONS,
669: array( "cml_type" => $type ),
670: array( "%s" ) );
671: }
672: }
673:
674: 675: 676: 677:
678: class CMLPost {
679:
680: private static $_indexes = null;
681:
682: private static $_posts_meta = null;
683:
684: 685: 686: 687: 688: 689: 690: 691: 692:
693: public static function get_language_by_id( $post_id ) {
694: if( empty( self::$_indexes ) ) self::_load_indexes();
695:
696: 697: 698: 699: 700:
701: if( @in_array( $post_id, self::$_indexes[ CMLLanguage::get_current_id() ] ) ) {
702: return CMLLanguage::get_current();
703: }
704:
705: foreach( CMLLanguage::get_others() as $lang ) {
706: if( @in_array( $post_id, self::$_indexes[ $lang->id ] ) )
707: return $lang;
708: }
709:
710: return null;
711: }
712:
713: 714: 715: 716: 717: 718: 719: 720: 721: 722: 723: 724:
725: public static function get_language_id_by_id( $post_id, $meta = false ) {
726: if( $meta ) {
727:
728: $meta = get_post_meta( $post_id, "_cml_meta", true );
729:
730: if( ! empty( $meta ) && isset( $meta[ "lang" ] ) ) {
731: return $meta[ "lang"];
732: }
733: }
734:
735: $lang = self::get_language_by_id( $post_id );
736:
737: if( null === $lang ) {
738:
739: $meta = get_post_meta( $post_id, "_cml_meta", true );
740:
741: if( empty( $meta ) ) {
742: $lang = self::get_language_by_id( $post_id );
743:
744: if( is_object( $lang ) ) {
745:
746: self::update_meta( $lang->id, $post_id );
747: }
748:
749: return is_object( $lang ) ? $lang->id : 0;
750: } else {
751: return @$meta[ "lang" ];
752: }
753: }
754:
755: return $lang->id;
756: }
757:
758: 759: 760: 761: 762: 763: 764:
765: public static function get_language_slug_by_id( $post_id ) {
766: $lang = self::get_language_by_id( $post_id );
767:
768: return is_object( $lang ) ? $lang->cml_language_slug : "";
769: }
770:
771: 772: 773: 774: 775: 776: 777: 778: 779: 780:
781: public static function get_translation( $lang, $post_id ) {
782: global $wpdb;
783:
784: if( is_numeric( $lang ) ) $lang = CMLLanguage::get_slug( $lang );
785: if( empty( $post_id ) ) return 0;
786:
787:
788:
789:
790:
791: $linked = self::get_translations( $post_id );
792:
793: return ( ! array_key_exists( $lang, $linked) ) ? 0 : $linked[ $lang ];
794: }
795:
796: 797: 798: 799: 800: 801: 802: 803: 804: 805: 806: 807: 808: 809: 810: 811: 812: 813: 814: 815: 816: 817: 818: 819: 820: 821: 822: 823: 824: 825: 826: 827: 828: 829: 830: 831: 832: 833: 834: 835: 836: 837: 838: 839: 840: 841: 842: 843: 844: 845: 846: 847: 848: 849: 850: 851:
852: public static function get_translations( $post_id, $force = false ) {
853: global $wpdb;
854:
855: if( empty( $post_id ) ) return array();
856:
857: if( ! isset( self::$_posts_meta[ $post_id ] ) || $force ) {
858:
859: if( empty( $GLOBALS[ '_cml_language_columns' ] ) ) {
860: cml_generate_lang_columns();
861: }
862:
863: $_cml_language_columns = & $GLOBALS[ '_cml_language_columns' ];
864: $_conv = & $GLOBALS[ '_cml_language_keys' ];
865:
866: $query = "SELECT ";
867: foreach( $_conv as $key => $label ) {
868: $select[] = "$key as $label";
869: }
870: $query .= join( ",", $select ) . " FROM " . CECEPPA_ML_RELATIONS . " WHERE ";
871: foreach( $_cml_language_columns as $l ) {
872: $where[] = "$l = $post_id";
873: }
874: $query .= join( " OR ", $where );
875:
876: $row = $wpdb->get_row( $query, ARRAY_A );
877: unset( $row[ "id" ] );
878:
879: $keys = @array_filter( $row );
880: $keys = @array_replace( $keys, $_conv );
881: $others = @array_filter( is_array( $row ) ? $row : array() );
882: unset( $others[ CMLPost::get_language_slug_by_id( $post_id ) ] );
883:
884: $row = @array_merge( (array) $row, array( "indexes" => array_filter( $row ),
885: "linked" => $others ) );
886:
887: self::$_posts_meta[ $post_id ] = $row;
888: } else {
889: $row = self::$_posts_meta[ $post_id ];
890: }
891:
892: return $row;
893: }
894:
895: 896: 897: 898: 899: 900: 901: 902:
903: public static function set_language( $lang, $post_id ) {
904: if( ! is_numeric( $lang ) ) $lang = CMLLanguage::get_id_by_slug( $lang );
905:
906: cml_migrate_database_add_item( $lang, $post_id, 0, 0 );
907: }
908:
909: 910: 911: 912: 913: 914: 915: 916: 917: 918: 919: 920: 921: 922: 923:
924: public static function set_translation( $post_id, $linked_lang, $linked_post, $post_lang = null ) {
925: self::set_translations( $post_id, array( $linked_lang => $linked_post ), $post_lang );
926: }
927:
928: 929: 930: 931: 932: 933: 934: 935: 936: 937: 938: 939: 940: 941: 942: 943: 944: 945:
946: public static function set_translations( $post_id, $translations, $post_lang = null ) {
947:
948: if( null === $post_lang ) $post_lang = CMLPost::get_language_id_by_id( $post_id );
949:
950: foreach( $translations as $key => $id ) {
951: if( ! is_numeric( $key ) ) $key = CMLLanguage::get_by_slug( $key );
952:
953: cml_migrate_database_add_item( $post_lang, $post_id, $key, $id );
954: }
955:
956:
957: cml_fix_rebuild_posts_info();
958: self::_load_indexes();
959:
960: self::update_meta( $post_lang, $post_id );
961: }
962:
963: 964: 965: 966:
967: public static function update_meta( $lang, $post_id ) {
968: 969: 970:
971:
972: $meta = array( "lang" => $lang,
973: "translations" => CMLPost::get_translations( $post_id, true ) );
974:
975:
976:
977: update_post_meta( $post_id, "_cml_meta", $meta );
978: }
979:
980: 981: 982: 983: 984: 985: 986: 987:
988: public static function get_posts_by_language( $lang = null ) {
989: if( empty( $lang ) ) $lang = CMLLanguage::get_current_id();
990: if( ! is_numeric( $lang ) ) $lang = CMLLanguage::get_id_by_slug( $lang );
991:
992:
993: if( empty( self::$_indexes ) ) self::_load_indexes();
994:
995: $posts = @self::$_indexes[ $lang ];
996:
997: return ! empty( $posts ) ? array_unique( $posts ) : array();
998: }
999:
1000: 1001: 1002: 1003:
1004: public static function _update_posts_by_language( $lang, $ids ) {
1005: self::$_indexes[ $lang ] = $ids;
1006: }
1007:
1008: 1009: 1010: 1011: 1012: 1013: 1014:
1015: public static function get_posts_by_languages() {
1016:
1017: if( empty( self::$_indexes ) ) self::_load_indexes();
1018:
1019: return self::$_indexes;
1020: }
1021:
1022: 1023: 1024: 1025: 1026: 1027: 1028: 1029:
1030: public static function has_translation( $lang, $post_id ) {
1031: if( ! isset( self::$_posts_meta[ $post_id ] ) ) {
1032: self::$_posts_meta[ $post_id ] = self::get_translations( $post_id );
1033: }
1034:
1035: if( is_numeric( $lang ) ) $lang = CMLLanguage::get_slug( $lang );
1036:
1037: return ( isset( self::$_posts_meta[ $post_id ]['indexes'] ) &&
1038: self::$_posts_meta[ $post_id ]['indexes'][ $lang ] > 0 );
1039: }
1040:
1041: 1042: 1043: 1044: 1045: 1046: 1047:
1048: public static function has_translations( $post_id ) {
1049: if( ! isset( self::$_posts_meta[ $post_id ] ) ) {
1050: self::$_posts_meta[ $post_id ] = self::get_translations( $post_id );
1051: }
1052:
1053: return ! empty( self::$_posts_meta[ $post_id ][ 'linked' ] );
1054: }
1055:
1056:
1057: private static function _load_indexes() {
1058: $langs = cml_get_languages( false );
1059:
1060: foreach($langs as $lang) {
1061: self::$_indexes[ $lang->id ] = get_option( "cml_posts_of_lang_" . $lang->id );
1062: }
1063: }
1064:
1065: }
1066:
1067: 1068: 1069: 1070:
1071: class CMLUtils {
1072:
1073: private static $_permalink_structure;
1074:
1075: private static $_url_mode;
1076:
1077: private static $_date_format;
1078:
1079: private static $_home_url;
1080:
1081: private static $_clean_url;
1082:
1083: private static $_clean_request;
1084:
1085: private static $_request_url;
1086:
1087: private static $_clean_applied = false;
1088:
1089: private static $_url;
1090:
1091: private static $_language_detected = null;
1092:
1093: private static $_vars = array();
1094:
1095: 1096: 1097: 1098: 1099: 1100: 1101:
1102: public static function get_permalink_structure() {
1103: if( ! isset( self::$_permalink_structure ) ) self::$_permalink_structure = get_option( "permalink_structure" );
1104:
1105: return self::$_permalink_structure;
1106: }
1107:
1108: 1109: 1110: 1111: 1112: 1113: 1114: 1115: 1116:
1117: public static function get_home_url( $slug = null ) {
1118: $_cml_settings = & $GLOBALS[ '_cml_settings' ];
1119:
1120: if( null === $slug ) $slug = CMLLanguage::get_default()->cml_language_slug;
1121:
1122: switch( CMLUtils::get_url_mode() ) {
1123: case PRE_PATH:
1124: if( $slug == CMLLanguage::get_default()->cml_language_slug &&
1125: $_cml_settings[ 'url_mode_remove_default' ] ) {
1126: $slug = "";
1127: } else
1128: $slug = "/$slug";
1129:
1130: $link = CMLUtils::home_url() . $slug;
1131: break;
1132: case PRE_DOMAIN:
1133: $link = CMLUtils::home_url();
1134: break;
1135: default:
1136: $link = CMLUtils::home_url() . "?lang=$slug";
1137: break;
1138: }
1139:
1140: return $link;
1141: }
1142:
1143: 1144: 1145:
1146: public static function get_url_mode() {
1147: if( empty( self::$_url_mode ) ) {
1148: global $_cml_settings;
1149:
1150: self::$_url_mode = $_cml_settings[ 'url_mode' ];
1151:
1152: $permalink = self::get_permalink_structure();
1153: if( empty( $permalink ) && self::$_url_mode == PRE_PATH )
1154: self::$_url_mode = PRE_LANG;
1155: }
1156:
1157: return self::$_url_mode;
1158: }
1159:
1160: 1161: 1162: 1163:
1164: public static function get_date_format() {
1165: if( empty( self::$_date_format ) ) self::$_date_format = get_option( 'date_format' );
1166:
1167: return self::$_date_format;
1168: }
1169:
1170: 1171: 1172: 1173: 1174: 1175: 1176: 1177: 1178: 1179: 1180: 1181: 1182: 1183: 1184: 1185: 1186: 1187: 1188:
1189: public static function home_url() {
1190: if( empty( self::$_home_url ) ) {
1191: $GLOBALS[ '_cml_no_translate_home_url' ] = true;
1192: self::$_home_url = home_url();
1193:
1194: unset( $GLOBALS[ '_cml_no_translate_home_url' ] );
1195: }
1196:
1197: return self::$_home_url;
1198: }
1199:
1200: 1201: 1202: 1203: 1204:
1205: public static function clear_url( $url = null ) {
1206: global $wp_rewrite;
1207:
1208: if( self::get_url_mode() != PRE_PATH
1209: || ( self::$_clean_applied == true &&
1210: null === $url ) ) {
1211: return self::$_language_detected;
1212: }
1213:
1214: if( empty( self::$_url ) ) {
1215: self::$_url = "http://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
1216: self::$_request_url = str_replace( trailingslashit( self::home_url() ),
1217: "", self::$_url );
1218: }
1219:
1220: if( null === $url ) {
1221: $_url = self::$_url;
1222: $request_url = self::$_request_url;
1223:
1224: 1225: 1226:
1227: self::$_clean_url = preg_replace( "/\?.*/", "", $_url );
1228: self::$_clean_request = $request_url;
1229: } else {
1230: $_url = $url;
1231: $request_url = str_replace( trailingslashit( self::home_url() ),
1232: "", $url );
1233: }
1234:
1235: $_url = $request_url;
1236: $base_url = str_replace( "http://" . $_SERVER['HTTP_HOST'], "", get_option( 'home' ) );
1237:
1238: if( preg_match( "#^([a-z]{2})(/.*)?$#i", $_url, $match ) ) {
1239: $lang = CMLLanguage::get_id_by_slug( $match[1] );
1240: if( empty( $lang ) ) {
1241: return $url;
1242: }
1243:
1244: $_url = substr( $_url, 3 );
1245: $_url = preg_replace( "/\?.*/", "", $_url );
1246:
1247: if( null === $url ) {
1248: self::$_language_detected = $lang;
1249:
1250: CMLLanguage::set_current( self::$_language_detected );
1251:
1252: self::$_clean_url = trailingslashit( self::$_home_url ) . $_url;
1253: self::$_clean_request = trailingslashit( $base_url ) . $_url;
1254: } else {
1255: $_url = trailingslashit( CMLUtils::home_url() ) . $_url;
1256: }
1257: }
1258:
1259: if( null === $url ) {
1260: self::$_clean_applied = true;
1261: }
1262:
1263: return ( null === $url ) ? self::$_language_detected : $_url;
1264: }
1265:
1266: 1267: 1268: 1269: 1270: 1271: 1272: 1273: 1274: 1275: 1276: 1277: 1278:
1279: public static function get_clean_url() {
1280: return self::$_clean_url;
1281: }
1282:
1283: 1284: 1285: 1286: 1287:
1288: public static function get_clean_request() {
1289: return self::$_clean_request;
1290: }
1291:
1292: 1293: 1294:
1295: public static function _set( $key, $value ) {
1296: self::$_vars[ $key ] = $value;
1297: }
1298:
1299: 1300: 1301:
1302: public static function _get( $key ) {
1303: return isset( self::$_vars[ $key ] ) ? self::$_vars[ $key ] : null;
1304: }
1305:
1306: 1307: 1308:
1309: public static function _append( $key, $value ) {
1310: if( ! isset( self::$_vars[ $key ] ) ) {
1311: self::$_vars[ $key ] = array();
1312: }
1313:
1314: self::$_vars[ $key ][] = $value;
1315: }
1316: }
1317: ?>