diff --git a/UniversalLanguageSelector.hooks.php b/UniversalLanguageSelector.hooks.php index 61ae2450..2b0e3025 100644 --- a/UniversalLanguageSelector.hooks.php +++ b/UniversalLanguageSelector.hooks.php @@ -71,6 +71,31 @@ class UniversalLanguageSelectorHooks { return isset( $supported[$language] ); } + /** + * @return string + */ + protected static function getDefaultLanguage( array $preferred ) { + $supported = Language::fetchLanguageNames( null, 'mwfile' ); + // look for a language that is acceptable to the client + // and known to the wiki. + foreach ( $preferred as $code => $weight ) { + if ( isset( $supported[$code] ) ) { + return $code; + } + } + + // Some browsers might only send codes like de-de. + // Try with bare code. + foreach ( $preferred as $code => $weight ) { + $parts = explode( '-', $code, 2 ); + $code = $parts[0]; + if ( isset( $supported[$code] ) ) { + return $code; + } + } + return ""; + } + /** * Hook to UserGetLanguageObject * @param $user User @@ -78,7 +103,7 @@ class UniversalLanguageSelectorHooks { * @return bool */ public static function getLanguage( $user, &$code ) { - global $wgRequest; + global $wgRequest, $wgULSLanguageDetection; if ( $wgRequest->getVal( 'uselang' ) ) { // uselang can be used for temporary override of language preference return true; @@ -101,12 +126,19 @@ class UniversalLanguageSelectorHooks { $languageToUse = $wgRequest->getCookie( 'language' ); } - // Let the normal language loading mechanism decide if - // there is no cookie or setlang override. + // Check whether we got valid language from store or + // explicit language change. if ( self::isSupportedLanguage( $languageToUse ) ) { $code = $languageToUse; + } elseif ( $wgULSLanguageDetection ) { + $preferred = $wgRequest->getAcceptLang(); + $default = self::getDefaultLanguage( $preferred ); + if ( $default !== '' ) { + $code = $default; + } } + // Fall back to content language return true; } diff --git a/UniversalLanguageSelector.php b/UniversalLanguageSelector.php index 6e989f18..faa80353 100644 --- a/UniversalLanguageSelector.php +++ b/UniversalLanguageSelector.php @@ -56,6 +56,13 @@ $wgExtensionCredits['other'][] = array( */ $wgULSGeoService = 'http://freegeoip.net/json/'; +/** + * Try to use preferred interface language for anonymous users. + * Do not use if you are caching anonymous page views without + * taking Accept-Language into account. + */ +$wgULSLanguageDetection = true; + $dir = __DIR__ ; // Internationalization