/** * @dataProvider provideExtractPreferredValueOrAny */ public function testExtractPreferredValueOrAny($languageCode, $mode, $data, $expected) { $factory = new LanguageFallbackChainFactory(); $chain = $factory->newFromLanguage(Language::factory($languageCode), $mode); $resolved = $chain->extractPreferredValueOrAny($data); $this->assertEquals($expected, $resolved); }
/** * Get the chain stored for display. * * @return LanguageFallbackChain */ public function getLanguageFallbackChain() { if ($this->chain === null) { $this->setLanguageFallbackChain($this->factory->newFromContext($this->getContext())); } return $this->chain; }
/** * Set service objects to use. Unit tests may call this to substitute mock * services. */ public function initServices(DataTypeFactory $dataTypeFactory, PropertyInfoStore $propertyInfoStore, EntityIdFormatterFactory $entityIdFormatterFactory, LanguageFallbackChainFactory $languageFallbackChainFactory, EntityTitleLookup $titleLookup, BufferingTermLookup $bufferingTermLookup) { $fallbackMode = LanguageFallbackChainFactory::FALLBACK_ALL; $this->labelDescriptionLookup = new LanguageFallbackLabelDescriptionLookup($bufferingTermLookup, $languageFallbackChainFactory->newFromLanguage($this->getLanguage(), $fallbackMode)); $this->dataTypeFactory = $dataTypeFactory; $this->propertyInfoStore = $propertyInfoStore; $this->entityIdFormatter = $entityIdFormatterFactory->getEntityIdFormatter($this->labelDescriptionLookup); $this->titleLookup = $titleLookup; $this->bufferingTermLookup = $bufferingTermLookup; }
private function getEntityAccessor(EntityLookup $entityLookup = null, UsageAccumulator $usageAccumulator = null, $langCode = 'en') { $language = new Language($langCode); $propertyDataTypeLookup = $this->getMock('Wikibase\\DataModel\\Services\\Lookup\\PropertyDataTypeLookup'); $propertyDataTypeLookup->expects($this->any())->method('getDataTypeIdForProperty')->will($this->returnValue('structured-cat')); $fallbackChainFactory = new LanguageFallbackChainFactory(); $fallbackChain = $fallbackChainFactory->newFromLanguage($language, LanguageFallbackChainFactory::FALLBACK_SELF | LanguageFallbackChainFactory::FALLBACK_VARIANTS); $termsLanguages = $this->getMock('Wikibase\\Lib\\ContentLanguages'); $termsLanguages->expects($this->any())->method('getLanguages')->will($this->returnValue(array('de', $langCode, 'es', 'ja'))); return new EntityAccessor(new BasicEntityIdParser(), $entityLookup ?: new MockRepository(), $usageAccumulator ? $usageAccumulator : new HashUsageAccumulator(), $propertyDataTypeLookup, $fallbackChain, $language, $termsLanguages); }
/** * Returns a LabelDescriptionLookup where terms are prefetched for the given * entity ids with a language fallback chain applied for the given language. * * @param Language $language * @param EntityId[] $entityIds Array of entity ids that should be prefetched. Only relevant * when a TermBuffer was set in the constructor. Default is no prefetching. * @param string[] $termTypes Array with one or more of the types 'label', 'alias' and * 'description'. Default is only 'label'. * * @return LabelDescriptionLookup */ public function newLabelDescriptionLookup(Language $language, array $entityIds = array(), array $termTypes = array('label')) { $languageFallbackChain = $this->languageFallbackChainFactory->newFromLanguage($language, $this->fallbackMode); $languages = $languageFallbackChain->getFetchLanguageCodes(); $labelDescriptionLookup = new LanguageFallbackLabelDescriptionLookup($this->termLookup, $languageFallbackChain); // Optionally prefetch the terms of the entities passed in here // $termLookup and $termBuffer should be the same BufferingTermLookup then if ($this->termBuffer !== null) { $this->termBuffer->prefetchTerms($entityIds, $termTypes, $languages); } return $labelDescriptionLookup; }
/** * @param Language $language * @param UsageAccumulator $usageAccumulator * * @return SnakFormatter */ private function newSnakFormatterForLanguage(Language $language, UsageAccumulator $usageAccumulator) { $languageFallbackChain = $this->languageFallbackChainFactory->newFromLanguage($language, LanguageFallbackChainFactory::FALLBACK_SELF | LanguageFallbackChainFactory::FALLBACK_VARIANTS); $options = new FormatterOptions(array(FormatterLabelDescriptionLookupFactory::OPT_LANGUAGE_FALLBACK_CHAIN => $languageFallbackChain, ValueFormatter::OPT_LANG => $language->getCode())); $snakFormatter = new UsageTrackingSnakFormatter($this->snakFormatterFactory->getSnakFormatter(SnakFormatter::FORMAT_WIKI, $options), $usageAccumulator, $languageFallbackChain->getFetchLanguageCodes()); return $snakFormatter; }
/** * @param string[] $languageCodes * * @return string[] */ private function addFallbackLanguageCodes(array $languageCodes) { $languageCodesWithFallback = array(); foreach ($languageCodes as $languageCode) { $fallbackChain = $this->languageFallbackChainFactory->newFromLanguageCode($languageCode); $languageCodesWithFallback = array_merge($languageCodesWithFallback, $fallbackChain->getFetchLanguageCodes()); } return array_unique($languageCodesWithFallback); }
/** * @param array $params * * @return array * 0 => string[] languageCodes that the user wants returned * 1 => LanguageFallbackChain[] Keys are requested lang codes */ private function getLanguageCodesAndFallback(array $params) { $languageCodes = is_array($params['languages']) ? $params['languages'] : array(); $fallbackChains = array(); if ($params['languagefallback']) { $fallbackMode = LanguageFallbackChainFactory::FALLBACK_ALL; foreach ($languageCodes as $languageCode) { $fallbackChains[$languageCode] = $this->languageFallbackChainFactory->newFromLanguageCode($languageCode, $fallbackMode); } } return array(array_unique($languageCodes), $fallbackChains); }
/** * Initializes the options keys ValueFormatter::OPT_LANG and * FormatterLabelDescriptionLookupFactory::OPT_LANGUAGE_FALLBACK_CHAIN if they are not yet set. * * @param FormatterOptions $options The options to modify. * * @throws InvalidArgumentException * @todo : Sort out how the desired language is specified. We have two language options, * each accepting different ways of specifying the language. That's not good. * @todo: this shouldn't be public at all. Perhaps factor it out into a helper class. */ public function applyLanguageDefaults(FormatterOptions $options) { $options->defaultOption(ValueFormatter::OPT_LANG, $this->defaultLanguage->getCode()); $lang = $options->getOption(ValueFormatter::OPT_LANG); if (!is_string($lang)) { throw new InvalidArgumentException('The value of OPT_LANG must be a language code. For a fallback chain, use OPT_LANGUAGE_FALLBACK_CHAIN.'); } $fallbackOption = FormatterLabelDescriptionLookupFactory::OPT_LANGUAGE_FALLBACK_CHAIN; if (!$options->hasOption($fallbackOption)) { $fallbackMode = LanguageFallbackChainFactory::FALLBACK_ALL; $options->setOption($fallbackOption, $this->languageFallbackChainFactory->newFromLanguageCode($lang, $fallbackMode)); } if (!$options->getOption($fallbackOption) instanceof LanguageFallbackChain) { throw new InvalidArgumentException('The value of OPT_LANGUAGE_FALLBACK_CHAIN must be ' . 'an instance of LanguageFallbackChain.'); } }
/** * @dataProvider newFromContextForPageViewProvider */ public function testNewFromContextForPageView($anonymousPageViewCached, $msg) { $context = new RequestContext(); $context->setLanguage(Language::factory('es')); $user = User::newFromId(0); $context->setUser($user); $factory = new LanguageFallbackChainFactory($anonymousPageViewCached); $fallbackChain = $factory->newFromContextForPageView($context); $this->assertInstanceOf('Wikibase\\LanguageFallbackChain', $fallbackChain, $msg); }
/** * @dataProvider provideTestAddEntityRevisionFallback */ public function testAddEntityRevisionFallback($addMetaData, array $expected) { $item = new Item(new ItemId('Q123101')); $item->getFingerprint()->setLabel('de', 'Oslo-de'); $item->getFingerprint()->setLabel('en', 'Oslo-en'); $item->getFingerprint()->setDescription('es', 'desc-es'); $item->getFingerprint()->setDescription('zh-sg', 'desc-zh-sg'); $entityRevision = new EntityRevision($item); $fallbackChainFactory = new LanguageFallbackChainFactory(); $fallbackMode = LanguageFallbackChainFactory::FALLBACK_ALL; $fallbackChains = array('de-formal' => $fallbackChainFactory->newFromLanguageCode('de-formal', $fallbackMode), 'es' => $fallbackChainFactory->newFromLanguageCode('es', $fallbackMode), 'qug' => $fallbackChainFactory->newFromLanguageCode('qug', $fallbackMode), 'zh-my' => $fallbackChainFactory->newFromLanguageCode('zh-my', $fallbackMode)); $filterLangCodes = array_keys($fallbackChains); $result = $this->getDefaultResult(); $resultBuilder = $this->getResultBuilder($result, $addMetaData); $resultBuilder->addEntityRevision(null, $entityRevision, array('labels', 'descriptions'), array(), $filterLangCodes, $fallbackChains); $data = $result->getResultData(); $this->assertEquals($expected, $data); }
/** * @param Language $language * * @return LanguageFallbackChain */ private function getLanguageFallbackChain(Language $language) { // Language fallback must depend ONLY on the target language, // so we don't confuse the parser cache with user specific HTML. return $this->languageFallbackChainFactory->newFromLanguage($language); }
public function provideApplyLanguageDefaults() { $languageFallbackFactory = new LanguageFallbackChainFactory(); $languageFallback = $languageFallbackFactory->newFromLanguage(Language::factory('fr')); return array('empty' => array(new FormatterOptions(array()), 'en', 'en'), 'language code set' => array(new FormatterOptions(array(ValueFormatter::OPT_LANG => 'de')), 'de', 'de'), 'language fallback set' => array(new FormatterOptions(array(FormatterLabelDescriptionLookupFactory::OPT_LANGUAGE_FALLBACK_CHAIN => $languageFallback)), 'en', 'fr'), 'language code and fallback set' => array(new FormatterOptions(array(ValueFormatter::OPT_LANG => 'de', FormatterLabelDescriptionLookupFactory::OPT_LANGUAGE_FALLBACK_CHAIN => $languageFallback)), 'de', 'fr')); }
public function provideNewFormatter_LabelDescriptionLookupOption() { $labelDescriptionLookup = $this->getMock('Wikibase\\DataModel\\Services\\Lookup\\LabelDescriptionLookup'); $labelDescriptionLookup->expects($this->any())->method('getLabel')->will($this->returnValue(new Term('xy', 'Custom LabelDescriptionLookup'))); $fallbackFactory = new LanguageFallbackChainFactory(); $fallbackChain = $fallbackFactory->newFromLanguage(Language::factory('de-ch')); return array('language option' => array('newEntityIdFormatter', new FormatterOptions(array(ValueFormatter::OPT_LANG => 'de')), new EntityIdValue(new ItemId('Q5')), '@>Name für Q5<@'), 'fallback option' => array('newEntityIdFormatter', new FormatterOptions(array(FormatterLabelDescriptionLookupFactory::OPT_LANGUAGE_FALLBACK_CHAIN => $fallbackChain)), new EntityIdValue(new ItemId('Q5')), '@>Name für Q5<@'), 'LabelDescriptionLookup option' => array('newEntityIdFormatter', new FormatterOptions(array(FormatterLabelDescriptionLookupFactory::OPT_LABEL_DESCRIPTION_LOOKUP => $labelDescriptionLookup)), new EntityIdValue(new ItemId('Q5')), '@>Custom LabelDescriptionLookup<@')); }