(bug 1495) Include the site language in the fallback list
authorMormegil <mormegil@centrum.cz>
Mon, 25 Mar 2013 22:50:47 +0000 (23:50 +0100)
committerMormegil <mormegil@centrum.cz>
Mon, 25 Mar 2013 22:50:47 +0000 (23:50 +0100)
In Iaaf6ccebd8c40c9602748c58c3a5c73c29e7aa4d, the behavior of MessageCache
was changed so that it iterates over all possible on-wiki fallbacks including
the site language fallbacks. However, it omitted the site language itself.
Obviously, the problem appears only when the site language is not English,
because English is included always as the fallback language of last resort.
But in other cases, we need to add it explicitly.

Bug: 1495
Change-Id: Ib607a446d3499a3c042dce408db5cbaf12fa9e3d

languages/Language.php
tests/phpunit/includes/cache/MessageCacheTest.php

index 42883b5..16de816 100644 (file)
@@ -4006,8 +4006,9 @@ class Language {
                        if ( end( $fallbacks ) === 'en' ) {
                                array_pop( $fallbacks );
                        }
-                       // Append the site's fallback chain
+                       // 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_intersect( array_diff( $siteFallbacks, $fallbacks ), $siteFallbacks );
index eda06d4..3b3e4a6 100644 (file)
@@ -8,25 +8,44 @@ class MessageCacheTest extends MediaWikiLangTestCase {
 
        protected function setUp() {
                parent::setUp();
+               $this->configureLanguages();
                MessageCache::singleton()->enable();
        }
 
-       function addDBData() {
-               // be sure english messages under $key, not $key/en
+       /**
+        * Helper function -- setup site language for testing
+        */
+       protected function configureLanguages() {
+               // for the test, we need the content language to be anything but English,
+               // let's choose e.g. German (de)
+               $langCode = 'de';
+               $langObj = Language::factory( $langCode );
+
                $this->setMwGlobals( array(
-                       'wgLanguageCode' => 'en',
-                       'wgContLang' => Language::factory( 'en' ),
+                       'wgLanguageCode' => $langCode,
+                       'wgLang' => $langObj,
+                       'wgContLang' => $langObj,
                ) );
+       }
+
+       function addDBData() {
+               $this->configureLanguages();
 
-               // Set up messages and fallbacks ab -> ru -> en
+               // Set up messages and fallbacks ab -> ru -> de -> en
                $this->makePage( 'FallbackLanguageTest-Full', 'ab' );
                $this->makePage( 'FallbackLanguageTest-Full', 'ru' );
+               $this->makePage( 'FallbackLanguageTest-Full', 'de' );
                $this->makePage( 'FallbackLanguageTest-Full', 'en' );
 
                // Fallbacks where ab does not exist
                $this->makePage( 'FallbackLanguageTest-Partial', 'ru' );
+               $this->makePage( 'FallbackLanguageTest-Partial', 'de' );
                $this->makePage( 'FallbackLanguageTest-Partial', 'en' );
 
+               // Fallback to the content language
+               $this->makePage( 'FallbackLanguageTest-ContLang', 'de' );
+               $this->makePage( 'FallbackLanguageTest-ContLang', 'en' );
+
                // Fallback to english
                $this->makePage( 'FallbackLanguageTest-English', 'en' );
 
@@ -67,6 +86,7 @@ class MessageCacheTest extends MediaWikiLangTestCase {
                return array(
                        array( 'FallbackLanguageTest-Full', 'ab', 'ab' ),
                        array( 'FallbackLanguageTest-Partial', 'ab', 'ru' ),
+                       array( 'FallbackLanguageTest-ContLang', 'ab', 'de' ),
                        array( 'FallbackLanguageTest-English', 'ab', 'en' ),
                        array( 'FallbackLanguageTest-None', 'ab', false ),
                );