diff --git a/UniversalLanguageSelector.hooks.php b/UniversalLanguageSelector.hooks.php index 460d929c..989d6478 100644 --- a/UniversalLanguageSelector.hooks.php +++ b/UniversalLanguageSelector.hooks.php @@ -350,11 +350,25 @@ class UniversalLanguageSelectorHooks { // Place request context dependent stuff here + $user = $out->getUser(); + $loggedIn = $user->isLoggedIn(); + // Do not output accept languages if there is risk it will get cached accross requests - if ( $wgULSAnonCanChangeLanguage || $out->getUser()->isLoggedIn() ) { + if ( $wgULSAnonCanChangeLanguage || $loggedIn ) { $vars['wgULSAcceptLanguageList'] = array_keys( $out->getRequest()->getAcceptLang() ); } + if ( $loggedIn && class_exists( Babel::class ) ) { + $userLanguageInfo = Babel::getCachedUserLanguageInfo( $user ); + + // This relies on the fact that Babel levels are 'N' and + // the digits 0 to 5 as strings, and that in reverse + // ASCII order they will be 'N', '5', '4', '3', '2', '1', '0'. + arsort( $userLanguageInfo ); + + $vars['wgULSBabelLanguages'] = array_keys( $userLanguageInfo ); + } + // An optimization to avoid loading all of uls.data just to get the autonym $langCode = $out->getLanguage()->getCode(); $vars['wgULSCurrentAutonym'] = Language::fetchLanguageName( $langCode ); diff --git a/resources/js/ext.uls.compactlinks.js b/resources/js/ext.uls.compactlinks.js index 69e23c09..f292194a 100644 --- a/resources/js/ext.uls.compactlinks.js +++ b/resources/js/ext.uls.compactlinks.js @@ -247,6 +247,8 @@ // Previous languages are always the better suggestion // because the user has explicitly chosen them. filterByPreviousLanguages, + // User's languages in the Babel box on the user page + filterByBabelLanguages, // Site specific highlights, mostly used on Wikimedia sites filterBySitePicks, // Add all common languages to the beginning of array. @@ -305,6 +307,20 @@ } ); } + /** + * Filter by languages that appear in the Babel box on the user page. + * + * @param {string[]} languages Language codes + * @return {string[]} List of language codes supported by the article + */ + function filterByBabelLanguages( languages ) { + var babelLanguages = mw.config.get( 'wgULSBabelLanguages', [] ); + + return $.grep( babelLanguages, function ( language ) { + return $.inArray( language, languages ) >= 0; + } ); + } + /** * Filter the language list by site picks. * @@ -312,7 +328,7 @@ * @return {string[]} List of language codes supported by the article */ function filterBySitePicks( languages ) { - var picks = mw.config.get( 'wgULSCompactLinksPrepend' ) || []; + var picks = mw.config.get( 'wgULSCompactLinksPrepend', [] ); return $.grep( picks, function ( language ) { return $.inArray( language, languages ) >= 0;