* Use WebRequest::getAcceptLang() instead of home-brewed code (and in LanguageConverter too).
* Refactored that function to use getHeader()
*/
public function getAcceptLang() {
// Modified version of code found at http://www.thefutureoftheweb.com/blog/use-accept-language-header
- if ( !isset( $_SERVER['HTTP_ACCEPT_LANGUAGE'] ) ) {
+ $acceptLang = $this->getHeader( 'Accept-Language' );
+ if ( !$acceptLang ) {
return array();
}
// Break up string into pieces (languages and q factors)
$lang_parse = null;
preg_match_all( '/([a-z]{1,8}(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0(\.[0-9]+))?)?/i',
- $_SERVER['HTTP_ACCEPT_LANGUAGE'], $lang_parse );
+ $acceptLang, $lang_parse );
if ( !count( $lang_parse[1] ) ) {
return array();
* @return string
*/
public function getAcceptLanguage() {
- global $wgLanguageCode;
+ global $wgLanguageCode, $wgRequest;
$mwLanguages = Language::getLanguageNames();
- $langs = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
+ $headerLanguages = array_keys( $wgRequest->getAcceptLang() );
- foreach ( explode( ';', $langs ) as $splitted ) {
- foreach ( explode( ',', $splitted ) as $lang ) {
- $lang = trim( strtolower( $lang ) );
-
- if ( $lang == '' || $lang[0] == 'q' ) {
- continue;
- }
-
- if ( isset( $mwLanguages[$lang] ) ) {
- return $lang;
- }
-
- $lang = preg_replace( '/^(.*?)(?=-[^-]*)$/', '\\1', $lang );
-
- if ( $lang != '' && isset( $mwLanguages[$lang] ) ) {
- return $lang;
- }
+ foreach ( $headerLanguages as $lang ) {
+ if ( isset( $mwLanguages[$lang] ) ) {
+ return $lang;
}
}
// see if some supported language variant is set in the
// http header.
- $acceptLanguage = $wgRequest->getHeader( 'Accept-Language' );
- if ( !$acceptLanguage ) {
+ $languages = array_keys( $wgRequest->getAcceptLang() );
+ if ( empty( $languages ) ) {
return null;
}
- // explode by comma
- $result = StringUtils::explode( ',', strtolower( $acceptLanguage ) );
- $languages = array();
-
- foreach ( $result as $elem ) {
- // if $elem likes 'zh-cn;q=0.9'
- if ( ( $posi = strpos( $elem, ';' ) ) !== false ) {
- // get the real language code likes 'zh-cn'
- $languages[] = substr( $elem, 0, $posi );
- } else {
- $languages[] = $elem;
- }
- }
-
$fallback_languages = array();
foreach ( $languages as $language ) {
- // strip whitespace
- $language = trim( $language );
$this->mHeaderVariant = $this->validateVariant( $language );
if ( $this->mHeaderVariant ) {
break;