cleaned up getPreferredVariant() (MUCH easier to follow the logic), found a bug or two
authorMark A. Hershberger <mah@users.mediawiki.org>
Mon, 11 Jan 2010 05:53:39 +0000 (05:53 +0000)
committerMark A. Hershberger <mah@users.mediawiki.org>
Mon, 11 Jan 2010 05:53:39 +0000 (05:53 +0000)
languages/LanguageConverter.php
tests/LanguageConverterTest.php

index 113c470..23d532c 100644 (file)
@@ -142,61 +142,51 @@ class LanguageConverter {
 
                // see if the preference is set in the request
                $req = $wgRequest->getText( 'variant' );
-               if ( in_array( $req, $this->mVariants ) ) {
-                       $this->mPreferredVariant = $req;
-                       return $this->mPreferredVariant;
-               }
-
-        if ( $fromUser ) {
-                       // bug 21974, don't return $this->mPreferredVariant if
-                       // $fromUser = false
-                       if ( $this->mPreferredVariant ) {
-                               return $this->mPreferredVariant;
-                       }
-
-            // figure out user lang without constructing wgLang to avoid
-                       // infinite recursion
-                       $defaultUserLang = $wgUser->getOption( 'language' );
 
-                       // get language variant preference from logged in users
-                       // Don't call this on stub objects because that causes infinite
-                       // recursion during initialisation
-                       if ( $wgUser->isLoggedIn() )  {
-                               $this->mPreferredVariant = $wgUser->getOption( 'variant' );
-                       }
-
-               } else {
-                       $defaultUserLang = $this->mMainLanguageCode;
+               if ( !$req ) {
+                       $req = $wgRequest->getVal( 'uselang' );
                }
-               $userLang = $wgRequest->getVal( 'uselang', $defaultUserLang );
 
-               // see if interface language is same as content, if not, prevent
-               // conversion
-               if ( ! in_array( $userLang, $this->mVariants ) ) {
-                       // no conversion
-                       $this->mPreferredVariant = $this->mMainLanguageCode;
-                       return $this->mPreferredVariant;
-               } elseif ( $this->mPreferredVariant ) {
-                       // if the variant was set above and it iss a variant of
-                       // the content language
-                       return $this->mPreferredVariant;
+               if ( $fromUser && !$req ) {
+                       $req = $this->getUserVariant();
                }
 
-               // see if default variant is globaly set
-               if ( $wgDefaultLanguageVariant != false
-                        && in_array( $wgDefaultLanguageVariant, $this->mVariants ) ) {
-                       $this->mPreferredVariant = $wgDefaultLanguageVariant;
-                       return $this->mPreferredVariant;
+               if ( $fromHeader && !$req ) {
+                       $req = $this->getHeaderVariant();
                }
 
-               $headerVariant = $this->getHeaderVariant();
-               if ( $fromHeader && $headerVariant ) {
-                       return $headerVariant;
+               if ( $wgDefaultLanguageVariant && !$req ) {
+                       $req = $wgDefaultLanguageVariant;
                }
 
+               if ( in_array( $req, $this->mVariants ) ) {
+                       return $req;
+               }
                return $this->mMainLanguageCode;
        }
 
+       /**
+        * Determine the user has a variant set.
+        *
+        * @returns mixed variant if one found, false otherwise.
+        */
+       function getUserVariant() {
+               global $wgUser;
+
+               // get language variant preference from logged in users
+               // Don't call this on stub objects because that causes infinite
+               // recursion during initialisation
+               if ( $wgUser->isLoggedIn() )  {
+                       return $wgUser->getOption( 'variant' );
+               }
+               else {
+                       // figure out user lang without constructing wgLang to avoid
+                       // infinite recursion
+                       return $wgUser->getOption( 'language' );
+               }
+       }
+
+
        /**
         * Determine the language variant from the Accept-Language header.
         *
@@ -550,6 +540,7 @@ class LanguageConverter {
                if ( $wgDisableLangConversion ) return $text;
 
                $plang = $this->getPreferredVariant();
+
                $tarray = StringUtils::explode( $this->mMarkup['end'], $text );
                $converted = '';
 
index 872cecc..fe6dff8 100644 (file)
@@ -28,7 +28,7 @@ class LanguageConverterTest extends PHPUnit_Framework_TestCase {
 
                $wgRequest = new FauxRequest(array());
                $wgUser    = new User;
-               $wgContLang = Language::factory( 'tg-latn' );
+               $wgContLang = Language::factory( 'tg' );
 
                $this->assertEquals('tg', $this->lc->getPreferredVariant(false, false));
                $this->assertEquals('tg', $this->lc->getPreferredVariant(false, true));
@@ -41,7 +41,7 @@ class LanguageConverterTest extends PHPUnit_Framework_TestCase {
                $this->assertEquals('tg', $this->lc->getPreferredVariant(false, false));
                $this->assertEquals('tg-latn', $this->lc->getPreferredVariant(false, true));
                $this->assertEquals('tg', $this->lc->getPreferredVariant(true, false));
-               $this->assertEquals('tg-latn', $this->lc->getPreferredVariant(true, true));
+               $this->assertEquals('tg', $this->lc->getPreferredVariant(true, true));
 
                $wgRequest->setHeader('Accept-Language', 'tg;q=1');
                $this->lc = new TestConverter( $this->lang, 'tg',
@@ -57,7 +57,7 @@ class LanguageConverterTest extends PHPUnit_Framework_TestCase {
                $this->assertEquals('tg', $this->lc->getPreferredVariant(false, false));
                $this->assertEquals('tg-latn', $this->lc->getPreferredVariant(false, true));
                $this->assertEquals('tg', $this->lc->getPreferredVariant(true, false));
-               $this->assertEquals('tg-latn', $this->lc->getPreferredVariant(true, true));
+               $this->assertEquals('tg', $this->lc->getPreferredVariant(true, true));
 
                $wgRequest->setHeader('Accept-Language', 'en, tg-latn;q=1');
                $this->lc = new TestConverter( $this->lang, 'tg',
@@ -65,7 +65,7 @@ class LanguageConverterTest extends PHPUnit_Framework_TestCase {
                $this->assertEquals('tg', $this->lc->getPreferredVariant(false, false));
                $this->assertEquals('tg-latn', $this->lc->getPreferredVariant(false, true));
                $this->assertEquals('tg', $this->lc->getPreferredVariant(true, false));
-               $this->assertEquals('tg-latn', $this->lc->getPreferredVariant(true, true));
+               $this->assertEquals('tg', $this->lc->getPreferredVariant(true, true));
                $wgRequest->setHeader('Accept-Language', '');
 
                $wgUser = User::newFromId("admin");
@@ -95,6 +95,15 @@ class LanguageConverterTest extends PHPUnit_Framework_TestCase {
                $this->assertEquals('tg-latn', $this->lc->getPreferredVariant(true, false));
                $this->assertEquals('tg-latn', $this->lc->getPreferredVariant(true, true));
 
+               $wgRequest->setVal('variant', null);
+               $wgDefaultLanguageVariant = 'tg';
+               $this->lc = new TestConverter( $this->lang, 'tg',
+                                                                          array( 'tg', 'tg-latn' ) );
+               $this->assertEquals('tg', $this->lc->getPreferredVariant(false, false));
+               $this->assertEquals('tg', $this->lc->getPreferredVariant(false, true));
+               $this->assertEquals('tg-latn', $this->lc->getPreferredVariant(true, false));
+               $this->assertEquals('tg-latn', $this->lc->getPreferredVariant(true, true));
+
 
        }
 }