WikidataBuilder has uploaded a new change for review.

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

Change subject: New Wikidata Build - 2016-08-14T10:00:02+0000
......................................................................

New Wikidata Build - 2016-08-14T10:00:02+0000

Change-Id: I13a3b58af19ecd008b4c6fd67ce4327d3da619f1
---
M composer.lock
M extensions/ArticlePlaceholder/extension.json
A extensions/ArticlePlaceholder/i18n/cy.json
A extensions/ArticlePlaceholder/includes/BaseTemplateToolboxHookHandler.php
M extensions/ArticlePlaceholder/phpcs.xml
A 
extensions/ArticlePlaceholder/tests/phpunit/includes/BaseTemplateToolboxHookHandlerTest.php
M extensions/Wikibase/client/i18n/ckb.json
M extensions/Wikibase/client/i18n/la.json
M extensions/Wikibase/client/i18n/te.json
M extensions/Wikibase/lib/i18n/is.json
M extensions/Wikibase/lib/i18n/lb.json
M extensions/Wikibase/lib/i18n/nn.json
M extensions/Wikibase/lib/i18n/te.json
A extensions/Wikibase/lib/i18n/tokipona.json
M extensions/Wikibase/repo/i18n/bg.json
M extensions/Wikibase/repo/i18n/ckb.json
M extensions/Wikibase/repo/i18n/diq.json
M extensions/Wikibase/repo/i18n/id.json
M extensions/Wikibase/repo/i18n/is.json
M extensions/Wikibase/repo/i18n/it.json
M extensions/Wikibase/repo/i18n/ja.json
M extensions/Wikibase/repo/i18n/mr.json
M extensions/Wikibase/repo/i18n/nn.json
M extensions/Wikibase/repo/i18n/ru.json
M extensions/Wikibase/repo/i18n/yue.json
M extensions/Wikibase/repo/includes/Api/CreateClaim.php
M extensions/Wikibase/repo/includes/Api/EntityLoadingHelper.php
M extensions/Wikibase/repo/includes/Api/EntitySavingHelper.php
M extensions/Wikibase/repo/includes/Api/GetClaims.php
M extensions/Wikibase/repo/includes/Api/RemoveClaims.php
M extensions/Wikibase/repo/includes/Api/RemoveQualifiers.php
M extensions/Wikibase/repo/includes/Api/RemoveReferences.php
M extensions/Wikibase/repo/includes/Api/SetClaim.php
M extensions/Wikibase/repo/includes/Api/SetClaimValue.php
M extensions/Wikibase/repo/includes/Api/SetQualifier.php
M extensions/Wikibase/repo/includes/Api/SetReference.php
M extensions/Wikibase/repo/includes/Specials/SpecialItemByTitle.php
M extensions/Wikibase/repo/resources/Resources.php
D 
extensions/Wikibase/repo/resources/wikibase.special/wikibase.special.itemByTitle.js
M extensions/Wikibase/repo/resources/wikibase.ui.entityViewInit.js
M 
extensions/Wikibase/repo/tests/phpunit/includes/Api/EntityLoadingHelperTest.php
M extensions/Wikibase/repo/tests/phpunit/includes/Api/EntitySavingHelperTest.php
M 
extensions/Wikibase/repo/tests/phpunit/includes/Specials/SpecialItemByTitleTest.php
M 
extensions/Wikibase/view/resources/jquery/wikibase/toolbar/jquery.wikibase.edittoolbar.js
M extensions/Wikibase/view/resources/wikibase/view/ToolbarViewController.js
M vendor/composer/autoload_classmap.php
M vendor/composer/installed.json
47 files changed, 694 insertions(+), 237 deletions(-)


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

diff --git a/composer.lock b/composer.lock
index 9bfaef3..dbbd31b 100644
--- a/composer.lock
+++ b/composer.lock
@@ -782,12 +782,12 @@
             "source": {
                 "type": "git",
                 "url": 
"https://github.com/wikimedia/mediawiki-extensions-ArticlePlaceholder.git";,
-                "reference": "abe5908651e37f1a341d752552a72baf98454456"
+                "reference": "825dcf735dd4be4f0794f5c1ec23a561256a4167"
             },
             "dist": {
                 "type": "zip",
-                "url": 
"https://api.github.com/repos/wikimedia/mediawiki-extensions-ArticlePlaceholder/zipball/abe5908651e37f1a341d752552a72baf98454456";,
-                "reference": "abe5908651e37f1a341d752552a72baf98454456",
+                "url": 
"https://api.github.com/repos/wikimedia/mediawiki-extensions-ArticlePlaceholder/zipball/825dcf735dd4be4f0794f5c1ec23a561256a4167";,
+                "reference": "825dcf735dd4be4f0794f5c1ec23a561256a4167",
                 "shasum": ""
             },
             "require-dev": {
@@ -812,7 +812,7 @@
             ],
             "description": "Provides a special page with Wikibase information 
about a certain topic, with invitation to create an article for the topic",
             "homepage": 
"https://www.mediawiki.org/wiki/Extension:ArticlePlaceholder";,
-            "time": "2016-08-10 20:34:15"
+            "time": "2016-08-11 21:49:41"
         },
         {
             "name": "propertysuggester/property-suggester",
@@ -1568,12 +1568,12 @@
             "source": {
                 "type": "git",
                 "url": 
"https://github.com/wikimedia/mediawiki-extensions-Wikibase.git";,
-                "reference": "56096e27d96a6e71f97e92f9b092deabb38307a3"
+                "reference": "10af0cf1d56dab400f3a305e282ad1247d4e6f8a"
             },
             "dist": {
                 "type": "zip",
-                "url": 
"https://api.github.com/repos/wikimedia/mediawiki-extensions-Wikibase/zipball/56096e27d96a6e71f97e92f9b092deabb38307a3";,
-                "reference": "56096e27d96a6e71f97e92f9b092deabb38307a3",
+                "url": 
"https://api.github.com/repos/wikimedia/mediawiki-extensions-Wikibase/zipball/10af0cf1d56dab400f3a305e282ad1247d4e6f8a";,
+                "reference": "10af0cf1d56dab400f3a305e282ad1247d4e6f8a",
                 "shasum": ""
             },
             "require": {
@@ -1645,7 +1645,7 @@
                 "wikibaserepo",
                 "wikidata"
             ],
-            "time": "2016-08-11 00:41:04"
+            "time": "2016-08-13 20:33:48"
         },
         {
             "name": "wikibase/wikimedia-badges",
diff --git a/extensions/ArticlePlaceholder/extension.json 
b/extensions/ArticlePlaceholder/extension.json
index d9dd0ba..75ebe1f 100644
--- a/extensions/ArticlePlaceholder/extension.json
+++ b/extensions/ArticlePlaceholder/extension.json
@@ -62,6 +62,9 @@
                "remoteExtPath": "ArticlePlaceholder/modules"
        },
        "Hooks": {
+               "BaseTemplateToolbox": [
+                       
"ArticlePlaceholder\\BaseTemplateToolboxHookHandler::onBaseTemplateToolbox"
+               ],
                "ScribuntoExternalLibraries": [
                        
"ArticlePlaceholder\\Hooks::onScribuntoExternalLibraries"
                ],
diff --git a/extensions/ArticlePlaceholder/i18n/cy.json 
b/extensions/ArticlePlaceholder/i18n/cy.json
new file mode 100644
index 0000000..6e5ac5a
--- /dev/null
+++ b/extensions/ArticlePlaceholder/i18n/cy.json
@@ -0,0 +1,29 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Jason.nlw",
+                       "Robin Owain"
+               ]
+       },
+       "createtopicpage": "Creu'r ddalen",
+       "articleplaceholder-desc": "Darparwch ddalen arbennig gyda gwybodaeth 
{{WBREPONAME}} am unrhyw bwnc, gyda gwahoddiad i greu erthygl am y topig 
hwnnw.",
+       "articleplaceholder-abouttopic": "Am y pwnc",
+       "articleplaceholder-abouttopic-intro": "Mae'r ddalen arbennig hon yn 
rhoi braslun i chi o dopig, sy'n tynnu data o {{WBREPONAME}}.",
+       "articleplaceholder-abouttopic-entityid": "Rhowch ID yr eitem ee Q25",
+       "articleplaceholder-abouttopic-submit": "crefft",
+       "articleplaceholder-abouttopic-no-entity-error": "Nid yw'r ID yma'n 
ddilys.",
+       "articleplaceholder-abouttopic-create-article": "Crewch erthygl newydd, 
gyda theitl",
+       "articleplaceholder-abouttopic-create-article-label": "Teitl yr 
erthygl",
+       "articleplaceholder-abouttopic-create-article-mandatory": "Mae'n rhaid 
rhoi teitl i'r erthygl",
+       "articleplaceholder-abouttopic-create-article-button": "Creu erthygl",
+       "articleplaceholder-abouttopic-create-article-submit-button": 
"Cyflwyner",
+       "articleplaceholder-abouttopic-article-exists-error": "Mae tudalen o'r 
enw yma ar y wici hwn",
+       "articleplaceholder-abouttopic-lua-entity": "Endid",
+       "articleplaceholder-abouttopic-lua-reference": "Cyfeiriadau",
+       "articleplaceholder-abouttopic-lua-identifier": "Adnoddau allanol",
+       "articleplaceholder-search-header": "Darganfod data ar y pwnc",
+       "articleplaceholder-createpage-title": "Creu $1",
+       "articleplaceholder-createpage-alreadyexists": "Mae dalen gyda'r teitl 
$1 yn bodloi eisioes. Dewisiwch deitl arall.",
+       "articleplaceholder-createpage-notitleprovided": "Ni roesoch deitl; 
gwnewch hynny ar gyfer y ddalen yr hoffwch ei chreu.",
+       "articleplaceholder-createpage-invalidtitleprovided": "Mae'r teitl a 
roesoch yn annilys. Rhowch deitl dilys."
+}
diff --git 
a/extensions/ArticlePlaceholder/includes/BaseTemplateToolboxHookHandler.php 
b/extensions/ArticlePlaceholder/includes/BaseTemplateToolboxHookHandler.php
new file mode 100644
index 0000000..a70e87d
--- /dev/null
+++ b/extensions/ArticlePlaceholder/includes/BaseTemplateToolboxHookHandler.php
@@ -0,0 +1,137 @@
+<?php
+
+namespace ArticlePlaceholder;
+
+use BaseTemplate;
+use Exception;
+use SpecialPage;
+use SpecialPageFactory;
+use Title;
+use WebRequest;
+use Wikibase\Client\RepoLinker;
+use Wikibase\Client\WikibaseClient;
+use Wikibase\DataModel\Entity\EntityIdParser;
+use Wikibase\DataModel\Entity\ItemId;
+use Wikibase\DataModel\Services\Lookup\EntityLookup;
+
+/**
+ * Add Wikibase item link in toolbox for placeholders: Handler for the 
"BaseTemplateToolbox" hook.
+ *
+ * @license GPL-2.0+
+ * @author Marius Hoch < [email protected] >
+ */
+class BaseTemplateToolboxHookHandler {
+
+       /**
+        * @var EntityIdParser
+        */
+       private $entityIdParser;
+
+       /**
+        * @var RepoLinker
+        */
+       private $repoLinker;
+
+       /**
+        * @var EntityLookup
+        */
+       private $entityLookup;
+
+       /**
+        * @param SpecialPage $specialPage
+        *
+        * @return self
+        */
+       private static function newFromGlobalState() {
+               $wikibaseClient = WikibaseClient::getDefaultInstance();
+
+               return new self(
+                       $wikibaseClient->getEntityIdParser(),
+                       $wikibaseClient->newRepoLinker(),
+                       $wikibaseClient->getStore()->getEntityLookup()
+               );
+       }
+
+       /**
+        * @param EntityIdParser $entityIdParser
+        * @param RepoLinker $repoLinker
+        * @param EntityLookup $entityLookup
+        */
+       public function __construct(
+               EntityIdParser $entityIdParser,
+               RepoLinker $repoLinker,
+               EntityLookup $entityLookup
+       ) {
+               $this->entityIdParser = $entityIdParser;
+               $this->repoLinker = $repoLinker;
+               $this->entityLookup = $entityLookup;
+       }
+
+       /**
+        * @param BaseTemplate $baseTemplate
+        * @param array &$toolbox
+        */
+       public static function onBaseTemplateToolbox( BaseTemplate 
$baseTemplate, array &$toolbox ) {
+               // Return early (for performance reasons) in case we're not on
+               // Special:AboutTopic (even before calling newFromGlobalState)
+               $title = $baseTemplate->getSkin()->getTitle();
+
+               if ( $title->getNamespace() !== NS_SPECIAL ) {
+                       return;
+               }
+
+               $canonicalSpecialPageName = SpecialPageFactory::resolveAlias( 
$title->getText() )[0];
+               if ( $canonicalSpecialPageName !== 'AboutTopic' ) {
+                       return;
+               }
+
+               $self = self::newFromGlobalState();
+               $self->doBaseTemplateToolbox( $baseTemplate, $toolbox );
+       }
+
+       /**
+        * @param BaseTemplate $baseTemplate
+        * @param array &$toolbox
+        */
+       public function doBaseTemplateToolbox( BaseTemplate $baseTemplate, 
array &$toolbox ) {
+               $itemId = $this->getItemId(
+                       $baseTemplate->getSkin()->getTitle(),
+                       $baseTemplate->getSkin()->getRequest()
+               );
+
+               if ( $itemId && $this->entityLookup->hasEntity( $itemId ) ) {
+                       // Duplicated from 
Wikibase\ClientHooks::onBaseTemplateToolbox
+                       $toolbox['wikibase'] = [
+                               'text' => $baseTemplate->getMsg( 
'wikibase-dataitem' )->text(),
+                               'href' => $this->repoLinker->getEntityUrl( 
$itemId ),
+                               'id' => 't-wikibase'
+                       ];
+               }
+       }
+
+       /**
+        * @param Title $title
+        * @param WebRequest $webRequest
+        *
+        * @return ItemId|null
+        */
+       private function getItemId( Title $title, WebRequest $webRequest ) {
+               $idSerialization = $webRequest->getText(
+                       'entityid',
+                       SpecialPageFactory::resolveAlias( $title->getText() )[1]
+               );
+
+               if ( !$idSerialization ) {
+                       return null;
+               }
+
+               try {
+                       return $this->entityIdParser->parse( $idSerialization );
+               } catch ( Exception $ex ) {
+                       // Ignore
+               }
+
+               return null;
+       }
+
+}
diff --git a/extensions/ArticlePlaceholder/phpcs.xml 
b/extensions/ArticlePlaceholder/phpcs.xml
index df524dd..b03ae21 100644
--- a/extensions/ArticlePlaceholder/phpcs.xml
+++ b/extensions/ArticlePlaceholder/phpcs.xml
@@ -7,6 +7,11 @@
        <rule ref="Generic.PHP.CharacterBeforePHPOpeningTag" />
 
        <rule ref="PSR1" />
+       <rule ref="PSR1.Methods.CamelCapsMethodName.NotCamelCaps">
+               <!-- Exclude test methods like 
"testGivenInvalidInput_methodThrowsException". -->
+               <exclude-pattern>tests.phpunit*Test*\.php</exclude-pattern>
+       </rule>
+
        <rule ref="PSR2.Files" />
 
        <rule ref="Squiz.Classes.DuplicateProperty" />
diff --git 
a/extensions/ArticlePlaceholder/tests/phpunit/includes/BaseTemplateToolboxHookHandlerTest.php
 
b/extensions/ArticlePlaceholder/tests/phpunit/includes/BaseTemplateToolboxHookHandlerTest.php
new file mode 100644
index 0000000..77bf5f7
--- /dev/null
+++ 
b/extensions/ArticlePlaceholder/tests/phpunit/includes/BaseTemplateToolboxHookHandlerTest.php
@@ -0,0 +1,208 @@
+<?php
+
+namespace ArticlePlaceholder\Tests;
+
+use ArticlePlaceholder\BaseTemplateToolboxHookHandler;
+use BaseTemplate;
+use MediaWikiTestCase;
+use Skin;
+use Title;
+use WebRequest;
+use Wikibase\Client\WikibaseClient;
+use Wikibase\DataModel\Entity\Item;
+use Wikibase\DataModel\Entity\ItemId;
+use Wikibase\Test\MockClientStore;
+
+/**
+ * @group ArticlePlaceholder
+ *
+ * @covers ArticlePlaceholder\BaseTemplateToolboxHookHandler
+ *
+ * @license GPL-2.0+
+ * @author Marius Hoch < [email protected] >
+ */
+class BaseTemplateToolboxHookHandlerTest extends MediaWikiTestCase {
+
+       public function setUp() {
+               parent::setUp();
+
+               $this->setUserLang( 'qqx' );
+
+               $clientStore = new MockClientStore();
+               $wikibaseClient = WikibaseClient::getDefaultInstance();
+               $wikibaseClient->overrideStore( $clientStore );
+
+               $mockRepository = $clientStore->getEntityRevisionLookup();
+               $item = new Item( new ItemId( 'Q2013' ) );
+
+               $mockRepository->putEntity( $item );
+       }
+
+       public function tearDown() {
+               parent::tearDown();
+
+               WikibaseClient::getDefaultInstance( 'reset' );
+       }
+
+       public function testOnBaseTemplateToolbox_wrongNamespace() {
+               $title = $this->getMock( Title::class );
+               $title->expects( $this->once() )
+                       ->method( 'getNamespace' )
+                       ->will( $this->returnValue( 2 ) );
+
+               // We abort early, before Title::getText is ever called
+               $title->expects( $this->never() )
+                       ->method( 'getText' );
+
+               $baseTemplate = $this->getBaseTemplate( $title );
+
+               $arr = [];
+               BaseTemplateToolboxHookHandler::onBaseTemplateToolbox( 
$baseTemplate, $arr );
+
+               $this->assertSame( [], $arr );
+       }
+
+       public function testOnBaseTemplateToolbox_wrongSpecialPageName() {
+               $title = $this->getMock( Title::class );
+               $title->expects( $this->once() )
+                       ->method( 'getNamespace' )
+                       ->will( $this->returnValue( NS_SPECIAL ) );
+
+               // Title::getText is only called once, because we abort after 
checking the name
+               $title->expects( $this->once() )
+                       ->method( 'getText' )
+                       ->will( $this->returnValue( 'Preferences' ) );
+
+               $baseTemplate = $this->getBaseTemplate( $title );
+
+               $arr = [];
+               BaseTemplateToolboxHookHandler::onBaseTemplateToolbox( 
$baseTemplate, $arr );
+
+               $this->assertSame( [], $arr );
+       }
+
+       public function testOnBaseTemplateToolbox_invalidItemId() {
+               $title = $this->getAboutTopicTitle( 'not-an-item-id' );
+
+               $baseTemplate = $this->getBaseTemplate( $title );
+
+               $arr = [];
+               BaseTemplateToolboxHookHandler::onBaseTemplateToolbox( 
$baseTemplate, $arr );
+
+               $this->assertSame( [], $arr );
+       }
+
+       public function testOnBaseTemplateToolbox_unknownItemId() {
+               $title = $this->getAboutTopicTitle( 'Q42' );
+
+               $baseTemplate = $this->getBaseTemplate( $title );
+
+               $arr = [];
+               BaseTemplateToolboxHookHandler::onBaseTemplateToolbox( 
$baseTemplate, $arr );
+
+               $this->assertSame( [], $arr );
+       }
+
+       public function testOnBaseTemplateToolbox_subPage() {
+               $title = $this->getAboutTopicTitle( 'Q2013' );
+
+               $baseTemplate = $this->getBaseTemplate( $title );
+
+               $toolbox = [];
+               BaseTemplateToolboxHookHandler::onBaseTemplateToolbox( 
$baseTemplate, $toolbox );
+
+               $this->assertAmendedToolbox( $toolbox );
+       }
+
+       public function testOnBaseTemplateToolbox_entityidParam() {
+               $title = $this->getAboutTopicTitle();
+
+               $baseTemplate = $this->getBaseTemplate( $title, 'Q2013' );
+
+               $toolbox = [];
+               BaseTemplateToolboxHookHandler::onBaseTemplateToolbox( 
$baseTemplate, $toolbox );
+
+               $this->assertAmendedToolbox( $toolbox );
+       }
+
+       public function 
testOnBaseTemplateToolbox_entityidParamOverridesSubPage() {
+               // This matches the special page's behaviour.
+               $title = $this->getAboutTopicTitle( 'Q123' );
+
+               $baseTemplate = $this->getBaseTemplate( $title, 'Q2013' );
+
+               $toolbox = [];
+               BaseTemplateToolboxHookHandler::onBaseTemplateToolbox( 
$baseTemplate, $toolbox );
+
+               $this->assertAmendedToolbox( $toolbox );
+       }
+
+       private function assertAmendedToolbox( $toolbox ) {
+               $itemId = new ItemId( 'Q2013' );
+               $href = 
WikibaseClient::getDefaultInstance()->newRepoLinker()->getEntityUrl( $itemId );
+
+               $this->assertSame(
+                       [
+                               'wikibase' => [
+                                       'text' => '(wikibase-dataitem)',
+                                       'href' => $href,
+                                       'id' => 't-wikibase'
+                               ]
+                       ],
+                       $toolbox
+               );
+       }
+
+       private function getAboutTopicTitle( $subPage = null ) {
+               $titleText = 'AboutTopic';
+
+               if ( $subPage ) {
+                       $titleText .= '/' . $subPage;
+               }
+
+               $title = $this->getMock( Title::class );
+               $title->expects( $this->once() )
+                       ->method( 'getNamespace' )
+                       ->will( $this->returnValue( NS_SPECIAL ) );
+
+               $title->expects( $this->exactly( 2 ) )
+                       ->method( 'getText' )
+                       ->will( $this->returnValue( $titleText ) );
+
+               return $title;
+       }
+
+       private function getBaseTemplate( Title $title, $itemIdParam = null ) {
+               $request = $this->getMock( WebRequest::class );
+               $request->expects( $this->any() )
+                       ->method( 'getText' )
+                       ->will( $this->returnCallback( function( $name, 
$default ) use ( $itemIdParam ) {
+                               $this->assertSame( 'entityid', $name );
+
+                               return $itemIdParam ?: $default;
+                       } ) );
+
+               $skin = $this->getMockBuilder( Skin::class )
+                       ->setMethods( [ 'getTitle', 'getRequest' ] )
+                       ->getMockForAbstractClass();
+
+               $skin->expects( $this->any() )
+                       ->method( 'getTitle' )
+                       ->will( $this->returnValue( $title ) );
+
+               $skin->expects( $this->any() )
+                       ->method( 'getRequest' )
+                       ->will( $this->returnValue( $request ) );
+
+               $baseTemplate = $this->getMockBuilder( BaseTemplate::class )
+                       ->setMethods( [ 'getSkin' ] )
+                       ->getMockForAbstractClass();
+
+               $baseTemplate->expects( $this->any() )
+                       ->method( 'getSkin' )
+                       ->will( $this->returnValue( $skin ) );
+
+               return $baseTemplate;
+       }
+
+}
diff --git a/extensions/Wikibase/client/i18n/ckb.json 
b/extensions/Wikibase/client/i18n/ckb.json
index 95f28a8..74ac6b4 100644
--- a/extensions/Wikibase/client/i18n/ckb.json
+++ b/extensions/Wikibase/client/i18n/ckb.json
@@ -19,7 +19,7 @@
        "wikibase-comment-sitelink-remove": "بەستەری زمانی سڕدراو: $1",
        "wikibase-comment-multi": "$1 {{PLURAL:$1|گۆڕانکاری}}",
        "wikibase-dataitem": "بەندی {{WBREPONAME}}",
-       "wikibase-editlinks": "دەستکاریی گرێدانەکان بکە",
+       "wikibase-editlinks": "دەستکاریی گرێدانەکان",
        "wikibase-editlinkstitle": "بەستەرەکانی نێوانویکی دەستکاری بکە",
        "wikibase-linkitem-addlinks": "گرێدانەکان زیاد بکە",
        "wikibase-linkitem-close": "وتووێژەکە ببەستە و دیسان پەڕەکە بار بکەوە",
diff --git a/extensions/Wikibase/client/i18n/la.json 
b/extensions/Wikibase/client/i18n/la.json
index 1df28df..d0d1917 100644
--- a/extensions/Wikibase/client/i18n/la.json
+++ b/extensions/Wikibase/client/i18n/la.json
@@ -4,7 +4,8 @@
                        "Autokrator",
                        "UV",
                        "Lesgles",
-                       "Laurentianus"
+                       "Laurentianus",
+                       "Amahoney"
                ]
        },
        "tooltip-t-wikibase": "Nexus ad rem repositorii Vicibasis",
@@ -16,6 +17,7 @@
        "wikibase-rc-hide-wikidata-hide": "Celare",
        "wikibase-rc-hide-wikidata-show": "Monstrare",
        "wikibase-rc-show-wikidata-pref": "Recensiones apud {{WBREPONAME}} 
factas in nuper mutatorum indice ostendere",
+       "wikibase-rc-wikibase-edit-letter": "D",
        "wikibase-rc-wikibase-edit-title": "Recensio apud Wikidata facta",
        "wikibase-watchlist-show-changes-pref": "Mutationes apud {{WBREPONAME}} 
factas, siquas paginas observandas afficiant, in earum indice ostendere",
        "wikibase-otherprojects": "Inceptis aliis"
diff --git a/extensions/Wikibase/client/i18n/te.json 
b/extensions/Wikibase/client/i18n/te.json
index f179cc3..6ac799f 100644
--- a/extensions/Wikibase/client/i18n/te.json
+++ b/extensions/Wikibase/client/i18n/te.json
@@ -4,7 +4,8 @@
                        "Arjunaraoc",
                        "Ravichandra",
                        "Veeven",
-                       "రహ్మానుద్దీన్"
+                       "రహ్మానుద్దీన్",
+                       "WP MANIKHANTA"
                ]
        },
        "tooltip-t-wikibase": "ఈ పేజీకి జత చేసి ఉన్న వికీడేటా పేజీకి లంకె",
@@ -27,5 +28,5 @@
        "wikibase-rc-wikibase-edit-title": "{{WBREPONAME}} సవరణ",
        "wikibase-unconnectedpages-submit": "పేజీలను చూపించు",
        "wikibase-pageinfo-entity-id-none": "ఏమీలేదు",
-       "wikibase-otherprojects": "ఇతర ప్రాజెక్టులు"
+       "wikibase-otherprojects": "ఇతర ప్రాజక్టులలో"
 }
diff --git a/extensions/Wikibase/lib/i18n/is.json 
b/extensions/Wikibase/lib/i18n/is.json
index d6e0848..d5008e6 100644
--- a/extensions/Wikibase/lib/i18n/is.json
+++ b/extensions/Wikibase/lib/i18n/is.json
@@ -10,10 +10,10 @@
        "wikibase-deletedentity-property": "Eyddur eiginleiki",
        "wikibase-deletedentity-query": "Eydd fyrirspurn",
        "wikibase-error-unexpected": "Villa: $1",
-       "wikibase-error-save-generic": "Villa átti sér stað þegar þú vistaðir. 
Það mistókst að vista breytingarnar þínar.",
-       "wikibase-error-remove-generic": "Villa átti sér stað þegar þú 
fjarlægðir. Það mistókst að ljúka breytingum þínum.",
-       "wikibase-error-save-connection": "Tengingar villa átti sér stað þegar 
þú vistaðir. Það mistókst að ljúka breytingunum þínum. Athugaðu hvort þú sért 
tengd/ur netinu.",
-       "wikibase-error-remove-connection": "Tengingar villa átti sér stað 
þegar þú fjarlægðir. Það mistókst að ljúka breytingunum þínum. Vinsamlegast 
athugaðu hvort þú sért tengd/ur netinu.",
+       "wikibase-error-save-generic": "Gat ekki vistað vegna villu.",
+       "wikibase-error-remove-generic": "Gat ekki fjarlægt vegna villu.",
+       "wikibase-error-save-connection": "Gat ekki vistað vegna tengingar 
villu. Athugaðu hvort þú sért tengd/ur netinu.",
+       "wikibase-error-remove-connection": "Gat ekki fjarlægt vegna tengingar 
villu. Athugaðu hvort þú sért tengd/ur netinu.",
        "wikibase-error-save-timeout": "Við höfum orðið fyrir tæknilegum 
örðugleikum. Það mistókst að vista breytingarnar þínar.",
        "wikibase-error-remove-timeout": "Við höfum orðið fyrir tæknilegum 
örðugleikum. Þín tilraun við að fjarlægja mistókst.",
        "wikibase-error-autocomplete-connection": "Mistókst að senda fyrirspurn 
til síðunnar. Vinsamlegast reyndu aftur síðar.",
diff --git a/extensions/Wikibase/lib/i18n/lb.json 
b/extensions/Wikibase/lib/i18n/lb.json
index eb0d93f..2fe11be 100644
--- a/extensions/Wikibase/lib/i18n/lb.json
+++ b/extensions/Wikibase/lib/i18n/lb.json
@@ -14,6 +14,7 @@
        "wikibase-error-save-generic": "Duerch e Feeler konnt et net 
gespäichert ginn.",
        "wikibase-error-remove-generic": "Duerch e Feeler konnt et net 
ewechgeholl ginn.",
        "wikibase-error-save-connection": "Konnt duerch e Verbindunsproblem net 
gespäichert ginn. Iwwerpréift w.e.g. Är Internetverbindung.",
+       "wikibase-error-remove-connection": "Konnt duerch e Verbindunsproblem 
net ewechgeholl ginn. Iwwerpréift w.e.g. Är Internetverbindung.",
        "wikibase-error-save-timeout": "Mir hunn technesch Schwieregkeeten. Är 
Ännerung konnt net \"gespäichert\" ginn.",
        "wikibase-error-remove-timeout": "Mir hunn technesch Schwieregkeeten. 
Är \"Ännerung\" konnt net ofgeschloss ginn.",
        "wikibase-error-autocomplete-connection": "Den API-Site konnt net 
ofgefrot ginn. Probéiert w.e.g. méi spéit nach eng Kéier.",
diff --git a/extensions/Wikibase/lib/i18n/nn.json 
b/extensions/Wikibase/lib/i18n/nn.json
index 1e2d3e6..cd25ebd 100644
--- a/extensions/Wikibase/lib/i18n/nn.json
+++ b/extensions/Wikibase/lib/i18n/nn.json
@@ -92,6 +92,8 @@
        "wikibase-entity-summary-wbsetclaim-create": "Oppretta 
{{PLURAL:$3|påstand|påstandar}}",
        "wikibase-entity-summary-wbsetclaim-update-qualifiers": "Endra 
{{PLURAL:$4|éin kvalifikator|$4 kvalifikatorar}} for {{PLURAL:$3|éin 
påstand|fleire påstandar}}",
        "wikibase-entity-summary-clientsitelink-update": "Sida flytt frå [$3] 
til [$4]",
+       "wikibase-entity-summary-wbmergeitems-from": "Flette element frå $3",
+       "wikibase-entity-summary-wbmergeitems-to": "Flette element inn i $3",
        "wikibase-item-summary-wbcreate-new": "Oppretta eit nytt element",
        "wikibase-item-summary-wbeditentity": "Oppretta eit nytt element",
        "wikibase-item-summary-wbeditentity-create": "Oppretta eit nytt 
element",
diff --git a/extensions/Wikibase/lib/i18n/te.json 
b/extensions/Wikibase/lib/i18n/te.json
index afa98c7..0adaa5e 100644
--- a/extensions/Wikibase/lib/i18n/te.json
+++ b/extensions/Wikibase/lib/i18n/te.json
@@ -1,9 +1,12 @@
 {
        "@metadata": {
                "authors": [
-                       "Veeven"
+                       "Veeven",
+                       "Chaduvari"
                ]
        },
+       "wikibase-error-remove-generic": "ఏదో లోపం కారణంగా తీసివేయలేకపోయాం.",
+       "wikibase-error-save-connection": "కనెక్షను లోపం కారణంగా 
భద్రపరచలేకపోయాం. మీ అంతర్జాల కనెక్షన్ను చెక్ చేసుకోండి.",
        "wikibase-timedetails-time": "సమయం",
        "wikibase-timedetails-timezone": "కాలమండలం",
        "wikibase-timedetails-calendar": "క్యాలెండర్",
diff --git a/extensions/Wikibase/lib/i18n/tokipona.json 
b/extensions/Wikibase/lib/i18n/tokipona.json
new file mode 100644
index 0000000..d12cc6f
--- /dev/null
+++ b/extensions/Wikibase/lib/i18n/tokipona.json
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Robin van der Vliet"
+               ]
+       },
+       "wikibase-sitelinks-wikipedia": "Wikipesija"
+}
diff --git a/extensions/Wikibase/repo/i18n/bg.json 
b/extensions/Wikibase/repo/i18n/bg.json
index 8d05aef..3f6b494 100644
--- a/extensions/Wikibase/repo/i18n/bg.json
+++ b/extensions/Wikibase/repo/i18n/bg.json
@@ -26,6 +26,7 @@
        "wikibase-entitytermsforlanguagelistview-description": "Описание",
        "wikibase-entitytermsforlanguagelistview-label": "Етикет",
        "wikibase-entitytermsforlanguagelistview-language": "Език",
+       "wikibase-entitytermsforlanguagelistview-more": "Всички въведени езици",
        "wikibase-label-empty": "Не е зададен етикет",
        "wikibase-label-edit-placeholder-language-aware": "въведете етикет на 
$1",
        "wikibase-description-empty": "Не е въведено описание",
@@ -44,7 +45,6 @@
        "wikibase-sitelinks-special": "Други сайтове",
        "wikibase-remove": "премахване",
        "wikibase-restore-title": "Възстановяване на стара версия на \"$1\"",
-       "wikibase-aliases-empty": "Не е зададен псевдоним",
        "wikibase-propertypage-datatype": "Тип на данните",
        "wikibase-statementview-rank-preferred": "Предпочитан ранг",
        "wikibase-statementview-rank-normal": "Нормален ранг",
diff --git a/extensions/Wikibase/repo/i18n/ckb.json 
b/extensions/Wikibase/repo/i18n/ckb.json
index e1df63e..782e665 100644
--- a/extensions/Wikibase/repo/i18n/ckb.json
+++ b/extensions/Wikibase/repo/i18n/ckb.json
@@ -10,13 +10,14 @@
        },
        "wikibase-entity-item": "بەند",
        "wikibase-entity-property": "تایبەتمەندی",
-       "wikibase-edit": "دەستکاریی بکە",
+       "wikibase-edit": "دەستکاری",
        "wikibase-save": "پاشەکەوت",
        "wikibase-cancel": "ھەڵوەشاندنەوە",
        "wikibase-add": "زیاد بکە",
-       "wikibase-addreference": "سەرچاوە زیاد بکە",
+       "wikibase-addreference": "زیادکردنی سەرچاوە",
        "wikibase-save-inprogress": "پاشەکەوتکردن…",
        "wikibase-remove-inprogress": "سڕینەوە…",
+       "wikibase-entitytermsforlanguagelistview-language": "زمان",
        "wikibase-label-empty": "سەرناوێک دیاری نەکراوە",
        "wikibase-label-edit-placeholder": "سەرناوێک بنووسە",
        "wikibase-label-edit-placeholder-language-aware": "سەرناوێک بە $1 
بنووسە",
diff --git a/extensions/Wikibase/repo/i18n/diq.json 
b/extensions/Wikibase/repo/i18n/diq.json
index 444c5f1..c64612b 100644
--- a/extensions/Wikibase/repo/i18n/diq.json
+++ b/extensions/Wikibase/repo/i18n/diq.json
@@ -29,7 +29,7 @@
        "wikibase-diffview-alias": "nameyê bini",
        "wikibase-diffview-description": "şınasnayış",
        "wikibase-diffview-link": "gırey",
-       "wikibase-sitelink-site-edit-placeholder": "sita",
+       "wikibase-sitelink-site-edit-placeholder": "wiki",
        "wikibase-sitelink-page-edit-placeholder": "per",
        "wikibase-statementsection-statements": "İfadey",
        "wikibase-sitelinks-special": "Pelê bini",
diff --git a/extensions/Wikibase/repo/i18n/id.json 
b/extensions/Wikibase/repo/i18n/id.json
index 3996415..47cb48c 100644
--- a/extensions/Wikibase/repo/i18n/id.json
+++ b/extensions/Wikibase/repo/i18n/id.json
@@ -42,7 +42,7 @@
        "wikibase-label-edit-placeholder-language-aware": "masukkan label dalam 
$1",
        "wikibase-description-empty": "Tidak ada pemerian",
        "wikibase-description-edit-placeholder": "masukkan pemerian",
-       "wikibase-description-edit-placeholder-language-aware": "masukkan 
pemerian dalam $1",
+       "wikibase-description-edit-placeholder-language-aware": "masukkan 
pemerian dalam bahasa $1",
        "wikibase-aliases-edit-placeholder": "masukkan nama lain",
        "wikibase-aliases-edit-placeholder-language-aware": "masukkan nama lain 
dalam $1",
        "wikibase-diffview-reference": "rujukan",
@@ -55,7 +55,7 @@
        "wikibase-diffview-alias": "nama lain",
        "wikibase-diffview-description": "pemerian",
        "wikibase-diffview-link": "pranala",
-       "wikibase-sitelink-site-edit-placeholder": "situs",
+       "wikibase-sitelink-site-edit-placeholder": "wiki",
        "wikibase-sitelink-page-edit-placeholder": "laman",
        "wikibase-alias-edit-placeholder": "masukkan nama lain",
        "wikibase-label-input-help-message": "Masukkan label dari entitas ini 
ke dalam $1 .",
@@ -107,6 +107,7 @@
        "wikibase-shortcopyrightwarning": "Dengan mengeklik \"$1\", Anda 
menyetujui [[$2|ketentuan layanan]], dan Anda sepakat untuk melepas sumbangan 
Anda di bawah $3 tanpa bisa ditarik kembali.",
        "wikibase-copyrighttooltip-acknowledge": "Saya menerima syarat ini 
untuk suntingan selanjutnya. Jangan tampilkan lagi pesan ini.",
        "wikibase-entityselector-more": "kembangkan",
+       "wikibase-entityselector-notfound": "Tidak ditemukan data yang cocok",
        "wikibase-anonymouseditwarning": "Peringatan: Anda belum masuk 
log.\nAlamat IP Anda akan direkam dalam sejarah penyuntingan entitas ini.",
        "wikibase-move-error": "Anda tidak dapat memindahkan laman yang ada 
pada ruang nama data dan Anda tidak dapat memmindahkan laman ke dalamnya.",
        "wikibase-validator-sitelink-conflict": "Pranala $1 sudah digunakan 
oleh butir $2. Anda bisa menghapusnya dari $2 jika memang tidak seharusnya di 
sana atau gabungkan kedua butir jika memang merupakan topik yang sama.",
@@ -157,6 +158,8 @@
        "wikibase-newproperty-fieldset": "Buat atribut baru",
        "wikibase-newproperty-datatype": "Jenis data:",
        "wikibase-newproperty-invalid-datatype": "Jenis data tidak sahih 
tertentu.",
+       "wikibase-description-helppage": "Bantuan:Pemerian",
+       "wikibase-label-helppage": "Bantuan:Label",
        "special-newitem": "Buat butir baru",
        "wikibase-newitem-summary": "Pastikan Anda selalu 
[[Special:Search|memeriksa butir yang akan dimasukkan, siapa tahu data itu 
sudah ada]]<br />Buatlah [[{{int:Wikibase-label-helppage}}|label]] dan 
[[{{int:Wikibase-description-helppage}}|pemerian]] untuk semua butir baru.",
        "wikibase-newitem-fieldset": "Buat butir baru",
@@ -164,6 +167,7 @@
        "wikibase-newitem-page": "Nama dari laman tertaut pertama",
        "wikibase-newitem-no-external-page": "Laman yang dicari tidak ditemukan 
di situs bersangkutan.",
        "wikibase-newitem-not-recognized-siteid": "Penanda situs yang tersedia 
tidak dapat dikenali.",
+       "wikibase-newitem-not-recognized-language": "kode bahasa yang diberikan 
tidak dikenal.",
        "wikibase-newentity-language": "Bahasa:",
        "wikibase-newentity-label": "Label:",
        "wikibase-newentity-description": "Pemerian:",
diff --git a/extensions/Wikibase/repo/i18n/is.json 
b/extensions/Wikibase/repo/i18n/is.json
index 2f80f77..af63e9b 100644
--- a/extensions/Wikibase/repo/i18n/is.json
+++ b/extensions/Wikibase/repo/i18n/is.json
@@ -26,7 +26,7 @@
        "wikibase-entitytermsforlanguagelistview-description": "Lýsing",
        "wikibase-entitytermsforlanguagelistview-label": "Merkimiði",
        "wikibase-entitytermsforlanguagelistview-language": "Tungumál",
-       "wikibase-entitytermsforlanguagelistview-more": "Fleiri tungumál",
+       "wikibase-entitytermsforlanguagelistview-more": "Öll tilgreind 
tungumál",
        "wikibase-entitytermsforlanguagelistview-less": "Færri tungumál",
        "wikibase-label-empty": "Enginn merking skilgreind",
        "wikibase-label-edit-placeholder": "bæta við merkimiða",
diff --git a/extensions/Wikibase/repo/i18n/it.json 
b/extensions/Wikibase/repo/i18n/it.json
index 47ca60f..130430c 100644
--- a/extensions/Wikibase/repo/i18n/it.json
+++ b/extensions/Wikibase/repo/i18n/it.json
@@ -116,7 +116,7 @@
        "wikibase-copyrighttooltip-acknowledge": "Accetto questi termini per le 
mie future modifiche. Non mostrare di nuovo questo messaggio.",
        "wikibase-entityselector-more": "altro",
        "wikibase-entityselector-notfound": "Nessun risultato trovato",
-       "wikibase-anonymouseditwarning": "Attenzione: Accesso non 
effettuato.\nNella cronologia dell'entità verrà registrato il tuo indirizzo 
IP.",
+       "wikibase-anonymouseditwarning": "Attenzione: non hai effettuato 
l'accesso.\nNella cronologia dell'entità verrà registrato il tuo indirizzo IP.",
        "wikibase-move-error": "Non è possibile spostare le pagine che sono in 
un namespace dei dati e non è possibile spostare le pagine in esso.",
        "wikibase-validator-sitelink-conflict": "Il collegamento $1 è già usato 
dall'elemento $2. Puoi rimuoverlo da $2 se non coincide, o unire gli elementi 
se sono sullo stesso argomento esatto.",
        "wikibase-validator-label-conflict": "La proprietà $3 ha già 
l'etichetta \"$1\" associata con il codice lingua $2.",
diff --git a/extensions/Wikibase/repo/i18n/ja.json 
b/extensions/Wikibase/repo/i18n/ja.json
index c553fff..9d25040 100644
--- a/extensions/Wikibase/repo/i18n/ja.json
+++ b/extensions/Wikibase/repo/i18n/ja.json
@@ -37,7 +37,7 @@
        "wikibase-entitytermsforlanguagelistview-description": "説明",
        "wikibase-entitytermsforlanguagelistview-label": "ラベル",
        "wikibase-entitytermsforlanguagelistview-language": "言語",
-       "wikibase-entitytermsforlanguagelistview-more": "その他の言語",
+       "wikibase-entitytermsforlanguagelistview-more": "入力済みの全言語",
        "wikibase-entitytermsforlanguagelistview-less": "言語を減らす",
        "wikibase-label-empty": "ラベルは設定されていません",
        "wikibase-label-edit-placeholder": "ラベルを入力",
diff --git a/extensions/Wikibase/repo/i18n/mr.json 
b/extensions/Wikibase/repo/i18n/mr.json
index 0806726..d680f84 100644
--- a/extensions/Wikibase/repo/i18n/mr.json
+++ b/extensions/Wikibase/repo/i18n/mr.json
@@ -79,6 +79,7 @@
        "wikibase-shortcopyrightwarning": "\"$1\" टिचकण्याने,आपण 
[[$2|वापरण्याच्या शर्ती]]मान्य करीत आहात व आपण न परतवण्याजोग्या मान्यतेने, $3 
अंतर्गत आपल्या योगदानाचे विमोचन करीत आहात.",
        "wikibase-copyrighttooltip-acknowledge": "भविष्यातील संपादनांसाठी या 
शर्तींचा मी स्वीकार करतो.हा संदेश कृपया पुन्हा दाखवु नका.",
        "wikibase-entityselector-more": "अधिक",
+       "wikibase-entityselector-notfound": "या सम सापडले नाही",
        "wikibase-anonymouseditwarning": "ईशारा:आपण सनोंद-प्रवेशित नाहीत.आपला 
अंकपत्ता याच्या संपादनाच्या इतिहासात नोंदला जाईल.",
        "wikibase-move-error": "माहिती(डाटा) नामविश्वात असलेली पाने आपण 
(दुसरीकडे) स्थानांतरीत करू शकत नाही व त्यात आपण (इतर) पाने स्थानांतरीत करू शकत 
नाही.",
        "wikibase-validator-no-such-media": "[https://commons.wikimedia.org/ 
विकिमिडिया कॉमन्सवर] \"$1\" ही संचिका अस्तित्वात नाही.",
diff --git a/extensions/Wikibase/repo/i18n/nn.json 
b/extensions/Wikibase/repo/i18n/nn.json
index e6d0201..88eca38 100644
--- a/extensions/Wikibase/repo/i18n/nn.json
+++ b/extensions/Wikibase/repo/i18n/nn.json
@@ -25,6 +25,8 @@
        "wikibase-entitytermsforlanguagelistview-description": "Skildring",
        "wikibase-entitytermsforlanguagelistview-label": "Merkelapp",
        "wikibase-entitytermsforlanguagelistview-language": "Språk",
+       "wikibase-entitytermsforlanguagelistview-more": "Alle språk med data",
+       "wikibase-entitytermsforlanguagelistview-less": "Færre språk",
        "wikibase-label-empty": "Ingen merkelapp er definert",
        "wikibase-label-edit-placeholder": "skriv inn merkelapp",
        "wikibase-label-edit-placeholder-language-aware": "skriv inn merkelapp 
på $1",
@@ -202,7 +204,7 @@
        "wikibase-listdatatypes-commonsmedia-head": "Commons-media",
        "wikibase-listdatatypes-globe-coordinate-head": "Geografisk koordinat",
        "wikibase-listdatatypes-quantity-head": "Mengd",
-       "wikibase-listdatatypes-monolingualtext-head": "Éinspråkleg tekst",
+       "wikibase-listdatatypes-monolingualtext-head": "Einspråkleg tekst",
        "wikibase-listdatatypes-multilingualtext-head": "Fleirspråkleg tekst",
        "wikibase-listdatatypes-string-head": "Streng",
        "wikibase-listdatatypes-time-head": "Tid",
diff --git a/extensions/Wikibase/repo/i18n/ru.json 
b/extensions/Wikibase/repo/i18n/ru.json
index 4123e32..612caee 100644
--- a/extensions/Wikibase/repo/i18n/ru.json
+++ b/extensions/Wikibase/repo/i18n/ru.json
@@ -24,7 +24,8 @@
                        "Frhdkazan",
                        "Ядерный Трамвай",
                        "Adam-Yourist",
-                       "Mailman"
+                       "Mailman",
+                       "Lockal"
                ]
        },
        "wikibase-desc": "Хранилище структурированных данных",
@@ -303,7 +304,7 @@
        "wikibase-self-conflict-patched": "Ваша правка была помещена в 
последнюю версию, при этом были перекрыты некоторые из ваших собственных 
промежуточных изменений.",
        "wikibase-conflict-patched": "Ваша правка было исправлена в последней 
версии.",
        "wikibase-restoreold": "восстановить",
-       "wikibase-entity-summary-restore": "Восстановлена версия $3 с помощью 
[[Special:Contributions/$4|{{GENDER:$4|$4}}]]",
+       "wikibase-entity-summary-restore": "Восстановлена версия $3 
{{GENDER:$4|участника|участницы}} [[Special:Contributions/$4|$4]]",
        "wikibase-no-direct-editing": "В пространстве имён «$1» отключено 
прямое редактирование",
        "wikibase-noentity": "Такой сущности не существует. Вы можете 
[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} поискать соответствующие 
записи в журналах], чтобы узнать, где он может быть.",
        "wikibase-noentity-createone": "Вы также можете [[$1|создать его]].",
diff --git a/extensions/Wikibase/repo/i18n/yue.json 
b/extensions/Wikibase/repo/i18n/yue.json
index c380493..61d857c 100644
--- a/extensions/Wikibase/repo/i18n/yue.json
+++ b/extensions/Wikibase/repo/i18n/yue.json
@@ -1,16 +1,17 @@
 {
        "@metadata": {
                "authors": [
-                       "Yueman"
+                       "Yueman",
+                       "Ktchankt"
                ]
        },
        "wikibase-edit": "改",
        "wikibase-add": "加",
+       "wikibase-entitytermsforlanguagelistview-less": "少啲語言",
        "wikibase-label-empty": "未定義標籤",
        "wikibase-description-empty": "未定義描述",
        "wikibase-statementsection-statements": "陳述",
        "wikibase-sitelinks-special": "第啲網站",
-       "wikibase-aliases-empty": "未定義其他名。",
        "wikibase-statementview-rank-normal": "正常等級",
        "wikibase-statementview-references-counter": 
"$1{{PLURAL:$2|0=|$3+$2$4}} {{PLURAL:$1|參考來源}}"
 }
diff --git a/extensions/Wikibase/repo/includes/Api/CreateClaim.php 
b/extensions/Wikibase/repo/includes/Api/CreateClaim.php
index 4e27490..6c5d237 100644
--- a/extensions/Wikibase/repo/includes/Api/CreateClaim.php
+++ b/extensions/Wikibase/repo/includes/Api/CreateClaim.php
@@ -82,15 +82,7 @@
                $this->validateParameters( $params );
 
                $entityId = $this->modificationHelper->getEntityIdFromString( 
$params['entity'] );
-               if ( isset( $params['baserevid'] ) ) {
-                       $entityRevision = 
$this->entitySavingHelper->loadEntityRevision(
-                               $entityId,
-                               (int)$params['baserevid']
-                       );
-               } else {
-                       $entityRevision = 
$this->entitySavingHelper->loadEntityRevision( $entityId );
-               }
-               $entity = $entityRevision->getEntity();
+               $entity = $this->entitySavingHelper->loadEntity( $entityId );
 
                $propertyId = $this->modificationHelper->getEntityIdFromString( 
$params['property'] );
                if ( !( $propertyId instanceof PropertyId ) ) {
diff --git a/extensions/Wikibase/repo/includes/Api/EntityLoadingHelper.php 
b/extensions/Wikibase/repo/includes/Api/EntityLoadingHelper.php
index bf239f1..35ba2e4 100644
--- a/extensions/Wikibase/repo/includes/Api/EntityLoadingHelper.php
+++ b/extensions/Wikibase/repo/includes/Api/EntityLoadingHelper.php
@@ -2,14 +2,17 @@
 
 namespace Wikibase\Repo\Api;
 
+use ApiBase;
 use LogicException;
 use UsageException;
+use Wikibase\DataModel\Entity\EntityDocument;
 use Wikibase\DataModel\Entity\EntityId;
 use Wikibase\EntityRevision;
 use Wikibase\Lib\Store\BadRevisionException;
 use Wikibase\Lib\Store\EntityRevisionLookup;
 use Wikibase\Lib\Store\StorageException;
 use Wikibase\Lib\Store\RevisionedUnresolvedRedirectException;
+use Wikimedia\Assert\Assert;
 
 /**
  * Helper class for api modules to load entities.
@@ -31,12 +34,33 @@
         */
        protected $errorReporter;
 
+       /**
+        * @var string See the LATEST_XXX constants defined in 
EntityRevisionLookup
+        */
+       protected $defaultRetrievalMode = 
EntityRevisionLookup::LATEST_FROM_SLAVE;
+
        public function __construct(
                EntityRevisionLookup $entityRevisionLookup,
                ApiErrorReporter $errorReporter
        ) {
                $this->entityRevisionLookup = $entityRevisionLookup;
                $this->errorReporter = $errorReporter;
+       }
+
+       /**
+        * @return string
+        */
+       public function getDefaultRetrievalMode() {
+               return $this->defaultRetrievalMode;
+       }
+
+       /**
+        * @param string $defaultRetrievalMode Use the LATEST_XXX constants 
defined
+        *        in EntityRevisionLookup
+        */
+       public function setDefaultRetrievalMode( $defaultRetrievalMode ) {
+               Assert::parameterType( 'string', $defaultRetrievalMode, 
'$defaultRetrievalMode' );
+               $this->defaultRetrievalMode = $defaultRetrievalMode;
        }
 
        /**
@@ -48,16 +72,22 @@
         * @since 0.5
         *
         * @param EntityId $entityId EntityId of the page to load the revision 
for
-        * @param int|string $revId revision to load. If not given, the current 
revision will be loaded.
+        * @param int|string|null $revId revision to load, or the retrieval 
mode,
+        *        see the LATEST_XXX constants defined in EntityRevisionLookup.
+        *        If not given, the current revision will be loaded, using the 
default retrieval mode.
         *
         * @throws UsageException
         * @throws LogicException
         * @return EntityRevision
         */
-       public function loadEntityRevision(
+       protected function loadEntityRevision(
                EntityId $entityId,
-               $revId = EntityRevisionLookup::LATEST_FROM_MASTER
+               $revId = null
        ) {
+               if ( $revId === null ) {
+                       $revId = $this->defaultRetrievalMode;
+               }
+
                try {
                        $revision = 
$this->entityRevisionLookup->getEntityRevision( $entityId, $revId );
 
@@ -79,4 +109,13 @@
                throw new LogicException( 'ApiErrorReporter::dieException did 
not throw a UsageException' );
        }
 
+       /**
+        * @param EntityId $entityId
+        * @return EntityDocument
+        */
+       public function loadEntity( EntityId $entityId ) {
+               $entityRevision = $this->loadEntityRevision( $entityId );
+               return $entityRevision->getEntity();
+       }
+
 }
diff --git a/extensions/Wikibase/repo/includes/Api/EntitySavingHelper.php 
b/extensions/Wikibase/repo/includes/Api/EntitySavingHelper.php
index 1d4eaea..a828a74 100644
--- a/extensions/Wikibase/repo/includes/Api/EntitySavingHelper.php
+++ b/extensions/Wikibase/repo/includes/Api/EntitySavingHelper.php
@@ -7,6 +7,7 @@
 use Status;
 use UsageException;
 use Wikibase\DataModel\Entity\EntityDocument;
+use Wikibase\DataModel\Entity\EntityId;
 use Wikibase\EditEntity as EditEntityHandler;
 use Wikibase\EditEntityFactory;
 use Wikibase\Lib\Store\EntityRevisionLookup;
@@ -49,6 +50,27 @@
                $this->apiBase = $apiBase;
                $this->summaryFormatter = $summaryFormatter;
                $this->editEntityFactory = $editEntityFactory;
+
+               $this->defaultRetrievalMode = 
EntityRevisionLookup::LATEST_FROM_MASTER;
+       }
+
+       /**
+        * Returns the given EntityDocument.
+        *
+        * @param EntityId $entityId
+        * @return EntityDocument
+        */
+       public function loadEntity( EntityId $entityId ) {
+               $params = $this->apiBase->extractRequestParams();
+
+               // If a base revision is given, use if for consistency!
+               $baseRev = isset( $params['baserevid'] )
+                       ? (int)$params['baserevid']
+                       : $this->defaultRetrievalMode;
+
+               $entityRevision = $this->loadEntityRevision( $entityId, 
$baseRev );
+
+               return $entityRevision->getEntity();
        }
 
        /**
diff --git a/extensions/Wikibase/repo/includes/Api/GetClaims.php 
b/extensions/Wikibase/repo/includes/Api/GetClaims.php
index 1b2fc61..04270a9 100644
--- a/extensions/Wikibase/repo/includes/Api/GetClaims.php
+++ b/extensions/Wikibase/repo/includes/Api/GetClaims.php
@@ -96,11 +96,7 @@
                }
 
                /** @var EntityId $entityId */
-               $entityRevision = 
$this->entityLoadingHelper->loadEntityRevision(
-                       $entityId,
-                       EntityRevisionLookup::LATEST_FROM_SLAVE
-               );
-               $entity = $entityRevision->getEntity();
+               $entity = $this->entityLoadingHelper->loadEntity( $entityId );
 
                $statements = $this->getStatements( $entity, $guid );
                $this->resultBuilder->addStatements( $statements, null, 
$params['props'] );
diff --git a/extensions/Wikibase/repo/includes/Api/RemoveClaims.php 
b/extensions/Wikibase/repo/includes/Api/RemoveClaims.php
index 305f447..5e3ccee 100644
--- a/extensions/Wikibase/repo/includes/Api/RemoveClaims.php
+++ b/extensions/Wikibase/repo/includes/Api/RemoveClaims.php
@@ -91,15 +91,7 @@
        public function execute() {
                $params = $this->extractRequestParams();
                $entityId = $this->getEntityId( $params );
-               if ( isset( $params['baserevid'] ) ) {
-                       $entityRevision = 
$this->entitySavingHelper->loadEntityRevision(
-                               $entityId,
-                               (int)$params['baserevid']
-                       );
-               } else {
-                       $entityRevision = 
$this->entitySavingHelper->loadEntityRevision( $entityId );
-               }
-               $entity = $entityRevision->getEntity();
+               $entity = $this->entitySavingHelper->loadEntity( $entityId );
 
                if ( $entity instanceof StatementListProvider ) {
                        $this->assertStatementListContainsGuids( 
$entity->getStatements(), $params['claim'] );
diff --git a/extensions/Wikibase/repo/includes/Api/RemoveQualifiers.php 
b/extensions/Wikibase/repo/includes/Api/RemoveQualifiers.php
index 9b89e1c..780c526 100644
--- a/extensions/Wikibase/repo/includes/Api/RemoveQualifiers.php
+++ b/extensions/Wikibase/repo/includes/Api/RemoveQualifiers.php
@@ -91,15 +91,8 @@
 
                $guid = $params['claim'];
                $entityId = $this->guidParser->parse( $guid )->getEntityId();
-               if ( isset( $params['baserevid'] ) ) {
-                       $entityRevision = 
$this->entitySavingHelper->loadEntityRevision(
-                               $entityId,
-                               (int)$params['baserevid']
-                       );
-               } else {
-                       $entityRevision = 
$this->entitySavingHelper->loadEntityRevision( $entityId );
-               }
-               $entity = $entityRevision->getEntity();
+               $entity = $this->entitySavingHelper->loadEntity( $entityId );
+
                $summary = $this->modificationHelper->createSummary( $params, 
$this );
 
                $claim = $this->modificationHelper->getStatementFromEntity( 
$guid, $entity );
diff --git a/extensions/Wikibase/repo/includes/Api/RemoveReferences.php 
b/extensions/Wikibase/repo/includes/Api/RemoveReferences.php
index c3685b2..b4597d1 100644
--- a/extensions/Wikibase/repo/includes/Api/RemoveReferences.php
+++ b/extensions/Wikibase/repo/includes/Api/RemoveReferences.php
@@ -91,15 +91,7 @@
 
                $guid = $params['statement'];
                $entityId = $this->guidParser->parse( $guid )->getEntityId();
-               if ( isset( $params['baserevid'] ) ) {
-                       $entityRevision = 
$this->entitySavingHelper->loadEntityRevision(
-                               $entityId,
-                               (int)$params['baserevid']
-                       );
-               } else {
-                       $entityRevision = 
$this->entitySavingHelper->loadEntityRevision( $entityId );
-               }
-               $entity = $entityRevision->getEntity();
+               $entity = $this->entitySavingHelper->loadEntity( $entityId );
                $summary = $this->modificationHelper->createSummary( $params, 
$this );
 
                $claim = $this->modificationHelper->getStatementFromEntity( 
$guid, $entity );
diff --git a/extensions/Wikibase/repo/includes/Api/SetClaim.php 
b/extensions/Wikibase/repo/includes/Api/SetClaim.php
index 85b38f8..7bbd68d 100644
--- a/extensions/Wikibase/repo/includes/Api/SetClaim.php
+++ b/extensions/Wikibase/repo/includes/Api/SetClaim.php
@@ -121,15 +121,7 @@
                }
 
                $entityId = $statementGuid->getEntityId();
-               if ( isset( $params['baserevid'] ) ) {
-                       $entityRevision = 
$this->entitySavingHelper->loadEntityRevision(
-                               $entityId,
-                               (int)$params['baserevid']
-                       );
-               } else {
-                       $entityRevision = 
$this->entitySavingHelper->loadEntityRevision( $entityId );
-               }
-               $entity = $entityRevision->getEntity();
+               $entity = $this->entitySavingHelper->loadEntity( $entityId );
 
                if ( !( $entity instanceof StatementListProvider ) ) {
                        $this->errorReporter->dieError( 'The given entity 
cannot contain statements', 'not-supported' );
diff --git a/extensions/Wikibase/repo/includes/Api/SetClaimValue.php 
b/extensions/Wikibase/repo/includes/Api/SetClaimValue.php
index 73d9859..3f92a43 100644
--- a/extensions/Wikibase/repo/includes/Api/SetClaimValue.php
+++ b/extensions/Wikibase/repo/includes/Api/SetClaimValue.php
@@ -89,15 +89,7 @@
 
                $guid = $params['claim'];
                $entityId = $this->guidParser->parse( $guid )->getEntityId();
-               if ( isset( $params['baserevid'] ) ) {
-                       $entityRevision = 
$this->entitySavingHelper->loadEntityRevision(
-                               $entityId,
-                               (int)$params['baserevid']
-                       );
-               } else {
-                       $entityRevision = 
$this->entitySavingHelper->loadEntityRevision( $entityId );
-               }
-               $entity = $entityRevision->getEntity();
+               $entity = $this->entitySavingHelper->loadEntity( $entityId );
 
                $claim = $this->modificationHelper->getStatementFromEntity( 
$guid, $entity );
 
diff --git a/extensions/Wikibase/repo/includes/Api/SetQualifier.php 
b/extensions/Wikibase/repo/includes/Api/SetQualifier.php
index c786e0f..36625b4 100644
--- a/extensions/Wikibase/repo/includes/Api/SetQualifier.php
+++ b/extensions/Wikibase/repo/includes/Api/SetQualifier.php
@@ -90,15 +90,7 @@
                $this->validateParameters( $params );
 
                $entityId = $this->guidParser->parse( $params['claim'] 
)->getEntityId();
-               if ( isset( $params['baserevid'] ) ) {
-                       $entityRevision = 
$this->entitySavingHelper->loadEntityRevision(
-                               $entityId,
-                               (int)$params['baserevid']
-                       );
-               } else {
-                       $entityRevision = 
$this->entitySavingHelper->loadEntityRevision( $entityId );
-               }
-               $entity = $entityRevision->getEntity();
+               $entity = $this->entitySavingHelper->loadEntity( $entityId );
 
                $summary = $this->modificationHelper->createSummary( $params, 
$this );
 
diff --git a/extensions/Wikibase/repo/includes/Api/SetReference.php 
b/extensions/Wikibase/repo/includes/Api/SetReference.php
index bdb9657..6ed8c49 100644
--- a/extensions/Wikibase/repo/includes/Api/SetReference.php
+++ b/extensions/Wikibase/repo/includes/Api/SetReference.php
@@ -98,15 +98,7 @@
                $this->validateParameters( $params );
 
                $entityId = $this->guidParser->parse( $params['statement'] 
)->getEntityId();
-               if ( isset( $params['baserevid'] ) ) {
-                       $entityRevision = 
$this->entitySavingHelper->loadEntityRevision(
-                               $entityId,
-                               (int)$params['baserevid']
-                       );
-               } else {
-                       $entityRevision = 
$this->entitySavingHelper->loadEntityRevision( $entityId );
-               }
-               $entity = $entityRevision->getEntity();
+               $entity = $this->entitySavingHelper->loadEntity( $entityId );
 
                $summary = $this->modificationHelper->createSummary( $params, 
$this );
 
diff --git a/extensions/Wikibase/repo/includes/Specials/SpecialItemByTitle.php 
b/extensions/Wikibase/repo/includes/Specials/SpecialItemByTitle.php
index 7afabcd..3a4178f 100644
--- a/extensions/Wikibase/repo/includes/Specials/SpecialItemByTitle.php
+++ b/extensions/Wikibase/repo/includes/Specials/SpecialItemByTitle.php
@@ -6,9 +6,10 @@
 use Html;
 use Site;
 use SiteStore;
+use Wikibase\Lib\LanguageNameLookup;
 use Wikibase\Lib\Store\EntityTitleLookup;
 use Wikibase\Lib\Store\SiteLinkLookup;
-use Wikibase\Repo\Content\ItemHandler;
+use Wikibase\Repo\SiteLinkTargetProvider;
 use Wikibase\Repo\WikibaseRepo;
 
 /**
@@ -29,6 +30,11 @@
        private $titleLookup;
 
        /**
+        * @var LanguageNameLookup
+        */
+       private $languageNameLookup;
+
+       /**
         * @var SiteStore
         */
        private $sites;
@@ -37,6 +43,11 @@
         * @var SiteLinkLookup
         */
        private $siteLinkLookup;
+
+       /**
+        * @var SiteLinkTargetProvider
+        */
+       private $siteLinkTargetProvider;
 
        /**
         * site link groups
@@ -60,10 +71,17 @@
                        $wikibaseRepo->getSettings()->getSetting( 
'siteLinkGroups' )
                );
 
+               $siteLinkTargetProvider = new SiteLinkTargetProvider(
+                       $wikibaseRepo->getSiteStore(),
+                       $wikibaseRepo->getSettings()->getSetting( 
'specialSiteLinkGroups' )
+               );
+
                $this->initServices(
                        $wikibaseRepo->getEntityTitleLookup(),
+                       new LanguageNameLookup(),
                        $wikibaseRepo->getSiteStore(),
-                       $wikibaseRepo->getStore()->newSiteLinkStore()
+                       $wikibaseRepo->getStore()->newSiteLinkStore(),
+                       $siteLinkTargetProvider
                );
        }
 
@@ -84,17 +102,23 @@
         * May be used to inject mock services for testing.
         *
         * @param EntityTitleLookup $titleLookup
+        * @param LanguageNameLookup $languageNameLookup
         * @param SiteStore $siteStore
         * @param SiteLinkLookup $siteLinkLookup
+        * @param SiteLinkTargetProvider $siteLinkTargetProvider
         */
        public function initServices(
                EntityTitleLookup $titleLookup,
+               LanguageNameLookup $languageNameLookup,
                SiteStore $siteStore,
-               SiteLinkLookup $siteLinkLookup
+               SiteLinkLookup $siteLinkLookup,
+               SiteLinkTargetProvider $siteLinkTargetProvider
        ) {
                $this->titleLookup = $titleLookup;
+               $this->languageNameLookup = $languageNameLookup;
                $this->sites = $siteStore;
                $this->siteLinkLookup = $siteLinkLookup;
+               $this->siteLinkTargetProvider = $siteLinkTargetProvider;
        }
 
        /**
@@ -163,6 +187,21 @@
        }
 
        /**
+        * Return options for the site input field.
+        *
+        * @return array
+        */
+       private function getSiteOptions() {
+               $options = array();
+               foreach ( $this->siteLinkTargetProvider->getSiteList( 
$this->groups ) as $site ) {
+                       $siteId = $site->getGlobalId();
+                       $languageName = $this->languageNameLookup->getName( 
$site->getLanguageCode() );
+                       $options["$languageName ($siteId)"] = $siteId;
+               }
+               return $options;
+       }
+
+       /**
         * Output a form to allow searching for a page
         *
         * @param string $siteId
@@ -178,13 +217,12 @@
 
                wfDebugLog( __CLASS__, __FUNCTION__ . ": Site $siteId exists: " 
. var_export( $siteExists, true ) );
 
-               $this->getOutput()->addModules( 'wikibase.special.itemByTitle' 
);
-
                $formDescriptor = array(
                        'site' => array(
                                'name' => 'site',
                                'default' => $siteId,
-                               'type' => 'text',
+                               'type' => 'combobox',
+                               'options' => $this->getSiteOptions(),
                                'id' => 'wb-itembytitle-sitename',
                                'size' => 12,
                                'label-message' => 
'wikibase-itembytitle-lookup-site'
diff --git a/extensions/Wikibase/repo/resources/Resources.php 
b/extensions/Wikibase/repo/resources/Resources.php
index 05ca96d..97a10d4 100644
--- a/extensions/Wikibase/repo/resources/Resources.php
+++ b/extensions/Wikibase/repo/resources/Resources.php
@@ -148,17 +148,6 @@
                        ),
                ),
 
-               'wikibase.special.itemByTitle' => $moduleTemplate + array(
-                       'scripts' => array(
-                               
'wikibase.special/wikibase.special.itemByTitle.js'
-                       ),
-                       'dependencies' => array(
-                               'wikibase.sites',
-                               'jquery.ui.suggester',
-                               'oojs-ui'
-                       )
-               ),
-
        );
 
        return array_merge(
diff --git 
a/extensions/Wikibase/repo/resources/wikibase.special/wikibase.special.itemByTitle.js
 
b/extensions/Wikibase/repo/resources/wikibase.special/wikibase.special.itemByTitle.js
deleted file mode 100644
index 2d10b95..0000000
--- 
a/extensions/Wikibase/repo/resources/wikibase.special/wikibase.special.itemByTitle.js
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * JavaScript for 'wikibase' extension special page 'ItemByTitle'
- *
- * @since 0.1
- *
- * @license GPL-2.0+
- * @author Jens Ohlig
- */
-( function( $, mw, OO, wb ) {
-       'use strict';
-
-       $( document ).ready( function() {
-               if ( ( mw.config.get( 'wgCanonicalSpecialPageName' ) !== 
'ItemByTitle' ) ) {
-                       return; // not the right special page
-               }
-
-               // this will build a drop-down for the language selection:
-               var sites = wb.sites.getSites(),
-                       siteList = [];
-               for ( var siteId in sites ) {
-                       if ( sites.hasOwnProperty( siteId ) ) {
-                               siteList.push( sites[ siteId ].getName() + ' (' 
+ siteId + ')' );
-                       }
-               }
-
-               var $input = OO.ui.infuse( $( '#wb-itembytitle-sitename' ) 
).$input;
-
-               $input
-               .attr( 'autocomplete', 'off' )
-               .suggester( { source: siteList } );
-               // Hackety hack hack...
-               // On submit, replace human readable value like "English (en)" 
with actual sitename ("enwiki")
-               $( '#wb-itembytitle-form1' ).submit( function() {
-                       var langID = String( $input.val().replace( 
/.*\(|\).*/gi, '' ) );
-                       if ( wb.sites.getSite( langID ).getId() !== undefined ) 
{
-                               $input.val( wb.sites.getSite( langID ).getId() 
);
-                       }
-               } );
-       } );
-
-} )( jQuery, mediaWiki, OO, wikibase );
diff --git a/extensions/Wikibase/repo/resources/wikibase.ui.entityViewInit.js 
b/extensions/Wikibase/repo/resources/wikibase.ui.entityViewInit.js
index 872b4df..529aff7 100644
--- a/extensions/Wikibase/repo/resources/wikibase.ui.entityViewInit.js
+++ b/extensions/Wikibase/repo/resources/wikibase.ui.entityViewInit.js
@@ -8,6 +8,15 @@
        'use strict';
 
        /**
+        * @return {boolean}
+        */
+       function isEditable() {
+               return mw.config.get( 'wbIsEditView' )
+                       && mw.config.get( 'wbUserCanEdit' )
+                       && !mw.config.get( 'wbUserIsBlocked' );
+       }
+
+       /**
         * @param {jQuery} $entityview
         */
        function initToolbarController( $entityview ) {
@@ -106,10 +115,8 @@
                        htmlDataValueEntityIdFormatter = 
formatterFactory.getFormatter( null, null, 'text/html' ),
                        plaintextDataValueEntityIdFormatter = 
formatterFactory.getFormatter( null, null, 'text/plain' ),
                        entityIdParser = new ( parserStore.getParser( 
wb.datamodel.EntityId.TYPE ) )( { lang: userLanguages[0] } ),
-                       toolbarFactory = new wb.view.ToolbarFactory(),
-                       viewFactory = new wb.view.ControllerViewFactory(
-                               toolbarFactory,
-                               entityChangersFactory,
+                       viewFactoryClass = wb.view.ViewFactory,
+                       viewFactoryArguments = [
                                contentLanguages,
                                dataTypeStore,
                                new 
wb.entityIdFormatter.CachingEntityIdHtmlFormatter(
@@ -129,8 +136,18 @@
                                parserStore,
                                userLanguages,
                                repoApiUrl
-                       );
+                       ];
 
+               if ( isEditable() ) {
+                       viewFactoryClass = wb.view.ControllerViewFactory;
+                       viewFactoryArguments.unshift(
+                               new wb.view.ToolbarFactory(),
+                               entityChangersFactory
+                       );
+               }
+
+               viewFactoryArguments.unshift( null );
+               var viewFactory = new ( Function.prototype.bind.apply( 
viewFactoryClass, viewFactoryArguments ) );
                var entityView = viewFactory.getEntityView( entity, $entityview 
);
 
                return entityView.widgetName;
@@ -355,8 +372,7 @@
 
                var $entityview = $( '.wikibase-entityview' );
                var entityInitializer = new wb.EntityInitializer( 'wbEntity' );
-               var canEdit = !mw.config.get( 'wbUserIsBlocked' ) && 
mw.config.get( 'wbUserCanEdit' )
-                       && mw.config.get( 'wbIsEditView' );
+               var canEdit = isEditable();
 
                if ( canEdit ) {
                        initToolbarController( $entityview );
diff --git 
a/extensions/Wikibase/repo/tests/phpunit/includes/Api/EntityLoadingHelperTest.php
 
b/extensions/Wikibase/repo/tests/phpunit/includes/Api/EntityLoadingHelperTest.php
index aa19333..b0cfd7b 100644
--- 
a/extensions/Wikibase/repo/tests/phpunit/includes/Api/EntityLoadingHelperTest.php
+++ 
b/extensions/Wikibase/repo/tests/phpunit/includes/Api/EntityLoadingHelperTest.php
@@ -3,8 +3,8 @@
 namespace Wikibase\Test\Repo\Api;
 
 use Exception;
-use Revision;
 use UsageException;
+use Wikibase\DataModel\Entity\EntityDocument;
 use Wikibase\DataModel\Entity\ItemId;
 use Wikibase\EntityRevision;
 use Wikibase\Lib\Store\BadRevisionException;
@@ -43,7 +43,7 @@
                        $mock->expects( $this->once() )
                                ->method( 'getEntityRevision' )
                                ->will( $this->throwException( 
$entityRevisionReturn ) );
-               } else {
+               } elseif ( $entityRevisionReturn instanceof EntityRevision ) {
                        $mock->expects( $this->once() )
                                ->method( 'getEntityRevision' )
                                ->will( $this->returnValue( 
$entityRevisionReturn ) );
@@ -76,12 +76,20 @@
        }
 
        /**
-        * @return Revision
+        * @return EntityRevision
         */
        protected function getMockRevision() {
-               return $this->getMockBuilder( Revision::class )
+               $entity = $this->getMock( EntityDocument::class );
+
+               $revision = $this->getMockBuilder( EntityRevision::class )
                        ->disableOriginalConstructor()
                        ->getMock();
+
+               $revision->expects( $this->any() )
+                       ->method( 'getEntity' )
+                       ->will( $this->returnValue( $entity ) );
+
+               return $revision;
        }
 
        /**
@@ -100,23 +108,25 @@
                );
        }
 
-       public function testRevision_returnsRevision() {
+       public function testLoadEntity() {
                $revision = $this->getMockRevision();
+               $entity = $revision->getEntity();
+
                $helper = $this->newEntityLoadingHelper( $revision );
 
-               $return = $helper->loadEntityRevision( new ItemId( 'Q1' ) );
+               $return = $helper->loadEntity( new ItemId( 'Q1' ) );
 
-               $this->assertSame( $revision, $return );
+               $this->assertSame( $entity, $return );
        }
 
-       public function testNullRevision_callsErrorReporter() {
+       public function testLoadEntity_NullRevision() {
                $helper = $this->newEntityLoadingHelper( null, null, 
'cant-load-entity-content' );
 
                $this->setExpectedException( UsageException::class );
-               $helper->loadEntityRevision( new ItemId( 'Q1' ) );
+               $helper->loadEntity( new ItemId( 'Q1' ) );
        }
 
-       public function testUnresolvedRedirectException_callsErrorReporter() {
+       public function testLoadEntity_UnresolvedRedirectException() {
                $helper = $this->newEntityLoadingHelper(
                        new RevisionedUnresolvedRedirectException(
                                new ItemId( 'Q1' ),
@@ -126,21 +136,21 @@
                );
 
                $this->setExpectedException( UsageException::class );
-               $helper->loadEntityRevision( new ItemId( 'Q1' ) );
+               $helper->loadEntity( new ItemId( 'Q1' ) );
        }
 
-       public function testBadRevisionException_callsErrorReporter() {
+       public function testLoadEntity_BadRevisionException() {
                $helper = $this->newEntityLoadingHelper( new 
BadRevisionException(), 'nosuchrevid' );
 
                $this->setExpectedException( UsageException::class );
-               $helper->loadEntityRevision( new ItemId( 'Q1' ) );
+               $helper->loadEntity( new ItemId( 'Q1' ) );
        }
 
-       public function testStorageException_callsErrorReporter() {
+       public function testLoadEntity_StorageException() {
                $helper = $this->newEntityLoadingHelper( new 
StorageException(), 'cant-load-entity-content' );
 
                $this->setExpectedException( UsageException::class );
-               $helper->loadEntityRevision( new ItemId( 'Q1' ) );
+               $helper->loadEntity( new ItemId( 'Q1' ) );
        }
 
 }
diff --git 
a/extensions/Wikibase/repo/tests/phpunit/includes/Api/EntitySavingHelperTest.php
 
b/extensions/Wikibase/repo/tests/phpunit/includes/Api/EntitySavingHelperTest.php
index 7115a9a..a1de57f 100644
--- 
a/extensions/Wikibase/repo/tests/phpunit/includes/Api/EntitySavingHelperTest.php
+++ 
b/extensions/Wikibase/repo/tests/phpunit/includes/Api/EntitySavingHelperTest.php
@@ -16,7 +16,6 @@
 use Wikibase\EditEntity;
 use Wikibase\EditEntityFactory;
 use Wikibase\EntityRevision;
-use Wikibase\Repo\Api\ApiErrorReporter;
 use Wikibase\Repo\Api\EntityLoadingHelper;
 use Wikibase\Repo\Api\EntitySavingHelper;
 use Wikibase\SummaryFormatter;
@@ -92,6 +91,42 @@
                return $context;
        }
 
+       public function testLoadEntity_baserevid() {
+               $itemId = new ItemId( 'Q1' );
+
+               $revision = $this->getMockRevision();
+               $entity = $revision->getEntity();
+
+               $mockApiBase = $this->getMockApiBase();
+               $mockApiBase->expects( $this->any() )
+                       ->method( 'isWriteMode' )
+                       ->will( $this->returnValue( true ) );
+               $mockApiBase->expects( $this->any() )
+                       ->method( 'getContext' )
+                       ->will( $this->returnValue( $this->newContext() ) );
+               $mockApiBase->expects( $this->any() )
+                       ->method( 'extractRequestParams' )
+                       ->will( $this->returnValue( array( 'baserevid' => 17 ) 
) );
+
+               $revisionLookup = $this->getMockEntityRevisionLookup( true );
+               $revisionLookup->expects( $this->once() )
+                       ->method( 'getEntityRevision' )
+                       ->with( $itemId, 17 )
+                       ->will( $this->returnValue( $revision ) );
+
+               $helper = new EntitySavingHelper(
+                       $mockApiBase,
+                       $revisionLookup,
+                       $this->getMockErrorReporter(),
+                       $this->getMockSummaryFormatter(),
+                       $this->getMockEditEntityFactory()
+               );
+
+               $return = $helper->loadEntity( $itemId );
+
+               $this->assertSame( $entity, $return );
+       }
+
        public function testAttemptSave() {
                $mockApiBase = $this->getMockApiBase();
                $mockApiBase->expects( $this->once() )
diff --git 
a/extensions/Wikibase/repo/tests/phpunit/includes/Specials/SpecialItemByTitleTest.php
 
b/extensions/Wikibase/repo/tests/phpunit/includes/Specials/SpecialItemByTitleTest.php
index 3cdc982..b60c39f 100644
--- 
a/extensions/Wikibase/repo/tests/phpunit/includes/Specials/SpecialItemByTitleTest.php
+++ 
b/extensions/Wikibase/repo/tests/phpunit/includes/Specials/SpecialItemByTitleTest.php
@@ -2,7 +2,6 @@
 
 namespace Wikibase\Repo\Tests\Specials;
 
-use FauxResponse;
 use Site;
 use SiteList;
 use SiteStore;
@@ -10,8 +9,10 @@
 use Title;
 use Wikibase\DataModel\Entity\EntityId;
 use Wikibase\DataModel\Entity\ItemId;
+use Wikibase\Lib\LanguageNameLookup;
 use Wikibase\Lib\Store\EntityTitleLookup;
 use Wikibase\Lib\Store\SiteLinkLookup;
+use Wikibase\Repo\SiteLinkTargetProvider;
 use Wikibase\Repo\Specials\SpecialItemByTitle;
 
 /**
@@ -46,6 +47,18 @@
        }
 
        /**
+        * @return LanguageNameLookup
+        */
+       private function getMockLanguageNameLookup() {
+               $mock = $this->getMock( LanguageNameLookup::class );
+               $mock->expects( $this->any() )
+                       ->method( 'getName' )
+                       ->will( $this->returnValue( '<LANG>' ) );
+
+               return $mock;
+       }
+
+       /**
         * @return SiteLinkLookup
         */
        private function getMockSiteLinkLookup() {
@@ -74,10 +87,9 @@
                        return $site;
                };
 
-               $mockSiteList = $this->getMock( SiteList::class );
-               $mockSiteList->expects( $this->any() )
-                       ->method( 'getSite' )
-                       ->will( $this->returnCallback( $getSite ) );
+               $siteList = new SiteList();
+               $siteList[] = $getSite( 'dewiki' );
+               $siteList[] = $getSite( 'enwiki' );
 
                $mock = $this->getMock( SiteStore::class );
                $mock->expects( $this->any() )
@@ -86,7 +98,7 @@
 
                $mock->expects( $this->any() )
                        ->method( 'getSites' )
-                       ->will( $this->returnValue( $mockSiteList ) );
+                       ->will( $this->returnValue( $siteList ) );
 
                return $mock;
        }
@@ -101,10 +113,16 @@
                        array( 'wikipedia' )
                );
 
+               $siteStore = $this->getMockSiteStore();
+
+               $siteLinkTargetProvider = new SiteLinkTargetProvider( 
$siteStore, array() );
+
                $page->initServices(
                        $this->getMockTitleLookup(),
-                       $this->getMockSiteStore(),
-                       $this->getMockSiteLinkLookup()
+                       $this->getMockLanguageNameLookup(),
+                       $siteStore,
+                       $this->getMockSiteLinkLookup(),
+                       $siteLinkTargetProvider
                );
 
                return $page;
diff --git 
a/extensions/Wikibase/view/resources/jquery/wikibase/toolbar/jquery.wikibase.edittoolbar.js
 
b/extensions/Wikibase/view/resources/jquery/wikibase/toolbar/jquery.wikibase.edittoolbar.js
index fbf0194..cdfef14 100644
--- 
a/extensions/Wikibase/view/resources/jquery/wikibase/toolbar/jquery.wikibase.edittoolbar.js
+++ 
b/extensions/Wikibase/view/resources/jquery/wikibase/toolbar/jquery.wikibase.edittoolbar.js
@@ -248,9 +248,8 @@
                                self.toNonEditMode();
                                self.enable();
                                if ( !dropValue ) {
-                                       self.toggleActionMessage( function() {
-                                               self._trigger( 
'afterstopediting' );
-                                       } );
+                                       self.toggleActionMessage();
+                                       self._trigger( 'afterstopediting' );
                                }
                        }
                } )
@@ -268,12 +267,11 @@
                                }
 
                                self.enable();
-                               self.toggleActionMessage( function() {
-                                       // FIXME Move responsibility of 
displaying error out of here completely.
-                                       if ( $( event.target ).data( 
'sitelinkgroupview' ) === undefined ) {
-                                               self.displayError( error, 
$anchor );
-                                       }
-                               } );
+                               self.toggleActionMessage();
+                               // FIXME Move responsibility of displaying 
error out of here completely.
+                               if ( $( event.target ).data( 
'sitelinkgroupview' ) === undefined ) {
+                                       self.displayError( error, $anchor );
+                               }
                        }
                } );
        },
@@ -439,32 +437,24 @@
        /**
         * Toggles a message replacing the toolbar contents.
         *
-        * @param {string|Function} [messageOrCallback] Message to be displayed 
instead of the
-        *        toolbar contents or callback that is supposed to be triggered 
after removing the
-        *        replacement message again.
+        * @param {string} [message] Message to be displayed instead of the
+        *        toolbar contents. If omitted, the toolbar contents will be 
shown.
         */
-       toggleActionMessage: function( messageOrCallback ) {
+       toggleActionMessage: function( message ) {
                var $container = this.getContainer(),
                        actionMessageClass = this.widgetBaseClass + 
'-actionmsg',
                        $actionMsg = $container.find( '.' + actionMessageClass 
);
 
-               messageOrCallback = messageOrCallback || function() {};
-
-               if ( $.isFunction( messageOrCallback ) ) {
-                       if ( !$actionMsg.length ) {
-                               messageOrCallback();
-                       } else {
-                               $actionMsg.remove();
-                               $container.contents().show();
-                               messageOrCallback();
-                       }
-               } else {
+               if ( message !== undefined ) {
                        $container.contents().hide();
 
                        $actionMsg = $( '<span/>' )
                                .addClass( actionMessageClass + ' wb-actionmsg' 
)
-                               .text( messageOrCallback )
+                               .text( message )
                                .appendTo( $container );
+               } else if ( $actionMsg.length ) {
+                       $actionMsg.remove();
+                       $container.contents().show();
                }
        },
 
diff --git 
a/extensions/Wikibase/view/resources/wikibase/view/ToolbarViewController.js 
b/extensions/Wikibase/view/resources/wikibase/view/ToolbarViewController.js
index 9501557..2015975 100644
--- a/extensions/Wikibase/view/resources/wikibase/view/ToolbarViewController.js
+++ b/extensions/Wikibase/view/resources/wikibase/view/ToolbarViewController.js
@@ -237,10 +237,8 @@
                }
 
                this._toolbar.enable();
-               var self = this;
-               this._toolbar.toggleActionMessage( function() {
-                       self._toolbar.displayError( error, $anchor );
-               } );
+               this._toolbar.toggleActionMessage();
+               this._toolbar.displayError( error, $anchor );
        }
 };
 
diff --git a/vendor/composer/autoload_classmap.php 
b/vendor/composer/autoload_classmap.php
index 750d4b2..d347745 100644
--- a/vendor/composer/autoload_classmap.php
+++ b/vendor/composer/autoload_classmap.php
@@ -6,6 +6,7 @@
 $baseDir = dirname($vendorDir);
 
 return array(
+    'ArticlePlaceholder\\BaseTemplateToolboxHookHandler' => $baseDir . 
'/extensions/ArticlePlaceholder/includes/BaseTemplateToolboxHookHandler.php',
     'ArticlePlaceholder\\Hooks' => $baseDir . 
'/extensions/ArticlePlaceholder/includes/Hooks.php',
     'ArticlePlaceholder\\ItemNotabilityFilter' => $baseDir . 
'/extensions/ArticlePlaceholder/includes/ItemNotabilityFilter.php',
     'ArticlePlaceholder\\Lua\\Scribunto_LuaArticlePlaceholderLibrary' => 
$baseDir . 
'/extensions/ArticlePlaceholder/includes/Lua/Scribunto_LuaArticlePlaceholderLibrary.php',
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index a1aa372..255f850 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -110,19 +110,19 @@
         "source": {
             "type": "git",
             "url": 
"https://github.com/wikimedia/mediawiki-extensions-ArticlePlaceholder.git";,
-            "reference": "abe5908651e37f1a341d752552a72baf98454456"
+            "reference": "825dcf735dd4be4f0794f5c1ec23a561256a4167"
         },
         "dist": {
             "type": "zip",
-            "url": 
"https://api.github.com/repos/wikimedia/mediawiki-extensions-ArticlePlaceholder/zipball/abe5908651e37f1a341d752552a72baf98454456";,
-            "reference": "abe5908651e37f1a341d752552a72baf98454456",
+            "url": 
"https://api.github.com/repos/wikimedia/mediawiki-extensions-ArticlePlaceholder/zipball/825dcf735dd4be4f0794f5c1ec23a561256a4167";,
+            "reference": "825dcf735dd4be4f0794f5c1ec23a561256a4167",
             "shasum": ""
         },
         "require-dev": {
             "jakub-onderka/php-parallel-lint": "0.9.2",
             "mediawiki/mediawiki-codesniffer": "0.7.2"
         },
-        "time": "2016-08-10 20:34:15",
+        "time": "2016-08-11 21:49:41",
         "type": "mediawiki-extension",
         "installation-source": "dist",
         "autoload": {
@@ -1348,12 +1348,12 @@
         "source": {
             "type": "git",
             "url": 
"https://github.com/wikimedia/mediawiki-extensions-Wikibase.git";,
-            "reference": "56096e27d96a6e71f97e92f9b092deabb38307a3"
+            "reference": "10af0cf1d56dab400f3a305e282ad1247d4e6f8a"
         },
         "dist": {
             "type": "zip",
-            "url": 
"https://api.github.com/repos/wikimedia/mediawiki-extensions-Wikibase/zipball/56096e27d96a6e71f97e92f9b092deabb38307a3";,
-            "reference": "56096e27d96a6e71f97e92f9b092deabb38307a3",
+            "url": 
"https://api.github.com/repos/wikimedia/mediawiki-extensions-Wikibase/zipball/10af0cf1d56dab400f3a305e282ad1247d4e6f8a";,
+            "reference": "10af0cf1d56dab400f3a305e282ad1247d4e6f8a",
             "shasum": ""
         },
         "require": {
@@ -1386,7 +1386,7 @@
             "jakub-onderka/php-parallel-lint": "0.9.2",
             "mediawiki/mediawiki-codesniffer": "0.4.0|0.5.0"
         },
-        "time": "2016-08-11 00:41:04",
+        "time": "2016-08-13 20:33:48",
         "type": "mediawiki-extension",
         "installation-source": "dist",
         "autoload": {

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I13a3b58af19ecd008b4c6fd67ce4327d3da619f1
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