Merge "Enable fallback languages when retrieving messages"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Sun, 26 May 2013 14:02:27 +0000 (14:02 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Sun, 26 May 2013 14:02:27 +0000 (14:02 +0000)
1  2 
languages/Language.php

diff --combined languages/Language.php
@@@ -32,7 -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 +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
                static $coreLanguageNames;
  
                if ( $coreLanguageNames === null ) {
 -                      include( MWInit::compiledPath( 'languages/Names.php' ) );
 +                      include MWInit::compiledPath( 'languages/Names.php' );
                }
  
                if ( isset( $coreLanguageNames[$tag] )
                }
  
                if ( file_exists( "$IP/languages/classes/$class.php" ) ) {
 -                      include_once( "$IP/languages/classes/$class.php" );
 +                      include_once "$IP/languages/classes/$class.php";
                }
        }
  
                static $coreLanguageNames;
  
                if ( $coreLanguageNames === null ) {
 -                      include( MWInit::compiledPath( 'languages/Names.php' ) );
 +                      include MWInit::compiledPath( 'languages/Names.php' );
                }
  
                $names = array();
         * @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 ) ) {
                                unset( $forms[$index] );
                        }
                }
 +
                $forms = array_values( $forms );
 +              if ( !count( $forms ) ) {
 +                      return '';
 +              }
  
                $pluralForm = $this->getPluralRuleIndexNumber( $count );
                $pluralForm = min( $pluralForm, count( $forms ) - 1 );
                }
        }
  
+       /**
+        * 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*