I18n#1473: Use preferred language for anonymous users

Change-Id: I25833bb4c35453bbb055b4782d996604c93ef7db
This commit is contained in:
Niklas Laxström
2012-08-30 15:33:11 +00:00
committed by Gerrit Code Review
parent 47e852f2e5
commit b1fad2c1bb
2 changed files with 42 additions and 3 deletions

View File

@@ -71,6 +71,31 @@ class UniversalLanguageSelectorHooks {
return isset( $supported[$language] ); 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 * Hook to UserGetLanguageObject
* @param $user User * @param $user User
@@ -78,7 +103,7 @@ class UniversalLanguageSelectorHooks {
* @return bool * @return bool
*/ */
public static function getLanguage( $user, &$code ) { public static function getLanguage( $user, &$code ) {
global $wgRequest; global $wgRequest, $wgULSLanguageDetection;
if ( $wgRequest->getVal( 'uselang' ) ) { if ( $wgRequest->getVal( 'uselang' ) ) {
// uselang can be used for temporary override of language preference // uselang can be used for temporary override of language preference
return true; return true;
@@ -101,12 +126,19 @@ class UniversalLanguageSelectorHooks {
$languageToUse = $wgRequest->getCookie( 'language' ); $languageToUse = $wgRequest->getCookie( 'language' );
} }
// Let the normal language loading mechanism decide if // Check whether we got valid language from store or
// there is no cookie or setlang override. // explicit language change.
if ( self::isSupportedLanguage( $languageToUse ) ) { if ( self::isSupportedLanguage( $languageToUse ) ) {
$code = $languageToUse; $code = $languageToUse;
} elseif ( $wgULSLanguageDetection ) {
$preferred = $wgRequest->getAcceptLang();
$default = self::getDefaultLanguage( $preferred );
if ( $default !== '' ) {
$code = $default;
}
} }
// Fall back to content language
return true; return true;
} }

View File

@@ -56,6 +56,13 @@ $wgExtensionCredits['other'][] = array(
*/ */
$wgULSGeoService = 'http://freegeoip.net/json/'; $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__ ; $dir = __DIR__ ;
// Internationalization // Internationalization