From: Liangent Date: Wed, 12 Jun 2013 12:13:04 +0000 (+0000) Subject: Allow more than one variant set in user preferences. X-Git-Tag: 1.31.0-rc.0~18959 X-Git-Url: http://git.cyclocoop.org/%7B%24admin_url%7Dmes_infos.php?a=commitdiff_plain;h=3a06dd9be90166d0c85abe2750199d6162f6f5ff;p=lhc%2Fweb%2Fwiklou.git Allow more than one variant set in user preferences. Now with the introduction of page language, a site can have pages in all languages, and different languages have different variants. This patch allows users to set preferred variants for every page they may see on the site. Change-Id: Ie7e82bee0b1f8f902b38bb4a464cf0ebc4df4d89 --- diff --git a/includes/Preferences.php b/includes/Preferences.php index 709f15cba3..f5f63eab48 100644 --- a/includes/Preferences.php +++ b/includes/Preferences.php @@ -335,35 +335,44 @@ class Preferences { // see if there are multiple language variants to choose from if ( !$wgDisableLangConversion ) { - $variants = $wgContLang->getVariants(); + foreach ( LanguageConverter::$languagesWithVariants as $langCode ) { + if ( $langCode == $wgContLang->getCode() ) { + $variants = $wgContLang->getVariants(); - if ( count( $variants ) > 1 ) { - $variantArray = array(); - foreach ( $variants as $v ) { - $v = str_replace( '_', '-', strtolower( $v ) ); - $variantArray[$v] = $wgContLang->getVariantname( $v, false ); - } + if ( count( $variants ) <= 1 ) { + continue; + } - $options = array(); - foreach ( $variantArray as $code => $name ) { - $display = wfBCP47( $code ) . ' - ' . $name; - $options[$display] = $code; - } + $variantArray = array(); + foreach ( $variants as $v ) { + $v = str_replace( '_', '-', strtolower( $v ) ); + $variantArray[$v] = $lang->getVariantname( $v, false ); + } - $defaultPreferences['variant'] = array( - 'label-message' => 'yourvariant', - 'type' => 'select', - 'options' => $options, - 'section' => 'personal/i18n', - 'help-message' => 'prefs-help-variant', - ); + $options = array(); + foreach ( $variantArray as $code => $name ) { + $display = wfBCP47( $code ) . ' - ' . $name; + $options[$display] = $code; + } - if ( !$wgDisableTitleConversion ) { - $defaultPreferences['noconvertlink'] = - array( - 'type' => 'toggle', + $defaultPreferences['variant'] = array( + 'label-message' => 'yourvariant', + 'type' => 'select', + 'options' => $options, 'section' => 'personal/i18n', - 'label-message' => 'tog-noconvertlink', + 'help-message' => 'prefs-help-variant', + ); + + if ( !$wgDisableTitleConversion ) { + $defaultPreferences['noconvertlink'] = array( + 'type' => 'toggle', + 'section' => 'personal/i18n', + 'label-message' => 'tog-noconvertlink', + ); + } + } else { + $defaultPreferences["variant-$langCode"] = array( + 'type' => 'api', ); } } diff --git a/includes/User.php b/includes/User.php index fedc6a9400..3c0e1f6ec1 100644 --- a/includes/User.php +++ b/includes/User.php @@ -1240,7 +1240,10 @@ class User { $defOpt = $wgDefaultUserOptions; // Default language setting - $defOpt['language'] = $defOpt['variant'] = $wgContLang->getCode(); + $defOpt['language'] = $wgContLang->getCode(); + foreach ( LanguageConverter::$languagesWithVariants as $langCode ) { + $defOpt[$langCode == $wgContLang->getCode() ? 'variant' : "variant-$langCode"] = $langCode; + } foreach ( SearchEngine::searchableNamespaces() as $nsnum => $nsname ) { $defOpt['searchNs' . $nsnum] = !empty( $wgNamespacesToBeSearchedDefault[$nsnum] ); } diff --git a/languages/LanguageConverter.php b/languages/LanguageConverter.php index a02fc8ad97..11d36a8dd0 100644 --- a/languages/LanguageConverter.php +++ b/languages/LanguageConverter.php @@ -246,7 +246,7 @@ class LanguageConverter { * @return Mixed: variant if one found, false otherwise. */ protected function getUserVariant() { - global $wgUser; + global $wgUser, $wgContLang; // memoizing this function wreaks havoc on parserTest.php /* @@ -259,7 +259,11 @@ class LanguageConverter { // Don't call this on stub objects because that causes infinite // recursion during initialisation if ( $wgUser->isLoggedIn() ) { - $ret = $wgUser->getOption( 'variant' ); + if ( $this->mMainLanguageCode == $wgContLang->getCode() ) { + $ret = $wgUser->getOption( 'variant' ); + } else { + $ret = $wgUser->getOption( 'variant-' . $this->mMainLanguageCode ); + } } else { // figure out user lang without constructing wgLang to avoid // infinite recursion diff --git a/tests/phpunit/includes/LanguageConverterTest.php b/tests/phpunit/includes/LanguageConverterTest.php index 93ce1195a1..070a680f1d 100644 --- a/tests/phpunit/includes/LanguageConverterTest.php +++ b/tests/phpunit/includes/LanguageConverterTest.php @@ -75,6 +75,20 @@ class LanguageConverterTest extends MediaWikiLangTestCase { $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() ); } + function testGetPreferredVariantUserOptionForForeignLanguage() { + global $wgContLang, $wgUser; + + $wgContLang = Language::factory( 'en' ); + $wgUser = new User; + $wgUser->load(); // from 'defaults' + $wgUser->mId = 1; + $wgUser->mDataLoaded = true; + $wgUser->mOptionsLoaded = true; + $wgUser->setOption( 'variant-tg', 'tg-latn' ); + + $this->assertEquals( 'tg-latn', $this->lc->getPreferredVariant() ); + } + function testGetPreferredVariantHeaderUserVsUrl() { global $wgContLang, $wgRequest, $wgUser;