Thiemo Mättig (WMDE) has uploaded a new change for review. https://gerrit.wikimedia.org/r/114486
Change subject: Don't display languages based on ULS heuristics if I have a Babel box ...................................................................... Don't display languages based on ULS heuristics if I have a Babel box If a user does have a {{#babel:en}} box with a single language that happens to be the interface language the server side PHP code will not display any alternative languages. But the client side JavaScript code (which uses ULS heuristics) will even if the users Babel box clearly says "English only". A possible solution to fix this is to expose the existence of a Babel box to JavaScript, either via DOM (hidden DIV or data attribute) or via a global wb... variable. Checking for isAnon (wgUserId === 0) isn't a solution since this would remove the usefull ULS heuristics from all users that don't have a Babel box. NEEDS MORE WORK, DO NOT MERGE! Bug: 61446 Change-Id: Iaac36e64bd9dd628e3f75d0e2df9cdb330e0f528 --- M repo/Wikibase.hooks.php M repo/includes/EntityViewPlaceholderExpander.php M repo/includes/UserLanguageLookup.php M repo/resources/wikibase.ui.initTermBox.js M repo/tests/phpunit/includes/UserLanguagesTest.php 5 files changed, 56 insertions(+), 16 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase refs/changes/86/114486/1 diff --git a/repo/Wikibase.hooks.php b/repo/Wikibase.hooks.php index 8979730..a0b999f 100644 --- a/repo/Wikibase.hooks.php +++ b/repo/Wikibase.hooks.php @@ -1067,17 +1067,22 @@ if ( $placeholders ) { $injector = new TextInjector( $placeholders ); - + $userLanguageLookup = new UserLanguageLookup( $out->getUser() ); $expander = new EntityViewPlaceholderExpander( $out->getTitle(), $out->getUser(), $out->getLanguage(), WikibaseRepo::getDefaultInstance()->getEntityIdParser(), WikibaseRepo::getDefaultInstance()->getEntityLookup(), - new UserLanguageLookup( $out->getUser() ) + $userLanguageLookup ); $html = $injector->inject( $html, array( $expander, 'getHtmlForPlaceholder' ) ); + + $userLanguages = $userLanguageLookup->getUserLanguages(); + if ( !empty( $userLanguages ) ) { + $out->addJsConfigVars( 'wbUserLanguages', $userLanguages ); + } } return true; diff --git a/repo/includes/EntityViewPlaceholderExpander.php b/repo/includes/EntityViewPlaceholderExpander.php index bb78a71..6641037 100644 --- a/repo/includes/EntityViewPlaceholderExpander.php +++ b/repo/includes/EntityViewPlaceholderExpander.php @@ -68,8 +68,7 @@ * @param Title $targetPage the page for which this expander is supposed to handle expansion. * @param User $user the current user * @param Language $uiLanguage the user's current UI language (as per the present request) - * - * @param Lib\EntityIdParser $idParser + * @param EntityIdParser $idParser * @param EntityLookup $entityLookup * @param UserLanguageLookup|null $userLanguageLookup */ @@ -105,7 +104,7 @@ } else { // ignore current interface language $skip = array( $this->uiLanguage->getCode() ); - $this->extraLanguages = $this->userLanguageLookup->getUserLanguages( $this->user, $skip ); + $this->extraLanguages = $this->userLanguageLookup->getExtraUserLanguages( $skip ); } } diff --git a/repo/includes/UserLanguageLookup.php b/repo/includes/UserLanguageLookup.php index 3978b4b..b71d049 100644 --- a/repo/includes/UserLanguageLookup.php +++ b/repo/includes/UserLanguageLookup.php @@ -18,28 +18,62 @@ class UserLanguageLookup { /** + * @var User + */ + private $user; + + /** + * Local caching since calling the Babel extension may be expensive + * + * @var string[]|null + */ + private $userLanguages; + + /** + * @param User $user the current user + */ + public function __construct( User $user ) { + $this->user = $user; + } + + /** + * @return string[] List of language codes in the users Babel box + */ + public function getUserLanguages() { + // Lazy initialisation + if ( $this->userLanguages === null ) { + // if the Babel extension is installed, grab the languages from the user's babel box + if ( class_exists( 'Babel' ) && !$this->user->isAnon() ) { + $this->userLanguages = \Babel::getUserLanguages( $this->user ); + } + else { + $this->userLanguages = array(); + } + } + return $this->userLanguages; + } + + /** * Returns the languages desired by the user, in order of preference. * - * @param User $user * @param array $skip a list of language codes to skip. * * @return string[] a list of language codes */ - public function getUserLanguages( User $user, $skip = array() ) { + public function getExtraUserLanguages( $skip = array() ) { wfProfileIn( __METHOD__ ); $languages = array(); // start with the user's UI language - $userLanguage = $user->getOption( 'language' ); - + $userLanguage = $this->user->getOption( 'language' ); if ( $userLanguage !== null ) { $languages[] = $userLanguage; } - // if the Babel extension is installed, grab the languages from the user's babel box - if ( class_exists( 'Babel' ) && ( !$user->isAnon() ) ) { - $languages = array_merge( $languages, \Babel::getUserLanguages( $user ) ); + $userLanguages = $this->getUserLanguages(); + if ( !empty( $userLanguages ) ) { + $languages = array_merge( $languages, $userLanguages ); } $languages = array_diff( $languages, $skip ); diff --git a/repo/resources/wikibase.ui.initTermBox.js b/repo/resources/wikibase.ui.initTermBox.js index 34073f0..9db17ea 100644 --- a/repo/resources/wikibase.ui.initTermBox.js +++ b/repo/resources/wikibase.ui.initTermBox.js @@ -12,9 +12,11 @@ mw.hook( 'wikibase.domready' ).add( function() { var termsValueTools = [], $termBoxRows = $( 'tr.wb-terms-label, tr.wb-terms-description' ), + userLanguages = mw.config.get( 'wbUserLanguages' ), ulsIsDefined = mw.uls !== undefined && $.uls !== undefined && $.uls.data !== undefined; - if( $termBoxRows.length === 0 && ulsIsDefined ) { + // TODO: userLanguages is actually an array. + if( $termBoxRows.length === 0 && !userLanguages && ulsIsDefined ) { // No term box present; Ask ULS to provide languages and generate plain HTML: var languageCodes = mw.uls.getFrequentLanguageList(), title = new mw.Title( diff --git a/repo/tests/phpunit/includes/UserLanguagesTest.php b/repo/tests/phpunit/includes/UserLanguagesTest.php index c5733ea..78e092d 100644 --- a/repo/tests/phpunit/includes/UserLanguagesTest.php +++ b/repo/tests/phpunit/includes/UserLanguagesTest.php @@ -22,13 +22,13 @@ $user->setName( 'UserLanguagesTest-TestUser' ); $user->setOption( 'language', 'de' ); - $userLanguages = new UserLanguageLookup(); + $userLanguages = new UserLanguageLookup( $user ); //TODO: we really want to test grabbing languages from the Babel extension, // but how can we test that? - $this->assertContains( 'de', $userLanguages->getUserLanguages( $user ) ); - $this->assertNotContains( 'de', $userLanguages->getUserLanguages( $user, array( 'de' ) ) ); + $this->assertContains( 'de', $userLanguages->getExtraUserLanguages() ); + $this->assertNotContains( 'de', $userLanguages->getExtraUserLanguages( array( 'de' ) ) ); } } -- To view, visit https://gerrit.wikimedia.org/r/114486 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Iaac36e64bd9dd628e3f75d0e2df9cdb330e0f528 Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/Wikibase Gerrit-Branch: master Gerrit-Owner: Thiemo Mättig (WMDE) <thiemo.maet...@wikimedia.de> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits