jenkins-bot has submitted this change and it was merged.

Change subject: New Wikidata Build - 2016-01-29T10:00:01+0000
......................................................................


New Wikidata Build - 2016-01-29T10:00:01+0000

Change-Id: I0310bdd96308e0b20a5e373de8b16e8512a5d9a5
---
M composer.lock
M extensions/Wikibase/client/i18n/gsw.json
A extensions/Wikibase/client/i18n/jam.json
M extensions/Wikibase/client/i18n/lzh.json
M extensions/Wikibase/lib/i18n/de.json
M extensions/Wikibase/lib/i18n/en.json
M extensions/Wikibase/lib/i18n/qqq.json
M extensions/Wikibase/lib/includes/formatters/ErrorHandlingSnakFormatter.php
M extensions/Wikibase/lib/includes/formatters/PropertyValueSnakFormatter.php
M 
extensions/Wikibase/lib/tests/phpunit/formatters/ErrorHandlingSnakFormatterTest.php
M 
extensions/Wikibase/lib/tests/phpunit/formatters/PropertyValueSnakFormatterTest.php
M extensions/Wikibase/repo/i18n/de.json
M extensions/Wikibase/repo/i18n/eml.json
M extensions/Wikibase/repo/i18n/en.json
M extensions/Wikibase/repo/i18n/frr.json
A extensions/Wikibase/repo/i18n/jam.json
M extensions/Wikibase/repo/i18n/pl.json
M extensions/Wikibase/repo/i18n/qqq.json
M extensions/Wikibase/repo/includes/Validators/SnakValidator.php
M extensions/Wikibase/repo/includes/api/CreateClaim.php
M extensions/Wikibase/repo/includes/api/ModifyClaim.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/SpecialNewProperty.php
M 
extensions/Wikibase/repo/tests/phpunit/includes/Validators/SnakValidatorTest.php
M 
extensions/Wikibase/view/resources/jquery/wikibase/jquery.wikibase.entitytermsforlanguagelistview.js
M 
extensions/Wikibase/view/resources/jquery/wikibase/jquery.wikibase.entitytermsview.js
M extensions/Wikibase/view/resources/jquery/wikibase/jquery.wikibase.listview.js
M 
extensions/Wikibase/view/resources/jquery/wikibase/jquery.wikibase.sitelinklistview.js
M 
extensions/Wikibase/view/resources/jquery/wikibase/jquery.wikibase.snaklistview.js
M 
extensions/Wikibase/view/resources/jquery/wikibase/jquery.wikibase.statementlistview.js
M extensions/Wikibase/view/resources/jquery/wikibase/resources.php
M 
extensions/Wikibase/view/resources/jquery/wikibase/themes/default/jquery.wikibase.entitytermsforlanguagelistview.css
M 
extensions/Wikibase/view/resources/jquery/wikibase/toolbar/controller/definitions/removetoolbar/statementview-snakview.js
M extensions/Wikibase/view/resources/wikibase/view/ViewFactory.js
M extensions/Wikibase/view/src/PropertyView.php
M 
extensions/Wikibase/view/tests/qunit/jquery/wikibase/jquery.wikibase.entitytermsforlanguagelistview.tests.js
M 
extensions/Wikibase/view/tests/qunit/jquery/wikibase/jquery.wikibase.entitytermsview.tests.js
M 
extensions/Wikibase/view/tests/qunit/jquery/wikibase/toolbar/jquery.wikibase.movetoolbar.tests.js
M extensions/Wikibase/view/tests/qunit/wikibase/view/ViewFactory.tests.js
M vendor/composer/installed.json
46 files changed, 558 insertions(+), 215 deletions(-)

Approvals:
  JanZerebecki: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/composer.lock b/composer.lock
index dfca68e..98d55f3 100644
--- a/composer.lock
+++ b/composer.lock
@@ -1449,12 +1449,12 @@
             "source": {
                 "type": "git",
                 "url": 
"https://github.com/wikimedia/mediawiki-extensions-Wikibase.git";,
-                "reference": "42433e84d5a3ef35b6c7e3e2e7c0b25c30ec72cb"
+                "reference": "578154d93f7e76b51aabebf58a65a98f70aaae1b"
             },
             "dist": {
                 "type": "zip",
-                "url": 
"https://api.github.com/repos/wikimedia/mediawiki-extensions-Wikibase/zipball/42433e84d5a3ef35b6c7e3e2e7c0b25c30ec72cb";,
-                "reference": "42433e84d5a3ef35b6c7e3e2e7c0b25c30ec72cb",
+                "url": 
"https://api.github.com/repos/wikimedia/mediawiki-extensions-Wikibase/zipball/578154d93f7e76b51aabebf58a65a98f70aaae1b";,
+                "reference": "578154d93f7e76b51aabebf58a65a98f70aaae1b",
                 "shasum": ""
             },
             "require": {
@@ -1525,7 +1525,7 @@
                 "wikibaserepo",
                 "wikidata"
             ],
-            "time": "2016-01-27 20:46:43"
+            "time": "2016-01-28 20:11:28"
         },
         {
             "name": "wikibase/wikimedia-badges",
diff --git a/extensions/Wikibase/client/i18n/gsw.json 
b/extensions/Wikibase/client/i18n/gsw.json
index e06fc66..7dcb2c0 100644
--- a/extensions/Wikibase/client/i18n/gsw.json
+++ b/extensions/Wikibase/client/i18n/gsw.json
@@ -12,11 +12,19 @@
        "wikibase-dataitem": "{{WBREPONAME}}-Datenobjäkt",
        "wikibase-editlinks": "Links bearbeite",
        "wikibase-editlinkstitle": "Sprachibergryfigi Link bearbeite",
+       "wikibase-linkitem-addlinks": "Link zuefiege",
+       "wikibase-linkitem-close": "Dialog zuemache un d Syte nei lade",
+       "wikibase-linkitem-linkpage": "Mit ere Syte verlinke",
+       "wikibase-linkitem-selectlink": "Bitte wehl e Websyte un e Syte uus, wu 
mit därte Syte witt verchnipfe.",
+       "wikibase-linkitem-confirmitem-text": "Di uusgwehlt Syte isch scho mit 
eme [$1 Objäkt in unsrem zäntrale Daterepositorium] verchnipft. Bitte due 
bstetige, ass d Syte, wu unte {{PLURAL:$2|stoht, die isch|stehn, die sin}}, wu 
Du mit däre Syte witt verlinke.",
+       "wikibase-linkitem-confirmitem-button": "Bstetige",
+       "wikibase-linkitem-success-link": "D Syte sin erfolgrych verlinkt wore. 
Du findsch s Objäkt, wu s d Link din het, in unsrem [$1 zäntrale 
Daterepositorium].",
        "wikibase-rc-hide-wikidata": "{{WBREPONAME}} $1",
        "wikibase-rc-hide-wikidata-hide": "uusblände",
        "wikibase-rc-hide-wikidata-show": "aazeige",
        "wikibase-rc-wikibase-edit-letter": "D",
        "wikibase-rc-wikibase-edit-title": "{{WBREPONAME}}-Bearbeitig",
+       "wikibase-replicationnote": "Bitte dänk draa, ass es e baar Minute cha 
goh, bi s d Änderige uf allene Wiki sichtbar sin.",
        "wikibase-otherprojects": "Andri Projäkt",
        "wikibase-otherprojects-beta-message": "Syteleiste für anderi Projekt",
        "wikibase-otherprojects-beta-description": "En Abschnitt 
«{{int:wikibase-otherprojects}}» chunt zur Syteleiste derzue. Är het Links zu 
anderne Wikimedia-Projekt, wo uf {{WBREPONAME}}-Date basiere."
diff --git a/extensions/Wikibase/client/i18n/jam.json 
b/extensions/Wikibase/client/i18n/jam.json
new file mode 100644
index 0000000..885ba8e
--- /dev/null
+++ b/extensions/Wikibase/client/i18n/jam.json
@@ -0,0 +1,9 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Katxis"
+               ]
+       },
+       "wikibase-editlinks": "Edit lingk",
+       "wikibase-editlinkstitle": "Edit intalanguij lingk"
+}
diff --git a/extensions/Wikibase/client/i18n/lzh.json 
b/extensions/Wikibase/client/i18n/lzh.json
index ba0156e..14a12cc 100644
--- a/extensions/Wikibase/client/i18n/lzh.json
+++ b/extensions/Wikibase/client/i18n/lzh.json
@@ -2,9 +2,11 @@
        "@metadata": {
                "authors": [
                        "StephDC",
-                       "Davidzdh"
+                       "Davidzdh",
+                       "飞舞回堂前"
                ]
        },
+       "wikibase-editlinks": "纂鏈",
        "wikibase-editlinkstitle": "修跨語鏈",
        "wikibase-rc-hide-wikidata-hide": "隱",
        "wikibase-rc-hide-wikidata-show": "示",
diff --git a/extensions/Wikibase/lib/i18n/de.json 
b/extensions/Wikibase/lib/i18n/de.json
index d466563..f34ae2f 100644
--- a/extensions/Wikibase/lib/i18n/de.json
+++ b/extensions/Wikibase/lib/i18n/de.json
@@ -71,6 +71,7 @@
        "wikibase-validator-no-such-property": "Eigenschaft $1 nicht gefunden",
        "wikibase-validator-bad-value": "Datenwert beschädigt: $1",
        "wikibase-validator-bad-value-type": "Ungültiger Wertetyp $1, erwartet 
$2",
+       "wikibase-validator-bad-data-type": "Ungültiger Datentyp: $1",
        "wikibase-validator-bad-url": "Fehlerhafte URL: $1",
        "wikibase-validator-bad-url-scheme": "Nicht unterstütztes URL-Schema: 
$1",
        "wikibase-validator-unknown-unit": "Unbekannte Einheit: $1",
@@ -95,6 +96,7 @@
        "wikibase-time-precision-BCE-10annum": "$1 Jahrzehnte v. u. Z.",
        "wikibase-snakformatter-valuetype-mismatch": "Der Wertetyp „$1“ stimmt 
nicht mit dem Eigenschaftstyp „$2“ überein.",
        "wikibase-snakformatter-property-not-found": "Die Eigenschaft $1 wurde 
nicht gefunden. Der zu verwendende Datentyp konnte nicht bestimmt werden.",
+       "wikibase-snakformatter-formatting-exception": "Formatierungsfehler: 
$1.",
        "wikibase-entity-summary-wbsetitem": "Ein neues Datenobjekt erstellt",
        "wikibase-entity-summary-wbcreate-new": "Ein neues Objekt erstellt",
        "wikibase-entity-summary-wbcreateredirect": "Weitergeleitet zu $4",
diff --git a/extensions/Wikibase/lib/i18n/en.json 
b/extensions/Wikibase/lib/i18n/en.json
index 391b71b..00da0e6 100644
--- a/extensions/Wikibase/lib/i18n/en.json
+++ b/extensions/Wikibase/lib/i18n/en.json
@@ -63,6 +63,7 @@
        "wikibase-validator-no-such-property": "Property $1 not found",
        "wikibase-validator-bad-value": "Data value corrupt: $1",
        "wikibase-validator-bad-value-type": "Bad value type $1, expected $2",
+       "wikibase-validator-bad-data-type": "Bad data type: $1",
        "wikibase-validator-bad-url": "Malformed URL: $1",
        "wikibase-validator-bad-url-scheme": "Unsupported URL scheme: $1",
        "wikibase-validator-unknown-unit": "Unknown unit: $1",
@@ -88,6 +89,7 @@
        "wikibase-monolingualtext": "<span lang=\"$2\" 
class=\"wb-monolingualtext-value\">$1</span> <span 
class=\"wb-monolingualtext-language-name\">($3)</span>",
        "wikibase-snakformatter-valuetype-mismatch": "The value's type \"$1\" 
does not match property's type \"$2\".",
        "wikibase-snakformatter-property-not-found": "Property $1 not found, 
cannot determine the data type to use.",
+       "wikibase-snakformatter-formatting-exception": "Formatting error: $1.",
        "wikibase-entity-summary-wbsetitem": "Created a new item",
        "wikibase-entity-summary-wbcreate-new": "Created a new entity",
        "wikibase-entity-summary-wbcreateredirect": "Redirected to $4",
diff --git a/extensions/Wikibase/lib/i18n/qqq.json 
b/extensions/Wikibase/lib/i18n/qqq.json
index 6a01306..7796325 100644
--- a/extensions/Wikibase/lib/i18n/qqq.json
+++ b/extensions/Wikibase/lib/i18n/qqq.json
@@ -73,6 +73,7 @@
        "wikibase-validator-no-such-property": "Input validation error shown 
when the property used for a statement could not be found.\n\nThis kind of 
error is unlikely to occur during normal operation, since the user interface 
should prevent illegal values from being entered.\n\nParameters:\n* $1 - the 
property ID\n{{Related|Wikibase-validator}}",
        "wikibase-validator-bad-value": "Input validation error shown when the 
value is syntactically invalid or structurally corrupt.\n\nThis kind of error 
is unlikely to occur during normal operation, since the user interface should 
prevent illegal values from being entered.\n\nParameters:\n* $1 - the technical 
error message describing the problem\n{{Related|Wikibase-validator}}",
        "wikibase-validator-bad-value-type": "Input validation error shown when 
the value has the wrong type for the property it is applied to.\n\nThis kind of 
error is unlikely to occur during normal operation, since the user interface 
should prevent illegal values from being entered.\n\nParameters:\n* $1 - the 
actual value type\n* $2 - the expected value 
type\n{{Related|Wikibase-validator}}",
+       "wikibase-validator-bad-data-type": "Input validation error shown when 
the snak has an invalid data type.\n\nThis kind of error is unlikely to occur 
during normal operation, since the user interface should prevent illegal values 
from being entered.\n\nParameters:\n* $1 - the invalid data 
type\n{{Related|Wikibase-validator}}",
        "wikibase-validator-bad-url": "Input validation error shown when the 
value is an invalid URL.\n\nParameters:\n* $1 - the malformed 
URL\n{{Related|Wikibase-validator}}",
        "wikibase-validator-bad-url-scheme": "Input validation error shown when 
the value is a URL using an unsupported protocol (scheme).\n\nParameters:\n* $1 
- the scheme name\n{{Related|Wikibase-validator}}",
        "wikibase-validator-unknown-unit": "Input validation error when the 
value has an unknown unit.\n\nParameters:\n* $1 - the unknown 
unit\n{{Related|Wikibase-validator}}",
@@ -98,6 +99,7 @@
        "wikibase-monolingualtext": "Format for displaying monolingual text 
(along with a language name).\n\nParameters:\n* $1 - the text\n* $2 - the code 
of the language of the text\n* $3 - the name of the language of the text, in 
the user's language.",
        "wikibase-snakformatter-valuetype-mismatch": "Warning shown when if the 
data value type used by a Snak's (see [[d:Wikidata:Glossary]]) property's data 
type is different from the type of the Snak's actual value.\n\nParameters:\n* 
$1 - data value type of the property-value Snak's value.\n* $2 - data value 
type used by the data type used in the property which is used by the 
property-value Snak",
        "wikibase-snakformatter-property-not-found": "Warning shown when a 
Snak's (see [[d:Wikidata:Glossary]]) data type could not be determined based on 
the Snak's property ID.",
+       "wikibase-snakformatter-formatting-exception": "Warning shown when a 
Snak (see [[d:Wikidata:Glossary]]) could not be rendered due to an internal 
error (a FormattingException).\n* $1 - the error message from the 
FormattingException, in English, possibly including technical details.",
        "wikibase-entity-summary-wbsetitem": "{{wikibase summary 
messages|entity|Automatic edit summary generated when creating a new item. This 
is a legacy message. Note that some item-specific messages need to be defined 
with the generic wikibase-entity-summary prefix for use on client wikis.}}",
        "wikibase-entity-summary-wbcreate-new": "{{wikibase summary 
messages|entity|Automatic edit summary generated when creating a new entity. 
This is for backwards compatibility for edits already made and in the database 
with this message.}}",
        "wikibase-entity-summary-wbcreateredirect": "{{wikibase summary 
messages|entity|Automatic edit summary generated when changing an entity into a 
redirect to another entity.}}",
diff --git 
a/extensions/Wikibase/lib/includes/formatters/ErrorHandlingSnakFormatter.php 
b/extensions/Wikibase/lib/includes/formatters/ErrorHandlingSnakFormatter.php
index 132d5fb..9d4508f 100644
--- a/extensions/Wikibase/lib/includes/formatters/ErrorHandlingSnakFormatter.php
+++ b/extensions/Wikibase/lib/includes/formatters/ErrorHandlingSnakFormatter.php
@@ -77,11 +77,15 @@
                                );
                        }
                } catch ( PropertyDataTypeLookupException $ex ) {
-                       // @todo: PropertyDataTypeLookupException should be 
wrapped in a FormatterException
                        $warningText = $this->formatWarning(
                                'wikibase-snakformatter-property-not-found',
                                $snak->getPropertyId()->getSerialization()
                        );
+               } catch ( FormattingException $ex ) {
+                       $warningText = $this->formatWarning(
+                               'wikibase-snakformatter-formatting-exception',
+                               $ex->getMessage() // this is 
unlocalized/technical!
+                       );
                }
 
                if ( $snak instanceof PropertyValueSnak && 
$this->fallbackFormatter ) {
diff --git 
a/extensions/Wikibase/lib/includes/formatters/PropertyValueSnakFormatter.php 
b/extensions/Wikibase/lib/includes/formatters/PropertyValueSnakFormatter.php
index f86ab0e..278d3e7 100644
--- a/extensions/Wikibase/lib/includes/formatters/PropertyValueSnakFormatter.php
+++ b/extensions/Wikibase/lib/includes/formatters/PropertyValueSnakFormatter.php
@@ -7,6 +7,7 @@
 use DataValues\UnDeserializableValue;
 use InvalidArgumentException;
 use Message;
+use OutOfBoundsException;
 use ValueFormatters\Exceptions\MismatchingDataValueTypeException;
 use ValueFormatters\FormatterOptions;
 use ValueFormatters\FormattingException;
@@ -105,9 +106,9 @@
                        $propertyType = 
$this->typeLookup->getDataTypeIdForProperty( $snak->getPropertyId() );
                        $expectedDataValueType = 
$this->getDataValueTypeForPropertyDataType( $propertyType );
                } catch ( PropertyDataTypeLookupException $ex ) {
-                       // @todo: wrap PropertyDataTypeLookupException in a 
FormatterException,
-                       // handle that exception in ErrorHandlingSnakFormatter
                        throw $ex;
+               } catch ( OutOfBoundsException $ex ) {
+                       throw new FormattingException( $ex->getMessage(), 0, 
$ex );
                }
 
                $this->checkValueType( $value, $expectedDataValueType );
diff --git 
a/extensions/Wikibase/lib/tests/phpunit/formatters/ErrorHandlingSnakFormatterTest.php
 
b/extensions/Wikibase/lib/tests/phpunit/formatters/ErrorHandlingSnakFormatterTest.php
index 5cccd13..ef05e27 100644
--- 
a/extensions/Wikibase/lib/tests/phpunit/formatters/ErrorHandlingSnakFormatterTest.php
+++ 
b/extensions/Wikibase/lib/tests/phpunit/formatters/ErrorHandlingSnakFormatterTest.php
@@ -7,6 +7,7 @@
 use Exception;
 use Language;
 use ValueFormatters\Exceptions\MismatchingDataValueTypeException;
+use ValueFormatters\FormattingException;
 use ValueFormatters\ValueFormatter;
 use Wikibase\DataModel\Entity\PropertyId;
 use Wikibase\DataModel\Services\Lookup\PropertyDataTypeLookupException;
@@ -118,6 +119,11 @@
                                new PropertyDataTypeLookupException( new 
PropertyId( 'P1' ) ),
                                $valueFormatter
                        ),
+                       'FormattingException' => array(
+                               '<span class="error 
wb-format-error">(wikibase-snakformatter-formatting-exception: TEST)</span>',
+                               new PropertyValueSnak( $p1, new StringValue( 
'foo' ) ),
+                               new FormattingException( 'TEST' ),
+                       ),
                );
        }
 
diff --git 
a/extensions/Wikibase/lib/tests/phpunit/formatters/PropertyValueSnakFormatterTest.php
 
b/extensions/Wikibase/lib/tests/phpunit/formatters/PropertyValueSnakFormatterTest.php
index 4ac73f0..51720bf 100644
--- 
a/extensions/Wikibase/lib/tests/phpunit/formatters/PropertyValueSnakFormatterTest.php
+++ 
b/extensions/Wikibase/lib/tests/phpunit/formatters/PropertyValueSnakFormatterTest.php
@@ -6,6 +6,7 @@
 use DataTypes\DataTypeFactory;
 use DataValues\StringValue;
 use DataValues\UnDeserializableValue;
+use OutOfBoundsException;
 use ValueFormatters\FormatterOptions;
 use ValueFormatters\StringFormatter;
 use ValueFormatters\ValueFormatter;
@@ -78,13 +79,20 @@
         * @return DataTypeFactory
         */
        private function getMockDataTypeFactory( $dataType, $valueType ) {
+               if ( $valueType !== '' ) {
+                       $getValueTypeIdForPropertyResult = $this->returnValue( 
new DataType( $dataType, $valueType ) );
+               } else {
+                       $getValueTypeIdForPropertyResult = 
$this->throwException(
+                               new OutOfBoundsException( 'unknown datatype ' . 
$dataType ) );
+               }
+
                $typeFactory = $this->getMockBuilder( 
'DataTypes\DataTypeFactory' )
                        ->disableOriginalConstructor()
                        ->getMock();
 
                $typeFactory->expects( $this->any() )
                        ->method( 'getType' )
-                       ->will( $this->returnValue( new DataType( $dataType, 
$valueType ) ) );
+                       ->will( $getValueTypeIdForPropertyResult );
 
                return $typeFactory;
        }
@@ -190,13 +198,23 @@
 
                        'property not found, fail' => array(
                                new PropertyValueSnak( 7, new StringValue( 
'dummy' ) ),
-                               '', // triggers an exception from the mock 
PropertyDataTypeLookup
+                               '', // triggers an exception from the mock 
DataTypeFactory
                                'xxx', // should not be used
                                SnakFormatter::FORMAT_HTML,
                                $dispatchingFormatter,
                                null,
                                
'Wikibase\DataModel\Services\Lookup\PropertyDataTypeLookupException'
                        ),
+
+                       'data type not found, fail' => array(
+                               new PropertyValueSnak( 7, new StringValue( 
'dummy' ) ),
+                               'url',
+                               '', // triggers an exception from the mock 
DataTypeFactory
+                               SnakFormatter::FORMAT_HTML,
+                               $dispatchingFormatter,
+                               null,
+                               'ValueFormatters\FormattingException'
+                       ),
                );
        }
 
diff --git a/extensions/Wikibase/repo/i18n/de.json 
b/extensions/Wikibase/repo/i18n/de.json
index ceb5e69..bc00e21 100644
--- a/extensions/Wikibase/repo/i18n/de.json
+++ b/extensions/Wikibase/repo/i18n/de.json
@@ -49,6 +49,8 @@
        "wikibase-entitytermsforlanguagelistview-description": "Beschreibung",
        "wikibase-entitytermsforlanguagelistview-label": "Bezeichnung",
        "wikibase-entitytermsforlanguagelistview-language": "Sprache",
+       "wikibase-entitytermsforlanguagelistview-more": "Weitere Sprachen",
+       "wikibase-entitytermsforlanguagelistview-less": "Weniger Sprachen",
        "wikibase-label-empty": "Keine Bezeichnung vorhanden",
        "wikibase-label-edit-placeholder": "Bezeichnung eingeben",
        "wikibase-label-edit-placeholder-language-aware": "Bezeichnung auf $1 
eingeben",
@@ -102,6 +104,7 @@
        "wikibase-aliases-input-help-message": "Um dieses Objekt leichter 
wiederzufinden, kannst du alternative Namen eingeben.",
        "wikibase-aliases-empty": "Es wurden keine Aliasse definiert.",
        "wikibase-propertypage-datatype": "Datentyp",
+       "wikibase-propertypage-bad-datatype": "Unbekannter Datentyp: $1",
        "wikibase-claimview-snak-tooltip": "Gib einen Wert ein, der der 
Eigenschaft namens „$1“ entspricht. Falls die Eigenschaft keinen bestimmten 
Wert hat oder der derzeitige Wert unbekannt ist, kannst du eine Alternative 
wählen, um einen benutzerdefinierten Wert anzugeben, indem du auf das Symbol 
neben dem Werteingabekasten klickst.",
        "wikibase-claimview-snak-new-tooltip": "Nach der Festlegung einer 
Eigenschaft kannst du einen dazugehörigen Wert eingeben. Falls die Eigenschaft 
keinen bestimmten Wert hat oder der derzeitige Wert unbekannt ist, kannst du 
eine Alternative wählen, um einen benutzerdefinierten Wert anzugeben, indem du 
auf das Symbol neben dem Werteingabekasten klickst.",
        "wikibase-statementview-rank-preferred": "Bevorzugter Rang",
diff --git a/extensions/Wikibase/repo/i18n/eml.json 
b/extensions/Wikibase/repo/i18n/eml.json
index a0df9a2..639e922 100644
--- a/extensions/Wikibase/repo/i18n/eml.json
+++ b/extensions/Wikibase/repo/i18n/eml.json
@@ -7,6 +7,7 @@
        },
        "wikibase-edit": "mudéfica",
        "wikibase-save": "sêlva",
+       "wikibase-entitytermsforlanguagelistview-more": "Più lèngvi",
        "wikibase-setdescription-label": "Spiegasiòun",
        "wikibase-setdescription-submit": "Scrév la spiegasiòun"
 }
diff --git a/extensions/Wikibase/repo/i18n/en.json 
b/extensions/Wikibase/repo/i18n/en.json
index d39c1ab..f395db7 100644
--- a/extensions/Wikibase/repo/i18n/en.json
+++ b/extensions/Wikibase/repo/i18n/en.json
@@ -35,6 +35,8 @@
        "wikibase-entitytermsforlanguagelistview-description": "Description",
        "wikibase-entitytermsforlanguagelistview-label": "Label",
        "wikibase-entitytermsforlanguagelistview-language": "Language",
+       "wikibase-entitytermsforlanguagelistview-more": "More languages",
+       "wikibase-entitytermsforlanguagelistview-less": "Less languages",
        "wikibase-label-empty": "No label defined",
        "wikibase-label-edit-placeholder": "enter a label",
        "wikibase-label-edit-placeholder-language-aware": "enter a label in $1",
@@ -90,6 +92,7 @@
        "wikibase-aliases-input-help-message": "To make this entity easier to 
find, you can enter alternative names.",
        "wikibase-aliases-empty": "No aliases defined",
        "wikibase-propertypage-datatype": "Data type",
+       "wikibase-propertypage-bad-datatype": "Unknown data type: $1",
        "wikibase-property-footer": "",
        "wikibase-claimview-snak-tooltip": "Enter a value corresponding to the 
property named \"$1\". If the property has no designated value or the actual 
value is not known, you may choose an alternative to specifying a custom value 
by clicking the icon next to the value input box.",
        "wikibase-claimview-snak-new-tooltip": "After specifying a property you 
can enter a corresponding value. If the property has no designated value or the 
actual value is not known, you may choose an alternative to specifying a custom 
value by clicking the icon next to the value input box.",
diff --git a/extensions/Wikibase/repo/i18n/frr.json 
b/extensions/Wikibase/repo/i18n/frr.json
index 401d961..f646a90 100644
--- a/extensions/Wikibase/repo/i18n/frr.json
+++ b/extensions/Wikibase/repo/i18n/frr.json
@@ -9,10 +9,12 @@
        "wikibase-add": "diartusaat",
        "wikibase-label-empty": "Diar as nään nööm.",
        "wikibase-description-empty": "Diar as nian beskriiwang.",
-       "wikibase-statements": "Ütjsaagen",
+       "wikibase-statementsection-statements": "Ütjsaagen",
        "wikibase-sitelinks-special": "Ööder wääbsidjen",
        "wikibase-aliases-empty": "Nian aliasen fäästlaanj.",
        "wikibase-statementview-rank-normal": "Normool steed",
        "wikibase-statementview-referencesheading-pendingcountersubject": 
"{{PLURAL:$1|efterwis|efterwiser}}",
+       "special-itembytitle": "Dootenobjekten efter tiitel",
+       "special-newitem": "En nei dootenobjekt maage",
        "wikibase-listdatatypes-wikibase-item-body": "Ferwisang tu ööder 
objekten uun't projekt. Di nöömrüm „objekt“ woort trochsoocht. Det as man en 
ianfach tekstfial.\n* scheme – hiart tu't Iri-tiakenkeed.\n* hierarchicalpart – 
hiart tu't Iri-tiakenkeed.\n* query – hiart tu't Iri-tiakenkeed.\n* fragment – 
hiart tu't Iri-tiakenkeed."
 }
diff --git a/extensions/Wikibase/repo/i18n/jam.json 
b/extensions/Wikibase/repo/i18n/jam.json
new file mode 100644
index 0000000..e4ce180
--- /dev/null
+++ b/extensions/Wikibase/repo/i18n/jam.json
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Katxis"
+               ]
+       },
+       "wikibase-edit": "edit"
+}
diff --git a/extensions/Wikibase/repo/i18n/pl.json 
b/extensions/Wikibase/repo/i18n/pl.json
index 1b1dae2..fb820c7 100644
--- a/extensions/Wikibase/repo/i18n/pl.json
+++ b/extensions/Wikibase/repo/i18n/pl.json
@@ -38,6 +38,8 @@
        "wikibase-entitytermsforlanguagelistview-description": "Opis",
        "wikibase-entitytermsforlanguagelistview-label": "Etykieta",
        "wikibase-entitytermsforlanguagelistview-language": "Język",
+       "wikibase-entitytermsforlanguagelistview-more": "Więcej języków",
+       "wikibase-entitytermsforlanguagelistview-less": "Mniej języków",
        "wikibase-label-empty": "Etykieta nie została podana",
        "wikibase-label-edit-placeholder": "podaj etykietę",
        "wikibase-label-edit-placeholder-language-aware": "podaj etykietę w $1",
diff --git a/extensions/Wikibase/repo/i18n/qqq.json 
b/extensions/Wikibase/repo/i18n/qqq.json
index 42dc13f..46fc649 100644
--- a/extensions/Wikibase/repo/i18n/qqq.json
+++ b/extensions/Wikibase/repo/i18n/qqq.json
@@ -66,6 +66,8 @@
        "wikibase-entitytermsforlanguagelistview-description": "List of labels, 
aliases and descriptions in one or more languages: Heading of the 
\"description\" column. (see 
[[d:Wikidata:Glossary]])\n{{Identical|Description}}",
        "wikibase-entitytermsforlanguagelistview-label": "List of labels, 
aliases and descriptions in one or more languages: Heading of the \"label\" 
column. (see [[d:Wikidata:Glossary]])\n{{Identical|Label}}",
        "wikibase-entitytermsforlanguagelistview-language": "List of labels, 
aliases and descriptions in one or more languages: Heading of the \"language\" 
column. (see [[d:Wikidata:Glossary]])\n{{Identical|Language}}",
+       "wikibase-entitytermsforlanguagelistview-more": "List of labels, 
aliases and descriptions in one or more languages: Label for the button to show 
all non-empty sets of terms.",
+       "wikibase-entitytermsforlanguagelistview-less": "List of labels, 
aliases and descriptions in one or more languages: Label for the button to hide 
all but the default terms.",
        "wikibase-label-empty": "Placeholder message displayed instead of the 
item's label in case no label has been specified yet. This message is displayed 
only when the user has JavaScript disabled. (When JavaScript is enabled, an 
input box will be displayed instead.)",
        "wikibase-label-edit-placeholder": "[[File:Screenshot WikidataRepo 
2012-05-13 G.png|right|0x150px]]\nThis is a generic text used as a placeholder 
while editing a new label. See also the Wikidata glossary on 
[[d:Wikidata:Glossary#languageattribute-label|label]].",
        "wikibase-label-edit-placeholder-language-aware": "Like 
{{msg-mw|Wikibase-label-edit-placeholder}}, but language aware. $1 is the 
autonym of the language.",
@@ -121,6 +123,7 @@
        "wikibase-aliases-input-help-message": "Bubble help message for 
entering the aliases of the data set used for a specific 
item.\n\nParameters:\n* $1 - (Unused) language 
name\n{{Related|Wikibase-input-help-message}}",
        "wikibase-aliases-empty": "Placeholder message when no aliases for this 
data set representing a specific item have been defined.",
        "wikibase-propertypage-datatype": "Heading used on a page displaying a 
[[d:Wikidata:Glossary#Property|Property]] for the 
[[d:Wikidata:Glossary#Datatypes|data type]] applied to a property.\n\nThe 
section below the heading contains a data type label. (See 
[[d:Special:ListDatatypes|List of all data types 
available]].)\n{{Identical|Data type}}",
+       "wikibase-propertypage-bad-datatype": "Error message shown on the 
property page when the property has an unknown data type.\n* $1 the ID of the 
unknown data type.",
        "wikibase-property-footer": "Text displayed at the bottom of every 
property page.",
        "wikibase-claimview-snak-tooltip": "Tooltip message displayed when 
hovering/clicking the help icon next to the save, cancel and remove links of a 
claim (see [[d:Wikidata:Glossary#Claim]]).\n\nParameters:\n* $1 - the property 
name the user is about to edit a value of or add another value to",
        "wikibase-claimview-snak-new-tooltip": "Tooltip message displayed when 
hovering/clicking the help icon next to the save, cancel and remove links of a 
claim (see [[d:Wikidata:Glossary]]) when about to add a completely new claim 
which includes specifying the property.",
diff --git a/extensions/Wikibase/repo/includes/Validators/SnakValidator.php 
b/extensions/Wikibase/repo/includes/Validators/SnakValidator.php
index 9c991e9..faa9760 100644
--- a/extensions/Wikibase/repo/includes/Validators/SnakValidator.php
+++ b/extensions/Wikibase/repo/includes/Validators/SnakValidator.php
@@ -6,6 +6,7 @@
 use DataValues\DataValue;
 use DataValues\UnDeserializableValue;
 use InvalidArgumentException;
+use OutOfBoundsException;
 use ValueValidators\Error;
 use ValueValidators\Result;
 use ValueValidators\ValueValidator;
@@ -179,10 +180,21 @@
         * @return Result
         */
        public function validateDataValue( DataValue $dataValue, $dataTypeId ) {
-               $dataValueType = $this->dataTypeFactory->getType( $dataTypeId 
)->getDataValueType();
+               try {
+                       $dataValueType = $this->dataTypeFactory->getType( 
$dataTypeId )->getDataValueType();
+               } catch ( OutOfBoundsException $ex ) {
+                       return Result::newError( array(
+                               Error::newError(
+                                       'Bad data type: ' . $dataTypeId,
+                                       null,
+                                       'bad-data-type',
+                                       array( $dataTypeId )
+                               ),
+                       ) );
+               }
 
                if ( $dataValue instanceof UnDeserializableValue ) {
-                       $result = Result::newError( array(
+                       return Result::newError( array(
                                Error::newError(
                                        'Bad snak value: ' . 
$dataValue->getReason(),
                                        null,
@@ -191,7 +203,7 @@
                                ),
                        ) );
                } elseif ( $dataValueType != $dataValue->getType() ) {
-                       $result = Result::newError( array(
+                       return Result::newError( array(
                                Error::newError(
                                        'Bad value type: ' . 
$dataValue->getType() . ', expected ' . $dataValueType,
                                        null,
@@ -199,10 +211,10 @@
                                        array( $dataValue->getType(), 
$dataValueType )
                                ),
                        ) );
-               } else {
-                       $result = Result::newSuccess();
                }
 
+               $result = Result::newSuccess();
+
                //XXX: DataTypeValidatorFactory should expose only one 
validator, which would be a CompositeValidator
                foreach ( $this->validatorFactory->getValidators( $dataTypeId ) 
as $validator ) {
                        $subResult = $validator->validate( $dataValue );
diff --git a/extensions/Wikibase/repo/includes/api/CreateClaim.php 
b/extensions/Wikibase/repo/includes/api/CreateClaim.php
index 5a77d38..99676f9 100644
--- a/extensions/Wikibase/repo/includes/api/CreateClaim.php
+++ b/extensions/Wikibase/repo/includes/api/CreateClaim.php
@@ -82,7 +82,7 @@
 
                $statement = 
$entity->getStatements()->getFirstStatementWithGuid( 
$changeOp->getStatementGuid() );
 
-               $status = $this->saveChanges( $entity, $summary );
+               $status = $this->attemptSaveEntity( $entity, $summary, 
EDIT_UPDATE );
                $this->getResultBuilder()->addRevisionIdFromStatusToResult( 
$status, 'pageinfo' );
                $this->getResultBuilder()->markSuccess();
                $this->getResultBuilder()->addStatement( $statement );
diff --git a/extensions/Wikibase/repo/includes/api/ModifyClaim.php 
b/extensions/Wikibase/repo/includes/api/ModifyClaim.php
index 1fee1b3..374fd33 100644
--- a/extensions/Wikibase/repo/includes/api/ModifyClaim.php
+++ b/extensions/Wikibase/repo/includes/api/ModifyClaim.php
@@ -103,22 +103,6 @@
        }
 
        /**
-        * @since 0.4
-        *
-        * @param Entity $entity
-        * @param Summary $summary
-        *
-        * @return Status
-        */
-       public function saveChanges( Entity $entity, Summary $summary ) {
-               return $this->attemptSaveEntity(
-                       $entity,
-                       $summary,
-                       EDIT_UPDATE
-               );
-       }
-
-       /**
         * @see ApiBase::getAllowedParams
         */
        protected function getAllowedParams() {
diff --git a/extensions/Wikibase/repo/includes/api/RemoveClaims.php 
b/extensions/Wikibase/repo/includes/api/RemoveClaims.php
index e681d0a..a820a20 100644
--- a/extensions/Wikibase/repo/includes/api/RemoveClaims.php
+++ b/extensions/Wikibase/repo/includes/api/RemoveClaims.php
@@ -80,7 +80,7 @@
                        $this->errorReporter->dieException( $e, 'failed-save' );
                }
 
-               $status = $this->saveChanges( $entity, $summary );
+               $status = $this->attemptSaveEntity( $entity, $summary, 
EDIT_UPDATE );
                $this->getResultBuilder()->addRevisionIdFromStatusToResult( 
$status, 'pageinfo' );
                $this->getResultBuilder()->markSuccess();
                $this->getResultBuilder()->setList( null, 'claims', 
$params['claim'], 'claim' );
diff --git a/extensions/Wikibase/repo/includes/api/RemoveQualifiers.php 
b/extensions/Wikibase/repo/includes/api/RemoveQualifiers.php
index 780d7bd..e639fbc 100644
--- a/extensions/Wikibase/repo/includes/api/RemoveQualifiers.php
+++ b/extensions/Wikibase/repo/includes/api/RemoveQualifiers.php
@@ -79,7 +79,7 @@
                        $this->errorReporter->dieException( $e, 'failed-save' );
                }
 
-               $status = $this->saveChanges( $entity, $summary );
+               $status = $this->attemptSaveEntity( $entity, $summary, 
EDIT_UPDATE );
                $this->getResultBuilder()->addRevisionIdFromStatusToResult( 
$status, 'pageinfo' );
                $this->getResultBuilder()->markSuccess();
        }
diff --git a/extensions/Wikibase/repo/includes/api/RemoveReferences.php 
b/extensions/Wikibase/repo/includes/api/RemoveReferences.php
index 56c9673..6602f1e 100644
--- a/extensions/Wikibase/repo/includes/api/RemoveReferences.php
+++ b/extensions/Wikibase/repo/includes/api/RemoveReferences.php
@@ -86,7 +86,7 @@
                        $this->errorReporter->dieException( $e, 'failed-save' );
                }
 
-               $status = $this->saveChanges( $entity, $summary );
+               $status = $this->attemptSaveEntity( $entity, $summary, 
EDIT_UPDATE );
                $this->getResultBuilder()->addRevisionIdFromStatusToResult( 
$status, 'pageinfo' );
                $this->getResultBuilder()->markSuccess();
        }
diff --git a/extensions/Wikibase/repo/includes/api/SetClaim.php 
b/extensions/Wikibase/repo/includes/api/SetClaim.php
index 4cdad2c..4d21856 100644
--- a/extensions/Wikibase/repo/includes/api/SetClaim.php
+++ b/extensions/Wikibase/repo/includes/api/SetClaim.php
@@ -101,7 +101,7 @@
 
                $this->modificationHelper->applyChangeOp( $changeop, $entity, 
$summary );
 
-               $status = $this->saveChanges( $entity, $summary );
+               $status = $this->attemptSaveEntity( $entity, $summary, 
EDIT_UPDATE );
                $this->getResultBuilder()->addRevisionIdFromStatusToResult( 
$status, 'pageinfo' );
                $this->getResultBuilder()->markSuccess();
                $this->getResultBuilder()->addStatement( $claim );
diff --git a/extensions/Wikibase/repo/includes/api/SetClaimValue.php 
b/extensions/Wikibase/repo/includes/api/SetClaimValue.php
index 64921ea..7a70f44 100644
--- a/extensions/Wikibase/repo/includes/api/SetClaimValue.php
+++ b/extensions/Wikibase/repo/includes/api/SetClaimValue.php
@@ -73,7 +73,7 @@
 
                $this->modificationHelper->applyChangeOp( $changeOp, $entity, 
$summary );
 
-               $status = $this->saveChanges( $entity, $summary );
+               $status = $this->attemptSaveEntity( $entity, $summary, 
EDIT_UPDATE );
                $this->getResultBuilder()->addRevisionIdFromStatusToResult( 
$status, 'pageinfo' );
                $this->getResultBuilder()->markSuccess();
                $this->getResultBuilder()->addStatement( $claim );
diff --git a/extensions/Wikibase/repo/includes/api/SetQualifier.php 
b/extensions/Wikibase/repo/includes/api/SetQualifier.php
index d735c3d..ef6cf06 100644
--- a/extensions/Wikibase/repo/includes/api/SetQualifier.php
+++ b/extensions/Wikibase/repo/includes/api/SetQualifier.php
@@ -75,7 +75,7 @@
                $changeOp = $this->getChangeOp();
                $this->modificationHelper->applyChangeOp( $changeOp, $entity, 
$summary );
 
-               $status = $this->saveChanges( $entity, $summary );
+               $status = $this->attemptSaveEntity( $entity, $summary, 
EDIT_UPDATE );
                $this->getResultBuilder()->addRevisionIdFromStatusToResult( 
$status, 'pageinfo' );
                $this->getResultBuilder()->markSuccess();
                $this->getResultBuilder()->addStatement( $statement );
diff --git a/extensions/Wikibase/repo/includes/api/SetReference.php 
b/extensions/Wikibase/repo/includes/api/SetReference.php
index 8f300a4..c8fa0f9 100644
--- a/extensions/Wikibase/repo/includes/api/SetReference.php
+++ b/extensions/Wikibase/repo/includes/api/SetReference.php
@@ -106,7 +106,7 @@
                $changeOp = $this->getChangeOp( $newReference );
                $this->modificationHelper->applyChangeOp( $changeOp, $entity, 
$summary );
 
-               $status = $this->saveChanges( $entity, $summary );
+               $status = $this->attemptSaveEntity( $entity, $summary, 
EDIT_UPDATE );
                $resultBuilder = $this->getResultBuilder();
                $resultBuilder->addRevisionIdFromStatusToResult( $status, 
'pageinfo' );
                $resultBuilder->markSuccess();
diff --git a/extensions/Wikibase/repo/includes/specials/SpecialNewProperty.php 
b/extensions/Wikibase/repo/includes/specials/SpecialNewProperty.php
index 07eb0a0..ccce096 100644
--- a/extensions/Wikibase/repo/includes/specials/SpecialNewProperty.php
+++ b/extensions/Wikibase/repo/includes/specials/SpecialNewProperty.php
@@ -89,7 +89,8 @@
 
        protected function dataTypeExists() {
                $dataTypeFactory = 
WikibaseRepo::getDefaultInstance()->getDataTypeFactory();
-               return $dataTypeFactory->getType( $this->dataType ) !== null;
+               $ids = $dataTypeFactory->getTypeIds();
+               return in_array( $this->dataType, $ids );
        }
 
        /**
diff --git 
a/extensions/Wikibase/repo/tests/phpunit/includes/Validators/SnakValidatorTest.php
 
b/extensions/Wikibase/repo/tests/phpunit/includes/Validators/SnakValidatorTest.php
index 20c83ab..95e694c 100644
--- 
a/extensions/Wikibase/repo/tests/phpunit/includes/Validators/SnakValidatorTest.php
+++ 
b/extensions/Wikibase/repo/tests/phpunit/includes/Validators/SnakValidatorTest.php
@@ -8,6 +8,7 @@
 use DataValues\UnDeserializableValue;
 use DataValues\UnknownValue;
 use PHPUnit_Framework_TestCase;
+use ValueValidators\Error;
 use Wikibase\DataModel\Entity\PropertyId;
 use Wikibase\DataModel\Reference;
 use Wikibase\DataModel\ReferenceList;
@@ -61,12 +62,14 @@
                        'alphabetic' => 'string'
                ) );
 
-               $p1 = new PropertyId( 'p1' );
-               $p2 = new PropertyId( 'p2' );
+               $p1 = new PropertyId( 'P1' );
+               $p2 = new PropertyId( 'P2' );
+               $p4 = new PropertyId( 'P4' );
 
                $this->propertyDataTypeLookup = new InMemoryDataTypeLookup();
                $this->propertyDataTypeLookup->setDataTypeForProperty( $p1, 
'numeric' );
                $this->propertyDataTypeLookup->setDataTypeForProperty( $p2, 
'alphabetic' );
+               $this->propertyDataTypeLookup->setDataTypeForProperty( $p4, 
'fiddlediddle' );
 
                $this->validatorFactory = $this->getMock( 
'Wikibase\Repo\DataTypeValidatorFactory' );
                $this->validatorFactory->expects( $this->any() )
@@ -226,38 +229,96 @@
        }
 
        public function provideValidate() {
-               $p1 = new PropertyId( 'p1' ); // numeric
-               $p2 = new PropertyId( 'p2' ); // alphabetic
-               $p3 = new PropertyId( 'p3' ); // bad
+               $p1 = new PropertyId( 'P1' ); // numeric
+               $p2 = new PropertyId( 'P2' ); // alphabetic
+               $p3 = new PropertyId( 'P3' ); // bad
+               $p4 = new PropertyId( 'P4' ); // property with bad data type
 
                $cases = array();
 
                $snak = new PropertyNoValueSnak( $p1 );
-               $cases[] = array( $snak, 'PropertyNoValueSnak', true );
+               $cases[] = array( $snak, 'PropertyNoValueSnak' );
 
                $snak = new PropertySomeValueSnak( $p2 );
-               $cases[] = array( $snak, 'PropertySomeValueSnak', true );
+               $cases[] = array( $snak, 'PropertySomeValueSnak' );
 
                $snak = new PropertyValueSnak( $p1, new StringValue( '123' ) );
-               $cases[] = array( $snak, 'valid numeric value', true );
-
-               $snak = new PropertyValueSnak( $p2, new StringValue( '123' ) );
-               $cases[] = array( $snak, 'invalid alphabetic value', false );
+               $cases[] = array( $snak, 'valid numeric value' );
 
                $snak = new PropertyValueSnak( $p2, new StringValue( 'abc' ) );
-               $cases[] = array( $snak, 'valid alphabetic value', true );
+               $cases[] = array( $snak, 'valid alphabetic value' );
+
+               $snak = new PropertyValueSnak( $p2, new StringValue( '123' ) );
+               $cases[] = array(
+                       $snak,
+                       'invalid alphabetic value',
+                       Error::newError(
+                               'doesn\'t match /^[A-Z]+$/i',
+                               null,
+                               'invalid',
+                               array()
+                       )
+               );
 
                $snak = new PropertyValueSnak( $p1, new StringValue( 'abc' ) );
-               $cases[] = array( $snak, 'invalid numeric value', false );
+               $cases[] = array(
+                       $snak,
+                       'invalid numeric value',
+                       Error::newError(
+                               'doesn\'t match /^\d+$/',
+                               null,
+                               'invalid',
+                               array()
+                       )
+               );
 
-               $snak = new PropertyValueSnak( $p1, new UnDeserializableValue( 
'abc', 'string', 'error' ) );
-               $cases[] = array( $snak, 'bad value', false );
+               $snak = new PropertyValueSnak( $p1, new UnDeserializableValue( 
'abc', 'string', 'ooops' ) );
+               $cases[] = array(
+                       $snak,
+                       'bad value',
+                       Error::newError(
+                               'Bad snak value: ooops',
+                               null,
+                               'bad-value',
+                               array( 'ooops' )
+                       )
+               );
 
                $snak = new PropertyValueSnak( $p1, new UnknownValue( 'abc' ) );
-               $cases[] = array( $snak, 'wrong value type', false );
+               $cases[] = array(
+                       $snak,
+                       'wrong value type',
+                       Error::newError(
+                               'Bad value type: unknown, expected string',
+                               null,
+                               'bad-value-type',
+                               array( 'unknown', 'string' )
+                       )
+               );
 
                $snak = new PropertyValueSnak( $p3, new StringValue( 'abc' ) );
-               $cases[] = array( $snak, 'bad property', false );
+               $cases[] = array(
+                       $snak,
+                       'bad property',
+                       Error::newError(
+                               'Property P3 not found!',
+                               null,
+                               'no-such-property',
+                               array( 'P3' )
+                       )
+               );
+
+               $snak = new PropertyValueSnak( $p4, new StringValue( 'abc' ) );
+               $cases[] = array(
+                       $snak,
+                       'bad data type',
+                       Error::newError(
+                               'Bad data type: fiddlediddle',
+                               null,
+                               'bad-data-type',
+                               array( 'fiddlediddle' )
+                       )
+               );
 
                return $cases;
        }
@@ -265,12 +326,18 @@
        /**
         * @dataProvider provideValidate
         */
-       public function testValidate( Snak $snak, $description, $expectedValid 
= true ) {
+       public function testValidate( Snak $snak, $description, $expectedError 
= null ) {
                $validator = $this->getSnakValidator();
 
                $result = $validator->validate( $snak );
 
-               $this->assertEquals( $expectedValid, $result->isValid(), 
$description );
+               if ( $expectedError === null ) {
+                       $this->assertTrue( $result->isValid(), $description . 
': isValid' );
+               } else {
+                       $resultErrors = $result->getErrors();
+                       $firstError = reset( $resultErrors );
+                       $this->assertEquals( $expectedError, $firstError, 
$description );
+               }
        }
 
        public function provideValidateDataValue() {
diff --git 
a/extensions/Wikibase/view/resources/jquery/wikibase/jquery.wikibase.entitytermsforlanguagelistview.js
 
b/extensions/Wikibase/view/resources/jquery/wikibase/jquery.wikibase.entitytermsforlanguagelistview.js
index a9b3d10..09d429a 100644
--- 
a/extensions/Wikibase/view/resources/jquery/wikibase/jquery.wikibase.entitytermsforlanguagelistview.js
+++ 
b/extensions/Wikibase/view/resources/jquery/wikibase/jquery.wikibase.entitytermsforlanguagelistview.js
@@ -1,6 +1,7 @@
 /**
  * @licence GNU GPL v2+
  * @author H. Snater < [email protected] >
+ * @author Bene* < [email protected] >
  */
 ( function( mw, wb, $ ) {
        'use strict';
@@ -12,16 +13,10 @@
  * @since 0.5
  * @extends jQuery.ui.TemplatedWidget
  *
- * @option {Object[]} value
- *         Object representing the widget's value.
- *         Structure: [
- *           {
- *             language: <{string]>,
- *             label: <{wikibase.datamodel.Term}>,
- *             description: <{wikibase.datamodel.Term}>,
- *             aliases: <{wikibase.datamodel.MultiTerm}>
- *           }[, ...]
- *         ]
+ * @option {Fingerprint} value
+ *
+ * @option {string[]} userLanguages
+ *         A list of languages for which terms should be displayed initially.
  *
  * @option {wikibase.entityChangers.EntityChangersFactory} 
entityChangersFactory
  *
@@ -58,9 +53,20 @@
                        $header: 
'.wikibase-entitytermsforlanguagelistview-header',
                        $listview: 
'.wikibase-entitytermsforlanguagelistview-listview'
                },
-               value: [],
+               value: null,
+               userLanguages: [],
                entityChangersFactory: null
        },
+
+       /**
+        * @type {jQuery}
+        */
+       $listview: null,
+
+       /**
+        * @type {jQuery}
+        */
+       $entitytermsforlanguagelistviewMore: null,
 
        /**
         * @type {boolean}
@@ -68,10 +74,16 @@
        _isInEditMode: false,
 
        /**
+        * @type {Object} Map of language codes pointing to list items (in the 
form of jQuery nodes).
+        */
+       _moreLanguagesItems: {},
+
+       /**
         * @see jQuery.ui.TemplatedWidget._create
         */
        _create: function() {
-               if ( !$.isArray( this.options.value )
+               if ( !( this.options.value instanceof wb.datamodel.Fingerprint )
+                       || !$.isArray( this.options.userLanguages )
                        || !this.options.entityChangersFactory
                ) {
                        throw new Error( 'Required option(s) missing' );
@@ -97,6 +109,10 @@
                        if ( listview ) {
                                listview.destroy();
                        }
+               }
+
+               if ( this.$entitytermsforlanguagelistviewMore ) {
+                       this.$entitytermsforlanguagelistviewMore.remove();
                }
 
                this.element.removeClass( 
'wikibase-entitytermsforlanguagelistview' );
@@ -126,11 +142,11 @@
                        } );
                } );
 
-               var mismatch = scrapedLanguages.length !== 
this.options.value.length;
+               var mismatch = scrapedLanguages.length !== 
this.options.userLanguages.length;
 
                if ( !mismatch ) {
                        for ( i = 0; i < scrapedLanguages.length; i++ ) {
-                               if ( scrapedLanguages[i] !== 
this.options.value[i].language ) {
+                               if ( scrapedLanguages[i] !== 
this.options.userLanguages[i] ) {
                                        mismatch = true;
                                        break;
                                }
@@ -145,6 +161,8 @@
 
        /**
         * Creates the listview widget managing the entitytermsforlanguageview 
widgets
+        *
+        * @private
         */
        _createListView: function() {
                var self = this,
@@ -189,9 +207,163 @@
                                        };
                                }
                        } ),
-                       value: self.options.value || null,
+                       value: $.map( this.options.userLanguages, function( 
lang ) {
+                               return self._getValueForLanguage( lang );
+                       } ),
                        listItemNodeName: 'TR'
                } );
+
+               if ( !this.element.find( 
'.wikibase-entitytermsforlanguagelistview-more' ).length ) {
+                       this._createEntitytermsforlanguagelistviewMore();
+               }
+       },
+
+       /**
+        * Creates a button which allows the user to show terms in all 
languages available.
+        *
+        * @private
+        */
+       _createEntitytermsforlanguagelistviewMore: function() {
+               if ( $.isEmptyObject( this._getAdditionalLanguages() ) ) {
+                       return;
+               }
+
+               var $moreLanguagesButton = $( '<a/>' )
+                       .attr( 'href', '#' )
+                       .click( $.proxy( this._onMoreLanguagesButtonClicked, 
this ) );
+               this._toggleMoreLanguagesButton( $moreLanguagesButton );
+
+               this.$entitytermsforlanguagelistviewMore = $( '<div/>' )
+                       .addClass( 
'wikibase-entitytermsforlanguagelistview-more' )
+                       .append( $moreLanguagesButton );
+
+               this.element.after( this.$entitytermsforlanguagelistviewMore );
+       },
+
+       /**
+        * Click handler for more languages button
+        *
+        * @private
+        */
+       _onMoreLanguagesButtonClicked: function( event ) {
+               var $button = $( event.target );
+
+               if ( !this._isMoreLanguagesExpanded() ) {
+                       this._addMoreLanguages();
+               } else {
+                       var previousTop = $button.offset().top;
+                       this._removeMoreLanguages();
+                       this._scrollUp( $button, previousTop );
+               }
+
+               this._toggleMoreLanguagesButton( $button );
+               return false;
+       },
+
+       /**
+        * Toggle more language button text between the 
"wikibase-entitytermsforlanguagelistview-less"
+        * and "wikibase-entitytermsforlanguagelistview-more" messages.
+        *
+        * @param {jQuery} $button
+        * @private
+        */
+       _toggleMoreLanguagesButton: function( $button ) {
+               $button.text( mw.msg(
+                       'wikibase-entitytermsforlanguagelistview-'
+                               + ( this._isMoreLanguagesExpanded() ? 'less' : 
'more' )
+               ) );
+       },
+
+       _isMoreLanguagesExpanded: function() {
+               return !$.isEmptyObject( this._moreLanguagesItems );
+       },
+
+       /**
+        * Add 'more' languages to listview
+        *
+        * @private
+        */
+       _addMoreLanguages: function() {
+               var listview = this.$listview.data( 'listview' ),
+                       lia = listview.listItemAdapter();
+
+               for ( var lang in this._getAdditionalLanguages() ) {
+                       var $item = listview.addItem( 
this._getValueForLanguage( lang ) );
+                       if ( this._isInEditMode ) {
+                               lia.liInstance( $item ).startEditing();
+                       }
+                       this._moreLanguagesItems[lang] = $item;
+               }
+       },
+
+       /**
+        * Remove 'more' languages from listview
+        *
+        * @private
+        */
+       _removeMoreLanguages: function() {
+               var listview = this.$listview.data( 'listview' );
+
+               $.each( this._moreLanguagesItems, function() {
+                       listview.removeItem( this );
+               } );
+
+               this._moreLanguagesItems = {};
+       },
+
+       /**
+        * @return {Object} Map of additional language codes in this 
fingerprint.
+        * @private
+        */
+       _getAdditionalLanguages: function() {
+               var fingerprint = this.options.value,
+                       languages = {};
+
+               fingerprint.getLabels().each( function( lang ) {
+                       languages[lang] = lang;
+               } );
+               fingerprint.getDescriptions().each( function( lang ) {
+                       languages[lang] = lang;
+               } );
+               fingerprint.getAliases().each( function( lang ) {
+                       languages[lang] = lang;
+               } );
+
+               $.each( this.options.userLanguages, function() {
+                       delete languages[this];
+               } );
+
+               return languages;
+       },
+
+       /**
+        * @param {jQuery} $this
+        * @param {int} previousTop
+        * @private
+        */
+       _scrollUp: function( $this, previousTop ) {
+               var top = $this.offset().top;
+
+               if ( top < $( window ).scrollTop() ) {
+                       // This does not only keep the toggler visible, it also 
updates all stick(y)nodes.
+                       window.scrollBy( 0, top - previousTop );
+               }
+       },
+
+       /**
+        * @param {string} lang
+        * @return {Object}
+        * @private
+        */
+       _getValueForLanguage: function( lang ) {
+               var fingerprint = this.options.value;
+
+               return {
+                       language: lang,
+                       label: fingerprint.getLabelFor( lang ) || new 
wb.datamodel.Term( lang, '' ),
+                       description: fingerprint.getDescriptionFor( lang ) || 
new wb.datamodel.Term( lang, '' ),
+                       aliases: fingerprint.getAliasesFor( lang ) || new 
wb.datamodel.MultiTerm( lang, [] )
+               };
        },
 
        /**
@@ -418,8 +590,8 @@
        },
 
        /**
-        * @param {Object[]} [value]
-        * @return {Object[]|*}
+        * @param {Fingerprint} [value]
+        * @return {Fingerprint|*}
         */
        value: function( value ) {
                if ( value !== undefined ) {
@@ -429,11 +601,20 @@
                var listview = this.$listview.data( 'listview' ),
                        lia = listview.listItemAdapter();
 
-               value = [];
+               // Clones the current Fingerprint.
+               // FIXME: This accesses the private _items property since there 
is no copy or clone.
+               value = new wb.datamodel.Fingerprint(
+                       new wb.datamodel.TermMap( 
this.options.value.getLabels()._items ),
+                       new wb.datamodel.TermMap( 
this.options.value.getDescriptions()._items ),
+                       new wb.datamodel.MultiTermMap( 
this.options.value.getAliases()._items )
+               );
 
+               // this only adds all terms visible in the ui to the 
Fingerprint, all other languages get ignored
                listview.items().each( function() {
-                       var entitytermsforlanguageview = lia.liInstance( $( 
this ) );
-                       value.push( entitytermsforlanguageview.value() );
+                       var terms = lia.liInstance( $( this ) ).value();
+                       value.setLabel( terms.language, terms.label );
+                       value.setDescription( terms.language, terms.description 
);
+                       value.setAliases( terms.language, terms.aliases );
                } );
 
                return value;
diff --git 
a/extensions/Wikibase/view/resources/jquery/wikibase/jquery.wikibase.entitytermsview.js
 
b/extensions/Wikibase/view/resources/jquery/wikibase/jquery.wikibase.entitytermsview.js
index 68d03f2..0397e94 100644
--- 
a/extensions/Wikibase/view/resources/jquery/wikibase/jquery.wikibase.entitytermsview.js
+++ 
b/extensions/Wikibase/view/resources/jquery/wikibase/jquery.wikibase.entitytermsview.js
@@ -2,7 +2,7 @@
  * @licence GNU GPL v2+
  * @author H. Snater < [email protected] >
  */
-( function( mw, $ ) {
+( function( mw, wb, $ ) {
        'use strict';
 
        var PARENT = $.ui.EditableTemplatedWidget;
@@ -12,16 +12,10 @@
  * @since 0.5
  * @extends jQuery.ui.EditableTemplatedWidget
  *
- * @option {Object[]} value
- *         Object representing the widget's value.
- *         Structure: [
- *           {
- *             language: <{string]>,
- *             label: <{wikibase.datamodel.Term}>,
- *             description: <{wikibase.datamodel.Term}>
- *             aliases: <{wikibase.datamodel.MultiTerm}>
- *           }[, ...]
- *         ]
+ * @option {Fingerprint} value
+ *
+ * @option {string[]} userLanguages
+ *         A list of languages for which terms should be displayed initially.
  *
  * @option {wikibase.entityChangers.EntityChangersFactory} 
entityChangersFactory
  *
@@ -65,7 +59,8 @@
                        $entitytermsforlanguagelistviewContainer:
                                
'.wikibase-entitytermsview-entitytermsforlanguagelistview'
                },
-               value: [],
+               value: null,
+               userLanguages: [],
                entityChangersFactory: null,
                helpMessage: 'Edit label, description and aliases per language.'
        },
@@ -89,7 +84,8 @@
         * @see jQuery.ui.TemplatedWidget._create
         */
        _create: function() {
-               if ( !$.isArray( this.options.value )
+               if ( !( this.options.value instanceof wb.datamodel.Fingerprint )
+                       || !$.isArray( this.options.userLanguages )
                        || !this.options.entityChangersFactory
                ) {
                        throw new Error( 'Required option(s) missing' );
@@ -104,38 +100,37 @@
                        this.widgetEventPrefix + 'change.' + this.widgetName
                                + ' ' + this.widgetEventPrefix + 
'afterstopediting.' + this.widgetName,
                        function() {
-                               $.each( self.value(), function() {
-                                       if ( this.language !== 
self.options.value[0].language ) {
-                                               return true;
-                                       }
+                               if ( self.options.userLanguages.length === 0 ) {
+                                       // if no user languages have been 
specified, do nothing
+                                       return;
+                               }
 
-                                       var descriptionText = 
this.description.getText(),
-                                               aliasesTexts = 
this.aliases.getTexts();
+                               var fingerprint = self.value(),
+                                       language = 
self.options.userLanguages[0],
+                                       description = 
fingerprint.getDescriptionFor( language ) || new wb.datamodel.Term( language, 
'' ),
+                                       aliases = fingerprint.getAliasesFor( 
language ) || new wb.datamodel.MultiTerm( language, [] );
 
-                                       self.$headingDescription
-                                               .toggleClass( 'wb-empty', 
descriptionText === '' )
-                                               .text( descriptionText === ''
-                                                       ? mw.msg( 
'wikibase-description-empty' )
-                                                       : descriptionText
-                                               );
+                               self.$headingDescription
+                                       .toggleClass( 'wb-empty', 
description.getText() === '' )
+                                       .text( description.getText() === ''
+                                               ? mw.msg( 
'wikibase-description-empty' )
+                                               : description.getText()
+                               );
 
-                                       var $ul = self.$headingAliases
-                                               .toggleClass( 'wb-empty', 
aliasesTexts.length === 0 )
-                                               .children( 'ul' )
-                                               .text( aliasesTexts.length === 0
-                                                       ? mw.msg( 
'wikibase-aliases-empty' )
-                                                       : ''
-                                               );
+                               var $ul = self.$headingAliases
+                                       .toggleClass( 'wb-empty', 
aliases.isEmpty() )
+                                       .children( 'ul' )
+                                       .text( aliases.isEmpty()
+                                               ? mw.msg( 
'wikibase-aliases-empty' )
+                                               : ''
+                               );
 
-                                       for ( var i = 0; i < 
aliasesTexts.length; i++ ) {
-                                               $ul.append(
-                                                       mw.wbTemplate( 
'wikibase-entitytermsview-aliases-alias',
-                                                               aliasesTexts[i]
-                                                       )
-                                               );
-                                       }
-
-                                       return false;
+                               $.each( aliases.getTexts(), function( i, text ) 
{
+                                       $ul.append(
+                                               mw.wbTemplate( 
'wikibase-entitytermsview-aliases-alias',
+                                                       text
+                                               )
+                                       );
                                } );
                        }
                );
@@ -344,6 +339,7 @@
                )
                .entitytermsforlanguagelistview( {
                        value: this.options.value,
+                       userLanguages: this.options.userLanguages,
                        entityChangersFactory: 
this.options.entityChangersFactory
                } );
 
@@ -454,8 +450,8 @@
        /**
         * @inheritdoc
         *
-        * @param {Object[]} [value]
-        * @return {Object[]|*}
+        * @param {Fingerprint} [value]
+        * @return {Fingerprint|*}
         */
        value: function( value ) {
                if ( value !== undefined ) {
@@ -509,4 +505,4 @@
        }
 } );
 
-}( mediaWiki, jQuery ) );
+}( mediaWiki, wikibase, jQuery ) );
diff --git 
a/extensions/Wikibase/view/resources/jquery/wikibase/jquery.wikibase.listview.js
 
b/extensions/Wikibase/view/resources/jquery/wikibase/jquery.wikibase.listview.js
index bb6944d..c757342 100644
--- 
a/extensions/Wikibase/view/resources/jquery/wikibase/jquery.wikibase.listview.js
+++ 
b/extensions/Wikibase/view/resources/jquery/wikibase/jquery.wikibase.listview.js
@@ -131,8 +131,8 @@
                if ( key === 'listItemAdapter' ) {
                        throw new Error( 'Can not change the ListItemAdapter 
after initialization' );
                } else if ( key === 'value' ) {
-                       this.items().each( function( i, node ) {
-                               var $node = $( node );
+                       this.items().each( function() {
+                               var $node = $( this );
                                self._lia.liInstance( $node ).destroy();
                                $node.remove();
                        } );
diff --git 
a/extensions/Wikibase/view/resources/jquery/wikibase/jquery.wikibase.sitelinklistview.js
 
b/extensions/Wikibase/view/resources/jquery/wikibase/jquery.wikibase.sitelinklistview.js
index e954a4d..6f4bd2b 100644
--- 
a/extensions/Wikibase/view/resources/jquery/wikibase/jquery.wikibase.sitelinklistview.js
+++ 
b/extensions/Wikibase/view/resources/jquery/wikibase/jquery.wikibase.sitelinklistview.js
@@ -426,7 +426,7 @@
                        lia = listview.listItemAdapter(),
                        foundOne = false;
 
-               listview.items().each( function( i ) {
+               listview.items().each( function() {
                        if ( touchesViewport( this ) ) {
                                var sitelinkview = lia.liInstance( $( this ) );
                                sitelinkview.startEditing();
diff --git 
a/extensions/Wikibase/view/resources/jquery/wikibase/jquery.wikibase.snaklistview.js
 
b/extensions/Wikibase/view/resources/jquery/wikibase/jquery.wikibase.snaklistview.js
index 9743dbc..1610e74 100644
--- 
a/extensions/Wikibase/view/resources/jquery/wikibase/jquery.wikibase.snaklistview.js
+++ 
b/extensions/Wikibase/view/resources/jquery/wikibase/jquery.wikibase.snaklistview.js
@@ -295,8 +295,8 @@
                var listview = this.$listview.data( 'listview' ),
                        snaks = [];
 
-               $.each( listview.items(), function( i, item ) {
-                       var liInstance = listview.listItemAdapter().liInstance( 
$( item ) ),
+               listview.items().each( function() {
+                       var liInstance = listview.listItemAdapter().liInstance( 
$( this ) ),
                                snak = liInstance.snak();
                        if ( snak ) {
                                snaks.push( snak );
@@ -316,8 +316,8 @@
                        lia = listview.listItemAdapter(),
                        isValid = true;
 
-               $.each( listview.items(), function( i, item ) {
-                       var snakview = lia.liInstance( $( item ) );
+               listview.items().each( function() {
+                       var snakview = lia.liInstance( $( this ) );
                        isValid = snakview.isValid() && snakview.snak();
                        return isValid;
                } );
@@ -473,8 +473,8 @@
                var self = this,
                        $snakview = null;
 
-               this._listview.items().each( function( i, itemNode ) {
-                       var $itemNode = $( itemNode );
+               this._listview.items().each( function() {
+                       var $itemNode = $( this );
 
                        if ( self._listview.listItemAdapter().liInstance( 
$itemNode ).snak().equals( snak ) ) {
                                $snakview = $itemNode;
diff --git 
a/extensions/Wikibase/view/resources/jquery/wikibase/jquery.wikibase.statementlistview.js
 
b/extensions/Wikibase/view/resources/jquery/wikibase/jquery.wikibase.statementlistview.js
index 09f39d6..aaec9f3 100644
--- 
a/extensions/Wikibase/view/resources/jquery/wikibase/jquery.wikibase.statementlistview.js
+++ 
b/extensions/Wikibase/view/resources/jquery/wikibase/jquery.wikibase.statementlistview.js
@@ -154,19 +154,18 @@
         */
        value: function( statementList ) {
                if ( statementList === undefined ) {
-                       var lia = this._listview.listItemAdapter();
-
-                       statementList = new wb.datamodel.StatementList();
+                       var statements = [],
+                               lia = this._listview.listItemAdapter();
 
                        this._listview.items().each( function() {
                                var statementview = lia.liInstance( $( this ) ),
                                        statement = statementview.value();
                                if ( statement ) {
-                                       statementList.addItem( statement );
+                                       statements.push( statement );
                                }
                        } );
 
-                       return statementList;
+                       return new wb.datamodel.StatementList( statements );
                }
 
                this.option( 'value', statementList );
diff --git a/extensions/Wikibase/view/resources/jquery/wikibase/resources.php 
b/extensions/Wikibase/view/resources/jquery/wikibase/resources.php
index a52543f..83daa23 100644
--- a/extensions/Wikibase/view/resources/jquery/wikibase/resources.php
+++ b/extensions/Wikibase/view/resources/jquery/wikibase/resources.php
@@ -195,6 +195,8 @@
                                
'wikibase-entitytermsforlanguagelistview-description',
                                'wikibase-entitytermsforlanguagelistview-label',
                                
'wikibase-entitytermsforlanguagelistview-language',
+                               'wikibase-entitytermsforlanguagelistview-less',
+                               'wikibase-entitytermsforlanguagelistview-more',
                                
'wikibase-entitytermsforlanguageview-input-help-message',
                        ),
                ),
diff --git 
a/extensions/Wikibase/view/resources/jquery/wikibase/themes/default/jquery.wikibase.entitytermsforlanguagelistview.css
 
b/extensions/Wikibase/view/resources/jquery/wikibase/themes/default/jquery.wikibase.entitytermsforlanguagelistview.css
index 5abcafc..5e047a2 100644
--- 
a/extensions/Wikibase/view/resources/jquery/wikibase/themes/default/jquery.wikibase.entitytermsforlanguagelistview.css
+++ 
b/extensions/Wikibase/view/resources/jquery/wikibase/themes/default/jquery.wikibase.entitytermsforlanguagelistview.css
@@ -125,3 +125,7 @@
 .wikibase-entitytermsforlanguagelistview 
.wikibase-entitytermsforlanguagelistview-listview 
.wikibase-entitytermsforlanguageview 
.wikibase-entitytermsforlanguageview-aliases input:focus {
        border-color: #0b0080;
 }
+
+.wikibase-entitytermsview-entitytermsforlanguagelistview 
.wikibase-entitytermsforlanguagelistview-more {
+       padding: 0.4em;
+}
diff --git 
a/extensions/Wikibase/view/resources/jquery/wikibase/toolbar/controller/definitions/removetoolbar/statementview-snakview.js
 
b/extensions/Wikibase/view/resources/jquery/wikibase/toolbar/controller/definitions/removetoolbar/statementview-snakview.js
index 8fe335d..3f2318d 100644
--- 
a/extensions/Wikibase/view/resources/jquery/wikibase/toolbar/controller/definitions/removetoolbar/statementview-snakview.js
+++ 
b/extensions/Wikibase/view/resources/jquery/wikibase/toolbar/controller/definitions/removetoolbar/statementview-snakview.js
@@ -43,8 +43,8 @@
                                                listview = 
$snaklistviewNode.data( 'snaklistview' )._listview,
                                                lia = 
listview.listItemAdapter();
 
-                                       $.each( listview.items(), function( i, 
item ) {
-                                               var snakview = lia.liInstance( 
$( item ) );
+                                       listview.items().each( function() {
+                                               var snakview = lia.liInstance( 
$( this ) );
                                                
toolbarcontroller.destroyToolbar(
                                                        snakview.element.data( 
'removetoolbar' )
                                                );
@@ -63,8 +63,8 @@
                                                $statementview = 
$snaklistviewNode.closest( ':wikibase-statementview' ),
                                                statementview = 
$statementview.data( 'statementview' );
 
-                                       $.each( listview.items(), function( i, 
node ) {
-                                               var $snakview = $( node ),
+                                       listview.items().each( function() {
+                                               var $snakview = $( this ),
                                                        snakview = 
lia.liInstance( $snakview ),
                                                        removeToolbar = 
$snakview.data( 'removetoolbar' );
 
diff --git a/extensions/Wikibase/view/resources/wikibase/view/ViewFactory.js 
b/extensions/Wikibase/view/resources/wikibase/view/ViewFactory.js
index 2546931..f318fd3 100644
--- a/extensions/Wikibase/view/resources/wikibase/view/ViewFactory.js
+++ b/extensions/Wikibase/view/resources/wikibase/view/ViewFactory.js
@@ -170,26 +170,12 @@
         * @return {jQuery.wikibase.entitytermsview} The constructed entity 
terms view
         **/
        SELF.prototype.getEntityTermsView = function( fingerprint, $dom ) {
-               var value = $.map(
-                               this._userLanguages,
-                               function( language ) {
-                                       return {
-                                               language: language,
-                                               label: fingerprint.getLabelFor( 
language )
-                                                       || new 
wb.datamodel.Term( language, '' ),
-                                               description: 
fingerprint.getDescriptionFor( language )
-                                                       || new 
wb.datamodel.Term( language, '' ),
-                                               aliases: 
fingerprint.getAliasesFor( language )
-                                                       || new 
wb.datamodel.MultiTerm( language, [] )
-                                       };
-                               }
-                       );
-
                return this._getView(
                        'entitytermsview',
                        $dom,
                        {
-                               value: value,
+                               value: fingerprint,
+                               userLanguages: this._userLanguages,
                                entityChangersFactory: 
this._entityChangersFactory,
                                helpMessage: this._messageProvider.getMessage( 
'wikibase-entitytermsview-input-help-message' )
                        }
diff --git a/extensions/Wikibase/view/src/PropertyView.php 
b/extensions/Wikibase/view/src/PropertyView.php
index c2a0ab4..0f23b1a 100644
--- a/extensions/Wikibase/view/src/PropertyView.php
+++ b/extensions/Wikibase/view/src/PropertyView.php
@@ -3,9 +3,11 @@
 namespace Wikibase\View;
 
 use DataTypes\DataTypeFactory;
+use Html;
 use InvalidArgumentException;
 use Language;
 use Wikibase\DataModel\Entity\EntityDocument;
+use OutOfBoundsException;
 use Wikibase\DataModel\Entity\Property;
 use Wikibase\EntityRevision;
 use Wikibase\View\Template\TemplateFactory;
@@ -89,16 +91,25 @@
         * @return string HTML
         */
        private function getHtmlForDataType( $propertyType ) {
-               $dataType = $this->dataTypeFactory->getType( $propertyType );
 
-               return $this->templateFactory->render( 'wb-section-heading',
+               $html = $this->templateFactory->render( 'wb-section-heading',
                        wfMessage( 'wikibase-propertypage-datatype' 
)->escaped(),
                        'datatype',
                        'wikibase-propertypage-datatype'
-               )
-               . $this->templateFactory->render( 
'wikibase-propertyview-datatype',
-                       htmlspecialchars( $dataType->getLabel( 
$this->language->getCode() ) )
                );
+
+               try {
+                       $dataType = $this->dataTypeFactory->getType( 
$propertyType );
+                       $html .= $this->templateFactory->render( 
'wikibase-propertyview-datatype',
+                               htmlspecialchars( $dataType->getLabel( 
$this->language->getCode() ) )
+                       );
+               } catch ( OutOfBoundsException $ex ) {
+                       $html .= Html::rawElement( 'span', array( 'class' => 
'error' ),
+                               wfMessage( 
'wikibase-propertypage-bad-datatype', $propertyType )->parse()
+                       );
+               }
+
+               return $html;
        }
 
        /**
diff --git 
a/extensions/Wikibase/view/tests/qunit/jquery/wikibase/jquery.wikibase.entitytermsforlanguagelistview.tests.js
 
b/extensions/Wikibase/view/tests/qunit/jquery/wikibase/jquery.wikibase.entitytermsforlanguagelistview.tests.js
index ae8a969..3d142a6 100644
--- 
a/extensions/Wikibase/view/tests/qunit/jquery/wikibase/jquery.wikibase.entitytermsforlanguagelistview.tests.js
+++ 
b/extensions/Wikibase/view/tests/qunit/jquery/wikibase/jquery.wikibase.entitytermsforlanguagelistview.tests.js
@@ -6,36 +6,51 @@
 'use strict';
 
 /**
+ *  @return {Fingerprint}
+ */
+function createFingerprint() {
+       return new wb.datamodel.Fingerprint(
+               new wb.datamodel.TermMap( {
+                       de: new wb.datamodel.Term( 'de', 'de-label' ),
+                       en: new wb.datamodel.Term( 'en', 'en-label' ),
+                       fa: new wb.datamodel.Term( 'fa', 'fa-label' ),
+                       it: new wb.datamodel.Term( 'it', 'it-label' )
+               } ),
+               new wb.datamodel.TermMap( {
+                       de: new wb.datamodel.Term( 'de', 'de-description' ),
+                       en: new wb.datamodel.Term( 'en', 'en-description' ),
+                       fa: new wb.datamodel.Term( 'fa', 'fa-description' ),
+                       it: new wb.datamodel.Term( 'it', 'it-description' )
+               } ),
+               new wb.datamodel.MultiTermMap( {
+                       de: new wb.datamodel.MultiTerm( 'de', [] ),
+                       en: new wb.datamodel.MultiTerm( 'en', [] ),
+                       fa: new wb.datamodel.MultiTerm( 'fa', [] ),
+                       it: new wb.datamodel.MultiTerm( 'it', [] )
+               } )
+       );
+}
+
+/**
  * @param {Object} [options]
  * @return {jQuery}
  */
-var createEntitytermsforlanguagelistview = function( options ) {
+function createEntitytermsforlanguagelistview( options ) {
        options = $.extend( {
                entityChangersFactory: {
                        getAliasesChanger: function() { return 'I am an 
AliasesChanger'; },
                        getDescriptionsChanger: function() { return 'I am a 
DescriptionsChanger'; },
                        getLabelsChanger: function() { return 'I am a 
LabelsChanger'; }
                },
-               value: [
-                       {
-                               language: 'de',
-                               label: new wb.datamodel.Term( 'de', 'de-label' 
),
-                               description: new wb.datamodel.Term( 'de', 
'de-description' ),
-                               aliases: new wb.datamodel.MultiTerm( 'de', [] )
-                       }, {
-                               language: 'en',
-                               label: new wb.datamodel.Term( 'en', 'en-label' 
),
-                               description: new wb.datamodel.Term( 'en', 
'en-description' ),
-                               aliases: new wb.datamodel.MultiTerm( 'en', [] )
-                       }
-               ]
+               value: createFingerprint(),
+               userLanguages: [ 'de', 'en' ]
        }, options || {} );
 
        return $( '<table/>' )
                .appendTo( 'body' )
                .addClass( 'test_entitytermsforlanguagelistview' )
                .entitytermsforlanguagelistview( options );
-};
+}
 
 QUnit.module( 'jquery.wikibase.entitytermsforlanguagelistview', 
QUnit.newMwEnvironment( {
        teardown: function() {
@@ -84,8 +99,6 @@
        var view = createEntitytermsforlanguagelistview().data( 
'entitytermsforlanguagelistview' ),
                listview = view.$listview.data( 'listview' );
 
-       view.startEditing();
-
        assert.ok(
                view.isInitialValue(),
                'Verified isInitialValue() returning true.'
@@ -100,14 +113,17 @@
 
        assert.ok(
                view.isInitialValue(),
-               'Verified isInitialValue() still returning false after adding 
another unchanged value.'
+               'Verified isInitialValue()still returning false after adding 
another unchanged value.'
        );
 
-       listview.removeItem( $item );
+       // Replace the method with a fake that always acts like the value 
changed.
+       $item.data( 'entitytermsforlanguageview' ).isInitialValue = function() {
+               return false;
+       };
 
        assert.ok(
-               view.isInitialValue(),
-               'Verified isInitialValue() returning true after resetting to 
initial value.'
+               !view.isInitialValue(),
+               'Verified isInitialValue() returning false.'
        );
 } );
 
@@ -140,11 +156,8 @@
                entitytermsforlanguagelistview
                        = $entitytermsforlanguagelistview.data( 
'entitytermsforlanguagelistview' );
 
-       // TODO: Enhance test as soon as SiteLinkList is implemented in 
DataModelJavaScript and used
-       // as value object.
-       assert.equal(
-               entitytermsforlanguagelistview.value().length,
-               2,
+       assert.ok(
+               entitytermsforlanguagelistview.value().equals( 
createFingerprint() ),
                'Retrieved value.'
        );
 
diff --git 
a/extensions/Wikibase/view/tests/qunit/jquery/wikibase/jquery.wikibase.entitytermsview.tests.js
 
b/extensions/Wikibase/view/tests/qunit/jquery/wikibase/jquery.wikibase.entitytermsview.tests.js
index f2d0a1e..2292cb0 100644
--- 
a/extensions/Wikibase/view/tests/qunit/jquery/wikibase/jquery.wikibase.entitytermsview.tests.js
+++ 
b/extensions/Wikibase/view/tests/qunit/jquery/wikibase/jquery.wikibase.entitytermsview.tests.js
@@ -6,24 +6,36 @@
 'use strict';
 
 /**
+ *  @return {Fingerprint}
+ */
+function createFingerprint() {
+       return new wb.datamodel.Fingerprint(
+               new wb.datamodel.TermMap( {
+                       de: new wb.datamodel.Term( 'de', 'de-label' ),
+                       en: new wb.datamodel.Term( 'en', 'en-label' ),
+                       fa: new wb.datamodel.Term( 'fa', 'fa-label' )
+               } ),
+               new wb.datamodel.TermMap( {
+                       de: new wb.datamodel.Term( 'de', 'de-description' ),
+                       en: new wb.datamodel.Term( 'en', 'en-description' ),
+                       fa: new wb.datamodel.Term( 'fa', 'fa-description' )
+               } ),
+               new wb.datamodel.MultiTermMap( {
+                       de: new wb.datamodel.MultiTerm( 'de', [] ),
+                       en: new wb.datamodel.MultiTerm( 'en', [] ),
+                       fa: new wb.datamodel.MultiTerm( 'fa', [] )
+               } )
+       );
+}
+
+/**
  * @param {Object} [options]
  * @return {jQuery}
  */
-var createEntitytermsview = function( options ) {
+function createEntitytermsview( options ) {
        options = $.extend( {
-               value: [
-                       {
-                               language: 'de',
-                               label: new wb.datamodel.Term( 'de', 'de-label' 
),
-                               description: new wb.datamodel.Term( 'de', 
'de-description' ),
-                               aliases: new wb.datamodel.MultiTerm( 'de', [] )
-                       }, {
-                               language: 'en',
-                               label: new wb.datamodel.Term( 'en', 'en-label' 
),
-                               description: new wb.datamodel.Term( 'en', 
'en-description' ),
-                               aliases: new wb.datamodel.MultiTerm( 'en', [] )
-                       }
-               ],
+               value: createFingerprint(),
+               userLanguages: [ 'de', 'en' ],
                entityChangersFactory: {
                        getAliasesChanger: function() { return 'I am an 
AliasesChanger'; },
                        getDescriptionsChanger: function() { return 'I am a 
DescriptionsChanger'; },
@@ -35,7 +47,7 @@
                .appendTo( 'body' )
                .addClass( 'test_entitytermsview' )
                .entitytermsview( options );
-};
+}
 
 QUnit.module( 'jquery.wikibase.entitytermsview', QUnit.newMwEnvironment( {
        teardown: function() {
@@ -98,10 +110,8 @@
        var $entitytermsview = createEntitytermsview(),
                entitytermsview = $entitytermsview.data( 'entitytermsview' );
 
-       // TODO: Enhance test as soon as SiteLinkList is implemented in 
DataModelJavaScript
-       assert.equal(
-               entitytermsview.value().length,
-               2,
+       assert.ok(
+               entitytermsview.value().equals( createFingerprint() ),
                'Retrieved value.'
        );
 
diff --git 
a/extensions/Wikibase/view/tests/qunit/jquery/wikibase/toolbar/jquery.wikibase.movetoolbar.tests.js
 
b/extensions/Wikibase/view/tests/qunit/jquery/wikibase/toolbar/jquery.wikibase.movetoolbar.tests.js
index 4b677e9..5151bc1 100644
--- 
a/extensions/Wikibase/view/tests/qunit/jquery/wikibase/toolbar/jquery.wikibase.movetoolbar.tests.js
+++ 
b/extensions/Wikibase/view/tests/qunit/jquery/wikibase/toolbar/jquery.wikibase.movetoolbar.tests.js
@@ -69,8 +69,8 @@
        var $listview = createListview( listviewValue ),
                listview = $listview.data( 'listview' );
 
-       listview.items().each( function( i, itemNode ) {
-               $( itemNode ).movetoolbar( { listView: listview } );
+       listview.items().each( function() {
+               $( this ).movetoolbar( { listView: listview } );
        } );
 
        return $listview;
diff --git 
a/extensions/Wikibase/view/tests/qunit/wikibase/view/ViewFactory.tests.js 
b/extensions/Wikibase/view/tests/qunit/wikibase/view/ViewFactory.tests.js
index e6019c1..71e05eb 100644
--- a/extensions/Wikibase/view/tests/qunit/wikibase/view/ViewFactory.tests.js
+++ b/extensions/Wikibase/view/tests/qunit/wikibase/view/ViewFactory.tests.js
@@ -599,7 +599,8 @@
                viewFactory.getEntityTermsView( fingerprint, $dom );
 
                sinon.assert.calledWith( $.wikibase.entitytermsview, 
sinon.match( {
-                       value: [],
+                       value: fingerprint,
+                       userLanguages: userLanguages,
                        entityChangersFactory: entityChangersFactory,
                        helpMessage: message
                } ) );
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index 9f364bf..244fb00 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -1237,12 +1237,12 @@
         "source": {
             "type": "git",
             "url": 
"https://github.com/wikimedia/mediawiki-extensions-Wikibase.git";,
-            "reference": "42433e84d5a3ef35b6c7e3e2e7c0b25c30ec72cb"
+            "reference": "578154d93f7e76b51aabebf58a65a98f70aaae1b"
         },
         "dist": {
             "type": "zip",
-            "url": 
"https://api.github.com/repos/wikimedia/mediawiki-extensions-Wikibase/zipball/42433e84d5a3ef35b6c7e3e2e7c0b25c30ec72cb";,
-            "reference": "42433e84d5a3ef35b6c7e3e2e7c0b25c30ec72cb",
+            "url": 
"https://api.github.com/repos/wikimedia/mediawiki-extensions-Wikibase/zipball/578154d93f7e76b51aabebf58a65a98f70aaae1b";,
+            "reference": "578154d93f7e76b51aabebf58a65a98f70aaae1b",
             "shasum": ""
         },
         "require": {
@@ -1274,7 +1274,7 @@
             "jakub-onderka/php-parallel-lint": "0.9.2",
             "mediawiki/mediawiki-codesniffer": "0.4.0|0.5.0"
         },
-        "time": "2016-01-27 20:46:43",
+        "time": "2016-01-28 20:11:28",
         "type": "mediawiki-extension",
         "installation-source": "dist",
         "autoload": {

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

Gerrit-MessageType: merged
Gerrit-Change-Id: I0310bdd96308e0b20a5e373de8b16e8512a5d9a5
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikidata
Gerrit-Branch: master
Gerrit-Owner: WikidataBuilder <[email protected]>
Gerrit-Reviewer: Addshore <[email protected]>
Gerrit-Reviewer: Aude <[email protected]>
Gerrit-Reviewer: JanZerebecki <[email protected]>
Gerrit-Reviewer: Siebrand <[email protected]>
Gerrit-Reviewer: Tobias Gritschacher <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

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

Reply via email to