X-Git-Url: https://git.cyclocoop.org/?a=blobdiff_plain;f=languages%2FLanguage.php;h=ea34363b4f85f722d99f9a811680cb1925d4dc71;hb=0073be25d95541c8cd9ec53de6d4551bad9b62ca;hp=7ec37a1a0b9b131af82c519400a72afbceb40445;hpb=35f0a66f32ee99f7eb348526db1e6cc4301f4ab1;p=lhc%2Fweb%2Fwiklou.git diff --git a/languages/Language.php b/languages/Language.php index 7ec37a1a0b..ea34363b4f 100644 --- a/languages/Language.php +++ b/languages/Language.php @@ -32,7 +32,7 @@ if ( !defined( 'MEDIAWIKI' ) ) { # Read language names global $wgLanguageNames; -require_once( __DIR__ . '/Names.php' ); +require_once __DIR__ . '/Names.php'; if ( function_exists( 'mb_strtoupper' ) ) { mb_internal_encoding( 'UTF-8' ); @@ -170,6 +170,14 @@ class Language { 'seconds' => 1, ); + /** + * Cache for language fallbacks. + * @see Language::getFallbacksIncludingSiteLanguage + * @since 1.21 + * @var array + */ + static private $fallbackLanguageCache = array(); + /** * Get a cached or new language object for a given language code * @param $code String @@ -326,13 +334,19 @@ class Language { * @return bool */ public static function isValidCode( $code ) { - return - // People think language codes are html safe, so enforce it. - // Ideally we should only allow a-zA-Z0-9- - // but, .+ and other chars are often used for {{int:}} hacks - // see bugs 37564, 37587, 36938 + static $cache = array(); + if ( isset( $cache[$code] ) ) { + return $cache[$code]; + } + // People think language codes are html safe, so enforce it. + // Ideally we should only allow a-zA-Z0-9- + // but, .+ and other chars are often used for {{int:}} hacks + // see bugs 37564, 37587, 36938 + $cache[$code] = strcspn( $code, ":/\\\000&<>'\"" ) === strlen( $code ) && !preg_match( Title::getTitleInvalidRegex(), $code ); + + return $cache[$code]; } /** @@ -372,7 +386,7 @@ class Language { static $coreLanguageNames; if ( $coreLanguageNames === null ) { - include( MWInit::compiledPath( 'languages/Names.php' ) ); + include MWInit::compiledPath( 'languages/Names.php' ); } if ( isset( $coreLanguageNames[$tag] ) @@ -408,10 +422,8 @@ class Language { return; } - if ( !defined( 'MW_COMPILED' ) ) { - if ( file_exists( "$IP/languages/classes/$class.php" ) ) { - include_once( "$IP/languages/classes/$class.php" ); - } + if ( file_exists( "$IP/languages/classes/$class.php" ) ) { + include_once "$IP/languages/classes/$class.php"; } } @@ -845,7 +857,7 @@ class Language { static $coreLanguageNames; if ( $coreLanguageNames === null ) { - include( MWInit::compiledPath( 'languages/Names.php' ) ); + include MWInit::compiledPath( 'languages/Names.php' ); } $names = array(); @@ -1832,7 +1844,7 @@ class Language { } $start = substr( $str, 0, strlen( $str ) - 2 ); $end = substr( $str, strlen( $str ) - 2 ); - switch( $end ) { + switch ( $end ) { case 'כ': $str = $start . 'ך'; break; @@ -3593,10 +3605,6 @@ class Language { * @return string Correct form of plural for $count in this language */ function convertPlural( $count, $forms ) { - if ( !count( $forms ) ) { - return ''; - } - // Handle explicit n=pluralform cases foreach ( $forms as $index => $form ) { if ( preg_match( '/\d+=/i', $form ) ) { @@ -3607,7 +3615,11 @@ class Language { unset( $forms[$index] ); } } + $forms = array_values( $forms ); + if ( !count( $forms ) ) { + return ''; + } $pluralForm = $this->getPluralRuleIndexNumber( $count ); $pluralForm = min( $pluralForm, count( $forms ) - 1 ); @@ -4049,6 +4061,36 @@ class Language { } } + /** + * Get the ordered list of fallback languages, ending with the fallback + * language chain for the site language. + * + * @since 1.22 + * @param string $code Language code + * @return array array( fallbacks, site fallbacks ) + */ + public static function getFallbacksIncludingSiteLanguage( $code ) { + global $wgLanguageCode; + + // Usually, we will only store a tiny number of fallback chains, so we + // keep them in static memory. + $cacheKey = "{$code}-{$wgLanguageCode}"; + + if ( !array_key_exists( $cacheKey, self::$fallbackLanguageCache ) ) { + $fallbacks = self::getFallbacksFor( $code ); + + // Append the site's fallback chain, including the site language itself + $siteFallbacks = self::getFallbacksFor( $wgLanguageCode ); + array_unshift( $siteFallbacks, $wgLanguageCode ); + + // Eliminate any languages already included in the chain + $siteFallbacks = array_diff( $siteFallbacks, $fallbacks ); + + self::$fallbackLanguageCache[$cacheKey] = array( $fallbacks, $siteFallbacks ); + } + return self::$fallbackLanguageCache[$cacheKey]; + } + /** * Get all messages for a given language * WARNING: this may take a long time. If you just need all message *keys*