Liangent has uploaded a new change for review.
https://gerrit.wikimedia.org/r/72139
Change subject: Include preferred label for used entities on EntityView
......................................................................
Include preferred label for used entities on EntityView
* A new pseudo language code, qqc, is added, for data based on current context
* Label serialization now accepts LanguageFallbackChain as the language option
* EntityView now makes use of these, by initializing a fallback chain for the
current context, and send it for serialization, to have wbUsedEntities include
some labels for view by final users
* A helper JS variable, wbContextLanguageCode, is added, to identify labels for
page views on client side.
Change-Id: I314356382c8076a355e998481fc4d3f30867d8cd
---
M lib/includes/LanguageFallbackChain.php
M lib/includes/serializers/EntitySerializer.php
M lib/includes/serializers/LabelSerializer.php
M lib/tests/phpunit/serializers/EntitySerializerBaseTest.php
M lib/tests/phpunit/serializers/LabelSerializerTest.php
M repo/includes/EntityView.php
6 files changed, 106 insertions(+), 7 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase
refs/changes/39/72139/1
diff --git a/lib/includes/LanguageFallbackChain.php
b/lib/includes/LanguageFallbackChain.php
index ee91987..03da481 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/tests/phpunit/serializers/EntitySerializerBaseTest.php
b/lib/tests/phpunit/serializers/EntitySerializerBaseTest.php
index 0abafa3..6c7d069 100644
--- a/lib/tests/phpunit/serializers/EntitySerializerBaseTest.php
+++ b/lib/tests/phpunit/serializers/EntitySerializerBaseTest.php
@@ -122,10 +122,12 @@
'en' => array(
'value' => 'foo',
'language' => 'en',
+ 'source-language' => 'en',
),
'de' => array(
'value' => 'bar',
'language' => 'de',
+ 'source-language' => 'de',
),
),
'descriptions' => array(
diff --git a/lib/tests/phpunit/serializers/LabelSerializerTest.php
b/lib/tests/phpunit/serializers/LabelSerializerTest.php
index 6f49cf0..4b3ed13 100644
--- a/lib/tests/phpunit/serializers/LabelSerializerTest.php
+++ b/lib/tests/phpunit/serializers/LabelSerializerTest.php
@@ -53,18 +53,22 @@
$expectedSerialization = array(
"en" => array(
"language" => "en",
+ "source-language" => "en",
"value" => "Rome"
),
"de" => array(
"language" => "de",
+ "source-language" => "de",
"value" => "Rom"
),
"it" => array(
"language" => "it",
+ "source-language" => "it",
"removed" => ""
),
"fi" => array(
"language" => "fi",
+ "source-language" => "fi",
"value" => "Rooma"
),
);
@@ -81,24 +85,78 @@
$expectedSerialization = array(
array(
"language" => "en",
+ "source-language" => "en",
"value" => "Rome"
),
array(
"language" => "de",
+ "source-language" => "de",
"value" => "Rom"
),
array(
"language" => "it",
+ "source-language" => "it",
"value" => "Roma"
),
array(
"language" => "fi",
+ "source-language" => "fi",
"value" => "Rooma"
),
"_element" => "label",
);
$validArgs[] = array( $labels, $options, $expectedSerialization
);
+ $options = new MultiLangSerializationOptions();
+ $options->setUseKeys( true );
+ $labels = array(
+ "en" => "Rome",
+ "de-formal" => array(
+ "value" => "Rom",
+ "language" => "de",
+ "source" => "de",
+ ),
+ "it" => "",
+ "zh-tw" => array(
+ "value" => "羅馬",
+ "language" => "zh-tw",
+ "source" => "zh-cn",
+ ),
+ "sr-ec" => array(
+ "value" => "Rome",
+ "language" => "en",
+ "source" => "en",
+ ),
+ );
+ $expectedSerialization = array(
+ "en" => array(
+ "language" => "en",
+ "source-language" => "en",
+ "value" => "Rome"
+ ),
+ "de-formal" => array(
+ "language" => "de",
+ "source-language" => "de",
+ "value" => "Rom"
+ ),
+ "it" => array(
+ "language" => "it",
+ "source-language" => "it",
+ "removed" => ""
+ ),
+ "zh-tw" => array(
+ "language" => "zh-tw",
+ "source-language" => "zh-cn",
+ "value" => "羅馬"
+ ),
+ "sr-ec" => array(
+ "language" => "en",
+ "source-language" => "en",
+ "value" => "Rome"
+ ),
+ );
+ $validArgs[] = array( $labels, $options, $expectedSerialization
);
+
return $validArgs;
}
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/72139
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I314356382c8076a355e998481fc4d3f30867d8cd
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