Liangent has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/71788


Change subject: DO NOT MERGE - WAITING FOR TESTS
......................................................................

DO NOT MERGE - WAITING FOR TESTS

Change-Id: Ibd21394b17a72a2c08338e750bb98f5e5e1b5e67
---
M lib/includes/LanguageFallbackChain.php
M lib/includes/serializers/EntitySerializer.php
M lib/includes/serializers/LabelSerializer.php
M lib/includes/serializers/SerializerFactory.php
M repo/includes/EntityView.php
5 files changed, 47 insertions(+), 8 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase 
refs/changes/88/71788/1

diff --git a/lib/includes/LanguageFallbackChain.php 
b/lib/includes/LanguageFallbackChain.php
index e9e78e5..85f7c51 100644
--- a/lib/includes/LanguageFallbackChain.php
+++ b/lib/includes/LanguageFallbackChain.php
@@ -30,6 +30,11 @@
 class LanguageFallbackChain {
 
        /**
+        * Pseudo language code used to identify a fallback chain initialized 
from current context.
+        */
+       const CONTEXT_LANGUAGE_CODE = 'qqc';
+
+       /**
         * @var LanguageWithConversion[]
         */
        private $chain = array();
diff --git a/lib/includes/serializers/EntitySerializer.php 
b/lib/includes/serializers/EntitySerializer.php
index f41e5f6..7ad4045 100644
--- a/lib/includes/serializers/EntitySerializer.php
+++ b/lib/includes/serializers/EntitySerializer.php
@@ -89,7 +89,19 @@
                                        break;
                                case 'labels':
                                        $labelSerializer = new LabelSerializer( 
$this->options );
-                                       $labels = $entity->getLabels( 
$this->options->getLanguages() );
+                                       $allLabels = $entity->getLabels();
+                                       $labels = array();
+                                       $languageFallbackChains = 
$this->options->getLanguageFallbackChains();
+                                       if ( $languageFallbackChains ) {
+                                               foreach ( 
$languageFallbackChains as $languageCode => $languageFallbackChain ) {
+                                                       $data = 
$languageFallbackChain->extractPreferredValue( $allLabels );
+                                                       if ( $data !== null ) {
+                                                               
$labels[$languageCode] = $data;
+                                                       }
+                                               }
+                                       } else {
+                                               $labels = $allLabels;
+                                       }
                                        $serialization['labels'] = 
$labelSerializer->getSerialized( $labels );
                                        break;
                                case 'claims':
diff --git a/lib/includes/serializers/LabelSerializer.php 
b/lib/includes/serializers/LabelSerializer.php
index 13094f8..0789c27 100644
--- a/lib/includes/serializers/LabelSerializer.php
+++ b/lib/includes/serializers/LabelSerializer.php
@@ -73,12 +73,23 @@
                $value = array();
                $idx = 0;
 
-               foreach ( $labels as $languageCode => $label ) {
+               foreach ( $labels as $languageCode => $labelData ) {
                        $key = $this->options->shouldUseKeys() ? $languageCode 
: $idx++;
+                       if ( is_array( $labelData ) ) {
+                               $label = $labelData['value'];
+                               $labelLanguageCode = $labelData['language'];
+                               $labelSourceLanguageCode = $labelData['source'];
+                       } else {
+                               // back-compat
+                               $label = $labelData;
+                               $labelLanguageCode = $languageCode;
+                               $labelSourceLanguageCode = $languageCode;
+                       }
                        $valueKey = ( $label === '' ) ? 'removed' : 'value';
                        $value[$key] = array(
-                               'language' => $languageCode,
-                               $valueKey => $label
+                               'language' => $labelLanguageCode,
+                               'source-language' => $labelSourceLanguageCode,
+                               $valueKey => $label,
                        );
                }
 
diff --git a/lib/includes/serializers/SerializerFactory.php 
b/lib/includes/serializers/SerializerFactory.php
index 4c24074..db3fc90 100644
--- a/lib/includes/serializers/SerializerFactory.php
+++ b/lib/includes/serializers/SerializerFactory.php
@@ -91,4 +91,4 @@
                throw new OutOfBoundsException( '"' . $className . '" has no 
associated unserializer' );
        }
 
-}
\ No newline at end of file
+}
diff --git a/repo/includes/EntityView.php b/repo/includes/EntityView.php
index 628e562..a20278d 100644
--- a/repo/includes/EntityView.php
+++ b/repo/includes/EntityView.php
@@ -810,6 +810,9 @@
                $out->addJsConfigVars( 'wbEntityType', $entity->getType() );
                $out->addJsConfigVars( 'wbDataLangName', 
Utils::fetchLanguageName( $langCode ) );
 
+               // Some constant, but to avoid hard coding it everywhere
+               $out->addJsConfigVars( 'wbContextLanguageCode', 
LanguageFallbackChain::CONTEXT_LANGUAGE_CODE );
+
                // entity specific data
                $out->addJsConfigVars( 'wbEntityId', 
$this->getFormattedIdForEntity( $entity ) );
 
@@ -832,7 +835,7 @@
                $refFinder = new ReferencedEntitiesFinder( $entityLoader );
 
                $usedEntityIds = $refFinder->findClaimLinks( 
$entity->getClaims() );
-               $basicEntityInfo = static::getBasicEntityInfo( $entityLoader, 
$usedEntityIds, $langCode );
+               $basicEntityInfo = static::getBasicEntityInfo( $entityLoader, 
$usedEntityIds, $langCode, $this->getContext() );
 
                $out->addJsConfigVars(
                        'wbUsedEntities',
@@ -850,9 +853,12 @@
         * @param EntityLookup $entityLoader
         * @param EntityId[] $entityIds
         * @param string $langCode For the entity labels which will be included 
in one language only.
+        * @param IContextSource $context Set it to include labels to display 
for the given context too.
         * @return array
         */
-       protected static function getBasicEntityInfo( EntityLookup 
$entityLoader, array $entityIds, $langCode ) {
+       protected static function getBasicEntityInfo(
+               EntityLookup $entityLoader, array $entityIds, $langCode, 
IContextSource $context = null
+       ) {
                wfProfileIn( __METHOD__ );
 
                $entityContentFactory = EntityContentFactory::singleton();
@@ -864,7 +870,12 @@
                $serializationOptions = new EntitySerializationOptions( 
WikibaseRepo::getDefaultInstance()->getIdFormatter() );
                $serializationOptions->setProps( array( 'labels', 
'descriptions', 'datatype' ) );
 
-               $serializationOptions->setLanguages( array( $langCode ) );
+               $languages = array( $langCode );
+               if ( $context ) {
+                       $factory = 
WikibaseRepo::getDefaultInstance()->getLanguageFallbackChainFactory();
+                       
$languages[LanguageFallbackChain::CONTEXT_LANGUAGE_CODE] = 
$factory->newFromContext( $context );
+               }
+               $serializationOptions->setLanguages( $languages );
 
                foreach( $entities as $prefixedId => $entity ) {
                        if( $entity === null ) {

-- 
To view, visit https://gerrit.wikimedia.org/r/71788
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ibd21394b17a72a2c08338e750bb98f5e5e1b5e67
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Liangent <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to