jenkins-bot has submitted this change and it was merged.
Change subject: Make LanguageFallbackChain compatible to EntityInfoBuilder
......................................................................
Make LanguageFallbackChain compatible to EntityInfoBuilder
This is split from my pretty old draft I9bbbe80. It expands the
"language chain lookup" (or fixes a bug by adding a missing feature
that is already described in the documentation of the class).
Short explanation: If the provided data array is not an array of
strings but an array of arrays (like the arrays returned by the
EntityInfoBuilders) just return the array as it is.
Additional test cases cover this behavior.
Change-Id: I715bbb02aa780451d4431d185261b3a648910312
---
M lib/includes/LanguageFallbackChain.php
M lib/tests/phpunit/LanguageFallbackChainTest.php
2 files changed, 84 insertions(+), 23 deletions(-)
Approvals:
Hoo man: Looks good to me, approved
WikidataJenkins: Verified
Jeroen De Dauw: Looks good to me, but someone else must approve
jenkins-bot: Verified
diff --git a/lib/includes/LanguageFallbackChain.php
b/lib/includes/LanguageFallbackChain.php
index 179091b..4bd2f7d 100644
--- a/lib/includes/LanguageFallbackChain.php
+++ b/lib/includes/LanguageFallbackChain.php
@@ -2,6 +2,7 @@
namespace Wikibase;
+use InvalidArgumentException;
use Language;
/**
@@ -11,6 +12,8 @@
* @since 0.4
*
* @licence GNU GPL v2+
+ * @author Liangent
+ * @author Thiemo Mättig
*/
class LanguageFallbackChain {
@@ -38,24 +41,31 @@
/**
* Try to fetch the best value in a multilingual data array.
*
- * @param string[] $data Multilingual data with language codes as keys
+ * @param string[]|array[] $data Multilingual data with language codes
as keys
*
- * @return null|array of three items: array(
+ * @throws InvalidArgumentException
+ * @return string[]|null of three items: array(
* 'value' => finally fetched and translated value
* 'language' => language code of the language which final value
is in
* 'source' => language code of the language where the value is
translated from
* ), or null when no "acceptable" data can be found.
*/
public function extractPreferredValue( array $data ) {
-
foreach ( $this->chain as $languageWithConversion ) {
- $fetchCode =
$languageWithConversion->getFetchLanguageCode();
+ $languageCode =
$languageWithConversion->getFetchLanguageCode();
- if ( isset( $data[$fetchCode] ) ) {
- return array(
- 'value' =>
$languageWithConversion->translate( $data[$fetchCode] ),
- 'language' =>
$languageWithConversion->getLanguageCode(),
- 'source' =>
$languageWithConversion->getSourceLanguageCode(),
+ if ( isset( $data[$languageCode] ) ) {
+ $value = $data[$languageCode];
+
+ // Data from an EntityInfoBuilder is already
made of pre-build arrays
+ if ( is_array( $value ) ) {
+ $value = $value['value'];
+ }
+
+ return $this->getValueArray(
+ $languageWithConversion->translate(
$value ),
+
$languageWithConversion->getLanguageCode(),
+
$languageWithConversion->getSourceLanguageCode()
);
}
}
@@ -67,9 +77,9 @@
* Try to fetch the best value in a multilingual data array first.
* If no "acceptable" value exists, return any value known.
*
- * @param string[] $data Multilingual data with language codes as keys
+ * @param string[]|array[] $data Multilingual data with language codes
as keys
*
- * @return null|array of three items: array(
+ * @return string[]|null of three items: array(
* 'value' => finally fetched and translated value
* 'language' => language code of the language which final value
is in
* 'source' => language code of the language where the value is
translated from
@@ -78,21 +88,38 @@
public function extractPreferredValueOrAny( array $data ) {
$preferred = $this->extractPreferredValue( $data );
- if ( $preferred ) {
+ if ( $preferred !== null ) {
return $preferred;
}
- foreach ( $data as $code => $value ) {
- if ( Language::isValidCode( $code ) ) {
- return array(
- 'value' => $value,
- 'language' => $code,
- 'source' => null,
- );
+ foreach ( $data as $languageCode => $value ) {
+ if ( Language::isValidCode( $languageCode ) ) {
+ // We can not translate here, we do not have a
LanguageWithConversion object
+ return $this->getValueArray( $value,
$languageCode );
}
}
return null;
}
+ /**
+ * @param string|string[] $value
+ * @param string $languageCode
+ * @param string|null $sourceLanguageCode
+ *
+ * @return string[]
+ */
+ private function getValueArray( $value, $languageCode,
$sourceLanguageCode = null ) {
+ // Data from an EntityInfoBuilder is already made of pre-build
arrays
+ if ( !is_array( $value ) ) {
+ $value = array(
+ 'value' => $value,
+ 'language' => $languageCode,
+ 'source' => $sourceLanguageCode,
+ );
+ }
+
+ return $value;
+ }
+
}
diff --git a/lib/tests/phpunit/LanguageFallbackChainTest.php
b/lib/tests/phpunit/LanguageFallbackChainTest.php
index 83cecc9..e1294d5 100644
--- a/lib/tests/phpunit/LanguageFallbackChainTest.php
+++ b/lib/tests/phpunit/LanguageFallbackChainTest.php
@@ -2,6 +2,7 @@
namespace Wikibase\Test;
+use Language;
use Wikibase\LanguageFallbackChainFactory;
/**
@@ -13,15 +14,16 @@
*
* @licence GNU GPL v2+
* @author Liangent
+ * @author Thiemo Mättig
*/
class LanguageFallbackChainTest extends \MediaWikiTestCase {
/**
* @dataProvider provideExtractPreferredValue
*/
- public function testExtractPreferredValue( $lang, $mode, $data,
$expected ) {
+ public function testExtractPreferredValue( $languageCode, $mode, $data,
$expected ) {
$factory = new LanguageFallbackChainFactory();
- $chain = $factory->newFromLanguageCode( $lang, $mode );
+ $chain = $factory->newFromLanguageCode( $languageCode, $mode );
$resolved = $chain->extractPreferredValue( $data );
@@ -35,6 +37,16 @@
'zh-cn' => '测试',
'lzh' => '試',
'zh-classical' => '驗',
+ );
+ $entityInfoBuilderArray = array(
+ 'de' => array(
+ 'language' => 'de',
+ 'value' => 'Beispiel'
+ ),
+ 'zh-cn' => array(
+ 'language' => 'zh-cn',
+ 'value' => '测试'
+ )
);
return array(
@@ -104,15 +116,26 @@
'language' => 'zh-hant',
'source' => 'zh-cn',
) ),
+
+ array( 'de',
LanguageFallbackChainFactory::FALLBACK_SELF, $entityInfoBuilderArray, array(
+ 'value' => 'Beispiel',
+ 'language' => 'de',
+ 'source' => null,
+ ) ),
+ array( 'gan-hant',
LanguageFallbackChainFactory::FALLBACK_ALL, $entityInfoBuilderArray, array(
+ 'value' => '測試',
+ 'language' => 'zh-hant',
+ 'source' => 'zh-cn',
+ ) ),
);
}
/**
* @dataProvider provideExtractPreferredValueOrAny
*/
- public function testExtractPreferredValueOrAny( $lang, $mode, $data,
$expected ) {
+ public function testExtractPreferredValueOrAny( $languageCode, $mode,
$data, $expected ) {
$factory = new LanguageFallbackChainFactory();
- $chain = $factory->newFromLanguage( \Language::factory( $lang
), $mode );
+ $chain = $factory->newFromLanguage( Language::factory(
$languageCode ), $mode );
$resolved = $chain->extractPreferredValueOrAny( $data );
@@ -124,6 +147,12 @@
'en' => 'foo',
'nl' => 'bar',
'zh-cn' => '测试',
+ );
+ $entityInfoBuilderArray = array(
+ 'en' => array(
+ 'language' => 'en',
+ 'value' => 'Example'
+ ),
);
return array(
@@ -161,6 +190,11 @@
':' => 'qux',
), null ),
array( 'ar',
LanguageFallbackChainFactory::FALLBACK_SELF, array(), null ),
+
+ array( 'de',
LanguageFallbackChainFactory::FALLBACK_SELF, $entityInfoBuilderArray, array(
+ 'value' => 'Example',
+ 'language' => 'en',
+ ) ),
);
}
--
To view, visit https://gerrit.wikimedia.org/r/140197
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I715bbb02aa780451d4431d185261b3a648910312
Gerrit-PatchSet: 5
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Thiemo Mättig (WMDE) <[email protected]>
Gerrit-Reviewer: Daniel Kinzler <[email protected]>
Gerrit-Reviewer: Hoo man <[email protected]>
Gerrit-Reviewer: Jeroen De Dauw <[email protected]>
Gerrit-Reviewer: Thiemo Mättig (WMDE) <[email protected]>
Gerrit-Reviewer: WikidataJenkins <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits