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

Reply via email to