From 3b147f876a0c7450025d2fe4e8c7117cb2be50d0 Mon Sep 17 00:00:00 2001 From: "Mark A. Hershberger" Date: Mon, 11 Jan 2010 05:53:39 +0000 Subject: [PATCH] cleaned up getPreferredVariant() (MUCH easier to follow the logic), found a bug or two --- languages/LanguageConverter.php | 77 +++++++++++++++------------------ tests/LanguageConverterTest.php | 17 ++++++-- 2 files changed, 47 insertions(+), 47 deletions(-) diff --git a/languages/LanguageConverter.php b/languages/LanguageConverter.php index 113c470b25..23d532c728 100644 --- a/languages/LanguageConverter.php +++ b/languages/LanguageConverter.php @@ -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 = ''; diff --git a/tests/LanguageConverterTest.php b/tests/LanguageConverterTest.php index 872cecc901..fe6dff88e1 100644 --- a/tests/LanguageConverterTest.php +++ b/tests/LanguageConverterTest.php @@ -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)); + } } -- 2.20.1