Big oops - merged to wrong branch.
[lhc/web/wiklou.git] / languages / Language.php
index b7d7306..656f5d0 100644 (file)
@@ -19,7 +19,9 @@ if ( !defined( 'MEDIAWIKI' ) ) {
 global $wgLanguageNames;
 require_once( dirname( __FILE__ ) . '/Names.php' );
 
-mb_internal_encoding( 'UTF-8' );
+if ( function_exists( 'mb_strtoupper' ) ) {
+       mb_internal_encoding( 'UTF-8' );
+}
 
 /**
  * a fake language converter
@@ -282,10 +284,6 @@ class Language {
                }
 
                if ( !defined( 'MW_COMPILED' ) ) {
-                       // Preload base classes to work around APC/PHP5 bug
-                       if ( file_exists( "$IP/languages/classes/$class.deps.php" ) ) {
-                               include_once( "$IP/languages/classes/$class.deps.php" );
-                       }
                        if ( file_exists( "$IP/languages/classes/$class.php" ) ) {
                                include_once( "$IP/languages/classes/$class.php" );
                        }
@@ -732,9 +730,8 @@ class Language {
                $mwNames = $wgExtraLanguageNames + $coreLanguageNames;
                foreach ( $mwNames as $mwCode => $mwName ) {
                        # - Prefer own MediaWiki native name when not using the hook
-                       #       TODO: prefer it always to make it consistent, but casing is different in CLDR
                        # - For other names just add if not added through the hook
-                       if ( ( $mwCode === $inLanguage && !$inLanguage ) || !isset( $names[$mwCode] ) ) {
+                       if ( $mwCode === $inLanguage || !isset( $names[$mwCode] ) ) {
                                $names[$mwCode] = $mwName;
                        }
                }
@@ -2150,6 +2147,24 @@ class Language {
                return mb_strtoupper( $matches[0] );
        }
 
+       /**
+        * @param $matches array
+        * @return string
+        */
+       function ucCallback( $matches ) {
+               list( $wikiUpperChars ) = self::getCaseMaps();
+               return strtr( $matches[1], $wikiUpperChars );
+       }
+
+       /**
+        * @param $matches array
+        * @return string
+        */
+       function lcCallback( $matches ) {
+               list( , $wikiLowerChars ) = self::getCaseMaps();
+               return strtr( $matches[1], $wikiLowerChars );
+       }
+
        /**
         * @param $matches array
         * @return string
@@ -2158,6 +2173,15 @@ class Language {
                return mb_strtoupper( $matches[0] );
        }
 
+       /**
+        * @param $matches array
+        * @return string
+        */
+       function ucwordsCallbackWiki( $matches ) {
+               list( $wikiUpperChars ) = self::getCaseMaps();
+               return strtr( $matches[0], $wikiUpperChars );
+       }
+
        /**
         * Make a string's first character uppercase
         *
@@ -2186,14 +2210,27 @@ class Language {
         * @return string
         */
        function uc( $str, $first = false ) {
-               if ( $first ) {
-                       if ( $this->isMultibyte( $str ) ) {
-                               return mb_strtoupper( mb_substr( $str, 0, 1 ) ) . mb_substr( $str, 1 );
+               if ( function_exists( 'mb_strtoupper' ) ) {
+                       if ( $first ) {
+                               if ( $this->isMultibyte( $str ) ) {
+                                       return mb_strtoupper( mb_substr( $str, 0, 1 ) ) . mb_substr( $str, 1 );
+                               } else {
+                                       return ucfirst( $str );
+                               }
                        } else {
-                               return ucfirst( $str );
+                               return $this->isMultibyte( $str ) ? mb_strtoupper( $str ) : strtoupper( $str );
                        }
                } else {
-                       return $this->isMultibyte( $str ) ? mb_strtoupper( $str ) : strtoupper( $str );
+                       if ( $this->isMultibyte( $str ) ) {
+                               $x = $first ? '^' : '';
+                               return preg_replace_callback(
+                                       "/$x([a-z]|[\\xc0-\\xff][\\x80-\\xbf]*)/",
+                                       array( $this, 'ucCallback' ),
+                                       $str
+                               );
+                       } else {
+                               return $first ? ucfirst( $str ) : strtoupper( $str );
+                       }
                }
        }
 
@@ -2221,14 +2258,27 @@ class Language {
         * @return mixed|string
         */
        function lc( $str, $first = false ) {
-               if ( $first ) {
-                       if ( $this->isMultibyte( $str ) ) {
-                               return mb_strtolower( mb_substr( $str, 0, 1 ) ) . mb_substr( $str, 1 );
+               if ( function_exists( 'mb_strtolower' ) ) {
+                       if ( $first ) {
+                               if ( $this->isMultibyte( $str ) ) {
+                                       return mb_strtolower( mb_substr( $str, 0, 1 ) ) . mb_substr( $str, 1 );
+                               } else {
+                                       return strtolower( substr( $str, 0, 1 ) ) . substr( $str, 1 );
+                               }
                        } else {
-                               return strtolower( substr( $str, 0, 1 ) ) . substr( $str, 1 );
+                               return $this->isMultibyte( $str ) ? mb_strtolower( $str ) : strtolower( $str );
                        }
                } else {
-                       return $this->isMultibyte( $str ) ? mb_strtolower( $str ) : strtolower( $str );
+                       if ( $this->isMultibyte( $str ) ) {
+                               $x = $first ? '^' : '';
+                               return preg_replace_callback(
+                                       "/$x([A-Z]|[\\xc0-\\xff][\\x80-\\xbf]*)/",
+                                       array( $this, 'lcCallback' ),
+                                       $str
+                               );
+                       } else {
+                               return $first ? strtolower( substr( $str, 0, 1 ) ) . substr( $str, 1 ) : strtolower( $str );
+                       }
                }
        }
 
@@ -2252,11 +2302,19 @@ class Language {
                        $replaceRegexp = "/^([a-z]|[\\xc0-\\xff][\\x80-\\xbf]*)| ([a-z]|[\\xc0-\\xff][\\x80-\\xbf]*)/";
 
                        // function to use to capitalize a single char
-                       return preg_replace_callback(
-                               $replaceRegexp,
-                               array( $this, 'ucwordsCallbackMB' ),
-                               $str
-                       );
+                       if ( function_exists( 'mb_strtoupper' ) ) {
+                               return preg_replace_callback(
+                                       $replaceRegexp,
+                                       array( $this, 'ucwordsCallbackMB' ),
+                                       $str
+                               );
+                       } else {
+                               return preg_replace_callback(
+                                       $replaceRegexp,
+                                       array( $this, 'ucwordsCallbackWiki' ),
+                                       $str
+                               );
+                       }
                } else {
                        return ucwords( strtolower( $str ) );
                }
@@ -2278,11 +2336,19 @@ class Language {
                        // find first letter after word break
                        $replaceRegexp = "/^([a-z]|[\\xc0-\\xff][\\x80-\\xbf]*)|$breaks([a-z]|[\\xc0-\\xff][\\x80-\\xbf]*)/";
 
-                       return preg_replace_callback(
-                               $replaceRegexp,
-                               array( $this, 'ucwordbreaksCallbackMB' ),
-                               $str
-                       );
+                       if ( function_exists( 'mb_strtoupper' ) ) {
+                               return preg_replace_callback(
+                                       $replaceRegexp,
+                                       array( $this, 'ucwordbreaksCallbackMB' ),
+                                       $str
+                               );
+                       } else {
+                               return preg_replace_callback(
+                                       $replaceRegexp,
+                                       array( $this, 'ucwordsCallbackWiki' ),
+                                       $str
+                               );
+                       }
                } else {
                        return preg_replace_callback(
                                '/\b([\w\x80-\xff]+)\b/',
@@ -2325,8 +2391,12 @@ class Language {
                        return $s;
                }
 
-               $isutf8 = preg_match( '/^([\x00-\x7f]|[\xc0-\xdf][\x80-\xbf]|' .
-                               '[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3})+$/', $s );
+               if ( function_exists( 'mb_check_encoding' ) ) {
+                       $isutf8 = mb_check_encoding( $s, 'UTF-8' );
+               } else {
+                       $isutf8 = preg_match( '/^(?>[\x00-\x7f]|[\xc0-\xdf][\x80-\xbf]|' .
+                                       '[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3})+$/', $s );
+               }
                if ( $isutf8 ) {
                        return $s;
                }