- if( $fromUser && $wgUser->isLoggedIn() ) {
- $this->mPreferredVariant = $wgUser->getOption('variant');
- return $this->mPreferredVariant;
- }
-
- // see if default variant is globaly set
- if($wgDefaultLanguageVariant != false && in_array( $wgDefaultLanguageVariant, $this->mVariants )){
- $this->mPreferredVariant = $wgDefaultLanguageVariant;
- return $this->mPreferredVariant;
- }
-
- # FIXME rewrite code for parsing http header. The current code
- # is written specific for detecting zh- variants
- if( !$this->mPreferredVariant ) {
- // see if some supported language variant is set in the
- // http header, but we don't set the mPreferredVariant
- // variable in case this is called before the user's
- // preference is loaded
- $pv=$this->mMainLanguageCode;
- if(array_key_exists('HTTP_ACCEPT_LANGUAGE', $_SERVER)) {
- $header = str_replace( '_', '-', strtolower($_SERVER["HTTP_ACCEPT_LANGUAGE"]));
- $zh = strstr($header, $pv.'-');
- if($zh) {
- $pv = substr($zh,0,5);
- }
+ if ( $wgUser->isLoggedIn() ) {
+ $ret = $wgUser->getOption( 'variant' );
+ } else {
+ // figure out user lang without constructing wgLang to avoid
+ // infinite recursion
+ $ret = $wgUser->getOption( 'language' );
+ }
+
+ return $this->mUserVariant = $this->validateVariant( $ret );
+ }
+
+ /**
+ * Determine the language variant from the Accept-Language header.
+ *
+ * @return Mixed: variant if one found, false otherwise.
+ */
+ protected function getHeaderVariant() {
+ global $wgRequest;
+
+ if ( $this->mHeaderVariant ) {
+ return $this->mHeaderVariant;
+ }
+
+ // see if some supported language variant is set in the
+ // HTTP header.
+ $languages = array_keys( $wgRequest->getAcceptLang() );
+ if ( empty( $languages ) ) {
+ return null;
+ }
+
+ $fallbackLanguages = array();
+ foreach ( $languages as $language ) {
+ $this->mHeaderVariant = $this->validateVariant( $language );
+ if ( $this->mHeaderVariant ) {
+ break;
+ }
+
+ // To see if there are fallbacks of current language.
+ // We record these fallback variants, and process
+ // them later.
+ $fallbacks = $this->getVariantFallbacks( $language );
+ if ( is_string( $fallbacks ) ) {
+ $fallbackLanguages[] = $fallbacks;
+ } elseif ( is_array( $fallbacks ) ) {
+ $fallbackLanguages =
+ array_merge( $fallbackLanguages, $fallbacks );