- $fallback_languages = array();
- $ret_language = null;
- foreach( $languages as $language ) {
- // strip whitespace
- $language = trim( $language );
- if( in_array( $language, $this->mVariants ) ) {
- $ret_language = $language;
- break;
- }
- else {
- // 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 );
- }
- }
-
- // process fallback languages now
- if( $ret_language === null ) {
- $fallback_languages = array_unique( $fallback_languages );
- foreach( $fallback_languages as $language ) {
- if( in_array( $language, $this->mVariants ) ) {
- $ret_language = $language;
- break;
- }
- }
- }
-
- // bug 21672: Add Accept-Language to Vary and XVO headers
- // to help Squid to determine user's perferred local language
- // ONLY add Accept-Language when a variant has been found out
- // thanks to Liangent's help
- if( $ret_language !== $this->mMainLanguageCode ) {
- global $wgOut, $wgUseXVO;
- $wgOut->addVaryHeader( 'Accept-Language' );
- if( $wgUseXVO ) {
- $aloption = array();
- foreach( $this->mVariants as $variant ) {
- if($variant === $this->mMainLanguageCode)
- continue;
- $aloption[] = 'string-contains=' . $variant;
- }
- $wgOut->addXVOHeader( 'Accept-Language', $aloption );
- }
+ 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 );
+ }
+ }
+
+ if ( !$this->mHeaderVariant ) {
+ // process fallback languages now
+ $fallback_languages = array_unique( $fallback_languages );
+ foreach ( $fallback_languages as $language ) {
+ $this->mHeaderVariant = $this->validateVariant( $language );
+ if ( $this->mHeaderVariant ) {
+ break;