- 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;
- }
-
- 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
- if( array_key_exists( 'HTTP_ACCEPT_LANGUAGE', $_SERVER ) ) {
- $acceptLanguage = str_replace( '_', '-', strtolower($_SERVER["HTTP_ACCEPT_LANGUAGE"]));
-
- // take the part of the string up to the first semicolon
- if($semiPos = strpos( $acceptLanguage, ';' ) !== false )
- $acceptLanguage = substr( $acceptLanguage, 0, $semiPos );
-
- // explode by comma
- $languages = explode(',', $acceptLanguage);
-
- foreach( $languages as $language ) {
- // strip whitespace
- $language = trim( $language );
- if( in_array( $language, $this->mVariants ) ) {
- return $language;
- break;
- }
- }
+ 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;
+ }
+
+ $fallback_languages = 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 ) ) {
+ $fallback_languages[] = $fallbacks;
+ } elseif ( is_array( $fallbacks ) ) {
+ $fallback_languages =
+ array_merge( $fallback_languages,
+ $fallbacks );