WikidataBuilder has uploaded a new change for review.

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

Change subject: New Wikidata Build - 2015-05-21T10:00:01+0000
......................................................................

New Wikidata Build - 2015-05-21T10:00:01+0000

Change-Id: Ib6f09a03c056d94a5ca61bea929043a60d8b8eab
---
M composer.lock
M extensions/Wikibase/client/i18n/ht.json
M extensions/Wikibase/client/i18n/ml.json
M extensions/Wikibase/client/includes/Changes/AffectedPagesFinder.php
M extensions/Wikibase/client/includes/Changes/ChangeHandler.php
M extensions/Wikibase/client/includes/Hooks/DataUpdateHookHandlers.php
M extensions/Wikibase/client/includes/Usage/EntityUsage.php
M extensions/Wikibase/client/includes/Usage/PageEntityUsages.php
M extensions/Wikibase/client/includes/Usage/Sql/UsageTableUpdater.php
M extensions/Wikibase/client/includes/Usage/UsageAccumulator.php
M extensions/Wikibase/client/includes/Usage/UsageAspectTransformer.php
M 
extensions/Wikibase/client/tests/phpunit/includes/Changes/AffectedPagesFinderTest.php
M 
extensions/Wikibase/client/tests/phpunit/includes/Changes/ChangeHandlerTest.php
M 
extensions/Wikibase/client/tests/phpunit/includes/Hooks/DataUpdateHookHandlersTest.php
M extensions/Wikibase/client/tests/phpunit/includes/Usage/EntityUsageTest.php
M 
extensions/Wikibase/client/tests/phpunit/includes/Usage/PageEntityUsagesTest.php
M 
extensions/Wikibase/client/tests/phpunit/includes/Usage/Sql/UsageTableUpdaterTest.php
M 
extensions/Wikibase/client/tests/phpunit/includes/Usage/UsageAccumulatorContractTester.php
M 
extensions/Wikibase/client/tests/phpunit/includes/Usage/UsageAspectTransformerTest.php
M extensions/Wikibase/lib/i18n/es.json
M extensions/Wikibase/lib/i18n/ml.json
M extensions/Wikibase/lib/i18n/os.json
M extensions/Wikibase/repo/i18n/arq.json
M extensions/Wikibase/repo/i18n/de.json
M extensions/Wikibase/repo/i18n/es.json
M extensions/Wikibase/repo/i18n/he.json
M extensions/Wikibase/repo/i18n/ml.json
M extensions/Wikibase/repo/i18n/os.json
M extensions/Wikibase/repo/i18n/pt.json
M extensions/Wikibase/repo/i18n/ru.json
M extensions/Wikibase/repo/i18n/sco.json
M extensions/Wikibase/repo/i18n/sv.json
M extensions/Wikibase/repo/includes/Interactors/ItemMergeInteractor.php
M extensions/Wikibase/repo/includes/api/MergeItems.php
M extensions/Wikibase/repo/tests/phpunit/includes/api/BotEditTest.php
M extensions/Wikibase/view/src/SiteLinksView.php
M vendor/composer/installed.json
37 files changed, 589 insertions(+), 164 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikidata 
refs/changes/27/212527/1

diff --git a/composer.lock b/composer.lock
index b57879b..3766313 100644
--- a/composer.lock
+++ b/composer.lock
@@ -1213,12 +1213,12 @@
             "source": {
                 "type": "git",
                 "url": 
"https://github.com/wikimedia/mediawiki-extensions-Wikibase.git";,
-                "reference": "7bf3cae73c330b2eb7698b98a7e64bc4fc2c2cb7"
+                "reference": "6518ec6723bcd377b42e424cfc3cc803760f26d6"
             },
             "dist": {
                 "type": "zip",
-                "url": 
"https://api.github.com/repos/wikimedia/mediawiki-extensions-Wikibase/zipball/7bf3cae73c330b2eb7698b98a7e64bc4fc2c2cb7";,
-                "reference": "7bf3cae73c330b2eb7698b98a7e64bc4fc2c2cb7",
+                "url": 
"https://api.github.com/repos/wikimedia/mediawiki-extensions-Wikibase/zipball/6518ec6723bcd377b42e424cfc3cc803760f26d6";,
+                "reference": "6518ec6723bcd377b42e424cfc3cc803760f26d6",
                 "shasum": ""
             },
             "require": {
@@ -1286,7 +1286,7 @@
                 "wikibaserepo",
                 "wikidata"
             ],
-            "time": "2015-05-19 20:37:25"
+            "time": "2015-05-21 04:52:54"
         },
         {
             "name": "wikibase/wikimedia-badges",
diff --git a/extensions/Wikibase/client/i18n/ht.json 
b/extensions/Wikibase/client/i18n/ht.json
index 3f2151c..7156946 100644
--- a/extensions/Wikibase/client/i18n/ht.json
+++ b/extensions/Wikibase/client/i18n/ht.json
@@ -10,5 +10,6 @@
        "wikibase-rc-hide-wikidata-hide": "Kache",
        "wikibase-rc-hide-wikidata-show": "Montre",
        "wikibase-rc-wikibase-edit-letter": "D",
-       "wikibase-rc-wikibase-edit-title": "Chanjman {{WBREPONAME}}"
+       "wikibase-rc-wikibase-edit-title": "Chanjman {{WBREPONAME}}",
+       "wikibase-otherprojects": "Lòt pwojè"
 }
diff --git a/extensions/Wikibase/client/i18n/ml.json 
b/extensions/Wikibase/client/i18n/ml.json
index a84391c..e9c497f 100644
--- a/extensions/Wikibase/client/i18n/ml.json
+++ b/extensions/Wikibase/client/i18n/ml.json
@@ -2,12 +2,14 @@
        "@metadata": {
                "authors": [
                        "Praveenp",
-                       "Santhosh.thottingal"
+                       "Santhosh.thottingal",
+                       "Vssun"
                ]
        },
        "wikibase-client-desc": "വിക്കിബേസ് അനുബന്ധത്തിനുള്ള ക്ലയന്റ്",
-       "specialpages-group-wikibaseclient": "{{WBREPONAME}} ക്ലയന്റ്",
        "tooltip-t-wikibase": "ബന്ധപ്പെട്ട ഡേറ്റാ ശേഖര ഇനത്തിലേയ്ക്കുള്ള കണ്ണി",
+       "apihelp-query+pageterms-description": "ബന്ധപ്പെട്ട  ഡേറ്റാ ഇനം വഴി 
താളുമായി ബന്ധപ്പെട്ട പദങ്ങൾ ലഭ്യമാക്കുക.",
+       "apihelp-query+pageterms-example-simple": "ഉപയോക്താവിന്റെ ഭാഷയിൽ 
'ലണ്ടൻ' എന്ന താളുമായി ബന്ധപ്പെട്ട എല്ലാ പദങ്ങളും ലഭ്യമാക്കുക.",
        "wikibase-after-page-move": "മാറ്റിയ താളിലെ ഭാഷാ കണ്ണികൾ 
പരിപാലിക്കുന്നതിനായി ബന്ധപ്പെട്ട {{WBREPONAME}} ഇനം താങ്കൾക്ക് [$1 
പുതുക്കുകയും] ചെയ്യാവുന്നതാണ്.",
        "wikibase-after-page-move-queued": "ഈ താളുമായി ബന്ധമുള്ള [$1 
{{WBREPONAME}} ഇനം] ഉടൻ തന്നെ പുതുക്കപ്പെടുന്നതാണ്.",
        "wikibase-comment-add": "ഒരു {{WBREPONAME}} ഇനം 
സൃഷ്ടിക്കപ്പെട്ടിരിക്കുന്നു.",
@@ -23,6 +25,7 @@
        "wikibase-dataitem": "{{WBREPONAME}} ഇനം",
        "wikibase-editlinks": "കണ്ണികൾ തിരുത്തുക",
        "wikibase-editlinkstitle": "അന്തർഭാഷാ കണ്ണികൾ തിരുത്തുക",
+       "wikibase-addlinkstitle": "അന്തർഭാഷാകണ്ണികൾ ചേർക്കുക",
        "wikibase-linkitem-addlinks": "കണ്ണികൾ ചേർക്കുക",
        "wikibase-linkitem-alreadylinked": "കേന്ദ്രീകൃത വിവര ശേഖരത്തിൽ നിന്ന് ഈ 
താളുമായി ബന്ധപ്പെടുത്താൻ താങ്കൾ ശ്രമിക്കുന്ന ഒരു [$1 ഇനം], ഈ സൈറ്റിൽ $2 
എന്നതിലേയ്ക്ക് കണ്ണിചേർക്കപ്പെട്ടിരിക്കുന്നു. ഒരു സൈറ്റിൽ ഒരൊറ്റ താളിലേയ്ക്കേ 
ഇനങ്ങൾ ചേർക്കപ്പെടാവൂ. ദയവായി കണ്ണി ചേർക്കാൻ വ്യത്യസ്തമായ ഒരു താൾ 
തിരഞ്ഞെടുക്കുക.",
        "wikibase-linkitem-close": "അറിയിപ്പ് അടച്ച ശേഷം താൾ വീണ്ടും എടുക്കുക",
@@ -44,7 +47,9 @@
        "wikibase-rc-show-wikidata-pref": "സമീപകാല മാറ്റങ്ങളിൽ {{WBREPONAME}} 
തിരുത്തലുകളും പ്രദർശിപ്പിക്കുക",
        "wikibase-rc-wikibase-edit-letter": "(ഡേ.)",
        "wikibase-rc-wikibase-edit-title": "{{WBREPONAME}} തിരുത്ത്",
+       "wikibase-replicationnote": "മാറ്റങ്ങൾ എല്ലാ വിക്കികളിലും 
പ്രത്യക്ഷപ്പെടാൻ കുറച്ച് മിനിറ്റുകൾ എടുത്തേക്കും എന്നത് പ്രത്യേകം ശ്രദ്ധിക്കുക",
        "wikibase-watchlist-show-changes-pref": "താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ 
പട്ടികയിൽ {{WBREPONAME}} തിരുത്തുകളും പ്രദർശിപ്പിക്കുക",
+       "wikibase-error-deserialize-error": "ഡേറ്റാ അനുക്രമമാക്കിയത് ഒഴിവാക്കൽ 
പരാജയപ്പെട്ടു.",
        "wikibase-error-serialize-error": "ഡേറ്റാ അനുക്രമമാക്കൽ പരാജയപ്പെട്ടു.",
        "wikibase-error-invalid-entity-id": "നൽകിയ ഐ.ഡി. വ്യവസ്ഥയിൽ 
അപരിചിതമാണ്. ദയവായി സാധുവായ ഐ.ഡി. നൽകുക.",
        "special-unconnectedpages": "താളുകൾ ഇനങ്ങളുമായി 
ബന്ധപ്പെടുത്തിയിട്ടില്ല",
diff --git 
a/extensions/Wikibase/client/includes/Changes/AffectedPagesFinder.php 
b/extensions/Wikibase/client/includes/Changes/AffectedPagesFinder.php
index 967c98d..c4ebcf0 100644
--- a/extensions/Wikibase/client/includes/Changes/AffectedPagesFinder.php
+++ b/extensions/Wikibase/client/includes/Changes/AffectedPagesFinder.php
@@ -144,9 +144,10 @@
                if ( $diff instanceof EntityDiff && 
!$diff->getLabelsDiff()->isEmpty() ) {
                        $labelsDiff = $diff->getLabelsDiff();
 
-                       if ( isset( $labelsDiff[$this->contentLanguageCode] ) ) 
{
-                               $aspects[] = EntityUsage::LABEL_USAGE;
-                               $remainingDiffOps--;
+                       if ( !empty( $labelsDiff ) ) {
+                               $labelAspects = $this->getChangedLabelAspects( 
$labelsDiff );
+                               $aspects = array_merge( $aspects, $labelAspects 
);
+                               $remainingDiffOps -= count( $labelAspects );
                        }
                }
 
@@ -158,6 +159,21 @@
        }
 
        /**
+        * @param Diff $labelsDiff
+        *
+        * @return string[]
+        */
+       private function getChangedLabelAspects( Diff $labelsDiff ) {
+               $aspects = array();
+
+               foreach ( $labelsDiff as $lang => $diffOp ) {
+                       $aspects[] = EntityUsage::makeAspectKey( 
EntityUsage::LABEL_USAGE, $lang );
+               }
+
+               return $aspects;
+       }
+
+       /**
         * Returns the page updates implied by the given the change.
         *
         * @param EntityChange $change
diff --git a/extensions/Wikibase/client/includes/Changes/ChangeHandler.php 
b/extensions/Wikibase/client/includes/Changes/ChangeHandler.php
index 236f6f0..90df9ae 100644
--- a/extensions/Wikibase/client/includes/Changes/ChangeHandler.php
+++ b/extensions/Wikibase/client/includes/Changes/ChangeHandler.php
@@ -184,7 +184,7 @@
        }
 
        /**
-        * @param string[] $aspects
+        * @param string[] $aspects Usage aspects (without modifier), see 
EntityUsage.
         *
         * @return string[] A list of actions, as defined by the 
self::XXXX_ACTION constants.
         */
diff --git 
a/extensions/Wikibase/client/includes/Hooks/DataUpdateHookHandlers.php 
b/extensions/Wikibase/client/includes/Hooks/DataUpdateHookHandlers.php
index 90987e0..45daed9 100644
--- a/extensions/Wikibase/client/includes/Hooks/DataUpdateHookHandlers.php
+++ b/extensions/Wikibase/client/includes/Hooks/DataUpdateHookHandlers.php
@@ -26,11 +26,6 @@
 class DataUpdateHookHandlers {
 
        /**
-        * @var NamespaceChecker
-        */
-       private $namespaceChecker;
-
-       /**
         * @var UsageUpdater
         */
        private $usageUpdater;
@@ -39,7 +34,6 @@
                $wikibaseClient = WikibaseClient::getDefaultInstance();
                $settings = $wikibaseClient->getSettings();
 
-               $namespaceChecker = $wikibaseClient->getNamespaceChecker();
                $usageUpdater = new UsageUpdater(
                        $settings->getSetting( 'siteGlobalID' ),
                        $wikibaseClient->getStore()->getUsageTracker(),
@@ -48,7 +42,6 @@
                );
 
                return new DataUpdateHookHandlers(
-                       $namespaceChecker,
                        $usageUpdater
                );
        }
@@ -97,11 +90,8 @@
        }
 
        public function __construct(
-               NamespaceChecker $namespaceChecker,
                UsageUpdater $usageUpdater
        ) {
-
-               $this->namespaceChecker = $namespaceChecker;
                $this->usageUpdater = $usageUpdater;
        }
 
@@ -115,11 +105,6 @@
         */
        public function doArticleEditUpdates( WikiPage $page, &$editInfo, 
$changed ) {
                $title = $page->getTitle();
-
-               if ( !$this->namespaceChecker->isWikibaseEnabled( 
$title->getNamespace() ) ) {
-                       // shorten out
-                       return;
-               }
 
                $usageAcc = new ParserOutputUsageAccumulator( $editInfo->output 
);
 
@@ -137,11 +122,6 @@
         * @param int $pageId
         */
        public function doArticleDeleteComplete( $namespace, $pageId ) {
-               if ( !$this->namespaceChecker->isWikibaseEnabled( $namespace ) 
) {
-                       // shorten out
-                       return;
-               }
-
                $this->usageUpdater->updateUsageForPage(
                        $pageId,
                        array(),
diff --git a/extensions/Wikibase/client/includes/Usage/EntityUsage.php 
b/extensions/Wikibase/client/includes/Usage/EntityUsage.php
index ae283ba..75bc3df 100644
--- a/extensions/Wikibase/client/includes/Usage/EntityUsage.php
+++ b/extensions/Wikibase/client/includes/Usage/EntityUsage.php
@@ -28,7 +28,8 @@
 
        /**
         * Usage flag indicating that the entity's label in the local content 
language was used.
-        * This would be the case when showing the label of a referenced entity.
+        * This would be the case when showing the label of a referenced 
entity. Note that
+        * label usage is typically tracked with a modifier specifying the 
label's language code.
         */
        const LABEL_USAGE = 'L';
 
@@ -77,18 +78,26 @@
        private $aspect;
 
        /**
+        * @var null|string
+        */
+       private $modifier;
+
+       /**
         * @param EntityId $entityId
         * @param string $aspect use the EntityUsage::XXX_USAGE constants
+        * @param string|null $modifier for further qualifying the usage aspect 
(e.g. a language code
+        *        may be used along with the LABEL_USAGE aspect.
         *
         * @throws InvalidArgumentException
         */
-       public function __construct( EntityId $entityId, $aspect ) {
+       public function __construct( EntityId $entityId, $aspect, $modifier = 
null ) {
                if ( !array_key_exists( $aspect, self::$aspects ) ) {
                        throw new InvalidArgumentException( '$aspect must use 
one of the XXX_USAGE constants!' );
                }
 
                $this->entityId = $entityId;
                $this->aspect = $aspect;
+               $this->modifier = $modifier;
        }
 
        /**
@@ -96,6 +105,23 @@
         */
        public function getAspect() {
                return $this->aspect;
+       }
+
+       /**
+        * @return null|string
+        */
+       public function getModifier() {
+               return $this->modifier;
+       }
+
+       /**
+        * Returns the aspect with the modifier applied.
+        * @see makeAspectKey
+        *
+        * @return string
+        */
+       public function getAspectKey() {
+               return self::makeAspectKey( $this->aspect, $this->modifier );
        }
 
        /**
@@ -109,7 +135,7 @@
         * @return string
         */
        public function getIdentityString() {
-               return $this->getEntityId()->getSerialization() . '#' . 
$this->getAspect();
+               return $this->getEntityId()->getSerialization() . '#' . 
$this->getAspectKey();
        }
 
        /**
@@ -119,4 +145,38 @@
                return $this->getIdentityString();
        }
 
+       /**
+        * Splits the given aspect key into aspect and modifier (if any).
+        * This is the inverse of makeAspectKey().
+        *
+        * @param string $aspectKey
+        *
+        * @return string[] list( $aspect, $modifier )
+        */
+       public static function splitAspectKey( $aspectKey ) {
+               $parts = explode( '.', $aspectKey, 2 );
+
+               if ( !isset( $parts[1] ) ) {
+                       $parts[1] = null;
+               }
+
+               return $parts;
+       }
+       /**
+        * Composes an aspect key from aspect and modifier (if any).
+        * This is the inverse of splitAspectKey().
+        *
+        * @param string $aspect
+        * @param string $modifier
+        *
+        * @return string "$aspect.$modifier"
+        */
+       public static function makeAspectKey( $aspect, $modifier ) {
+               if ( $modifier !== null ) {
+                       return "$aspect.$modifier";
+               } else {
+                       return $aspect;
+               }
+       }
+
 }
diff --git a/extensions/Wikibase/client/includes/Usage/PageEntityUsages.php 
b/extensions/Wikibase/client/includes/Usage/PageEntityUsages.php
index 4eca198..c1c8158 100644
--- a/extensions/Wikibase/client/includes/Usage/PageEntityUsages.php
+++ b/extensions/Wikibase/client/includes/Usage/PageEntityUsages.php
@@ -81,14 +81,37 @@
 
        /**
         * Collects all usage aspects present on the page.
+        * Modifiers are not considered, use getAspects() if modifiers should 
be included.
         *
-        * string[] aspect names (sorted)
+        * @see getAspectKeys()
+        *
+        * string[] Sorted list of aspect names (without modifiers).
         */
        public function getAspects() {
                $aspects = array();
 
                foreach ( $this->usages as $usage ) {
                        $aspect = $usage->getAspect();
+                       $aspects[$aspect] = true;
+               }
+
+               ksort( $aspects );
+               return array_keys( $aspects );
+       }
+
+       /**
+        * Collects all usage aspects present on the page.
+        * Aspect keys will include modifiers, use getAspects() if modifiers 
are not desired.
+        *
+        * @see getAspects()
+        *
+        * string[] Sorted list of full aspect names with modifiers.
+        */
+       public function getAspectKeys() {
+               $aspects = array();
+
+               foreach ( $this->usages as $usage ) {
+                       $aspect = $usage->getAspectKey();
                        $aspects[$aspect] = true;
                }
 
@@ -132,18 +155,19 @@
 
        /**
         * Returns the aspects used by the given entity on the page
-        * represented by this PageEntityUsages object.
+        * represented by this PageEntityUsages object. They aspects
+        * will include any modifiers.
         *
         * @param EntityId $id
         *
-        * @return string[] List of aspect names, sorted.
+        * @return string[] List of aspect keys, sorted.
         */
-       public function getUsageAspects( EntityId $id ) {
+       public function getUsageAspectKeys( EntityId $id ) {
                $aspects = array();
 
                foreach ( $this->usages as $usage ) {
                        if ( $id->equals( $usage->getEntityId() ) ) {
-                               $aspects[] = $usage->getAspect();
+                               $aspects[] = $usage->getAspectKey();
                        }
                }
 
diff --git 
a/extensions/Wikibase/client/includes/Usage/Sql/UsageTableUpdater.php 
b/extensions/Wikibase/client/includes/Usage/Sql/UsageTableUpdater.php
index fab22b2..c625a03 100644
--- a/extensions/Wikibase/client/includes/Usage/Sql/UsageTableUpdater.php
+++ b/extensions/Wikibase/client/includes/Usage/Sql/UsageTableUpdater.php
@@ -155,7 +155,7 @@
 
        /**
         * Collects the entity id strings contained in the given list of 
EntityUsages into
-        * bins based on the usage's aspect.
+        * bins based on the usage's aspect and modifier.
         *
         * @param EntityUsage[] $usages
         *
@@ -170,7 +170,7 @@
                                throw new InvalidArgumentException( '$usages 
must contain EntityUsage objects.' );
                        }
 
-                       $aspect = $usage->getAspect();
+                       $aspect = $usage->getAspectKey();
                        $bins[$aspect][] = 
$usage->getEntityId()->getSerialization();
                }
 
@@ -195,7 +195,7 @@
 
                        $rows[] = array(
                                'eu_page_id' => (int)$pageId,
-                               'eu_aspect' => $usage->getAspect(),
+                               'eu_aspect' => $usage->getAspectKey(),
                                'eu_entity_id' => 
$usage->getEntityId()->getSerialization(),
                                'eu_touched' => wfTimestamp( TS_MW, $touched ),
                        );
diff --git a/extensions/Wikibase/client/includes/Usage/UsageAccumulator.php 
b/extensions/Wikibase/client/includes/Usage/UsageAccumulator.php
index d744c4f..51c1f2a 100644
--- a/extensions/Wikibase/client/includes/Usage/UsageAccumulator.php
+++ b/extensions/Wikibase/client/includes/Usage/UsageAccumulator.php
@@ -24,7 +24,7 @@
        abstract public function addUsage( EntityUsage $usage );
 
        /**
-        * Registers the usage of entity's labels (in the local content 
language), if the provided
+        * Registers the usage of entity's labels (in the given language), if 
the provided
         * snaks are PropertyValueSnaks that contain EntityIdValues.
         *
         * @note We track any EntityIdValue as a label usage. This is making 
assumptions about what the
@@ -32,15 +32,16 @@
         * but that seems nasty to model.
         *
         * @param Snak[] $snaks
+        * @param string|null $language
         */
-       public function addLabelUsageForSnaks( array $snaks ) {
+       public function addLabelUsageForSnaks( array $snaks, $language = null ) 
{
                foreach ( $snaks as $snak ) {
-                       $this->addLabelUsageForSnak( $snak );
+                       $this->addLabelUsageForSnak( $snak, $language );
                }
        }
 
        /**
-        * Registers the usage of an entity's label (in the local content 
language), if the provided
+        * Registers the usage of an entity's label (in the given language), if 
the provided
         * snak is a PropertyValueSnak that contains an EntityIdValue.
         *
         * @note We track any EntityIdValue as a label usage. This is making 
assumptions about what the
@@ -48,24 +49,26 @@
         * but that seems nasty to model.
         *
         * @param Snak $snak
+        * @param string|null $language
         */
-       public function addLabelUsageForSnak( Snak $snak ) {
+       public function addLabelUsageForSnak( Snak $snak, $language = null ) {
                if ( $snak instanceof PropertyValueSnak ) {
                        $value = $snak->getDataValue();
 
                        if ( $value instanceof EntityIdValue ) {
-                               $this->addLabelUsage( $value->getEntityId() );
+                               $this->addLabelUsage( $value->getEntityId(), 
$language );
                        }
                }
        }
 
        /**
-        * Registers the usage of an entity's label (in the local content 
language).
+        * Registers the usage of an entity's label (in the given language).
         *
         * @param EntityId $id
+        * @param string|null $language
         */
-       public function addLabelUsage( EntityId $id ) {
-               $this->addUsage( new EntityUsage( $id, EntityUsage::LABEL_USAGE 
) );
+       public function addLabelUsage( EntityId $id, $language = null ) {
+               $this->addUsage( new EntityUsage( $id, 
EntityUsage::LABEL_USAGE, $language ) );
        }
 
        /**
diff --git 
a/extensions/Wikibase/client/includes/Usage/UsageAspectTransformer.php 
b/extensions/Wikibase/client/includes/Usage/UsageAspectTransformer.php
index 06cbff0..b695274 100644
--- a/extensions/Wikibase/client/includes/Usage/UsageAspectTransformer.php
+++ b/extensions/Wikibase/client/includes/Usage/UsageAspectTransformer.php
@@ -53,10 +53,10 @@
         * Gets EntityUsage objects for each aspect in $aspects that is 
relevant according to
         * getRelevantAspects( $entityId ).
         *
-        * @example: If was called with setRelevantAspects( $q3, array( 'T', 
'L' ) ),
-        * getFilteredUsages( $q3, array( 'S', 'L' ) ) will return EntityUsage( 
$q3, 'L'),
-        * while getFilteredUsages( $q3, array( 'X' ) ) will return 
EntityUsage( $q3, 'T')
-        * and EntityUsage( $q3, 'L').
+        * @example: If was called with setRelevantAspects( $q3, array( 'T', 
'L.de', 'L.en' ) ),
+        * getFilteredUsages( $q3, array( 'S', 'L' ) ) will return EntityUsage( 
$q3, 'L.de', 'L.en' ),
+        * while getFilteredUsages( $q3, array( 'X' ) ) will return 
EntityUsage( $q3, 'T' )
+        * and EntityUsage( $q3, 'L' ).
         *
         * @param EntityId $entityId
         * @param string[] $aspects
@@ -86,7 +86,7 @@
                $transformedPageEntityUsages = new PageEntityUsages( 
$pageEntityUsages->getPageId(), array() );
 
                foreach ( $entityIds as $id ) {
-                       $aspects = $pageEntityUsages->getUsageAspects( $id );
+                       $aspects = $pageEntityUsages->getUsageAspectKeys( $id );
                        $usages = $this->getFilteredUsages( $id, $aspects );
                        $transformedPageEntityUsages->addUsages( $usages );
                }
@@ -96,7 +96,7 @@
 
        /**
         * @param EntityId $entityId
-        * @param string[] $aspects
+        * @param string[] $aspects (may have modifiers applied)
         *
         * @return EntityUsage[]
         */
@@ -104,7 +104,9 @@
                $usages = array();
 
                foreach ( $aspects as $aspect ) {
-                       $entityUsage = new EntityUsage( $entityId, $aspect );
+                       list( $aspect, $modifier ) = 
EntityUsage::splitAspectKey( $aspect );
+
+                       $entityUsage = new EntityUsage( $entityId, $aspect, 
$modifier );
                        $key = $entityUsage->getIdentityString();
 
                        $usages[$key] = $entityUsage;
@@ -118,17 +120,22 @@
         * Filter $aspects based on the aspects provided by $relevant, 
according to the rules
         * defined for combining aspects (see class level documentation).
         *
-        * @note This returns the intersection of $aspects and $relevant,
-        * except if on of the list contains the ALL_USAGE code (X).
-        * If X is present in $aspects, this method will return $relevant (if 
"all" is in the
+        * @note This basically returns the intersection of $aspects and 
$relevant,
+        * except for special treatment of ALL_USAGE and of modified aspects:
+        *
+        * - If X is present in $aspects, this method will return $relevant (if 
"all" is in the
         * base set, the filtered set will be the filter itself).
-        * If X is present in $relevant, this method returns $aspects (if all 
aspects are relevant,
+        * - If X is present in $relevant, this method returns $aspects (if all 
aspects are relevant,
         * nothing is filtered out).
+        * - If a modified aspect A.xx is present in $relevant and the 
unmodified aspect A is present in
+        *   $aspects, A is included in the result.
+        * - If a modified aspect A.xx is present in $aspect and the unmodified 
aspect A is present in
+        *   $relevant, the modified aspect A.xx is included in the result.
         *
         * @param string[] $aspects
         * @param string[] $relevant
         *
-        * @return string[]
+        * @return string[] Aspect keys, with modifiers applied
         */
        private function getFilteredAspects( array $aspects, array $relevant ) {
                if ( empty( $aspects ) || empty( $relevant ) ) {
@@ -141,7 +148,78 @@
                        return $aspects;
                }
 
-               return array_intersect( $aspects, $relevant );
+               // group modified aspects into "bins" for matching with 
unmodified aspects, e.g.
+               // array( 'X' => array( 'X' ), 'L' => array( 'L.de', 'L.ru' ) )
+               $aspectBins = $this->binAspects( $aspects );
+               $relevantBins = $this->binAspects( $relevant );
+
+               // matches 'L.xx' in $aspects to 'L' in  $relevant
+               $leftMatches = $this->matchBins( $aspectBins, $relevant );
+
+               // matches 'L.xx' in $relevant to 'L' in  $aspects
+               $rightMatches = $this->matchBins( $relevantBins, $aspects );
+
+               // matches 'L.xx' in $relevant to 'L.xx' in $aspects
+               $directMatches = array_intersect( $relevant, $aspects );
+
+               // combine, sort, and uniquify the results
+               $matches = array_merge(
+                       $directMatches,
+                       $leftMatches,
+                       $rightMatches
+               );
+
+               sort( $matches );
+               return array_unique( $matches );
+       }
+
+       /**
+        * Collects aspects into bins, each bin containing all the 
modifications of a given aspect.
+        * This is useful for matching modified aspects against unmodified ones.
+        *
+        * @example array( 'X', 'L.de', 'L.ru' ) becomes
+        *   array( 'X' => array( 'X' ), 'L' => array( 'L.de', 'L.ru' ) ).
+        *
+        * @param string[] $aspects
+        *
+        * @return string[][] An associative array mapping aspect names to 
groups of modifications
+        *         of that aspect.
+        */
+       private function binAspects( $aspects ) {
+               $bags = array();
+
+               foreach ( $aspects as $a ) {
+                       list( $key, ) = EntityUsage::splitAspectKey( $a );
+                       $bags[$key][] = $a;
+               }
+
+               return $bags;
+       }
+
+       /**
+        * Match the names $aspects against the aspects used as keys to in 
$bins.
+        * The result is constructed by merging the bins associated with 
matching keys.
+        *
+        * @example: If $aspects = array( 'T', 'L', 'S' ) and
+        * $bins = array( 'L' => array( 'L.de', 'L.ru' ), 'T' => array( 'T' ), 
'X' => array( 'X' ) ),
+        * the result would be array( 'L.de', 'L.ru', 'T' ), which is the union 
of the bins
+        * associated with the 'L' and 'T' keys.
+        *
+        * @param string[][] $bins An associative array mapping aspect names to 
groups of modifications
+        *         of that aspect, as returned by binAspects().
+        *
+        * @param string[] $aspects A list of aspect names
+        *
+        * @return string[]
+        */
+       private function matchBins( array $bins, array $aspects ) {
+               // keep the bins with keys also present in $aspects
+               $matchingBins = array_intersect_key( $bins, array_flip( 
$aspects ) );
+
+               // merge the matching bins into a single list
+               $matchingAspects = array_reduce( $matchingBins, 'array_merge', 
array() );
+
+               return $matchingAspects;
        }
 
 }
diff --git 
a/extensions/Wikibase/client/tests/phpunit/includes/Changes/AffectedPagesFinderTest.php
 
b/extensions/Wikibase/client/tests/phpunit/includes/Changes/AffectedPagesFinderTest.php
index bc1cc3b..93cd71b 100644
--- 
a/extensions/Wikibase/client/tests/phpunit/includes/Changes/AffectedPagesFinderTest.php
+++ 
b/extensions/Wikibase/client/tests/phpunit/includes/Changes/AffectedPagesFinderTest.php
@@ -163,12 +163,12 @@
                        $changeFactory->newFromUpdate(
                                ItemChange::UPDATE,
                                $this->getEmptyItem( $q1 ),
-                               $this->getItemWithLabel( $q1, 'de', 'EINS' )
+                               $this->getItemWithAliases( $q1, 'de', array( 
'EINS' ) )
                        )
                );
 
                $cases['local label change on Q1 (used by Q2)'] = array(
-                       array( EntityUsage::LABEL_USAGE ),
+                       array( EntityUsage::makeAspectKey( 
EntityUsage::LABEL_USAGE, 'en' ) ),
                        $changeFactory->newFromUpdate(
                                ItemChange::UPDATE,
                                $this->getEmptyItem( $q1 ),
@@ -211,26 +211,32 @@
                $q2AllUsage = new EntityUsage( $q2, EntityUsage::ALL_USAGE );
                $q2OtherUsage = new EntityUsage( $q2, EntityUsage::OTHER_USAGE 
);
 
-               $q1LabelUsage = new EntityUsage( $q1, EntityUsage::LABEL_USAGE 
);
+               $q1LabelUsage_en = new EntityUsage( $q1, 
EntityUsage::LABEL_USAGE, 'en' );
                $q2LabelUsage = new EntityUsage( $q2, EntityUsage::LABEL_USAGE 
);
+               $q2LabelUsage_en = new EntityUsage( $q2, 
EntityUsage::LABEL_USAGE, 'en' );
+               $q2LabelUsage_de = new EntityUsage( $q2, 
EntityUsage::LABEL_USAGE, 'de' );
 
                $q1TitleUsage = new EntityUsage( $q1, EntityUsage::TITLE_USAGE 
);
                $q2TitleUsage = new EntityUsage( $q2, EntityUsage::TITLE_USAGE 
);
 
+               // Page 1 is linked to Q1
                $page1Q1Usages = new PageEntityUsages( 1, array(
                        $q1SitelinkUsage,
                ) );
 
+               // Page 2 uses label and title to link to Q1
                $page2Q1Usages = new PageEntityUsages( 2, array(
-                       $q1LabelUsage,
+                       $q1LabelUsage_en,
                        $q1TitleUsage,
                ) );
 
+               // Page 1 uses label and title to link to Q2, and shows the 
German label too.
                $page1Q2Usages = new PageEntityUsages( 1, array(
-                       $q2LabelUsage,
+                       $q2LabelUsage, // "all languages" usage
                        $q2TitleUsage,
                ) );
 
+               // Page 2 uses Q2 to render an infobox
                $page2Q2Usages = new PageEntityUsages( 2, array(
                        $q2AllUsage,
                ) );
@@ -362,9 +368,22 @@
                        )
                );
 
-               $cases['other language label change on Q2 (used on page 2)'] = 
array(
+               $cases['other change on Q2 (used on page 2)'] = array(
                        array(
                                new PageEntityUsages( 2, array( $q2OtherUsage ) 
),
+                       ),
+                       array( $page1Q2Usages, $page2Q2Usages ),
+                       $changeFactory->newFromUpdate(
+                               ItemChange::UPDATE,
+                               $this->getEmptyItem( $q2 ),
+                               $this->getItemWithAliases( $q2, 'fr', array( 
'X', 'Y' ) )
+                       )
+               );
+
+               $cases['other language label change on Q2 (used on page 1 and 
2)'] = array(
+                       array(
+                               new PageEntityUsages( 1, array( 
$q2LabelUsage_de ) ),
+                               new PageEntityUsages( 2, array( 
$q2LabelUsage_de ) ),
                        ),
                        array( $page1Q2Usages, $page2Q2Usages ),
                        $changeFactory->newFromUpdate(
@@ -376,7 +395,7 @@
 
                $cases['local label change on Q1 (used by page 2)'] = array(
                        array(
-                               new PageEntityUsages( 2, array( $q1LabelUsage ) 
),
+                               new PageEntityUsages( 2, array( 
$q1LabelUsage_en ) ),
                        ),
                        array( $page1Q1Usages, $page2Q1Usages ),
                        $changeFactory->newFromUpdate(
@@ -386,10 +405,10 @@
                        )
                );
 
-               $cases['label change on Q2 (used by page 1 and page 2)'] = 
array(
+               $cases['local label change on Q2 (used by page 1 and page 2)'] 
= array(
                        array(
-                               new PageEntityUsages( 1, array( $q2LabelUsage ) 
),
-                               new PageEntityUsages( 2, array( $q2LabelUsage ) 
),
+                               new PageEntityUsages( 1, array( 
$q2LabelUsage_en ) ),
+                               new PageEntityUsages( 2, array( 
$q2LabelUsage_en ) ),
                        ),
                        array( $page1Q2Usages, $page2Q2Usages ),
                        $changeFactory->newFromUpdate(
@@ -501,6 +520,20 @@
        }
 
        /**
+        * @param ItemId $id
+        * @param string $languageCode
+        * @param string[] $aliases
+        *
+        * @return Item
+        */
+       private function getItemWithAliases( ItemId $id, $languageCode, array 
$aliases ) {
+               $item = $this->getEmptyItem( $id );
+               $item->addAliases( $languageCode, $aliases );
+
+               return $item;
+       }
+
+       /**
         * @param PageEntityUsages[]|Iterator<PageEntityUsages> $usagesPerPage
         *
         * @return PageEntityUsages[]
diff --git 
a/extensions/Wikibase/client/tests/phpunit/includes/Changes/ChangeHandlerTest.php
 
b/extensions/Wikibase/client/tests/phpunit/includes/Changes/ChangeHandlerTest.php
index 0c98a46..d486d69 100644
--- 
a/extensions/Wikibase/client/tests/phpunit/includes/Changes/ChangeHandlerTest.php
+++ 
b/extensions/Wikibase/client/tests/phpunit/includes/Changes/ChangeHandlerTest.php
@@ -442,7 +442,7 @@
                                                                // we use the 
numeric item id as the fake page id of the local page!
                                                                $usages = array(
                                                                        new 
EntityUsage( $id, EntityUsage::SITELINK_USAGE ),
-                                                                       new 
EntityUsage( $id, EntityUsage::LABEL_USAGE )
+                                                                       new 
EntityUsage( $id, EntityUsage::LABEL_USAGE, 'en' )
                                                                );
                                                                $pages[] = new 
PageEntityUsages( $id->getNumericId(), $usages );
                                                        }
diff --git 
a/extensions/Wikibase/client/tests/phpunit/includes/Hooks/DataUpdateHookHandlersTest.php
 
b/extensions/Wikibase/client/tests/phpunit/includes/Hooks/DataUpdateHookHandlersTest.php
index 5ed7f66..49a06ae 100644
--- 
a/extensions/Wikibase/client/tests/phpunit/includes/Hooks/DataUpdateHookHandlersTest.php
+++ 
b/extensions/Wikibase/client/tests/phpunit/includes/Hooks/DataUpdateHookHandlersTest.php
@@ -10,9 +10,6 @@
 use Wikibase\Client\Usage\ParserOutputUsageAccumulator;
 use Wikibase\DataModel\Entity\EntityId;
 use Wikibase\DataModel\Entity\ItemId;
-use Wikibase\NamespaceChecker;
-use Wikibase\Settings;
-use Wikibase\SettingsArray;
 use WikiPage;
 
 /**
@@ -26,20 +23,6 @@
  * @author Daniel Kinzler
  */
 class DataUpdateHookHandlersTest extends \MediaWikiTestCase {
-
-       /**
-        * @param array $settings
-        *
-        * @return Settings
-        */
-       private function newSettings( array $settings ) {
-               $defaults = array(
-                       'namespaces' => array( NS_MAIN, NS_CATEGORY ),
-                       'siteGlobalid' => 'enwiki',
-               );
-
-               return new SettingsArray( array_merge( $defaults, $settings ) );
-       }
 
        /**
         * @param Title $title
@@ -92,15 +75,9 @@
         * @return DataUpdateHookHandlers
         */
        private function newDataUpdateHookHandlers( Title $title, array 
$expectedUsages = null, array $settings = array() ) {
-               $settings = $this->newSettings( $settings );
-
-               $namespaces = $settings->getSetting( 'namespaces' );
-               $namespaceChecker = new NamespaceChecker( array(), $namespaces 
);
-
                $usageUpdater = $this->newUsageUpdater( $title, $expectedUsages 
);
 
                return new DataUpdateHookHandlers(
-                       $namespaceChecker,
                        $usageUpdater
                );
        }
@@ -178,9 +155,9 @@
                                array(),
                        ),
 
-                       'ignored-namespace' => array(
-                               Title::makeTitle( NS_USER, 'Foo' ),
-                               null,
+                       'other namespace' => array(
+                               Title::makeTitle( NS_USER_TALK, 'Foo' ),
+                               array(),
                        ),
                );
        }
diff --git 
a/extensions/Wikibase/client/tests/phpunit/includes/Usage/EntityUsageTest.php 
b/extensions/Wikibase/client/tests/phpunit/includes/Usage/EntityUsageTest.php
index a2cf399..5f5d39e 100644
--- 
a/extensions/Wikibase/client/tests/phpunit/includes/Usage/EntityUsageTest.php
+++ 
b/extensions/Wikibase/client/tests/phpunit/includes/Usage/EntityUsageTest.php
@@ -18,16 +18,73 @@
  */
 class EntityUsageTest extends PHPUnit_Framework_TestCase {
 
-       public function testGetters() {
+
+       public function testGetEntityId() {
                $id = new ItemId( 'Q7' );
                $aspect = EntityUsage::ALL_USAGE;
 
                $usage = new EntityUsage( $id, $aspect );
 
                $this->assertEquals( $id, $usage->getEntityId() );
-               $this->assertEquals( $aspect, $usage->getAspect() );
+       }
 
+       public function testGetAspect() {
+               $id = new ItemId( 'Q7' );
+               $aspect = EntityUsage::ALL_USAGE;
+
+               $usage = new EntityUsage( $id, $aspect );
+               $this->assertEquals( $aspect, $usage->getAspect() );
+       }
+
+       public function testGetIdentityString() {
+               $id = new ItemId( 'Q7' );
+               $aspect = EntityUsage::ALL_USAGE;
+
+               $usage = new EntityUsage( $id, $aspect );
                $this->assertInternalType( 'string', 
$usage->getIdentityString() );
        }
 
+       public function testGetAspectKey() {
+               $id = new ItemId( 'Q7' );
+               $aspect = EntityUsage::LABEL_USAGE;
+               $modifier = 'ru';
+
+               $usage = new EntityUsage( $id, $aspect );
+               $this->assertEquals( $aspect, $usage->getAspectKey() );
+
+               $usage = new EntityUsage( $id, $aspect, $modifier );
+               $this->assertEquals( "$aspect.$modifier", 
$usage->getAspectKey() );
+       }
+
+       public function provideSplitAspectKey() {
+               return array(
+                       array( 'L', array( 'L', null ) ),
+                       array( 'L.x', array( 'L', 'x' ) ),
+                       array( 'L.x.y', array( 'L', 'x.y' ) ),
+               );
+       }
+
+       /**
+        * @dataProvider provideSplitAspectKey
+        */
+       public function testSplitAspectKey( $aspectKey, $expectedParts ) {
+               $parts = EntityUsage::splitAspectKey( $aspectKey );
+               $this->assertEquals( $expectedParts, $parts );
+       }
+
+       public function provideMakeAspectKey() {
+               return array(
+                       array( 'L', null, 'L' ),
+                       array( 'L', 'x', 'L.x' ),
+               );
+       }
+
+       /**
+        * @dataProvider provideMakeAspectKey
+        */
+       public function testMakeAspectKey( $aspect, $modifier, $expectedKey ) {
+               $key = EntityUsage::makeAspectKey( $aspect, $modifier );
+               $this->assertEquals( $expectedKey, $key );
+       }
+
 }
diff --git 
a/extensions/Wikibase/client/tests/phpunit/includes/Usage/PageEntityUsagesTest.php
 
b/extensions/Wikibase/client/tests/phpunit/includes/Usage/PageEntityUsagesTest.php
index d923d26..21e0f35 100644
--- 
a/extensions/Wikibase/client/tests/phpunit/includes/Usage/PageEntityUsagesTest.php
+++ 
b/extensions/Wikibase/client/tests/phpunit/includes/Usage/PageEntityUsagesTest.php
@@ -24,7 +24,8 @@
 
                $usages = array(
                        new EntityUsage( $q7, EntityUsage::ALL_USAGE ),
-                       new EntityUsage( $q11, EntityUsage::LABEL_USAGE ),
+                       new EntityUsage( $q11, EntityUsage::LABEL_USAGE, 'de' ),
+                       new EntityUsage( $q11, EntityUsage::LABEL_USAGE, 'en' ),
                        new EntityUsage( $q11, EntityUsage::TITLE_USAGE ),
                );
 
@@ -38,11 +39,25 @@
                        EntityUsage::ALL_USAGE,
                );
 
-               $this->assertEquals( $expectedAspects, 
$pageUsages->getAspects() );
-               $this->assertEquals( array( 'Q11' => $q11, 'Q7' => $q7 ), 
$pageUsages->getEntityIds() );
-               $this->assertEquals( array( 'Q11#L', 'Q11#T', 'Q7#X' ), 
array_keys( $pageUsages->getUsages() ) );
+               $expectedAspectKeys = array(
+                       EntityUsage::LABEL_USAGE . '.de',
+                       EntityUsage::LABEL_USAGE . '.en',
+                       EntityUsage::TITLE_USAGE,
+                       EntityUsage::ALL_USAGE,
+               );
 
-               $this->assertEquals( array( EntityUsage::ALL_USAGE ), 
$pageUsages->getUsageAspects( $q7 ) );
+               $expectedAspectKeysQ11 = array(
+                       EntityUsage::LABEL_USAGE . '.de',
+                       EntityUsage::LABEL_USAGE . '.en',
+                       EntityUsage::TITLE_USAGE,
+               );
+
+               $this->assertEquals( $expectedAspects, 
$pageUsages->getAspects(), 'getAspects' );
+               $this->assertEquals( $expectedAspectKeys, 
$pageUsages->getAspectKeys(), 'getAspectKeys' );
+               $this->assertEquals( array( 'Q11' => $q11, 'Q7' => $q7 ), 
$pageUsages->getEntityIds(), 'getEntityIds' );
+               $this->assertEquals( array( 'Q11#L.de', 'Q11#L.en', 'Q11#T', 
'Q7#X' ), array_keys( $pageUsages->getUsages() ), 'getUsages' );
+
+               $this->assertEquals( $expectedAspectKeysQ11, 
$pageUsages->getUsageAspectKeys( $q11 ), 'getUsageAspects' );
        }
 
 }
diff --git 
a/extensions/Wikibase/client/tests/phpunit/includes/Usage/Sql/UsageTableUpdaterTest.php
 
b/extensions/Wikibase/client/tests/phpunit/includes/Usage/Sql/UsageTableUpdaterTest.php
index 6377951..24d16be 100644
--- 
a/extensions/Wikibase/client/tests/phpunit/includes/Usage/Sql/UsageTableUpdaterTest.php
+++ 
b/extensions/Wikibase/client/tests/phpunit/includes/Usage/Sql/UsageTableUpdaterTest.php
@@ -39,7 +39,8 @@
                        $key = "Q$i";
                        $id = new ItemId( $key );
 
-                       $usages["$key#L"] = new EntityUsage( $id, 
EntityUsage::LABEL_USAGE );
+                       $usages["$key#L.de"] = new EntityUsage( $id, 
EntityUsage::LABEL_USAGE, 'de' );
+                       $usages["$key#L.en"] = new EntityUsage( $id, 
EntityUsage::LABEL_USAGE, 'en' );
                        $usages["$key#T"] = new EntityUsage( $id, 
EntityUsage::TITLE_USAGE );
                }
 
@@ -77,7 +78,7 @@
                foreach ( $usages as $key => $usage ) {
                        $row = array(
                                'eu_entity_id' => 
$usage->getEntityId()->getSerialization(),
-                               'eu_aspect' => $usage->getAspect()
+                               'eu_aspect' => $usage->getAspectKey()
                        );
 
                        if ( $pageId > 0 ) {
@@ -89,7 +90,7 @@
                        }
 
                        if ( is_int( $key ) ) {
-                               $key = 
$usage->getEntityId()->getSerialization() . '#' . $usage->getAspect();
+                               $key = 
$usage->getEntityId()->getSerialization() . '#' . $usage->getAspectKey();
                        }
 
                        $rows[$key] = $row;
diff --git 
a/extensions/Wikibase/client/tests/phpunit/includes/Usage/UsageAccumulatorContractTester.php
 
b/extensions/Wikibase/client/tests/phpunit/includes/Usage/UsageAccumulatorContractTester.php
index cfb0356..50421a5 100644
--- 
a/extensions/Wikibase/client/tests/phpunit/includes/Usage/UsageAccumulatorContractTester.php
+++ 
b/extensions/Wikibase/client/tests/phpunit/includes/Usage/UsageAccumulatorContractTester.php
@@ -47,8 +47,8 @@
                $q3 = new ItemId( 'Q3' );
                $q4 = new ItemId( 'Q4' );
                $expected = array(
-                       new EntityUsage( $q4, EntityUsage::LABEL_USAGE ),
-                       new EntityUsage( $q2, EntityUsage::LABEL_USAGE ),
+                       new EntityUsage( $q4, EntityUsage::LABEL_USAGE, 'xx' ),
+                       new EntityUsage( $q2, EntityUsage::LABEL_USAGE, 'xx' ),
                        new EntityUsage( $q2, EntityUsage::TITLE_USAGE ),
                        new EntityUsage( $q2, EntityUsage::SITELINK_USAGE ),
                        new EntityUsage( $q2, EntityUsage::OTHER_USAGE ),
@@ -64,9 +64,9 @@
                $this->usageAccumulator->addLabelUsageForSnaks( array(
                        new PropertyValueSnak( new PropertyId( 'P4' ), new 
EntityIdValue( $q4 ) ),
                        new PropertyValueSnak( new PropertyId( 'P5' ), new 
StringValue( 'string' ) ),
-               ) );
+               ), 'xx' );
 
-               $expected = new EntityUsage( $q4, EntityUsage::LABEL_USAGE );
+               $expected = new EntityUsage( $q4, EntityUsage::LABEL_USAGE, 
'xx' );
 
                $usages = $this->usageAccumulator->getUsages();
                $this->assertContainsUsage( $expected, $usages );
@@ -74,9 +74,9 @@
 
        private function testAddAndGetLabelUsage() {
                $q2 = new ItemId( 'Q2' );
-               $this->usageAccumulator->addLabelUsage( $q2 );
+               $this->usageAccumulator->addLabelUsage( $q2, 'xx' );
 
-               $expected = new EntityUsage( $q2, EntityUsage::LABEL_USAGE );
+               $expected = new EntityUsage( $q2, EntityUsage::LABEL_USAGE, 
'xx' );
 
                $usages = $this->usageAccumulator->getUsages();
                $this->assertContainsUsage( $expected, $usages );
diff --git 
a/extensions/Wikibase/client/tests/phpunit/includes/Usage/UsageAspectTransformerTest.php
 
b/extensions/Wikibase/client/tests/phpunit/includes/Usage/UsageAspectTransformerTest.php
index 7d7c041..11edfef 100644
--- 
a/extensions/Wikibase/client/tests/phpunit/includes/Usage/UsageAspectTransformerTest.php
+++ 
b/extensions/Wikibase/client/tests/phpunit/includes/Usage/UsageAspectTransformerTest.php
@@ -75,6 +75,36 @@
                                array( 'X' ),
                                array( 'Q1#L', 'Q1#S' )
                        ),
+                       'modifier: direct match' => array(
+                               $q1,
+                               array( 'L.de', 'L.en' ),
+                               array( 'L.en', 'L.ru' ),
+                               array( 'Q1#L.en' )
+                       ),
+                       'modifier: mismatch' => array(
+                               $q1,
+                               array( 'L.ru' ),
+                               array( 'L.en' ),
+                               array()
+                       ),
+                       'modifier: match unmodified relevant' => array(
+                               $q1,
+                               array( 'L', 'L.ru' ),
+                               array( 'L.en' ),
+                               array( 'Q1#L.en' )
+                       ),
+                       'modifier: match unmodified aspect' => array(
+                               $q1,
+                               array( 'L.en' ),
+                               array( 'L', 'L.ru' ),
+                               array( 'Q1#L.en' )
+                       ),
+                       'modifier: mixed' => array(
+                               $q1,
+                               array( 'L.en', 'L' ),
+                               array( 'L', 'L.ru' ),
+                               array( 'Q1#L', 'Q1#L.en', 'Q1#L.ru' )
+                       ),
                );
        }
 
diff --git a/extensions/Wikibase/lib/i18n/es.json 
b/extensions/Wikibase/lib/i18n/es.json
index 458b005..86bd820 100644
--- a/extensions/Wikibase/lib/i18n/es.json
+++ b/extensions/Wikibase/lib/i18n/es.json
@@ -29,6 +29,10 @@
        "wikibase-error-autocomplete-response": "El servidor respondió: $1",
        "wikibase-error-ui-no-external-page": "No se encontró el artículo 
especificado en el sitio correspondiente.",
        "wikibase-error-ui-edit-conflict": "Hay un conflicto de edición. Por 
favor, vuelve a cargar y guarda de nuevo.",
+       "wikibase-quantitydetails-amount": "Cantidad",
+       "wikibase-quantitydetails-upperbound": "Límite superior",
+       "wikibase-quantitydetails-lowerbound": "Límite inferior",
+       "wikibase-quantitydetails-unit": "Unidad",
        "wikibase-timedetails-time": "Tiempo",
        "wikibase-timedetails-isotime": "Fecha y hora",
        "wikibase-timedetails-timezone": "Huso horario",
@@ -40,21 +44,37 @@
        "wikibase-globedetails-latitude": "Latitud",
        "wikibase-globedetails-precision": "Precisión",
        "wikibase-globedetails-globe": "Globo",
+       "wikibase-parse-error": "Valor con formato incorrecto.",
+       "wikibase-parse-error-coordinate": "El valor de coordenadas es 
incorrecto.",
+       "wikibase-parse-error-entity-id": "El identificador de la entidad es 
incorrecto.",
+       "wikibase-parse-error-quantity": "El valor de cantidad es incorrecto.",
+       "wikibase-parse-error-time": "El valor de tiempo es incorrecto.",
        "wikibase-sitelinks-wikipedia": "Wikipedia",
        "wikibase-sitelinks-sitename-columnheading": "Idioma",
        "wikibase-sitelinks-link-columnheading": "Página enlazada",
        "wikibase-snakview-snaktypeselector-somevalue": "valor desconocido",
        "wikibase-snakview-snaktypeselector-novalue": "sin valor",
        "wikibase-tooltip-error-details": "Detalles",
+       "wikibase-undeserializable-value": "El valor no es válido y no puede 
mostrarse.",
        "wikibase-validator-invalid": "Valor no válido",
        "wikibase-validator-missing-field": "Falta el campo obligatorio «$1»",
+       "wikibase-validator-bad-type": "$2 en lugar de $1",
+       "wikibase-validator-malformed-value": "Entrada incorrecta: $1",
+       "wikibase-validator-bad-entity-id": "Identificador incorrecto: $1",
+       "wikibase-validator-bad-entity-type": "Tipo de entidad inesperado $1",
        "wikibase-validator-no-such-entity": "No se encontró \"$1\"",
        "wikibase-validator-no-such-property": "No se encontró la propiedad $1",
        "wikibase-validator-bad-value": "Valor corrupto: $1",
+       "wikibase-validator-bad-value-type": "Tipo de valor incorrecto $1, se 
esperaba $2",
+       "wikibase-validator-bad-url": "URL incorrecta: $1",
+       "wikibase-validator-bad-url-scheme": "Esquema de URL no admitido: $1",
+       "wikibase-validator-unknown-unit": "Unidad desconocida: $1",
        "wikibase-validator-not-allowed": "Valor ilegal: $1",
        "wikibase-validator-no-validators": "Prohibido",
        "datatypes-type-wikibase-item": "Elemento",
        "datatypes-type-wikibase-property": "Propiedad",
        "datatypes-type-commonsMedia": "Archivo multimedia de Commons",
-       "version-wikibase": "Wikibase"
+       "version-wikibase": "Wikibase",
+       "wikibase-snakformatter-valuetype-mismatch": "El tipo de valor \"$1\" 
no coincide con el tipo de propiedad \"$2\".",
+       "wikibase-snakformatter-property-not-found": "No se encuentra la 
propiedad $1. No se puede determinar el tipo de datos que utilizar."
 }
diff --git a/extensions/Wikibase/lib/i18n/ml.json 
b/extensions/Wikibase/lib/i18n/ml.json
index 076a428..2bddb61 100644
--- a/extensions/Wikibase/lib/i18n/ml.json
+++ b/extensions/Wikibase/lib/i18n/ml.json
@@ -7,7 +7,7 @@
                ]
        },
        "wikibase-lib-desc": "വിക്കിബേസിനും വിക്കിബേസ് ക്ലയന്റ് 
അനുബന്ധങ്ങൾക്കുമുള്ള പൊതു പ്രവർത്തനരീതി",
-       "specialpages-group-wikibase": "വിക്കിബേസ് റെപ്പോസിറ്ററി",
+       "specialpages-group-wikibase": "വിക്കിബേസ്",
        "wikibase-deletedentity-item": "മായ്ക്കപ്പെട്ട ഇനം",
        "wikibase-deletedentity-property": "മായ്ക്കപ്പെട്ട ഗുണം",
        "wikibase-deletedentity-query": "മായ്ക്കപ്പെട്ട ക്വറി",
@@ -22,12 +22,13 @@
        "wikibase-error-autocomplete-response": "സെർവർ പ്രതികരണം: $1",
        "wikibase-error-ui-no-external-page": "ബന്ധപ്പെട്ട സൈറ്റിൽ, 
വ്യക്തമാക്കിയ ലേഖനം കണ്ടെത്താനായില്ല.",
        "wikibase-error-ui-edit-conflict": "തിരുത്തൽ സമരസപ്പെടായ്ക 
ഉണ്ടായിരിക്കുന്നു. റീലോഡ് ചെയ്ത ശേഷം വീണ്ടും സേവ് ചെയ്യുക.",
+       "wikibase-language-fallback-transliteration-hint": "$1 (ലിപിമാറ്റം)",
        "wikibase-quantitydetails-amount": "തുക",
        "wikibase-quantitydetails-upperbound": "ഉയർന്ന പരിധി",
        "wikibase-quantitydetails-lowerbound": "താഴ്ന് പരിധി",
        "wikibase-quantitydetails-unit": "ഏകകം",
        "wikibase-timedetails-time": "സമയം",
-       "wikibase-timedetails-isotime": "ഐ.എസ്.ഒ. സമയമുദ്ര",
+       "wikibase-timedetails-isotime": "സമയമുദ്ര",
        "wikibase-timedetails-timezone": "സമയ മേഖല",
        "wikibase-timedetails-calendar": "കാലഗണനാരീതി",
        "wikibase-timedetails-precision": "കൃത്യത",
@@ -67,7 +68,20 @@
        "wikibase-validator-bad-url-scheme": "പിന്തുണയില്ലാത്ത യു.ആർ.എൽ. 
സമ്പ്രദായം: $1",
        "wikibase-validator-unknown-unit": "അപരിചിതമായ ഏകകം: $1",
        "wikibase-validator-not-allowed": "അസാധുവായ വില: $1",
+       "wikibase-validator-no-validators": "വിലക്കപ്പെട്ടത്",
        "datatypes-type-wikibase-item": "ഇനം",
        "datatypes-type-commonsMedia": "കോമൺസിൽ നിന്നുള്ള മീഡിയ പ്രമാണം",
-       "version-wikibase": "വിക്കിബേസ്"
+       "version-wikibase": "വിക്കിബേസ്",
+       "wikibase-time-precision-Gannum": "$1 ശതകോടി വർഷങ്ങൾ കോമൺ ഇറ",
+       "wikibase-time-precision-Mannum": "$1 ദശലക്ഷം വർഷങ്ങൾ കോമൺ ഇറ",
+       "wikibase-time-precision-annum": "$1 വർഷങ്ങൾ കോമൺ ഇറ",
+       "wikibase-time-precision-millennium": "$1. സഹസ്രാബ്ദം",
+       "wikibase-time-precision-century": "$1. നൂറ്റാണ്ട്",
+       "wikibase-time-precision-10annum": "$1കൾ",
+       "wikibase-time-precision-BCE-Gannum": "$1 ശതകോടി വർഷങ്ങൾ ബി.സി.ഇ.",
+       "wikibase-time-precision-BCE-Mannum": "$1 ദശലക്ഷം വർഷങ്ങൾ ബി.സി.ഇ.",
+       "wikibase-time-precision-BCE-annum": "$1 വർഷങ്ങൾ ബി.സി.ഇ.",
+       "wikibase-time-precision-BCE-millennium": "$1. സഹസ്രാബ്ദം ബി.സി.ഇ.",
+       "wikibase-time-precision-BCE-century": "$1. നൂറ്റാണ്ട് ബി.സി.ഇ.",
+       "wikibase-time-precision-BCE-10annum": "$1കൾ ബി.സി.ഇ."
 }
diff --git a/extensions/Wikibase/lib/i18n/os.json 
b/extensions/Wikibase/lib/i18n/os.json
index 397a4ae..d24706c 100644
--- a/extensions/Wikibase/lib/i18n/os.json
+++ b/extensions/Wikibase/lib/i18n/os.json
@@ -4,5 +4,6 @@
                        "Amikeco"
                ]
        },
+       "wikibase-timedetails-isotime": "Датæ/рæстæг",
        "wikibase-sitelinks-wikipedia": "Википеди"
 }
diff --git a/extensions/Wikibase/repo/i18n/arq.json 
b/extensions/Wikibase/repo/i18n/arq.json
index 1f7c6a4..e4b5763 100644
--- a/extensions/Wikibase/repo/i18n/arq.json
+++ b/extensions/Wikibase/repo/i18n/arq.json
@@ -8,7 +8,7 @@
        "wikibase-edit": "تبديله",
        "wikibase-add": "زيد",
        "wikibase-label-empty": "حتا وشيمة ما معرّفة حتا لضركا",
-       "wikibase-description-empty": "ما كاين حتا وصيفة مصوّبة حتا لضركا",
+       "wikibase-description-empty": "ما كاين حتا وصيفة مصوّبة",
        "wikibase-statements": "تصراحات",
        "wikibase-sitelinks-special": "سيتات وحدخرين",
        "wikibase-aliases-empty": "ماكانش آلياس مصوّب",
diff --git a/extensions/Wikibase/repo/i18n/de.json 
b/extensions/Wikibase/repo/i18n/de.json
index b53e204..11d0bc8 100644
--- a/extensions/Wikibase/repo/i18n/de.json
+++ b/extensions/Wikibase/repo/i18n/de.json
@@ -430,10 +430,19 @@
        "apihelp-wbcreateredirect-param-to": "Objektkennung, um die 
Weiterleitung darauf zu verweisen",
        "apihelp-wbcreateredirect-param-bot": "Markiert diese Bearbeitung als 
Bot\nDiese URL-Markierung wird nur berücksichtigt, wenn der Benutzer der Gruppe 
„Bot“ angehört.",
        "apihelp-wbcreateredirect-example-1": "Wandelt Q11 in eine 
Weiterleitung nach Q12 um",
+       "apihelp-wbeditentity-example-1": "Erstellt ein neues leeres 
Datenobjekt, gibt die gesamte Objektstruktur zurück",
        "apihelp-wbeditentity-example-2": "Erstellt ein neues Objekt und legt 
die Bezeichnungen für de und en fest",
+       "apihelp-wbeditentity-example-3": "Erstellt eine neue Eigenschaft mit 
den JSON-Daten, gibt sie erweitert um die Datenobjektstruktur zurück",
        "apihelp-wbeditentity-example-4": "Löscht alle Daten vom Objekt mit der 
Kennung Q42",
+       "apihelp-wbeditentity-example-5": "Leert alle Daten von dem Objekt mit 
der Kennung Q42 und legt eine Bezeichnung für en fest",
+       "apihelp-wbeditentity-example-6": "Legt den Websitelink für nowiki fest 
und überschreibt ihn, falls bereits vorhanden",
        "apihelp-wbeditentity-example-7": "Legt die Beschreibung für nb fest 
und überschreibt sie, falls bereits vorhanden",
+       "apihelp-wbeditentity-example-8": "Erstellt eine neue Behauptung für 
das Datenobjekt der Eigenschaft P56 und dem Wert „ExampleString“",
+       "apihelp-wbeditentity-example-9": "Entfernt die Behauptungen des 
Datenobjekts mit den GUIDs Q42$D8404CDA-25E4-4334-AF13-A3290BCD9C0F und 
Q42$GH678DSA-01PQ-28XC-HJ90-DDFD9990126X",
+       "apihelp-wbeditentity-example-10": "Legt die Behauptung mit der GUID 
für den Wert der Behauptung fest",
        "apihelp-wbformatvalue-description": "Formatiert Datenwerte.",
+       "apihelp-wbformatvalue-param-generate": "Das Ausgabeformat, das 
generiert werden soll.",
+       "apihelp-wbformatvalue-param-datatype": "Der Datentyp des Wertes. 
Dieser wird vom Typ des Wertes bestimmt",
        "apihelp-wbformatvalue-example-1": "Formatiert einen einfachen 
Zeichenfolgenwert.",
        "apihelp-wbformatvalue-example-2": "Formatiert einen Zeichenfolgenwert 
als eine URL in HTML.",
        "apihelp-wbgetclaims-description": "Ruft Wikibase-Behauptungen ab.",
diff --git a/extensions/Wikibase/repo/i18n/es.json 
b/extensions/Wikibase/repo/i18n/es.json
index 1660156..d120b3b 100644
--- a/extensions/Wikibase/repo/i18n/es.json
+++ b/extensions/Wikibase/repo/i18n/es.json
@@ -119,6 +119,7 @@
        "wikibase-wikibaserepopage-not-itemid": "\"$1\" no es un elemento 
válido de identificación.",
        "wikibase-wikibaserepopage-invalid-langcode": "El código de idioma «$1» 
es desconocido. Utiliza un código de idioma que el sistema reconozca, como 
«es».",
        "wikibase-wikibaserepopage-invalid-id": "El identificador ID \"$1\" es 
desconocido para el sistema. Utiliza un identificador de entidad que sea 
válido.",
+       "wikibase-wikibaserepopage-unresolved-redirect": "$1 es una 
redirección.",
        "wikibase-wikibaserepopage-storage-exception": "Se produjo un error al 
intentar cargar $1: $2.",
        "special-itembytitle": "Elemento por título",
        "wikibase-itembytitle-lookup-fieldset": "Búsqueda de artículos por 
sitio y título",
@@ -265,15 +266,19 @@
        "wikibase-item-summary-wbeditentity-update": "Se cambió un elemento",
        "wikibase-item-summary-wbeditentity-override": "Se sobreescribió un 
elemento",
        "wikibase-item-summary-wbsetreference": "Se estableció una referencia",
+       "wikibase-item-summary-wbsetlabel-add": "Se añade la etiqueta [$2]",
        "wikibase-item-summary-wbsetlabel-set": "Se cambió la etiqueta [$2]",
        "wikibase-item-summary-wbsetlabel-remove": "La etiqueta [$2] ha sido 
eliminada",
+       "wikibase-item-summary-wbsetdescription-add": "Se añade la descripción 
[$2]",
        "wikibase-item-summary-wbsetdescription-set": "Se cambió la descripción 
[$2]",
        "wikibase-item-summary-wbsetdescription-remove": "La descripción [$2] 
ha sido eliminada",
        "wikibase-item-summary-wbsetaliases-set": "Definiendo {{PLURAL:$1|el 
alias|los alias}} [$2]",
        "wikibase-item-summary-wbsetaliases-add-remove": "Se {{PLURAL:$1|añadió 
y eliminó un|añadieron y eliminaron}} alias de [$2]",
        "wikibase-item-summary-wbsetaliases-add": "Se añadió {{PLURAL:$1|el 
alias|los alias}} [$2]",
        "wikibase-item-summary-wbsetaliases-remove": "Eliminando {{PLURAL:$1|el 
alias|los alias}} de [$2]",
+       "wikibase-item-summary-wbsetlabeldescriptionaliases": "Se cambia 
etiqueta, descripción y alias [$2]",
        "wikibase-item-summary-wbsetsitelink-add": "Se añadió un enlace a [$2]",
+       "wikibase-item-summary-wbsetsitelink-set": "Se cambia enlace a [$2]",
        "wikibase-item-summary-wbsetsitelink-remove": "Se eliminó el enlace a 
[$2]",
        "wikibase-item-summary-wblinktitles-create": "Se creó este elemento 
para conectar las páginas",
        "wikibase-item-summary-wblinktitles-connect": "Se añadió un enlace 
lingüístico para conectar las páginas",
@@ -288,17 +293,24 @@
        "wikibase-item-summary-wbremoveclaims-remove": "Se {{PLURAL:$1|eliminó 
una afirmación|eliminaron varias afirmaciones}}",
        "wikibase-item-summary-wbsetclaim-create": "Se {{PLURAL:$3|creó una 
afirmación|crearon afirmaciones}}",
        "wikibase-item-summary-wbsetclaim-update-qualifiers": "Se 
{{PLURAL:$4|modificó un calificador|modificaron $4 calificadores}} de 
{{PLURAL:$3|una afirmación|afirmaciones}}",
+       "wikibase-item-summary-clientsitelink-update": "Página trasladada de 
[$3] a [$4]",
+       "wikibase-item-summary-clientsitelink-remove": "Página en [$3] 
eliminada",
+       "wikibase-property-summary-wbcreate-new": "Se crea una propiedad nueva",
+       "wikibase-property-summary-wbsetreference": "Se establece una 
referencia",
        "wikibase-property-summary-wbeditentity-create": "Se creó una nueva 
propiedad",
        "wikibase-property-summary-wbeditentity-update": "Se cambió una 
propiedad",
        "wikibase-property-summary-wbeditentity-override": "Se eliminó una 
propiedad",
+       "wikibase-property-summary-wbsetlabel-add": "Se añade la etiqueta [$2]",
        "wikibase-property-summary-wbsetlabel-set": "Se cambió la etiqueta 
[$2]",
        "wikibase-property-summary-wbsetlabel-remove": "Se eliminó la etiqueta 
[$2]",
+       "wikibase-property-summary-wbsetdescription-add": "Se añade la 
descripción [$2]",
        "wikibase-property-summary-wbsetdescription-set": "Se cambió la 
descripción [$2]",
        "wikibase-property-summary-wbsetdescription-remove": "Se eliminó la 
descripción [$2]",
        "wikibase-property-summary-wbsetaliases-set": "Definiendo 
{{PLURAL:$1|el alias|los alias}} [$2]",
        "wikibase-property-summary-wbsetaliases-add-remove": "Se 
{{PLURAL:$1|añadió y eliminó un|añadieron y eliminaron}} alias de [$2]",
        "wikibase-property-summary-wbsetaliases-add": "Se {{PLURAL:$1|añadió 
un|añadieron}} alias de [$2]",
        "wikibase-property-summary-wbsetaliases-remove": "Se 
{{PLURAL:$1|eliminó un|eliminaron}} alias de [$2]",
+       "wikibase-property-summary-wbsetlabeldescriptionaliases": "Se cambia 
etiqueta, descripción y alias [$2]",
        "wikibase-property-summary-special-create-property": "Se ha creado una 
propiedad de [$2] con {{PLURAL:$1|valor|valores}}",
        "wikibase-listdatatypes-wikibase-item-head": "Elemento",
        "wikibase-listdatatypes-wikibase-item-body": "Enlace hacia otros 
elementos en el proyecto. Cuando se ingresa un valor, se buscan elementos 
coincidentes en el espacio de nombres \"Item\" del proyecto.",
@@ -323,8 +335,17 @@
        "right-property-create": "Crear propiedades",
        "action-item-merge": "fusionar elementos",
        "action-property-create": "crear propiedades",
+       "apihelp-wbmergeitems-description": "Fusiona varios elementos.",
+       "apihelp-wbmergeitems-example-1": "Fusiona datos desde Q42 en Q222",
+       "apihelp-wbmergeitems-example-2": "Fusiona datos desde Q555 en Q3",
+       "apihelp-wbmergeitems-example-3": "Fusiona datos desde Q66 en Q99 
ignorando cualquier etiqueta conflitiva",
+       "apihelp-wbmergeitems-example-4": "Fusiona datos desde Q66 en Q99 
ignorando cualquier etiqueta o descriciones conflitivas",
+       "apihelp-wbsearchentities-description": "Busca entidades.",
        "apihelp-wbsearchentities-param-search": "Buscar este texto.",
        "apihelp-wbsearchentities-param-language": "Buscar en este idioma.",
+       "apihelp-wbsearchentities-param-type": "Buscar este tipo de entidad.",
+       "apihelp-wbsearchentities-param-limit": "Número máximo de resultados",
+       "apihelp-wbsearchentities-param-continue": "Desplazamiento desde donde 
continuar una búsqueda",
        "apihelp-wbsetdescription-param-language": "Idioma de la descripción",
        "apihelp-wbsetlabel-param-language": "Idioma de la etiqueta",
        "apihelp-wbsetlabel-param-value": "El valor de la etiqueta"
diff --git a/extensions/Wikibase/repo/i18n/he.json 
b/extensions/Wikibase/repo/i18n/he.json
index 17f8079..f96b1d5 100644
--- a/extensions/Wikibase/repo/i18n/he.json
+++ b/extensions/Wikibase/repo/i18n/he.json
@@ -173,7 +173,7 @@
        "wikibase-setaliases-submit": "קביעת כינויים",
        "special-setlabeldescriptionaliases": "הגדרת תווית, תיאור וכינויים",
        "wikibase-setlabeldescriptionaliases-introfull": "כאן נעשית הגדרה של 
תווית, תיאור וכינויים ב$2 עבור [[$1]]. כינויים מרובי מופרדים בתו מקל 
(<code>|</code>).",
-       "wikibase-setlabeldescriptionaliases-intro": "הטופס הזה מאפשר לך להגדיר 
תווית, תיאור וכינויי של ישות. תחילה יש לספק את המזהה של הישות (למשל Q23) ואת 
קוד שפה (למשל \"en\").",
+       "wikibase-setlabeldescriptionaliases-intro": "הטופס הזה מאפשר לך להגדיר 
תווית, תיאור וכינויי של ישות. תחילה יש לספק את המזהה של הישות (למשל \"Q23\") 
ואת קוד שפה (למשל \"en\").",
        "wikibase-setlabeldescriptionaliases-label-label": "תווית:",
        "wikibase-setlabeldescriptionaliases-description-label": "תיאור:",
        "wikibase-setlabeldescriptionaliases-aliases-label": "כינויים:",
diff --git a/extensions/Wikibase/repo/i18n/ml.json 
b/extensions/Wikibase/repo/i18n/ml.json
index 3ea21b9..0b65c0e 100644
--- a/extensions/Wikibase/repo/i18n/ml.json
+++ b/extensions/Wikibase/repo/i18n/ml.json
@@ -21,6 +21,12 @@
        "wikibase-addreference": "അവലംബം ചേർക്കുക",
        "wikibase-save-inprogress": "സേവ് ചെയ്യുന്നു...",
        "wikibase-remove-inprogress": "നീക്കം ചെയ്യുന്നു...",
+       "wikibase-entitytermsview-entitytermsforlanguagelistview-toggler": 
"കൂടുതൽ ഭാഷകളിൽ",
+       
"wikibase-entitytermsview-entitytermsforlanguagelistview-configure-link-label": 
"ക്രമീകരിക്കുക",
+       "wikibase-entitytermsforlanguagelistview-aliases": "ഇങ്ങനെയും 
അറിയപ്പെടുന്നു:",
+       "wikibase-entitytermsforlanguagelistview-description": "വിവരണം",
+       "wikibase-entitytermsforlanguagelistview-label": "തലക്കുറി",
+       "wikibase-entitytermsforlanguagelistview-language": "ഭാഷ",
        "wikibase-label-empty": "തലക്കുറിയൊന്നും നിർവചിച്ചിട്ടില്ല",
        "wikibase-label-edit-placeholder": "തലക്കുറി നൽകുക",
        "wikibase-label-edit-placeholder-language-aware": "$1 ഭാഷയിൽ തലക്കുറി 
നൽകുക",
@@ -81,17 +87,23 @@
        "wikibase-entityselector-more": "കൂടുതൽ",
        "wikibase-anonymouseditwarning": "മുന്നറിയിപ്പ്: താങ്കൾ ലോഗിൻ 
ചെയ്തിട്ടില്ല.\nതാങ്കളുടെ ഐ.പി. വിലാസം നാൾവഴിയിൽ ചേർക്കുന്നതാണ്",
        "wikibase-move-error": "ഡേറ്റാ നാമമേഖലയിലുള്ള താളുകൾ മാറ്റാനോ, താളുകൾ 
അതിലേയ്ക്ക് മാറ്റാനോ കഴിയില്ല.",
+       "wikibase-wikibaserepopage-unresolved-redirect": "$1 ഒരു 
തിരിച്ചുവിടലാണ്.",
        "special-itembytitle": "ഇനം തലക്കെട്ടനുസരിച്ച്",
        "wikibase-itembytitle-lookup-fieldset": "സൈറ്റും തലക്കെട്ടുമനുസരിച്ച് 
ഇനങ്ങൾക്കായി തിരയുക",
        "wikibase-itembytitle-lookup-site": "സൈറ്റ്:",
        "wikibase-itembytitle-lookup-page": "താൾ:",
        "wikibase-itembytitle-submit": "തിരയുക",
        "wikibase-itembytitle-create": "താങ്കൾക്ക് [$1 ഒരു ഇനം സൃഷ്ടിക്കുകയും] 
ആവാം.",
+       "special-gotolinkedpage": "കണ്ണി ചേർക്കപ്പെട്ട താളിലേക്ക് പോവുക",
+       "wikibase-gotolinkedpage-lookup-site": "സൈറ്റ്:",
+       "wikibase-gotolinkedpage-lookup-item": "ഇനത്തിന്റെ ഐ.ഡി.:",
        "special-itemdisambiguation": "ഇനത്തിന്റെ വിവക്ഷകൾ",
+       "wikibase-itemdisambiguation-lookup-fieldset": "ഭാഷയും തലക്കുറിയും 
ഉപയോഗിച്ച് ഇനങ്ങൾ തിരയുക",
        "wikibase-itemdisambiguation-lookup-language": "ഭാഷയുടെ കോഡ്:",
        "wikibase-itemdisambiguation-lookup-label": "തലക്കുറി:",
        "wikibase-itemdisambiguation-submit": "തിരയുക",
        "wikibase-itemdisambiguation-nothing-found": "ക്ഷമിക്കുക, ആ 
തലക്കുറിയുള്ള ഒരിനവും കണ്ടെത്താനായില്ല.",
+       "wikibase-itemdisambiguation-search": "താങ്കൾക്ക് [$1 ഇനത്തിനായി 
തിരയാവുന്നതാണ്].",
        "wikibase-itemdisambiguation-create": "താങ്കൾക്ക് [$1 ഇനം 
നിർമ്മിക്കാവുന്നതാണ്].",
        "wikibase-itemdisambiguation-invalid-langcode": "ക്ഷമിക്കുക, താങ്കൾ 
നൽകിയ ഭാഷാ തിരിച്ചറിയൽ വിവരം സിസ്റ്റത്തിന് അപരിചിതമാണ്. ദയവായി \"ml\" പോലെയുള്ള 
സാധുവായ തിരിച്ചറിയലുപാധി നൽകുക.",
        "wikibase-newproperty-datatype": "ഡേറ്റാ തരം:",
@@ -106,7 +118,17 @@
        "wikibase-setdescription-label": "വിവരണം:",
        "wikibase-setdescription-submit": "വിവരണം സജ്ജീകരിക്കുക",
        "wikibase-setaliases-label": "അപരനാമങ്ങൾ:",
+       "wikibase-setlabeldescriptionaliases-label-label": "തലക്കുറി:",
+       "wikibase-setlabeldescriptionaliases-description-label": "വിവരണം:",
+       "wikibase-setlabeldescriptionaliases-aliases-label": "അപരനാമങ്ങൾ:",
+       "wikibase-setlabeldescriptionaliases-submit": "തലക്കുറിയും വിവരണവും 
അപരനാമങ്ങളും സജ്ജീകരിക്കുക",
+       "special-setsitelink": "സൈറ്റിന്റെ കണ്ണി സജ്ജീകരിക്കുക",
+       "wikibase-setsitelink-site": "സൈറ്റിന്റെ ഐ.ഡി.:",
+       "wikibase-setsitelink-label": "സൈറ്റിന്റെ കണ്ണി:",
+       "wikibase-setsitelink-submit": "സൈറ്റിന്റെ കണ്ണി സജ്ജീകരിക്കുക",
+       "wikibase-modifyentity-id": "ഐ.ഡി.",
        "wikibase-modifyterm-language": "ഭാഷയുടെ കോഡ്:",
+       "special-mergeitems": "രണ്ട് ഇനങ്ങൾ സംയോജിപ്പിക്കുക",
        "wikibase-dispatchstats-change-timestamp": "സമയമുദ്ര",
        "wikibase-dispatchstats-oldest-change": "ഏറ്റവും പഴയവ",
        "wikibase-dispatchstats-newest-change": "ഏറ്റവും പുതിയവ",
diff --git a/extensions/Wikibase/repo/i18n/os.json 
b/extensions/Wikibase/repo/i18n/os.json
index f407fab..555c978 100644
--- a/extensions/Wikibase/repo/i18n/os.json
+++ b/extensions/Wikibase/repo/i18n/os.json
@@ -6,5 +6,6 @@
        },
        "wikibase-edit": "ивын",
        "wikibase-add": "бафтау",
-       "wikibase-sitelinks-special": "Æндæр сайттæ"
+       "wikibase-sitelinks-special": "Æндæр сайттæ",
+       "wikibase-dispatchstats-change-timestamp": "Датæ/рæстæг"
 }
diff --git a/extensions/Wikibase/repo/i18n/pt.json 
b/extensions/Wikibase/repo/i18n/pt.json
index 1f1bdac..9c64f89 100644
--- a/extensions/Wikibase/repo/i18n/pt.json
+++ b/extensions/Wikibase/repo/i18n/pt.json
@@ -167,7 +167,7 @@
        "wikibase-setaliases-submit": "Definir os nomes alternativos",
        "special-setlabeldescriptionaliases": "Definir rótulo, descrição e 
nomes alternativos",
        "wikibase-setlabeldescriptionaliases-introfull": "Está a definir o 
rótulo, a descrição e os nomes alternativos em $2 para [[$1]]. Nomes 
alternativos são separados por uma barra vertical (<code>|</code>).",
-       "wikibase-setlabeldescriptionaliases-intro": "Este formulário 
permite-lhe definir o rótulo, a descrição e nomes alternativos de uma entidade. 
Precisa de fornecer o identificador da entidade (ex: Q23) e o código de idioma 
(ex: \"pt\").",
+       "wikibase-setlabeldescriptionaliases-intro": "Este formulário 
permite-lhe definir o rótulo, a descrição e nomes alternativos de uma entidade. 
Precisa de fornecer primeiro o identificador da entidade (ex: \"Q23\") e o 
código de idioma (ex: \"pt\").",
        "wikibase-setlabeldescriptionaliases-label-label": "Rótulo:",
        "wikibase-setlabeldescriptionaliases-description-label": "Descrição:",
        "wikibase-setlabeldescriptionaliases-aliases-label": "Nomes 
alternativos:",
diff --git a/extensions/Wikibase/repo/i18n/ru.json 
b/extensions/Wikibase/repo/i18n/ru.json
index c09935e..ae66c75 100644
--- a/extensions/Wikibase/repo/i18n/ru.json
+++ b/extensions/Wikibase/repo/i18n/ru.json
@@ -233,6 +233,8 @@
        "wikibase-listdatatypes-intro": "Это список всех типов данных, 
доступных в этой инсталляции:",
        "wikibase-history-title-with-label": "История изменений для «$2» ($1)",
        "wikibase-history-title-without-label": "$1 — история изменений",
+       "special-listproperties": "Список свойств",
+       "wikibase-listproperties-legend": "Получить список свойств по типу 
данных",
        "wikibase-listproperties-datatype": "Тип данных:",
        "wikibase-listproperties-all": "Все типы данных",
        "wikibase-listproperties-submit": "Найти",
@@ -257,7 +259,10 @@
        "wikibase-entitydata-storage-error": "Не удалось загрузить сущность 
$1.",
        "wikibase-entitydata-title": "Данные сущности",
        "wikibase-entitydata-text": "Эта страница предоставляет интерфейс 
связанных данных для значений сущности. Просьба предоставить идентификатор 
сущности в URL, используя синтаксис подстраниц.",
+       "special-redirectentity": "Перенаправление сущности",
        "wikibase-redirectentity-success": "$1 был успешно перенаправлен на 
$2.",
+       "wikibase-redirectentity-fromid": "Id, с которого идёт перенаправление",
+       "wikibase-redirectentity-toid": "Id, на которое идёт перенаправление",
        "wikibase-redirectentity-submit": "Перенаправление",
        "special-mylanguagefallbackchain": "Моя цепочка резервных языков",
        "wikibase-mylanguagefallbackchain-text": "Ниже показана цепочка 
резервных языков, действующая для вас при отображении меток сущностей.",
@@ -376,5 +381,12 @@
        "right-property-term": "Изменять термины свойств (метки, описания, 
псевдонимы)",
        "right-property-create": "создание свойств",
        "action-item-merge": "объединение элементов",
-       "action-property-create": "создание свойств"
+       "action-property-create": "создание свойств",
+       "apihelp-wbcreateredirect-example-1": "Превратить Q11 в перенаправление 
на Q12",
+       "apihelp-wbmergeitems-description": "Объединяет несколько элементов.",
+       "apihelp-wbmergeitems-param-fromid": "Идентификатор для слияния из",
+       "apihelp-wbmergeitems-param-toid": "Идентификатор для слияния в",
+       "apihelp-wbmergeitems-example-1": "Объединяет данные из Q42 в Q222",
+       "apihelp-wbmergeitems-example-2": "Объединяет данные из Q555 в Q3",
+       "apihelp-wbmergeitems-example-3": "Объединяет данные из Q66 в Q99, 
игнорируя любые конфликтующие описания"
 }
diff --git a/extensions/Wikibase/repo/i18n/sco.json 
b/extensions/Wikibase/repo/i18n/sco.json
index 10f50e5..378eff4 100644
--- a/extensions/Wikibase/repo/i18n/sco.json
+++ b/extensions/Wikibase/repo/i18n/sco.json
@@ -20,9 +20,9 @@
        "wikibase-mergeitems-toid": "The id tae merge til",
        "wikibase-mergeitems-submit": "Merge eitems",
        "wikibase-listdatatypes-intro": "This is ae leet o aw datatypes 
available oan this instawation:",
-       "wikibase-api-target-is-incompatible": "Attempt tae redirect tae an 
entity o a different type.",
+       "wikibase-api-target-is-incompatible": "Attempt tae reguid tae aen 
entitie o ae different type.",
        "wikibase-special-mergeitems-error-prefix": "The eetems coudna be 
merged. The follaein mistak occurred:",
-       "wikibase-item-summary-wbcreateredirect": "Redirectit tae $4",
+       "wikibase-item-summary-wbcreateredirect": "Redguidit tae $4",
        "wikibase-item-summary-wblinktitles-create": "Cræftit this eetem fer 
tae connect pages",
        "wikibase-item-summary-wblinktitles-connect": "Eikit ae leid airtin fer 
tae connect pages",
        "wikibase-listdatatypes-wikibase-item-body": "Airt tae ither eetems at 
the waurk. Whan ae value is entert the waurks \"Eetem\" namespace oan Wikidata 
will be raket fer matchin eetems.",
diff --git a/extensions/Wikibase/repo/i18n/sv.json 
b/extensions/Wikibase/repo/i18n/sv.json
index 81a2310..74b9a71 100644
--- a/extensions/Wikibase/repo/i18n/sv.json
+++ b/extensions/Wikibase/repo/i18n/sv.json
@@ -14,6 +14,7 @@
                ]
        },
        "wikibase-desc": "Strukturerad datalagring",
+       "wikibase-entity": "entitet",
        "wikibase-entity-item": "objekt",
        "wikibase-entity-property": "egenskap",
        "wikibase-entity-query": "fråga",
@@ -51,10 +52,10 @@
        "wikibase-sitelink-site-edit-placeholder": "webbplats",
        "wikibase-sitelink-page-edit-placeholder": "sida",
        "wikibase-alias-edit-placeholder": "ange ett alias",
-       "wikibase-label-input-help-message": "Ange etiketten på detta objekt på 
$1.",
-       "wikibase-description-input-help-message": "Ange en kort beskrivning 
för detta objekt på $1.",
+       "wikibase-label-input-help-message": "Ange etiketten för denna entitet 
på $1.",
+       "wikibase-description-input-help-message": "Ange en kort beskrivning 
för denna entitet på $1.",
        "wikibase-entitytermsview-input-help-message": "Ange en etikett för 
detta objekt, en kort beskrivning och alias per språk.",
-       "wikibase-entitytermsforlanguageview-input-help-message": "Ange 
etiketten för detta objekt, en kort beskrivning och alias i $1.",
+       "wikibase-entitytermsforlanguageview-input-help-message": "Ange 
etiketten för denna entitet, en kort beskrivning och alias på $1.",
        "wikibase-statements": "Uttalanden",
        "wikibase-terms": "På andra språk",
        "wikibase-sitelinkgroupview-input-help-message": "Lägga till en 
webbplatslänk genom att ange en webbplats och en sida på den webbplatsen, 
redigera eller ta bort existerande webbplatslänkar.",
@@ -80,7 +81,7 @@
        "wikibase-disambiguation-title": "Särskiljning för \"$1\"",
        "wb-special-newitem-new-item-notification": "Nya objektet $1 skapades 
och omdirigerades till dess sida. Tillbaka till $2.",
        "wikibase-aliases-label": "Även känd som:",
-       "wikibase-aliases-input-help-message": "För att göra detta objekt 
enklare att hitta kan du ange alternativa namn.",
+       "wikibase-aliases-input-help-message": "För att göra denna entitet 
enklare att hitta kan du ange alternativa namn.",
        "wikibase-aliases-empty": "Inga alias definierade.",
        "wikibase-propertypage-datatype": "Datatyp",
        "wikibase-claimview-snak-tooltip": "Ange ett värde som motsvarar 
egenskapen \"$1\". Om egenskapen inte har några angivna värden eller det 
riktiga värdet är okänt kan du välja ett alternativ för att ange ett anpassat 
värde genom att klicka på ikonen bredvid värdets textruta.",
@@ -104,15 +105,15 @@
        "wikibase-shortcopyrightwarning": "Genom att klicka på \"$1\" samtycker 
du med [[$2|användarvillkoren]] och samtycker oåterkalleligen att släppa ditt 
bidrag under $3.",
        "wikibase-copyrighttooltip-acknowledge": "Jag accepterar dessa villkor 
för mina framtida redigeringar. Visa inte detta meddelande igen.",
        "wikibase-entityselector-more": "mer",
-       "wikibase-anonymouseditwarning": "Varning: Du är inte inloggad.\nDin 
IP-adress kommer att sparas i historiken för denna enhet.",
+       "wikibase-anonymouseditwarning": "Varning: Du är inte inloggad.\nDin 
IP-adress kommer att sparas i historiken för denna entitet.",
        "wikibase-move-error": "Du kan inte flytta sidor som finns i en 
datanamnrymd, och du kan inte flytta sidor in i den.",
        "wikibase-validator-sitelink-conflict": "Länken $1 används redan av 
objekt $2. Du kan ta bort den från $2 om den inte hör hemma där eller slå 
samman objekten om de är om exakt samma ämne.",
        "wikibase-validator-label-conflict": "Egenskap $3 har redan etikett 
\"$1\" associerad med språkkod $2.",
        "wikibase-validator-label-with-description-conflict": "Objekt $3 har 
redan etikett \"$1\" associerad med språkkod $2, med samma beskrivningstext.",
-       "wikibase-validator-label-no-entityid": "Etiketten behöver inte vara 
ett giltigt enhets-ID.",
+       "wikibase-validator-label-no-entityid": "Etiketten behöver inte vara 
ett giltigt entitets-ID.",
        "wikibase-wikibaserepopage-not-itemid": "\"$1\" är inte ett giltigt 
objekt-ID.",
        "wikibase-wikibaserepopage-invalid-langcode": "Språkkoden \"$1\" är 
okänd. Var god använd en språkkod som känns igen av systemet, t.ex. \"en\".",
-       "wikibase-wikibaserepopage-invalid-id": "ID:et \"$1\" är okänt för 
systemet. Var god använd ett giltigt enhets-ID.",
+       "wikibase-wikibaserepopage-invalid-id": "ID:et \"$1\" är okänt för 
systemet. Var god använd ett giltigt entitets-ID.",
        "wikibase-wikibaserepopage-unresolved-redirect": "$1 är en 
omdirigering.",
        "wikibase-wikibaserepopage-storage-exception": "Ett fel uppstod när $1 
skulle läsas in: $2",
        "special-itembytitle": "Objekt efter titel",
@@ -154,7 +155,7 @@
        "wikibase-newentity-submit": "Skapa",
        "special-setlabel": "Ange en etikett",
        "wikibase-setlabel-introfull": "Du anger etiketten på $2 för [[$1]].",
-       "wikibase-setlabel-intro": "Detta formulär tillåter dig att ange 
etiketten för ett objekt. Du behöver ange ID:et för objektet (t.ex. Q23), en 
språkkod (t.ex. \"sv\") och den önskade etiketten.",
+       "wikibase-setlabel-intro": "Detta formulär tillåter dig att ange 
etiketten för en entitet. Du behöver ange ID:et för objektet (t.ex. Q23), en 
språkkod (t.ex. \"sv\") och den önskade etiketten.",
        "wikibase-setlabel-label": "Etikett:",
        "wikibase-setlabel-submit": "Ange en etikett",
        "special-setdescription": "Ange en beskrivning",
@@ -225,8 +226,15 @@
        "wikibase-dispatchstats-average": "Genomsnitt",
        "special-listdatatypes": "Lista över alla tillgängliga datatyper",
        "wikibase-listdatatypes-intro": "Detta är en lista över alla 
tillgängliga datatyper i denna installation:",
+       "wikibase-listdatatypes-listproperties": "Lista över egenskaper med 
denna datatyp",
        "wikibase-history-title-with-label": "Versionshistorik för \"$2\" ($1)",
        "wikibase-history-title-without-label": "Versionshistorik för ($1)",
+       "special-listproperties": "Lista över egenskaper",
+       "wikibase-listproperties-legend": "Hämta en lista över egenskaper efter 
datatyp",
+       "wikibase-listproperties-datatype": "Datatyp:",
+       "wikibase-listproperties-all": "Alla datatyper",
+       "wikibase-listproperties-submit": "Hitta",
+       "wikibase-listproperties-invalid-datatype": "\"$1\" är inte en giltig 
datatyp.",
        "special-entitieswithoutdescription": "Entiteter utan beskrivning",
        "wikibase-entitieswithoutdescription-legend": "Få en lista av entiteter 
utan beskrivning",
        "special-entitieswithoutlabel": "Enheter utan etikett",
@@ -236,9 +244,9 @@
        "wikibase-entitieswithoutlabel-label-alltypes": "alla",
        "wikibase-entitieswithoutlabel-submit": "Hitta",
        "wikibase-entitieswithoutlabel-invalid-language": "\"$1\" är inte en 
giltig språkkod.",
-       "wikibase-entitieswithoutlabel-invalid-type": "\"$1\" är inte en giltig 
enhetstyp",
+       "wikibase-entitieswithoutlabel-invalid-type": "\"$1\" är inte en giltig 
entitetstyp.",
        "special-itemswithoutsitelinks": "Objekt utan webbplatslänkar",
-       "special-entitydata": "Enhetsdata",
+       "special-entitydata": "Entitetsdata",
        "wikibase-entitydata-not-found": "Ingen enhet med ID $1 hittades.",
        "wikibase-entitydata-not-acceptable": "Inga matchande format finns. 
MIME-typer som stöds:$1",
        "wikibase-entitydata-bad-revision": "Kan inte visa versionen $2 av 
enheten $1.",
@@ -247,11 +255,16 @@
        "wikibase-entitydata-storage-error": "Misslyckades att läsa in enheten 
$1.",
        "wikibase-entitydata-title": "Enhetsdata",
        "wikibase-entitydata-text": "Denna sida innehåller ett gränssnitt för 
länkad data för entitetsvärden. Ange entitets-id i URL:en med hjälp av 
undersidesyntax.",
+       "special-redirectentity": "Omdirigera en entitet",
+       "wikibase-redirectentity-success": "$1 omdirigerades till $2.",
+       "wikibase-redirectentity-fromid": "ID att omdirigera från",
+       "wikibase-redirectentity-toid": "ID att omdirigera till",
+       "wikibase-redirectentity-submit": "Omdirigera",
        "special-mylanguagefallbackchain": "Min språktillbakafallskedja",
        "wikibase-mylanguagefallbackchain-text": "Nedan visas kedjan 
språktillbakafallskedjan som används för att visa dig entitetsetiketter.",
        "wikibase-mylanguagefallbackchain-babel": "Du kan redigera den genom 
att lägga in <nowiki>{{#babel: }}</nowiki> på {{GENDER:$1|din}} 
[[Special:MyPage|användarsida]].",
        "wikibase-mylanguagefallbackchain-converted-item": "$1 - $2, 
konverterade från $3 - $4",
-       "wikibase-api-unresolved-redirect": "Angiven enhets-ID hänvisar till en 
omdirigering, som inte stöds i detta sammanhang.",
+       "wikibase-api-unresolved-redirect": "Angiven entitets-ID hänvisar till 
en omdirigering, som inte stöds i detta sammanhang.",
        "wikibase-api-no-such-sitelink": "Kunde inte hitta en wepplatslänk till 
'$1' när du försökte redigera märken.",
        "wikibase-api-target-not-empty": "Omdirigeringen kan enbart skapas 
ovanpå en tom entitet.",
        "wikibase-api-target-is-redirect": "Omdirigeringens mål får i sin tur 
inte vara en omdirigering.",
@@ -262,7 +275,7 @@
        "wikibase-restoreold": "återställ",
        "wikibase-restore-summary": "Återställ versionen $1 av 
[[Special:Contributions/$2|$2]]",
        "wikibase-no-direct-editing": "Direkt redigering har inaktiverats i 
namnområdet $1",
-       "wikibase-noentity": "Detta objekt finns inte. Du kan 
[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} söka i de relaterade 
loggarna] för att ta reda på var den tog vägen.",
+       "wikibase-noentity": "Denna entitet finns inte. Du kan 
[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} söka i de relaterade 
loggarna] för att ta reda på var den tog vägen.",
        "wikibase-noentity-createone": "Du kan också [[$1|skapa en ny]].",
        "wikibase-special-mergeitems-error-prefix": "Objekten kunde inte 
sammanfogas. Följande fel uppstod:",
        "wikibase-item-summary-wbsetitem": "Skapade ett nytt objekt",
@@ -382,6 +395,7 @@
        "right-property-create": "Skapa egenskaper",
        "wikibase-entity-not-viewable-title": "Innehållstypsfel: Kan inte visa 
inehåll",
        "wikibase-entity-not-viewable": "Det angivna innehållet av typen \"$1\" 
är inte en entitet och kan inte visas av Wikibase.",
+       "action-item-merge": "sammanfoga objekt",
        "action-property-create": "skapa egenskaper",
        "apihelp-wbcreateclaim-description": "Skapar Wikibase påståenden.",
        "apihelp-wbcreateclaim-param-entity": "ID av entiteten du lägger till 
ett påstående till",
@@ -394,7 +408,7 @@
        "apihelp-wbcreateclaim-example-4": "Skapar ett påstående för objekt Q42 
med egenskap P9004 med ett koordinat-snak-värde.",
        "apihelp-wbcreateredirect-description": "Skapar entitetomdirigeringar",
        "apihelp-wbcreateredirect-param-from": "Entitet ID att göra till en 
omdirigering",
-       "apihelp-wbcreateredirect-param-to": "Entitet ID att rikta 
omdirigeringen till",
+       "apihelp-wbcreateredirect-param-to": "Entitets-ID att rikta 
omdirigeringen till",
        "apihelp-wbcreateredirect-param-bot": "Markera denna redigering som en 
bot\nDenna URL-flagga kommer bara att respekteras om användare tillhör gruppen 
\"bot\".",
        "apihelp-wbcreateredirect-example-1": "Gör om Q11 till en omdirigering 
till Q12",
        "apihelp-wbeditentity-description": "Skapar en enstaka ny 
Wikibase-entitet och modifierar den med serialiserad information",
@@ -521,7 +535,7 @@
        "apihelp-wbsetclaim-param-baserevid": "Den numeriska identifieraren för 
versionen att basera redigeringen på.\nDetta används för att kunna upptäcka 
konflikter under sparandet.",
        "apihelp-wbsetclaim-param-bot": "Markera denna redigering som en 
bot\nDenna URL-flagga kommer bara att respekteras om användare tillhör gruppen 
\"bot\".",
        "apihelp-wbsetclaim-example-1": "Sätt påståendet med det angivna ID:et 
till egenskap P1 med strängvärdet \"City\"",
-       "apihelp-wbsetclaim-example-2": "Sätt påståendet med det angivna ID:et 
till egenskap P1 med strängvärdet \"City\" och flytta påståendet till den 
översta platsen inom entitetens undergrupp av påståenden som innehåller 
huvud-snak-egenskapen P1. Därutöver, flytta hela undergurppen överst av alla 
undergrupper aggregerade efter egenskap.",
+       "apihelp-wbsetclaim-example-2": "Sätt påståendet med det angivna ID:et 
till egenskap P1 med strängvärdet \"City\" och flytta påståendet till den 
översta platsen inom entitetens undergrupp av påståenden som innehåller 
huvud-snak-egenskapen P1. Därutöver, flytta hela undergruppen överst av alla 
undergrupper aggregerade efter egenskap.",
        "apihelp-wbsetclaimvalue-description": "Sätter värdet för ett 
Wikibase-påstående.",
        "apihelp-wbsetclaimvalue-param-claim": "En GUID som identifierar 
påståendet.",
        "apihelp-wbsetclaimvalue-param-snaktype": "Snakens typ",
@@ -571,5 +585,8 @@
        "apihelp-wbsetsitelink-example-1": "Lägg till webbplatslänken 
\"Hydrogen\" för engelska sidan med ID \"Q42\", om webbplatslänken inte finns",
        "apihelp-wbsetsitelink-example-2": "Lägg till webbplatslänken 
\"Hydrogen\" för engelska sidan med ID \"Q42\", om webbplatslänken inte finns, 
med redigeringskommentaren \"World domination will be mine soon!\"",
        "apihelp-wbsetsitelink-example-3": "Lägg till webbplatslänken 
\"Wasserstoff\" för den tyska sidan på objekt med länken för den engelska sidan 
till \"Hydrogen\", om webbplatslänken inte finns",
-       "apihelp-wbsetsitelink-example-4": "Tar bort den tyska webbplatslänken 
från objektet"
+       "apihelp-wbsetsitelink-example-4": "Tar bort den tyska webbplatslänken 
från objektet",
+       "apihelp-wbsetsitelink-example-6": "Ändra länken till den polska sidan 
från objektet med ID\"Q42\" till två märken som pekar till objekt med ID:n 
\"Q2\" och \"Q149\" utan att ange länkens titel",
+       "apihelp-wbsetsitelink-example-7": "Ändra länken till den polska sidan 
från objektet med ID\"Q42\" utan att ändra märken",
+       "apihelp-wbsetsitelink-example-8": "Ändra länken till den polska sidan 
från objektet med ID\"Q42\" och ta bort alla märken"
 }
diff --git 
a/extensions/Wikibase/repo/includes/Interactors/ItemMergeInteractor.php 
b/extensions/Wikibase/repo/includes/Interactors/ItemMergeInteractor.php
index 7ac98f0..ef0ebd4 100644
--- a/extensions/Wikibase/repo/includes/Interactors/ItemMergeInteractor.php
+++ b/extensions/Wikibase/repo/includes/Interactors/ItemMergeInteractor.php
@@ -127,13 +127,14 @@
         * @param ItemId $toId
         * @param array $ignoreConflicts The kinds of conflicts to ignore
         * @param string|null $summary
+        * @param bool $bot Mark the edit as bot edit
         *
         * @return array A list of exactly two EntityRevision objects. The 
first one represents
         * the modified source item, the second one represents the modified 
target item.
         *
         * @throws ItemMergeException
         */
-       public function mergeItems( ItemId $fromId, ItemId $toId, 
$ignoreConflicts = array(), $summary = null ) {
+       public function mergeItems( ItemId $fromId, ItemId $toId, 
$ignoreConflicts = array(), $summary = null, $bot = false ) {
 
                $this->checkPermissions( $fromId );
                $this->checkPermissions( $toId );
@@ -159,7 +160,7 @@
                        throw new ItemMergeException( $e->getMessage(), 
'failed-modify', $e );
                }
 
-               return $this->attemptSaveMerge( $fromEntity, $toEntity, 
$summary );
+               return $this->attemptSaveMerge( $fromEntity, $toEntity, 
$summary, $bot );
        }
 
        private function loadEntity( EntityId $entityId ) {
@@ -207,27 +208,33 @@
         * @param Item $fromItem
         * @param Item $toItem
         * @param string|null $summary
+        * @param bool $bot
         *
         * @return array A list of exactly two EntityRevision objects. The 
first one represents
         * the modified source item, the second one represents the modified 
target item.
         */
-       private function attemptSaveMerge( Item $fromItem, Item $toItem, 
$summary = null ) {
+       private function attemptSaveMerge( Item $fromItem, Item $toItem, 
$summary, $bot ) {
                $toSummary = $this->getSummary( 'to', $toItem->getId(), 
$summary );
-               $fromRev = $this->saveEntity( $fromItem, $toSummary );
+               $fromRev = $this->saveEntity( $fromItem, $toSummary, $bot );
 
                $fromSummary = $this->getSummary( 'from', $fromItem->getId(), 
$summary );
-               $toRev = $this->saveEntity( $toItem, $fromSummary );
+               $toRev = $this->saveEntity( $toItem, $fromSummary, $bot );
 
                return array( $fromRev, $toRev );
        }
 
-       private function saveEntity( Entity $entity, Summary $summary ) {
+       private function saveEntity( Entity $entity, Summary $summary, $bot ) {
+               $flags = EDIT_UPDATE;
+               if ( $bot && $this->user->isAllowed( 'bot' ) ) {
+                       $flags |= EDIT_FORCE_BOT;
+               }
+
                try {
                        return $this->entityStore->saveEntity(
                                $entity,
                                $this->summaryFormatter->formatSummary( 
$summary ),
                                $this->user,
-                               EDIT_UPDATE
+                               $flags
                        );
                } catch ( StorageException $ex ) {
                        throw new ItemMergeException( $ex->getMessage(), 
'failed-save', $ex );
diff --git a/extensions/Wikibase/repo/includes/api/MergeItems.php 
b/extensions/Wikibase/repo/includes/api/MergeItems.php
index d237786..e61f53c 100644
--- a/extensions/Wikibase/repo/includes/api/MergeItems.php
+++ b/extensions/Wikibase/repo/includes/api/MergeItems.php
@@ -126,7 +126,7 @@
                                $ignoreConflicts = array();
                        }
 
-                       $this->mergeItems( $fromId, $toId, $ignoreConflicts, 
$summary );
+                       $this->mergeItems( $fromId, $toId, $ignoreConflicts, 
$summary, $params['bot'] );
                } catch ( EntityIdParsingException $ex ) {
                        $this->errorReporter->dieException( $ex, 
'invalid-entity-id' );
                } catch ( ItemMergeException $ex ) {
@@ -139,9 +139,10 @@
         * @param ItemId $toId
         * @param array $ignoreConflicts
         * @param string $summary
+        * @param bool $bot
         */
-       private function mergeItems( ItemId $fromId, ItemId $toId, array 
$ignoreConflicts, $summary ) {
-               list( $newRevisionFrom, $newRevisionTo ) = 
$this->interactor->mergeItems( $fromId, $toId, $ignoreConflicts, $summary );
+       private function mergeItems( ItemId $fromId, ItemId $toId, array 
$ignoreConflicts, $summary, $bot ) {
+               list( $newRevisionFrom, $newRevisionTo ) = 
$this->interactor->mergeItems( $fromId, $toId, $ignoreConflicts, $summary, $bot 
);
 
                $this->resultBuilder->setValue( null, 'success', 1 );
 
diff --git 
a/extensions/Wikibase/repo/tests/phpunit/includes/api/BotEditTest.php 
b/extensions/Wikibase/repo/tests/phpunit/includes/api/BotEditTest.php
index cfe71fc..fdd7d5c 100644
--- a/extensions/Wikibase/repo/tests/phpunit/includes/api/BotEditTest.php
+++ b/extensions/Wikibase/repo/tests/phpunit/includes/api/BotEditTest.php
@@ -42,9 +42,10 @@
                        '[email protected]',
                        array( 'bot' )
                );
+               $this->mergeMwGlobalArrayValue( 'wgGroupPermissions', array( 
'user' => array( 'item-merge' => true ) ) );
 
                if( !isset( self::$hasSetup ) ){
-                       $this->initTestEntities( array( 'Empty' ) );
+                       $this->initTestEntities( array( 'Empty', 'Leipzig', 
'Osaka' ) );
                }
 
                self::$hasSetup = true;
@@ -88,6 +89,12 @@
                        array(//11
                                'p' => array( 'action' => 'wbeditentity', 'new' 
=> 'item', 'data' => '{}' ),
                                'e' => array( 'bot' => false, 'new' => true ) ),
+                       array(//12
+                               'p' => array( 'action' => 'wbmergeitems', 
'fromid' => 'Osaka', 'toid' => 'Empty', 'bot' => '' ),
+                               'e' => array( 'bot' => true, 'new' => false ) ),
+                       array(//13
+                               'p' => array( 'action' => 'wbmergeitems', 
'fromid' => 'Leipzig', 'toid' => 'Empty', 'ignoreconflicts' => 'description' ),
+                               'e' => array( 'bot' => false, 'new' => false ) 
),
                        //todo claims, references, qualifiers
                );
        }
@@ -99,18 +106,29 @@
                $this->login( 'wbbot' );
 
                // -- do the request 
--------------------------------------------------
-               if( array_key_exists( 'handle', $params ) ){
+               if ( array_key_exists( 'handle', $params ) ) {
                        $params['id'] = EntityTestHelper::getId( 
$params['handle'] );
                        unset( $params['handle'] );
+               }
+
+               // wbmergeitems needs special treatment as it takes two entities
+               if ( $params['action'] === 'wbmergeitems' ) {
+                       $params['fromid'] = EntityTestHelper::getId( 
$params['fromid'] );
+                       $params['toid'] = EntityTestHelper::getId( 
$params['toid'] );
                }
                list( $result,, ) = $this->doApiRequestWithToken( $params, 
null, self::$users['wbbot']->user );
 
                // -- check the result 
------------------------------------------------
                $this->assertArrayHasKey( 'success', $result, "Missing 
'success' marker in response." );
                $this->assertResultHasEntityType( $result );
-               $this->assertArrayHasKey( 'entity', $result, "Missing 'entity' 
section in response." );
-               $this->assertArrayHasKey( 'lastrevid', $result['entity'] , 
'entity should contain lastrevid key' );
-               $myid = $result['entity']['id'];
+               if ( $params['action'] !== 'wbmergeitems' ) {
+                       $this->assertArrayHasKey( 'entity', $result, "Missing 
'entity' section in response." );
+                       $this->assertArrayHasKey( 'lastrevid', 
$result['entity'] , 'entity should contain lastrevid key' );
+                       $myid = $result['entity']['id'];
+               } else {
+                       $this->assertArrayHasKey( 'from', $result, "Missing 
'from' section in response." );
+                       $myid = $result['from']['id'];
+               }
 
                // -- get the recentchanges 
-------------------------------------------
                $rcRequest = array(
diff --git a/extensions/Wikibase/view/src/SiteLinksView.php 
b/extensions/Wikibase/view/src/SiteLinksView.php
index 3fff9a7..fee5265 100644
--- a/extensions/Wikibase/view/src/SiteLinksView.php
+++ b/extensions/Wikibase/view/src/SiteLinksView.php
@@ -98,7 +98,7 @@
        public function getHtml( array $siteLinks, ItemId $itemId = null, array 
$groups ) {
                $html = '';
 
-               if ( count( $groups ) === 0 ) {
+               if ( empty( $groups ) ) {
                        return $html;
                }
 
@@ -192,6 +192,8 @@
                $sortOk = usort(
                        $siteLinksForTable,
                        function( array $a, array $b ) {
+                               /** @var SiteLink[] $a */
+                               /** @var SiteLink[] $b */
                                return strcmp( $a['siteLink']->getSiteId(), 
$b['siteLink']->getSiteId() );
                        }
                );
@@ -290,7 +292,7 @@
                // FIXME: No need for separate template; Use 
'wikibase-sitelinkview' template.
                return $this->templateFactory->render( 
'wikibase-sitelinkview-unknown',
                        htmlspecialchars( $siteLink->getSiteId() ),
-                       htmlspecialchars(  $siteLink->getPageName() )
+                       htmlspecialchars( $siteLink->getPageName() )
                );
        }
 
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index e56bcb3..d2f0084 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -1203,12 +1203,12 @@
         "source": {
             "type": "git",
             "url": 
"https://github.com/wikimedia/mediawiki-extensions-Wikibase.git";,
-            "reference": "7bf3cae73c330b2eb7698b98a7e64bc4fc2c2cb7"
+            "reference": "6518ec6723bcd377b42e424cfc3cc803760f26d6"
         },
         "dist": {
             "type": "zip",
-            "url": 
"https://api.github.com/repos/wikimedia/mediawiki-extensions-Wikibase/zipball/7bf3cae73c330b2eb7698b98a7e64bc4fc2c2cb7";,
-            "reference": "7bf3cae73c330b2eb7698b98a7e64bc4fc2c2cb7",
+            "url": 
"https://api.github.com/repos/wikimedia/mediawiki-extensions-Wikibase/zipball/6518ec6723bcd377b42e424cfc3cc803760f26d6";,
+            "reference": "6518ec6723bcd377b42e424cfc3cc803760f26d6",
             "shasum": ""
         },
         "require": {
@@ -1235,7 +1235,7 @@
         "conflict": {
             "mediawiki/mediawiki": "<1.23"
         },
-        "time": "2015-05-19 20:37:25",
+        "time": "2015-05-21 04:52:54",
         "type": "mediawiki-extension",
         "installation-source": "dist",
         "autoload": {

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ib6f09a03c056d94a5ca61bea929043a60d8b8eab
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikidata
Gerrit-Branch: master
Gerrit-Owner: WikidataBuilder <[email protected]>

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

Reply via email to