Merge "Remove Revision::getRevisionText from migrateArchiveText"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Mon, 23 Sep 2019 17:01:47 +0000 (17:01 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Mon, 23 Sep 2019 17:01:47 +0000 (17:01 +0000)
175 files changed:
.phan/config.php
includes/AjaxResponse.php
includes/Autopromote.php
includes/DefaultSettings.php
includes/EditPage.php
includes/FauxRequest.php
includes/GlobalFunctions.php
includes/Linker.php
includes/MediaWiki.php
includes/MovePage.php
includes/OutputPage.php
includes/PHPVersionCheck.php
includes/Permissions/PermissionManager.php
includes/ProtectionForm.php
includes/Revision/RevisionRecord.php
includes/Revision/RevisionStore.php
includes/Revision/RevisionStoreRecord.php
includes/Revision/SlotRoleHandler.php
includes/Setup.php
includes/Storage/PageEditStash.php
includes/Title.php
includes/Xml.php
includes/api/ApiBase.php
includes/api/ApiErrorFormatter.php
includes/api/ApiQueryLogEvents.php
includes/api/ApiTag.php
includes/api/ApiUpload.php
includes/api/i18n/lt.json
includes/api/i18n/ru.json
includes/api/i18n/zh-hant.json
includes/block/BlockManager.php
includes/cache/localisation/LocalisationCache.php
includes/changes/ChangesList.php
includes/changes/OldChangesList.php
includes/export/Dump7ZipOutput.php
includes/export/DumpFileOutput.php
includes/export/DumpFilter.php
includes/export/DumpOutput.php
includes/export/DumpPipeOutput.php
includes/filerepo/file/ArchivedFile.php
includes/htmlform/HTMLForm.php
includes/htmlform/fields/HTMLTitleTextField.php
includes/htmlform/fields/HTMLUserTextField.php
includes/http/HttpRequestFactory.php
includes/import/WikiRevision.php
includes/libs/filebackend/SwiftFileBackend.php
includes/logging/LogPager.php
includes/mail/UserMailer.php
includes/page/Article.php
includes/page/MovePageFactory.php
includes/parser/PPDPart_Hash.php
includes/site/MediaWikiSite.php
includes/site/Site.php
includes/site/SiteImporter.php
includes/skins/BaseTemplate.php
includes/specialpage/LoginSignupSpecialPage.php
includes/specials/SpecialConfirmEmail.php
includes/specials/SpecialEditTags.php
includes/specials/SpecialImport.php
includes/specials/SpecialPagesWithProp.php
includes/specials/SpecialRevisionDelete.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUpload.php
includes/specials/SpecialUserrights.php
languages/i18n/bg.json
languages/i18n/bn.json
languages/i18n/ce.json
languages/i18n/cs.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/exif/tt-cyrl.json
languages/i18n/exif/zh-hans.json
languages/i18n/fr.json
languages/i18n/he.json
languages/i18n/hr.json
languages/i18n/hu.json
languages/i18n/ia.json
languages/i18n/it.json
languages/i18n/ko.json
languages/i18n/lt.json
languages/i18n/min.json
languages/i18n/nds-nl.json
languages/i18n/nqo.json
languages/i18n/pt-br.json
languages/i18n/qqq.json
languages/i18n/ro.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/sat.json
languages/i18n/sh.json
languages/i18n/sk.json
languages/i18n/sl.json
languages/i18n/uk.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
maintenance/addChangeTag.php
maintenance/changePassword.php
maintenance/cleanupCaps.php
maintenance/copyFileBackend.php
maintenance/createAndPromote.php
maintenance/edit.php
maintenance/importDump.php
maintenance/importImages.php
maintenance/install.php
maintenance/moveBatch.php
maintenance/refreshFileHeaders.php
resources/src/jquery/jquery.makeCollapsible.js
resources/src/mediawiki.legacy/shared.css
resources/src/mediawiki.page.gallery.slideshow.js
resources/src/mediawiki.page.image.pagination.js
resources/src/mediawiki.ui/components/forms.less
tests/phpunit/MediaWikiCoversValidator.php
tests/phpunit/MediaWikiIntegrationTestCase.php
tests/phpunit/MediaWikiTestCaseTrait.php
tests/phpunit/includes/EditPageTest.php
tests/phpunit/includes/FauxRequestTest.php
tests/phpunit/includes/HtmlTest.php
tests/phpunit/includes/LinkerTest.php
tests/phpunit/includes/MediaWikiServicesTest.php
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/Revision/McrRevisionStoreDbTest.php
tests/phpunit/includes/Revision/RevisionStoreDbTestBase.php
tests/phpunit/includes/SiteStatsTest.php
tests/phpunit/includes/Storage/DerivedPageDataUpdaterTest.php
tests/phpunit/includes/TitleMethodsTest.php
tests/phpunit/includes/XmlTest.php
tests/phpunit/includes/api/ApiPageSetTest.php
tests/phpunit/includes/api/ApiQueryWatchlistIntegrationTest.php
tests/phpunit/includes/api/ApiQueryWatchlistRawIntegrationTest.php
tests/phpunit/includes/api/ApiWatchTest.php
tests/phpunit/includes/auth/AuthManagerTest.php
tests/phpunit/includes/block/BlockRestrictionStoreTest.php
tests/phpunit/includes/block/DatabaseBlockTest.php
tests/phpunit/includes/cache/MessageCacheTest.php
tests/phpunit/includes/changes/CategoryMembershipChangeTest.php
tests/phpunit/includes/changes/EnhancedChangesListTest.php
tests/phpunit/includes/changes/RCCacheEntryFactoryTest.php
tests/phpunit/includes/content/ContentHandlerTest.php
tests/phpunit/includes/content/UnknownContentHandlerTest.php
tests/phpunit/includes/content/UnknownContentTest.php
tests/phpunit/includes/content/WikitextContentHandlerTest.php
tests/phpunit/includes/context/RequestContextTest.php
tests/phpunit/includes/db/LBFactoryTest.php
tests/phpunit/includes/deferred/SiteStatsUpdateTest.php
tests/phpunit/includes/filebackend/FileBackendTest.php
tests/phpunit/includes/filerepo/file/LocalFileTest.php
tests/phpunit/includes/http/GuzzleHttpRequestTest.php
tests/phpunit/includes/http/HttpTest.php
tests/phpunit/includes/jobqueue/JobQueueTest.php
tests/phpunit/includes/jobqueue/jobs/ClearUserWatchlistJobTest.php
tests/phpunit/includes/libs/ProcessCacheLRUTest.php
tests/phpunit/includes/libs/TimingTest.php
tests/phpunit/includes/libs/objectcache/HashBagOStuffTest.php
tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php
tests/phpunit/includes/libs/rdbms/database/DatabaseSQLTest.php
tests/phpunit/includes/libs/rdbms/database/DatabaseTest.php
tests/phpunit/includes/linker/LinkRendererTest.php
tests/phpunit/includes/media/JpegPixelFormatTest.php
tests/phpunit/includes/media/PNGMetadataExtractorTest.php
tests/phpunit/includes/page/WikiPageDbTestBase.php
tests/phpunit/includes/resourceloader/ResourceLoaderTest.php
tests/phpunit/includes/search/SearchNearMatchResultSetTest.php
tests/phpunit/includes/shell/ShellTest.php
tests/phpunit/includes/site/CachingSiteStoreTest.php
tests/phpunit/includes/site/DBSiteStoreTest.php
tests/phpunit/includes/site/SiteTest.php
tests/phpunit/includes/user/UserTest.php
tests/phpunit/includes/watcheditem/WatchedItemStoreUnitTest.php
tests/phpunit/integration/includes/db/DatabaseSqliteTest.php
tests/phpunit/languages/LanguageTest.php
tests/phpunit/maintenance/DumpTestCase.php
tests/phpunit/unit/includes/diff/DiffOpTest.php
tests/phpunit/unit/includes/password/PasswordFactoryTest.php
tests/phpunit/unit/includes/search/SearchSuggestionSetTest.php
tests/selenium/wdio.conf.js

index 56a8ccb..0fdefe0 100644 (file)
@@ -101,9 +101,6 @@ $cfg['suppress_issue_types'] = array_merge( $cfg['suppress_issue_types'], [
        //after dropping HHVM
        // approximate error count: 110
        "PhanParamTooMany", // False positives with variargs. Unsuppress after dropping HHVM
-
-       // approximate error count: 45
-       "PhanTypeMismatchArgument",
 ] );
 
 // This helps a lot in discovering bad code, but unfortunately it will always fail for
index 0664652..faff021 100644 (file)
@@ -55,7 +55,7 @@ class AjaxResponse {
 
        /**
         * HTTP response code
-        * @var string $mResponseCode
+        * @var int|string $mResponseCode
         */
        private $mResponseCode;
 
@@ -114,7 +114,7 @@ class AjaxResponse {
 
        /**
         * Set the HTTP response code
-        * @param string $code
+        * @param int|string $code
         */
        function setResponseCode( $code ) {
                $this->mResponseCode = $code;
index 2156787..f8f3c24 100644 (file)
@@ -187,10 +187,10 @@ class Autopromote {
                                }
                                return $user->getEditCount() >= $reqEditCount;
                        case APCOND_AGE:
-                               $age = time() - wfTimestampOrNull( TS_UNIX, $user->getRegistration() );
+                               $age = time() - (int)wfTimestampOrNull( TS_UNIX, $user->getRegistration() );
                                return $age >= $cond[1];
                        case APCOND_AGE_FROM_EDIT:
-                               $age = time() - wfTimestampOrNull( TS_UNIX, $user->getFirstEditTimestamp() );
+                               $age = time() - (int)wfTimestampOrNull( TS_UNIX, $user->getFirstEditTimestamp() );
                                return $age >= $cond[1];
                        case APCOND_INGROUPS:
                                $groups = array_slice( $cond, 1 );
index fd1affc..1068700 100644 (file)
@@ -9094,6 +9094,13 @@ $wgSpecialSearchFormOptions = [];
  */
 $wgNativeImageLazyLoading = false;
 
+/**
+ * Option to whether serve the main page as the domain root
+ * @since 1.34
+ * @var bool
+ */
+$wgMainPageIsDomainRoot = false;
+
 /**
  * For really cool vim folding this needs to be at the end:
  * vim: foldmarker=@{,@} foldmethod=marker
index d047f6e..fe00149 100644 (file)
@@ -1156,7 +1156,7 @@ class EditPage {
                        $out->showErrorPage(
                                'modeleditnotsupported-title',
                                'modeleditnotsupported-text',
-                               $modelName
+                               [ $modelName ]
                        );
                        return false;
                }
@@ -1188,7 +1188,7 @@ class EditPage {
        /**
         * @param Content|null $def_content The default value to return
         *
-        * @return Content|null Content on success, $def_content for invalid sections
+        * @return Content|false|null Content on success, $def_content for invalid sections
         *
         * @since 1.21
         */
@@ -1683,7 +1683,9 @@ class EditPage {
                        case self::AS_CANNOT_USE_CUSTOM_MODEL:
                        case self::AS_PARSE_ERROR:
                        case self::AS_UNICODE_NOT_SUPPORTED:
-                               $out->wrapWikiTextAsInterface( 'error', $status->getWikiText() );
+                               $out->wrapWikiTextAsInterface( 'error',
+                                       $status->getWikiText( false, false, $this->context->getLanguage() )
+                               );
                                return true;
 
                        case self::AS_SUCCESS_NEW_ARTICLE:
@@ -1757,7 +1759,8 @@ class EditPage {
                                // is if an extension hook aborted from inside ArticleSave.
                                // Render the status object into $this->hookError
                                // FIXME this sucks, we should just use the Status object throughout
-                               $this->hookError = '<div class="error">' . "\n" . $status->getWikiText() .
+                               $this->hookError = '<div class="error">' . "\n" .
+                                       $status->getWikiText( false, false, $this->context->getLanguage() ) .
                                        '</div>';
                                return true;
                }
index 78f6ca9..9337270 100644 (file)
@@ -86,14 +86,6 @@ class FauxRequest extends WebRequest {
                return (string)$this->getVal( $name, $default );
        }
 
-       /**
-        * @return array
-        * @suppress PhanParamSignatureMismatch
-        */
-       public function getValues() {
-               return $this->data;
-       }
-
        /**
         * @return array
         */
index 2ed385e..125b917 100644 (file)
@@ -2031,7 +2031,7 @@ function wfRecursiveRemoveDir( $dir ) {
  */
 function wfPercent( $nr, $acc = 2, $round = true ) {
        $ret = sprintf( "%.${acc}f", $nr );
-       return $round ? round( $ret, $acc ) . '%' : "$ret%";
+       return $round ? round( (float)$ret, $acc ) . '%' : "$ret%";
 }
 
 /**
@@ -2794,7 +2794,7 @@ function wfMemoryLimit( $newLimit ) {
 function wfTransactionalTimeLimit() {
        global $wgTransactionalTimeLimit;
 
-       $timeLimit = ini_get( 'max_execution_time' );
+       $timeLimit = (int)ini_get( 'max_execution_time' );
        // Note that CLI scripts use 0
        if ( $timeLimit > 0 && $wgTransactionalTimeLimit > $timeLimit ) {
                set_time_limit( $wgTransactionalTimeLimit );
index 324b1f5..864019d 100644 (file)
@@ -891,7 +891,7 @@ class Linker {
         * Make user link (or user contributions for unregistered users)
         * @param int $userId User id in database.
         * @param string $userName User name in database.
-        * @param string $altUserName Text to display instead of the user name (optional)
+        * @param string|false $altUserName Text to display instead of the user name (optional)
         * @return string HTML fragment
         * @since 1.16.3. $altUserName was added in 1.19.
         */
@@ -1912,7 +1912,7 @@ class Linker {
         * @since 1.16.3. $context added in 1.20. $editCount added in 1.21
         * @param Revision $rev
         * @param IContextSource|null $context Context to use or null for the main context.
-        * @param int $editCount Number of edits that would be reverted
+        * @param int|false $editCount Number of edits that would be reverted
         * @return string HTML fragment
         */
        public static function buildRollbackLink( $rev, IContextSource $context = null,
index f91477a..28c9e16 100644 (file)
@@ -346,6 +346,10 @@ class MediaWiki {
                        return false;
                }
 
+               if ( $this->config->get( 'MainPageIsDomainRoot' ) && $request->getRequestURL() === '/' ) {
+                       return false;
+               }
+
                if ( $title->isSpecialPage() ) {
                        list( $name, $subpage ) = MediaWikiServices::getInstance()->getSpecialPageFactory()->
                                resolveAlias( $title->getDBkey() );
index 634e7af..59baae7 100644 (file)
@@ -83,7 +83,7 @@ class MovePage {
         * @param ServiceOptions|null $options
         * @param ILoadBalancer|null $loadBalancer
         * @param NamespaceInfo|null $nsInfo
-        * @param WatchedItemStore|null $watchedItems
+        * @param WatchedItemStoreInterface|null $watchedItems
         * @param PermissionManager|null $permMgr
         */
        public function __construct(
index c9b4193..acf2d25 100644 (file)
@@ -50,7 +50,7 @@ class OutputPage extends ContextSource {
        /** @var array */
        protected $mLinktags = [];
 
-       /** @var bool */
+       /** @var string|bool */
        protected $mCanonicalUrl = false;
 
        /**
@@ -2147,7 +2147,7 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Get TTL in [$minTTL,$maxTTL] in pass it to lowerCdnMaxage()
+        * Get TTL in [$minTTL,$maxTTL] and pass it to lowerCdnMaxage()
         *
         * This sets and returns $minTTL if $mtime is false or null. Otherwise,
         * the TTL is higher the older the $mtime timestamp is. Essentially, the
@@ -2163,10 +2163,10 @@ class OutputPage extends ContextSource {
                $maxTTL = $maxTTL ?: $this->getConfig()->get( 'CdnMaxAge' );
 
                if ( $mtime === null || $mtime === false ) {
-                       return $minTTL; // entity does not exist
+                       return; // entity does not exist
                }
 
-               $age = MWTimestamp::time() - wfTimestamp( TS_UNIX, $mtime );
+               $age = MWTimestamp::time() - (int)wfTimestamp( TS_UNIX, $mtime );
                $adaptiveTTL = max( 0.9 * $age, $minTTL );
                $adaptiveTTL = min( $adaptiveTTL, $maxTTL );
 
@@ -2270,7 +2270,7 @@ class OutputPage extends ContextSource {
        /**
         * Return a Link: header. Based on the values of $mLinkHeader.
         *
-        * @return string
+        * @return string|false
         */
        public function getLinkHeader() {
                if ( !$this->mLinkHeader ) {
@@ -2602,7 +2602,7 @@ class OutputPage extends ContextSource {
         * and optionally an custom HTML title (content of the "<title>" tag).
         *
         * @param string|Message $pageTitle Will be passed directly to setPageTitle()
-        * @param string|Message $htmlTitle Will be passed directly to setHTMLTitle();
+        * @param string|Message|false $htmlTitle Will be passed directly to setHTMLTitle();
         *                   optional, if not passed the "<title>" attribute will be
         *                   based on $pageTitle
         */
@@ -3283,7 +3283,7 @@ class OutputPage extends ContextSource {
                        $vars['wgUserId'] = $user->getId();
                        $vars['wgUserEditCount'] = $user->getEditCount();
                        $userReg = $user->getRegistration();
-                       $vars['wgUserRegistration'] = $userReg ? wfTimestamp( TS_UNIX, $userReg ) * 1000 : null;
+                       $vars['wgUserRegistration'] = $userReg ? (int)wfTimestamp( TS_UNIX, $userReg ) * 1000 : null;
                        // Get the revision ID of the oldest new message on the user's talk
                        // page. This can be used for constructing new message alerts on
                        // the client side.
index e726729..8d642e1 100644 (file)
@@ -77,8 +77,8 @@ class PHPVersionCheck {
        /**
         * Return the version of the installed PHP implementation.
         *
-        * @param string $impl By default, the function returns the info of the currently installed PHP
-        *  implementation. Using this parameter the caller can decide, what version info will be
+        * @param string|false $impl By default, the function returns the info of the currently installed
+        *  PHP implementation. Using this parameter the caller can decide, what version info will be
         *  returned. Valid values: HHVM, PHP
         * @return array An array of information about the PHP implementation, containing:
         *  - 'version': The version of the PHP implementation (specific to the implementation, not
@@ -258,7 +258,7 @@ HTML;
        <head>
                <meta charset="UTF-8" />
                <title>MediaWiki {$this->mwVersion}</title>
-               <style media='screen'>
+               <style media="screen">
                        body {
                                color: #000;
                                background-color: #fff;
@@ -266,7 +266,7 @@ HTML;
                                padding: 2em;
                                text-align: center;
                        }
-                       p, img, h1, h2, ul  {
+                       p, img, h1, h2, ul {
                                text-align: left;
                                margin: 0.5em 0 1em;
                        }
@@ -279,9 +279,9 @@ HTML;
                </style>
        </head>
        <body>
-               <img src="{$encLogo}" alt='The MediaWiki logo' />
+               <img src="{$encLogo}" alt="The MediaWiki logo" />
                <h1>MediaWiki {$this->mwVersion} internal error</h1>
-               <div class='error'>
+               <div class="error">
                <p>
                        {$shortHtml}
                </p>
index 0a8e515..ef6b8ac 100644 (file)
@@ -97,7 +97,7 @@ class PermissionManager {
         */
        private $temporaryUserRights = [];
 
-       /** @var string[] Cached rights for isEveryoneAllowed */
+       /** @var bool[] Cached rights for isEveryoneAllowed, [ right => allowed ] */
        private $cachedRights = [];
 
        /**
index a1be271..3e639b9 100644 (file)
@@ -333,7 +333,9 @@ class ProtectionForm {
                );
 
                if ( !$status->isOK() ) {
-                       $this->show( $out->parseInlineAsInterface( $status->getWikiText() ) );
+                       $this->show( $out->parseInlineAsInterface(
+                               $status->getWikiText( false, false, $this->mContext->getLanguage() )
+                       ) );
                        return false;
                }
 
index 759180a..cf35371 100644 (file)
@@ -59,7 +59,7 @@ abstract class RevisionRecord {
        const FOR_THIS_USER = 2;
        const RAW = 3;
 
-       /** @var string Wiki ID; false means the current wiki */
+       /** @var string|false Wiki ID; false means the current wiki */
        protected $mWiki = false;
        /** @var int|null */
        protected $mId;
index 735a212..3ecef76 100644 (file)
@@ -1623,10 +1623,18 @@ class RevisionStore
         * @param object[]|IResultWrapper $slotRows
         * @param int $queryFlags
         * @param Title $title
+        * @param array|null $slotContents a map from blobAddress to slot
+        *      content blob or Content object.
         *
         * @return SlotRecord[]
         */
-       private function constructSlotRecords( $revId, $slotRows, $queryFlags, Title $title ) {
+       private function constructSlotRecords(
+               $revId,
+               $slotRows,
+               $queryFlags,
+               Title $title,
+               $slotContents = null
+       ) {
                $slots = [];
 
                foreach ( $slotRows as $row ) {
@@ -1651,8 +1659,15 @@ class RevisionStore
                                        = $this->emulateContentId( intval( $row->rev_text_id ) );
                        }
 
-                       $contentCallback = function ( SlotRecord $slot ) use ( $queryFlags ) {
-                               return $this->loadSlotContent( $slot, null, null, null, $queryFlags );
+                       $contentCallback = function ( SlotRecord $slot ) use ( $slotContents, $queryFlags ) {
+                               $blob = null;
+                               if ( isset( $slotContents[$slot->getAddress()] ) ) {
+                                       $blob = $slotContents[$slot->getAddress()];
+                                       if ( $blob instanceof Content ) {
+                                               return $blob;
+                                       }
+                               }
+                               return $this->loadSlotContent( $slot, $blob, null, null, $queryFlags );
                        };
 
                        $slots[$row->role_name] = new SlotRecord( $row, $contentCallback );
@@ -1804,8 +1819,10 @@ class RevisionStore
 
        /**
         * @param object $row A database row generated from a query based on getQueryInfo()
-        * @param null|object[] $slotRows Database rows generated from a query based on
-        *        getSlotsQueryInfo with the 'content' flag set.
+        * @param null|object[]|RevisionSlots $slots
+        *      - Database rows generated from a query based on getSlotsQueryInfo
+        *        with the 'content' flag set. Or
+        *  - RevisionSlots instance
         * @param int $queryFlags
         * @param Title|null $title
         * @param bool $fromCache if true, the returned RevisionRecord will ensure that no stale
@@ -1816,11 +1833,10 @@ class RevisionStore
         * @see RevisionFactory::newRevisionFromRow
         *
         * MCR migration note: this replaces Revision::newFromRow
-        *
         */
        public function newRevisionFromRowAndSlots(
                $row,
-               $slotRows,
+               $slots,
                $queryFlags = 0,
                Title $title = null,
                $fromCache = false
@@ -1857,7 +1873,9 @@ class RevisionStore
                // Legacy because $row may have come from self::selectFields()
                $comment = $this->commentStore->getCommentLegacy( $db, 'rev_comment', $row, true );
 
-               $slots = $this->newRevisionSlots( $row->rev_id, $row, $slotRows, $queryFlags, $title );
+               if ( !( $slots instanceof RevisionSlots ) ) {
+                       $slots = $this->newRevisionSlots( $row->rev_id, $row, $slots, $queryFlags, $title );
+               }
 
                // If this is a cached row, instantiate a cache-aware revision class to avoid stale data.
                if ( $fromCache ) {
@@ -1887,7 +1905,7 @@ class RevisionStore
         *               loaded immediately. Supports falsy or truthy value as well
         *               as an explicit list of slot role names.
         *               'content'- whether the actual content of the slots should be
-        *               preloaded. TODO: no supported yet.
+        *               preloaded.
         * @param int $queryFlags
         * @param Title|null $title
         * @return StatusValue a status with a RevisionRecord[] of successfully fetched revisions
@@ -1957,24 +1975,40 @@ class RevisionStore
                        }, $options['slots'] );
                }
 
-               // TODO: Support optional fetching of the content
-               $queryInfo = self::getSlotsQueryInfo( [ 'content' ] );
+               // We need to set the `content` flag because newRevisionFromRowAndSlots requires content
+               // metadata to be loaded.
+               $slotQueryInfo = self::getSlotsQueryInfo( [ 'content' ] );
                $db = $this->getDBConnectionRefForQueryFlags( $queryFlags );
                $slotRows = $db->select(
-                       $queryInfo['tables'],
-                       $queryInfo['fields'],
+                       $slotQueryInfo['tables'],
+                       $slotQueryInfo['fields'],
                        $slotQueryConds,
                        __METHOD__,
                        [],
-                       $queryInfo['joins']
+                       $slotQueryInfo['joins']
                );
 
                $slotRowsByRevId = [];
                foreach ( $slotRows as $slotRow ) {
                        $slotRowsByRevId[$slotRow->slot_revision_id][] = $slotRow;
                }
+
+               $slotContents = null;
+               if ( $options['content'] ?? false ) {
+                       $blobAddresses = [];
+                       foreach ( $slotRows as $slotRow ) {
+                               $blobAddresses[] = $slotRow->content_address;
+                       }
+                       $slotContentFetchStatus = $this->blobStore
+                               ->getBlobBatch( $blobAddresses, $queryFlags );
+                       foreach ( $slotContentFetchStatus->getErrors() as $error ) {
+                               $result->warning( $error['message'], ...$error['params'] );
+                       }
+                       $slotContents = $slotContentFetchStatus->getValue();
+               }
+
                $result->setResult( true, array_map( function ( $row ) use
-                       ( $slotRowsByRevId, $queryFlags, $titlesByPageId, $result ) {
+                       ( $slotRowsByRevId, $queryFlags, $titlesByPageId, $slotContents, $result ) {
                                if ( !isset( $slotRowsByRevId[$row->rev_id] ) ) {
                                        $result->warning(
                                                'internalerror',
@@ -1985,7 +2019,15 @@ class RevisionStore
                                try {
                                        return $this->newRevisionFromRowAndSlots(
                                                $row,
-                                               $slotRowsByRevId[$row->rev_id],
+                                               new RevisionSlots(
+                                                       $this->constructSlotRecords(
+                                                               $row->rev_id,
+                                                               $slotRowsByRevId[$row->rev_id],
+                                                               $queryFlags,
+                                                               $titlesByPageId[$row->rev_page],
+                                                               $slotContents
+                                                       )
+                                               ),
                                                $queryFlags,
                                                $titlesByPageId[$row->rev_page]
                                        );
index 469e494..dabf62b 100644 (file)
@@ -151,7 +151,7 @@ class RevisionStoreRecord extends RevisionRecord {
 
        /**
         * @throws RevisionAccessException if the size was unknown and could not be calculated.
-        * @return string The nominal revision size, never null. May be computed on the fly.
+        * @return int The nominal revision size, never null. May be computed on the fly.
         */
        public function getSize() {
                // If length is null, calculate and remember it (potentially SLOW!).
index 85b4c5a..7c2623b 100644 (file)
@@ -150,7 +150,7 @@ class SlotRoleHandler {
         *
         * The default implementation always returns false.
         *
-        * @return string
+        * @return bool
         */
        public function supportsArticleCount() {
                return false;
index 6838c37..d450bdd 100644 (file)
@@ -728,7 +728,7 @@ if ( is_null( $wgLocaltimezone ) ) {
 
 date_default_timezone_set( $wgLocaltimezone );
 if ( is_null( $wgLocalTZoffset ) ) {
-       $wgLocalTZoffset = date( 'Z' ) / 60;
+       $wgLocalTZoffset = (int)date( 'Z' ) / 60;
 }
 // The part after the System| is ignored, but rest of MW fills it
 // out as the local offset.
index a0ef07d..826d526 100644 (file)
@@ -231,7 +231,7 @@ class PageEditStash {
                        return false;
                }
 
-               $age = time() - wfTimestamp( TS_UNIX, $editInfo->output->getCacheTime() );
+               $age = time() - (int)wfTimestamp( TS_UNIX, $editInfo->output->getCacheTime() );
                $context['age'] = $age;
 
                $isCacheUsable = true;
@@ -450,7 +450,7 @@ class PageEditStash {
        ) {
                // If an item is renewed, mind the cache TTL determined by config and parser functions.
                // Put an upper limit on the TTL for sanity to avoid extreme template/file staleness.
-               $age = time() - wfTimestamp( TS_UNIX, $parserOutput->getCacheTime() );
+               $age = time() - (int)wfTimestamp( TS_UNIX, $parserOutput->getCacheTime() );
                $ttl = min( $parserOutput->getCacheExpiry() - $age, self::MAX_CACHE_TTL );
                // Avoid extremely stale user signature timestamps (T84843)
                if ( $parserOutput->getFlag( 'user-signature' ) ) {
index 0f5c384..6c15a06 100644 (file)
@@ -2062,7 +2062,7 @@ class Title implements LinkTarget, IDBAccessObject {
         *
         * @see self::getLocalURL for the arguments.
         * @see wfExpandUrl
-        * @param string|string[] $query
+        * @param string|array $query
         * @param string|string[]|bool $query2
         * @param string|int|null $proto Protocol type to use in URL
         * @return string The URL
@@ -2123,7 +2123,7 @@ class Title implements LinkTarget, IDBAccessObject {
         *  valid to link, locally, to the current Title.
         * @see self::newFromText to produce a Title object.
         *
-        * @param string|string[] $query An optional query string,
+        * @param string|array $query An optional query string,
         *   not used for interwiki links. Can be specified as an associative array as well,
         *   e.g., [ 'action' => 'edit' ] (keys and values will be URL-escaped).
         *   Some query patterns will trigger various shorturl path replacements.
@@ -2137,7 +2137,7 @@ class Title implements LinkTarget, IDBAccessObject {
         * @return string String of the URL.
         */
        public function getLocalURL( $query = '', $query2 = false ) {
-               global $wgArticlePath, $wgScript, $wgServer, $wgRequest;
+               global $wgArticlePath, $wgScript, $wgServer, $wgRequest, $wgMainPageIsDomainRoot;
 
                $query = self::fixUrlQueryArgs( $query, $query2 );
 
@@ -2214,6 +2214,11 @@ class Title implements LinkTarget, IDBAccessObject {
                                $url = $wgServer . $url;
                        }
                }
+
+               if ( $wgMainPageIsDomainRoot && $this->isMainPage() && $query === '' ) {
+                       return '/';
+               }
+
                // Avoid PHP 7.1 warning from passing $this by reference
                $titleRef = $this;
                Hooks::run( 'GetLocalURL', [ &$titleRef, &$url, $query ] );
@@ -2258,7 +2263,7 @@ class Title implements LinkTarget, IDBAccessObject {
         * protocol-relative, the URL will be expanded to http://
         *
         * @see self::getLocalURL for the arguments.
-        * @param string|string[] $query
+        * @param string|array $query
         * @param string|bool $query2 Deprecated
         * @return string The URL
         */
@@ -2281,7 +2286,7 @@ class Title implements LinkTarget, IDBAccessObject {
         * NOTE: Unlike getInternalURL(), the canonical URL includes the fragment
         *
         * @see self::getLocalURL for the arguments.
-        * @param string|string[] $query
+        * @param string|array $query
         * @param string|bool $query2 Deprecated
         * @return string The URL
         * @since 1.18
index febf03e..b368a13 100644 (file)
@@ -266,7 +266,7 @@ class Xml {
        /**
         * Convenience function to build an HTML text input field
         * @param string $name Value of the name attribute
-        * @param int $size Value of the size attribute
+        * @param int|false $size Value of the size attribute
         * @param mixed $value Value of the value attribute
         * @param array $attribs Other attributes
         * @return string HTML
@@ -289,7 +289,7 @@ class Xml {
        /**
         * Convenience function to build an HTML password input field
         * @param string $name Value of the name attribute
-        * @param int $size Value of the size attribute
+        * @param int|false $size Value of the size attribute
         * @param mixed $value Value of the value attribute
         * @param array $attribs Other attributes
         * @return string HTML
@@ -600,7 +600,7 @@ class Xml {
         *
         * @param string|bool $legend Legend of the fieldset. If evaluates to false,
         *   legend is not added.
-        * @param string $content Pre-escaped content for the fieldset. If false,
+        * @param string|false $content Pre-escaped content for the fieldset. If false,
         *   only open fieldset is returned.
         * @param array $attribs Any attributes to fieldset-element.
         *
index 056d10c..7518008 100644 (file)
@@ -1585,6 +1585,7 @@ abstract class ApiBase extends ContextSource {
                                'integeroutofrange',
                                [ 'min' => $min, 'max' => $max, 'botMax' => $botMax ?: $max ]
                        );
+                       // @phan-suppress-next-line PhanTypeMismatchArgument
                        $this->warnOrDie( $msg, $enforceLimits );
                        $value = $min;
                }
@@ -1606,6 +1607,7 @@ abstract class ApiBase extends ContextSource {
                                                'integeroutofrange',
                                                [ 'min' => $min, 'max' => $max, 'botMax' => $botMax ?: $max ]
                                        );
+                                       // @phan-suppress-next-line PhanTypeMismatchArgument
                                        $this->warnOrDie( $msg, $enforceLimits );
                                        $value = $botMax;
                                }
@@ -1616,6 +1618,7 @@ abstract class ApiBase extends ContextSource {
                                        'integeroutofrange',
                                        [ 'min' => $min, 'max' => $max, 'botMax' => $botMax ?: $max ]
                                );
+                               // @phan-suppress-next-line PhanTypeMismatchArgument
                                $this->warnOrDie( $msg, $enforceLimits );
                                $value = $max;
                        }
@@ -2022,6 +2025,7 @@ abstract class ApiBase extends ContextSource {
         */
        public function dieWithException( $exception, array $options = [] ) {
                $this->dieWithError(
+                       // @phan-suppress-next-line PhanTypeMismatchArgument
                        $this->getErrorFormatter()->getMessageFromException( $exception, $options )
                );
        }
@@ -2464,6 +2468,7 @@ abstract class ApiBase extends ContextSource {
                                        if ( $m ) {
                                                $m = new ApiHelpParamValueMessage(
                                                        $value,
+                                                       // @phan-suppress-next-line PhanTypeMismatchArgument
                                                        [ $m->getKey(), 'api-help-param-no-description' ],
                                                        $m->getParams(),
                                                        isset( $deprecatedValues[$value] )
index 81ee9b9..9dfd370 100644 (file)
@@ -237,6 +237,7 @@ class ApiErrorFormatter {
         */
        public function formatException( $exception, array $options = [] ) {
                return $this->formatMessage(
+                       // @phan-suppress-next-line PhanTypeMismatchArgument
                        $this->getMessageFromException( $exception, $options ),
                        $options['format'] ?? null
                );
index 47a6f87..2c19c7d 100644 (file)
@@ -186,6 +186,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
 
                        // T71222: MariaDB's optimizer, at least 10.1.37 and .38, likes to choose a wildly bad plan for
                        // some reason for this code path. Tell it not to use the wrong index it wants to pick.
+                       // @phan-suppress-next-line PhanTypeMismatchArgument
                        $this->addOption( 'IGNORE INDEX', [ 'logging' => [ 'times' ] ] );
                }
 
index bb6c580..f2b52cd 100644 (file)
@@ -96,6 +96,7 @@ class ApiTag extends ApiBase {
                                $valid = RecentChange::newFromId( $id );
                                if ( $valid && $this->getPermissionManager()->isBlockedFrom( $user, $valid->getTitle() ) ) {
                                        $idResult['status'] = 'error';
+                                       // @phan-suppress-next-line PhanTypeMismatchArgument
                                        $idResult += $this->getErrorFormatter()->formatMessage( ApiMessage::create(
                                                'apierror-blocked',
                                                'blocked',
@@ -111,6 +112,7 @@ class ApiTag extends ApiBase {
                                        $this->getPermissionManager()->isBlockedFrom( $user, $valid->getPageAsLinkTarget() )
                                ) {
                                        $idResult['status'] = 'error';
+                                       // @phan-suppress-next-line PhanTypeMismatchArgument
                                        $idResult += $this->getErrorFormatter()->formatMessage( ApiMessage::create(
                                                        'apierror-blocked',
                                                        'blocked',
index 373ec11..4678e1f 100644 (file)
@@ -636,6 +636,7 @@ class ApiUpload extends ApiBase {
                                }
                                ApiResult::setIndexedTagName( $details, 'detail' );
                                $msg->setApiData( $msg->getApiData() + [ 'details' => $details ] );
+                               // @phan-suppress-next-line PhanTypeMismatchArgument
                                $this->dieWithError( $msg );
                                break;
 
index 907be26..51350a1 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Zygimantus",
                        "Eitvys200",
-                       "Hugo.arg"
+                       "Hugo.arg",
+                       "Homo"
                ]
        },
        "apihelp-main-param-action": "Kurį veiksmą atlikti.",
@@ -19,7 +20,7 @@
        "apihelp-createaccount-summary": "Kurti naują vartotojo paskyrą.",
        "apihelp-delete-summary": "Ištrinti puslapį.",
        "apihelp-delete-param-watch": "Pridėti puslapį prie dabartinio vartotojo stebimųjų sąrašo.",
-       "apihelp-delete-param-unwatch": "Pašalinti puslapį iš dabartinio vartotojo stebimųjų sąrašo.",
+       "apihelp-delete-param-unwatch": "Pašalinti puslapį iš dabartinio naudotojo stebimųjų sąrašo.",
        "apihelp-delete-example-simple": "Ištrinti <kbd>Main Page</kbd>.",
        "apihelp-delete-example-reason": "Ištrinti <kbd>Main Page</kbd> su priežastimi <kbd>Preparing for move</kbd>.",
        "apihelp-disabled-summary": "Šis modulis buvo išjungtas.",
@@ -36,7 +37,7 @@
        "apihelp-edit-param-createonly": "Neredaguoti puslapio jei jis jau egzistuoja.",
        "apihelp-edit-param-nocreate": "Parodyti klaidą, jei puslapis neegzistuoja.",
        "apihelp-edit-param-watch": "Pridėti puslapį į dabartinio vartotojo stebimųjų sąrašą.",
-       "apihelp-edit-param-unwatch": "Pašalinti puslapį iš dabartinio vartotojo stebimųjų sąrašo.",
+       "apihelp-edit-param-unwatch": "Pašalinti puslapį iš dabartinio naudotojo stebimųjų sąrašo.",
        "apihelp-edit-param-redirect": "Automatiškai išspręsti peradresavimus.",
        "apihelp-edit-param-contentmodel": "Naujam turiniui taikomas turinio modelis.",
        "apihelp-edit-example-edit": "Redaguoti puslapį.",
        "apihelp-move-param-movetalk": "Pervadinti aptarimo puslapį, jei jis egzistuoja.",
        "apihelp-move-param-noredirect": "Nekurti nukreipimo.",
        "apihelp-move-param-watch": "Pridėti puslapį ir nukreipimą į dabartinio vartotojo stebimųjų sąrašą.",
-       "apihelp-move-param-unwatch": "Pašalinti puslapį ir nukreipimą iš dabartinio vartotojo stebimųjų sąrašo.",
+       "apihelp-move-param-unwatch": "Pašalinti puslapį ir nukreipimą iš dabartinio naudotojo stebimųjų sąrašo.",
        "apihelp-move-param-ignorewarnings": "Ignuoruoti bet kokius įspėjimus.",
        "apihelp-move-example-move": "Perkelti <kbd>Badtitle</kbd> į <kbd>Goodtitle</kbd> nepaliekant nukreipimo.",
        "apihelp-opensearch-summary": "Ieškoti viki naudojant OpenSearch protokolą.",
        "apihelp-query+watchlist-paramvalue-type-new": "Puslapio sukūrimai.",
        "apihelp-query+watchlist-paramvalue-type-log": "Žurnalo įrašai.",
        "apihelp-resetpassword-param-user": "Iš naujo nustatomas vartotojas.",
-       "apihelp-resetpassword-param-email": "Iš naujo nustatomo vartotojo el. pašto adresas.",
+       "apihelp-resetpassword-param-email": "Iš naujo nustatomo naudotojo el. pašto adresas.",
        "apihelp-setpagelanguage-summary": "Keisti puslapio kalbą.",
        "apihelp-setpagelanguage-param-reason": "Keitimo priežastis.",
        "apihelp-stashedit-param-title": "Puslapio pavadinimas buvo redaguotas.",
index 4d02204..3e5da0a 100644 (file)
@@ -38,7 +38,8 @@
                        "Vlad5250",
                        "Diralik",
                        "DmitTrix",
-                       "Марио"
+                       "Марио",
+                       "Katunchik"
                ]
        },
        "apihelp-main-extended-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Документация]]\n* [[mw:Special:MyLanguage/API:FAQ|ЧаВО]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Почтовая рассылка]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Новости API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Ошибки и запросы]\n</div>\n<strong>Статус:</strong> MediaWiki API — зрелый и стабильный интерфейс, активно поддерживаемый и улучшаемый. Мы стараемся избегать ломающих изменений, однако изредка они могут быть необходимы. Подпишитесь на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ почтовую рассылку mediawiki-api-announce], чтобы быть в курсе обновлений.\n\n<strong>Ошибочные запросы:</strong> Если API получает запрос с ошибкой, вернётся заголовок HTTP с ключом «MediaWiki-API-Error», после чего значение заголовка и код ошибки будут отправлены обратно и установлены в то же значение. Более подробную информацию см. [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Ошибки и предупреждения]].\n\n<p class=\"mw-apisandbox-link\"><strong>Тестирование:</strong> для удобства тестирования API-запросов, см. [[Special:ApiSandbox]].</p>",
        "apierror-cantoverwrite-sharedfile": "Целевой файл существует в общем репозитории и у вас нет прав перезаписать его.",
        "apierror-cantsend": "Вы не авторизованы, ваш электронный адрес не подтверждён или у вас нет прав на отправку электронной почты другим участникам, поэтому вы не можете отправить электронное письмо.",
        "apierror-cantundelete": "Невозможно восстановить: возможно, запрашиваемые версии не существуют или уже были восстановлены.",
+       "apierror-cantview-deleted-comment": "У вас нет разрешения на просмотр удаленных комментариев.",
+       "apierror-cantview-deleted-description": "У вас нет разрешения на просмотр описаний удаленных файлов.",
+       "apierror-cantview-deleted-metadata": "У вас нет разрешения на просмотр метаданных удаленных файлов.",
+       "apierror-cantview-deleted-revision-content": "У вас нет разрешения на просмотр содержимого удаленных редакций.",
        "apierror-changeauth-norequest": "Попытка создать запрос правки провалилась.",
        "apierror-chunk-too-small": "Минимальный размер кусочка — $1 {{PLURAL:$1|байт|байта|байт}}, если кусочек не является последним.",
        "apierror-cidrtoobroad": "Диапазоны $1 CIDR, шире /$2, не разрешены.",
index 7ee3751..cd5b4ce 100644 (file)
        "apierror-cantoverwrite-sharedfile": "目標檔案存在於分享儲存庫上,因此您沒有權限來覆蓋掉。",
        "apierror-cantsend": "您尚未登入,您沒有已確認的電子郵件地址,或是您未被允許發送電子郵件給其他人,因此您不能發送電子郵件。",
        "apierror-cantundelete": "無法取消刪除:請求的修訂可能不存在,或是可能已被取消刪除。",
+       "apierror-cantview-deleted-comment": "您沒有權限來檢視被刪除的註釋。",
        "apierror-cantview-deleted-description": "您沒有權限來檢視被刪除檔案的描述內容。",
        "apierror-cantview-deleted-metadata": "您沒有權限來檢視被刪除檔案的詮釋資料。",
+       "apierror-cantview-deleted-revision-content": "您沒有權限來檢視被刪除修訂的內容。",
        "apierror-changeauth-norequest": "建立更改請求失敗。",
        "apierror-chunk-too-small": "對於非最終塊,最小塊的大小為 $1 {{PLURAL:$1|位元組|位元組}}。",
        "apierror-cidrtoobroad": "不能接受超出 /$2 的 $1 CIDR 範圍。",
index 4c2f27e..077bdca 100644 (file)
@@ -455,12 +455,14 @@ class BlockManager {
                                                // TODO: Improve on simply tracking the first trackable block (T225654)
                                                foreach ( $block->getOriginalBlocks() as $originalBlock ) {
                                                        if ( $this->shouldTrackBlockWithCookie( $originalBlock, $isAnon ) ) {
+                                                               '@phan-var DatabaseBlock $originalBlock';
                                                                $this->setBlockCookie( $originalBlock, $response );
                                                                return;
                                                        }
                                                }
                                        } else {
                                                if ( $this->shouldTrackBlockWithCookie( $block, $isAnon ) ) {
+                                                       '@phan-var DatabaseBlock $block';
                                                        $this->setBlockCookie( $block, $response );
                                                }
                                        }
index 2646845..c6d6b8f 100644 (file)
@@ -519,17 +519,8 @@ class LocalisationCache {
         * @return array
         */
        protected function readPHPFile( $_fileName, $_fileType ) {
-               // Disable APC caching
-               Wikimedia\suppressWarnings();
-               $_apcEnabled = ini_set( 'apc.cache_by_default', '0' );
-               Wikimedia\restoreWarnings();
-
                include $_fileName;
 
-               Wikimedia\suppressWarnings();
-               ini_set( 'apc.cache_by_default', $_apcEnabled );
-               Wikimedia\restoreWarnings();
-
                $data = [];
                if ( $_fileType == 'core' || $_fileType == 'extension' ) {
                        foreach ( self::$allKeys as $key ) {
index fbcbc35..34d73d6 100644 (file)
@@ -455,13 +455,21 @@ class ChangesList extends ContextSource {
         * @param string &$s HTML to update
         * @param Title $title
         * @param string $logtype
+        * @param bool $useParentheses (optional) Wrap log entry in parentheses where needed
         */
-       public function insertLog( &$s, $title, $logtype ) {
+       public function insertLog( &$s, $title, $logtype, $useParentheses = true ) {
                $page = new LogPage( $logtype );
                $logname = $page->getName()->setContext( $this->getContext() )->text();
-               $s .= Html::rawElement( 'span', [
-                       'class' => 'mw-changeslist-links'
-               ], $this->linkRenderer->makeKnownLink( $title, $logname ) );
+               $link = $this->linkRenderer->makeKnownLink( $title, $logname, [
+                       'class' => $useParentheses ? '' : 'mw-changeslist-links'
+               ] );
+               if ( $useParentheses ) {
+                       $s .= $this->msg( 'parentheses' )->rawParams(
+                               $link
+                       )->escaped();
+               } else {
+                       $s .= $link;
+               }
        }
 
        /**
@@ -625,7 +633,7 @@ class ChangesList extends ContextSource {
         */
        public function insertComment( $rc ) {
                if ( $this->isDeleted( $rc, RevisionRecord::DELETED_COMMENT ) ) {
-                       return ' <span class="history-deleted">' .
+                       return ' <span class="history-deleted comment">' .
                                $this->msg( 'rev-deleted-comment' )->escaped() . '</span>';
                } else {
                        return Linker::commentBlock( $rc->mAttribs['rc_comment'], $rc->getTitle(),
index c15701b..8228bae 100644 (file)
@@ -87,7 +87,7 @@ class OldChangesList extends ChangesList {
 
                if ( $rc->mAttribs['rc_log_type'] ) {
                        $logtitle = SpecialPage::getTitleFor( 'Log', $rc->mAttribs['rc_log_type'] );
-                       $this->insertLog( $html, $logtitle, $rc->mAttribs['rc_log_type'] );
+                       $this->insertLog( $html, $logtitle, $rc->mAttribs['rc_log_type'], false );
                        $flags = $this->recentChangesFlags( [ 'unpatrolled' => $unpatrolled,
                                'bot' => $rc->mAttribs['rc_bot'] ], '' );
                        if ( $flags !== '' ) {
@@ -98,7 +98,7 @@ class OldChangesList extends ChangesList {
                        list( $name, $htmlubpage ) = MediaWikiServices::getInstance()->getSpecialPageFactory()->
                                resolveAlias( $rc->mAttribs['rc_title'] );
                        if ( $name == 'Log' ) {
-                               $this->insertLog( $html, $rc->getTitle(), $htmlubpage );
+                               $this->insertLog( $html, $rc->getTitle(), $htmlubpage, false );
                        }
                // Regular entries
                } else {
index a50150e..833d553 100644 (file)
@@ -60,8 +60,7 @@ class Dump7ZipOutput extends DumpPipeOutput {
        }
 
        /**
-        * @param string $newname
-        * @param bool $open
+        * @inheritDoc
         */
        function closeAndRename( $newname, $open = false ) {
                $newname = $this->checkRenameArgCount( $newname );
index d0256fd..ad68109 100644 (file)
@@ -59,7 +59,7 @@ class DumpFileOutput extends DumpOutput {
        }
 
        /**
-        * @param string $newname
+        * @inheritDoc
         */
        function closeRenameAndReopen( $newname ) {
                $this->closeAndRename( $newname, true );
@@ -92,8 +92,7 @@ class DumpFileOutput extends DumpOutput {
        }
 
        /**
-        * @param string $newname
-        * @param bool $open
+        * @inheritDoc
         */
        function closeAndRename( $newname, $open = false ) {
                $newname = $this->checkRenameArgCount( $newname );
index 75e149c..143fb8e 100644 (file)
@@ -102,14 +102,16 @@ class DumpFilter {
        }
 
        /**
-        * @param string $newname
+        * @see DumpOutput::closeRenameAndReopen()
+        * @param string|string[] $newname
         */
        function closeRenameAndReopen( $newname ) {
                $this->sink->closeRenameAndReopen( $newname );
        }
 
        /**
-        * @param string $newname
+        * @see DumpOutput::closeAndRename()
+        * @param string|string[] $newname
         * @param bool $open
         */
        function closeAndRename( $newname, $open = false ) {
index ab925b7..5c15c5f 100644 (file)
@@ -86,7 +86,7 @@ class DumpOutput {
         * and reopen new file with the old name. Use this
         * for writing out a file in multiple pieces
         * at specified checkpoints (e.g. every n hours).
-        * @param string|array $newname File name. May be a string or an array with one element
+        * @param string|string[] $newname File name. May be a string or an array with one element
         */
        function closeRenameAndReopen( $newname ) {
        }
@@ -95,7 +95,7 @@ class DumpOutput {
         * Close the old file, and move it to a specified name.
         * Use this for the last piece of a file written out
         * at specified checkpoints (e.g. every n hours).
-        * @param string|array $newname File name. May be a string or an array with one element
+        * @param string|string[] $newname File name. May be a string or an array with one element
         * @param bool $open If true, a new file with the old filename will be opened
         *   again for writing (default: false)
         */
index 0521c5a..4e61434 100644 (file)
@@ -73,15 +73,14 @@ class DumpPipeOutput extends DumpFileOutput {
        }
 
        /**
-        * @param string $newname
+        * @inheritDoc
         */
        function closeRenameAndReopen( $newname ) {
                $this->closeAndRename( $newname, true );
        }
 
        /**
-        * @param string $newname
-        * @param bool $open
+        * @inheritDoc
         */
        function closeAndRename( $newname, $open = false ) {
                $newname = $this->checkRenameArgCount( $newname );
index b4fd176..a968831 100644 (file)
@@ -438,7 +438,9 @@ class ArchivedFile {
        function pageCount() {
                if ( !isset( $this->pageCount ) ) {
                        // @FIXME: callers expect File objects
+                       // @phan-suppress-next-line PhanTypeMismatchArgument
                        if ( $this->getHandler() && $this->handler->isMultiPage( $this ) ) {
+                               // @phan-suppress-next-line PhanTypeMismatchArgument
                                $this->pageCount = $this->handler->pageCount( $this );
                        } else {
                                $this->pageCount = false;
index 04be6c4..58c1602 100644 (file)
@@ -1329,7 +1329,7 @@ class HTMLForm extends ContextSource {
                }
 
                return $elementstr
-                       ? Html::rawElement( 'div', [ 'class' => $elementsType ], $elementstr )
+                       ? Html::rawElement( 'div', [ 'class' => $elementsType . 'box' ], $elementstr )
                        : '';
        }
 
index 1eda33c..3df5b7e 100644 (file)
@@ -7,9 +7,6 @@ use MediaWiki\Widget\TitleInputWidget;
  * Automatically does validation that the title is valid,
  * as well as autocompletion if using the OOUI display format.
  *
- * Note: Forms using GET requests will need to make sure the title value is not
- * an empty string.
- *
  * Optional parameters:
  * 'namespace' - Namespace the page must be in
  * 'relative' - If true and 'namespace' given, strip/add the namespace from/to the title as needed
@@ -33,14 +30,6 @@ class HTMLTitleTextField extends HTMLTextField {
        }
 
        public function validate( $value, $alldata ) {
-               if ( $this->mParent->getMethod() === 'get' && $value === '' ) {
-                       // If the form is a GET form and has no value, assume it hasn't been
-                       // submitted yet, and skip validation
-                       // TODO This doesn't look right, we should be able to tell the difference
-                       // between "not submitted" (null) and "submitted but empty" (empty string).
-                       return parent::validate( $value, $alldata );
-               }
-
                // Default value (from getDefault()) is null, which breaks Title::newFromTextThrow() below
                if ( $value === null ) {
                        $value = '';
index 5b3bc25..0e4d842 100644 (file)
@@ -6,8 +6,6 @@ use MediaWiki\Widget\UserInputWidget;
  * Implements a text input field for user names.
  * Automatically auto-completes if using the OOUI display format.
  *
- * FIXME: Does not work for forms that support GET requests.
- *
  * Optional parameters:
  * 'exists' - Whether to validate that the user already exists
  * 'ipallowed' - Whether an IP adress is interpreted as "valid"
index 8433df6..510d26d 100644 (file)
@@ -59,7 +59,7 @@ class HttpRequestFactory {
         *    - originalRequest     Information about the original request (as a WebRequest object or
         *                          an associative array with 'ip' and 'userAgent').
         * @codingStandardsIgnoreStart
-        * @phan-param array{timeout?:int,connectTimeout?:int,postData?:array,proxy?:string,noProxy?:bool,sslVerifyHost?:bool,sslVerifyCert?:bool,caInfo?:string,maxRedirects?:int,followRedirects?:bool,userAgent?:string,logger?:\Psr\Logger\LoggerInterface,username?:string,password?:string,originalRequest?:WebRequest|array{ip:string,userAgent:string}} $options
+        * @phan-param array{timeout?:int,connectTimeout?:int,postData?:array,proxy?:string,noProxy?:bool,sslVerifyHost?:bool,sslVerifyCert?:bool,caInfo?:string,maxRedirects?:int,followRedirects?:bool,userAgent?:string,method?:string,logger?:\Psr\Log\LoggerInterface,username?:string,password?:string,originalRequest?:WebRequest|array{ip:string,userAgent:string}} $options
         * @codingStandardsIgnoreEnd
         * @param string $caller The method making this request, for profiling
         * @throws RuntimeException
index c29ba21..e0799c0 100644 (file)
@@ -185,9 +185,16 @@ class WikiRevision implements ImportableUploadRevision, ImportableOldRevision {
        /** @var bool */
        private $mNoUpdates = false;
 
-       /** @var Config $config */
+       /**
+        * @deprecated since 1.31, along with self::downloadSource()
+        * @var Config $config
+        */
        private $config;
 
+       /**
+        * @param Config $config Deprecated since 1.31, along with self::downloadSource(). Just pass an
+        *  empty HashConfig.
+        */
        public function __construct( Config $config ) {
                $this->config = $config;
        }
index 820634c..ce1e99f 100644 (file)
@@ -268,8 +268,8 @@ class SwiftFileBackend extends FileBackendStore {
                        'headers' => array_merge(
                                $mutableHeaders,
                                [
-                                       'content-length' => strlen( $params['content'] ),
                                        'etag' => md5( $params['content'] ),
+                                       'content-length' => strlen( $params['content'] ),
                                        'x-object-meta-sha1base36' =>
                                                Wikimedia\base_convert( sha1( $params['content'] ), 16, 36, 31 )
                                ]
@@ -311,18 +311,34 @@ class SwiftFileBackend extends FileBackendStore {
                        return $status;
                }
 
+               // Open a handle to the source file so that it can be streamed. The size and hash
+               // will be computed using the handle. In the off chance that the source file changes
+               // during this operation, the PUT will fail due to an ETag mismatch and be aborted.
                AtEase::suppressWarnings();
-               $sha1Base16 = sha1_file( $params['src'] );
+               $srcHandle = fopen( $params['src'], 'rb' );
                AtEase::restoreWarnings();
-               if ( $sha1Base16 === false ) { // source doesn't exist?
-                       $status->fatal( 'backend-fail-store', $params['src'], $params['dst'] );
+               if ( $srcHandle === false ) { // source doesn't exist?
+                       $status->fatal( 'backend-fail-notexists', $params['src'] );
 
                        return $status;
                }
 
-               $handle = fopen( $params['src'], 'rb' );
-               if ( $handle === false ) { // source doesn't exist?
-                       $status->fatal( 'backend-fail-store', $params['src'], $params['dst'] );
+               // Compute the MD5 and SHA-1 hashes in one pass
+               $srcSize = fstat( $srcHandle )['size'];
+               $md5Context = hash_init( 'md5' );
+               $sha1Context = hash_init( 'sha1' );
+               $hashDigestSize = 0;
+               while ( !feof( $srcHandle ) ) {
+                       $buffer = (string)fread( $srcHandle, 131072 ); // 128 KiB
+                       hash_update( $md5Context, $buffer );
+                       hash_update( $sha1Context, $buffer );
+                       $hashDigestSize += strlen( $buffer );
+               }
+               // Reset the handle back to the beginning so that it can be streamed
+               rewind( $srcHandle );
+
+               if ( $hashDigestSize !== $srcSize ) {
+                       $status->fatal( 'backend-fail-hash', $params['src'] );
 
                        return $status;
                }
@@ -339,12 +355,13 @@ class SwiftFileBackend extends FileBackendStore {
                        'headers' => array_merge(
                                $mutableHeaders,
                                [
-                                       'content-length' => fstat( $handle )['size'],
-                                       'etag' => md5_file( $params['src'] ),
-                                       'x-object-meta-sha1base36' => Wikimedia\base_convert( $sha1Base16, 16, 36, 31 )
+                                       'content-length' => $srcSize,
+                                       'etag' => hash_final( $md5Context ),
+                                       'x-object-meta-sha1base36' =>
+                                               Wikimedia\base_convert( hash_final( $sha1Context ), 16, 36, 31 )
                                ]
                        ),
-                       'body' => $handle // resource
+                       'body' => $srcHandle // resource
                ] ];
 
                $method = __METHOD__;
@@ -362,7 +379,7 @@ class SwiftFileBackend extends FileBackendStore {
                };
 
                $opHandle = new SwiftFileOpHandle( $this, $handler, $reqs );
-               $opHandle->resourcesToClose[] = $handle;
+               $opHandle->resourcesToClose[] = $srcHandle;
 
                if ( !empty( $params['async'] ) ) { // deferred
                        $status->value = $opHandle;
index 5e9fdb8..781df06 100644 (file)
@@ -86,12 +86,13 @@ class LogPager extends ReverseChronologicalPager {
                $this->mLogEventsList = $list;
 
                $this->limitType( $types ); // also excludes hidden types
+               $this->limitLogId( $logId );
+               $this->limitFilterTypes();
                $this->limitPerformer( $performer );
                $this->limitTitle( $title, $pattern );
                $this->limitAction( $action );
                $this->getDateCond( $year, $month, $day );
                $this->mTagFilter = $tagFilter;
-               $this->limitLogId( $logId );
 
                $this->mDb = wfGetDB( DB_REPLICA, 'logpager' );
        }
@@ -107,7 +108,18 @@ class LogPager extends ReverseChronologicalPager {
                return $query;
        }
 
-       // Call ONLY after calling $this->limitType() already!
+       private function limitFilterTypes() {
+               if ( $this->hasEqualsClause( 'log_id' ) ) { // T220834
+                       return;
+               }
+               $filterTypes = $this->getFilterParams();
+               foreach ( $filterTypes as $type => $hide ) {
+                       if ( $hide ) {
+                               $this->mConds[] = 'log_type != ' . $this->mDb->addQuotes( $type );
+                       }
+               }
+       }
+
        public function getFilterParams() {
                global $wgFilterLogTypes;
                $filters = [];
@@ -127,9 +139,6 @@ class LogPager extends ReverseChronologicalPager {
                        }
 
                        $filters[$type] = $hide;
-                       if ( $hide ) {
-                               $this->mConds[] = 'log_type != ' . $this->mDb->addQuotes( $type );
-                       }
                }
 
                return $filters;
index 0783068..7b73902 100644 (file)
@@ -393,6 +393,7 @@ class UserMailer {
                                Wikimedia\restoreWarnings();
                                return Status::newFatal( 'pear-mail-error', $mail_object->getMessage() );
                        }
+                       '@phan-var Mail_smtp $mail_object';
 
                        wfDebug( "Sending mail via PEAR::Mail\n" );
 
index 6aeb038..4b37181 100644 (file)
@@ -808,7 +808,9 @@ class Article implements Page {
                                                        $outputPage->enableClientCache( false );
                                                        $outputPage->setRobotPolicy( 'noindex,nofollow' );
 
-                                                       $errortext = $error->getWikiText( false, 'view-pool-error' );
+                                                       $errortext = $error->getWikiText(
+                                                               false, 'view-pool-error', $this->getContext()->getLanguage()
+                                                       );
                                                        $outputPage->wrapWikiTextAsInterface( 'errorbox', $errortext );
                                                }
                                                # Connection or timeout error
@@ -2121,7 +2123,7 @@ class Article implements Page {
                        if ( $error == '' ) {
                                $outputPage->wrapWikiTextAsInterface(
                                        'error mw-error-cannotdelete',
-                                       $status->getWikiText()
+                                       $status->getWikiText( false, false, $context->getLanguage() )
                                );
                                $deleteLogPage = new LogPage( 'delete' );
                                $outputPage->addHTML( Xml::element( 'h2', null, $deleteLogPage->getName()->text() ) );
index 2f3fac2..ff7ee4b 100644 (file)
@@ -27,7 +27,6 @@ use MovePage;
 use NamespaceInfo;
 use RepoGroup;
 use Title;
-use WatchedItemStore;
 use WatchedItemStoreInterface;
 use Wikimedia\Rdbms\ILoadBalancer;
 
@@ -44,7 +43,7 @@ class MovePageFactory {
        /** @var NamespaceInfo */
        private $nsInfo;
 
-       /** @var WatchedItemStore */
+       /** @var WatchedItemStoreInterface */
        private $watchedItems;
 
        /** @var PermissionManager */
index d4f66f7..597f851 100644 (file)
@@ -35,6 +35,7 @@ class PPDPart_Hash extends PPDPart {
                } else {
                        $accum = [];
                }
+               // @phan-suppress-next-line PhanTypeMismatchArgument
                parent::__construct( $accum );
        }
 }
index 3e2a9a2..aa7a6d6 100644 (file)
@@ -176,13 +176,13 @@ class MediaWikiSite extends Site {
         *
         * @param string|bool $pageName Page name or false (default: false)
         *
-        * @return string|bool|null
+        * @return string|null
         */
        public function getPageUrl( $pageName = false ) {
                $url = $this->getLinkPath();
 
-               if ( $url === false ) {
-                       return false;
+               if ( $url === null ) {
+                       return null;
                }
 
                if ( $pageName !== false ) {
index 10711a6..401f6e4 100644 (file)
@@ -354,7 +354,7 @@ class Site implements Serializable {
 
        /**
         * Returns the full URL for the given page on the site.
-        * Or false if the needed information is not known.
+        * Or null if the needed information is not known.
         *
         * This generated URL is usually based upon the path returned by getLinkPath(),
         * but this is not a requirement.
@@ -365,13 +365,13 @@ class Site implements Serializable {
         *
         * @param bool|string $pageName
         *
-        * @return string|bool|null
+        * @return string|null
         */
        public function getPageUrl( $pageName = false ) {
                $url = $this->getLinkPath();
 
-               if ( $url === false ) {
-                       return false;
+               if ( $url === null ) {
+                       return null;
                }
 
                if ( $pageName !== false ) {
index 956bdab..571b6e4 100644 (file)
@@ -168,6 +168,7 @@ class SiteImporter {
                $pathTags = $siteElement->getElementsByTagName( 'path' );
                for ( $i = 0; $i < $pathTags->length; $i++ ) {
                        $pathElement = $pathTags->item( $i );
+                       '@phan-var DOMElement $pathElement';
                        $pathType = $this->getAttributeValue( $pathElement, 'type' );
                        $path = $pathElement->textContent;
 
@@ -177,6 +178,7 @@ class SiteImporter {
                $idTags = $siteElement->getElementsByTagName( 'localid' );
                for ( $i = 0; $i < $idTags->length; $i++ ) {
                        $idElement = $idTags->item( $i );
+                       '@phan-var DOMElement $idElement';
                        $idType = $this->getAttributeValue( $idElement, 'type' );
                        $id = $idElement->textContent;
 
index 403f5b2..dedf83a 100644 (file)
@@ -756,6 +756,7 @@ abstract class BaseTemplate extends QuickTemplate {
         */
        public function getTrail() {
                return WrappedString::join( "\n", [
+                       // @phan-suppress-next-line PhanTypeMismatchArgument
                        MWDebug::getDebugHTML( $this->getSkin()->getContext() ),
                        $this->get( 'bottomscripts' ),
                        $this->get( 'reporttime' )
index 94be852..8be029a 100644 (file)
@@ -441,7 +441,9 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                }
                if ( $extraMessages ) {
                        $extraMessages = Status::wrap( $extraMessages );
-                       $out->addWikiTextAsInterface( $extraMessages->getWikiText() );
+                       $out->addWikiTextAsInterface(
+                               $extraMessages->getWikiText( false, false, $this->getLanguage() )
+                       );
                }
 
                $out->addHTML( $injected_html );
index 2c42cd3..dc31eba 100644 (file)
@@ -141,7 +141,7 @@ class SpecialConfirmEmail extends UnlistedSpecialPage {
                        return Status::newGood( $this->msg( 'confirmemail_sent' )->text() );
                } else {
                        return Status::newFatal( new RawMessage(
-                               $status->getWikiText( 'confirmemail_sendfailed' )
+                               $status->getWikiText( 'confirmemail_sendfailed', false, $this->getLanguage() )
                        ) );
                }
        }
index 48357aa..0b4577e 100644 (file)
@@ -465,7 +465,7 @@ class SpecialEditTags extends UnlistedSpecialPage {
        protected function failure( $status ) {
                $this->getOutput()->setPageTitle( $this->msg( 'actionfailed' ) );
                $this->getOutput()->wrapWikiTextAsInterface(
-                       'errorbox', $status->getWikiText( 'tags-edit-failure' )
+                       'errorbox', $status->getWikiText( 'tags-edit-failure', false, $this->getLanguage() )
                );
                $this->showForm();
        }
index cfefa47..428556f 100644 (file)
@@ -187,7 +187,8 @@ class SpecialImport extends SpecialPage {
                $out = $this->getOutput();
                if ( !$source->isGood() ) {
                        $out->wrapWikiTextAsInterface( 'error',
-                               $this->msg( 'importfailed', $source->getWikiText() )->plain()
+                               $this->msg( 'importfailed', $source->getWikiText( false, false, $this->getLanguage() ) )
+                                       ->plain()
                        );
                } else {
                        $importer = new WikiImporter( $source->value, $this->getConfig() );
@@ -200,7 +201,7 @@ class SpecialImport extends SpecialPage {
                                                "<div class=\"error\">\n$1\n</div>",
                                                [
                                                        'import-options-wrong',
-                                                       $statusRootPage->getWikiText(),
+                                                       $statusRootPage->getWikiText( false, false, $this->getLanguage() ),
                                                        count( $statusRootPage->getErrorsArray() )
                                                ]
                                        );
@@ -239,7 +240,7 @@ class SpecialImport extends SpecialPage {
                                # Zero revisions
                                $out->wrapWikiMsg(
                                        "<div class=\"error\">\n$1\n</div>",
-                                       [ 'importfailed', $result->getWikiText() ]
+                                       [ 'importfailed', $result->getWikiText( false, false, $this->getLanguage() ) ]
                                );
                        } else {
                                # Success!
index 527b910..8d6488d 100644 (file)
@@ -40,7 +40,7 @@ class SpecialPagesWithProp extends QueryPage {
        private $existingPropNames = null;
 
        /**
-        * @var string|null
+        * @var int|null
         */
        private $ns;
 
@@ -69,6 +69,7 @@ class SpecialPagesWithProp extends QueryPage {
 
                $request = $this->getRequest();
                $propname = $request->getVal( 'propname', $par );
+               $this->ns = $request->getIntOrNull( 'namespace' );
                $this->reverse = $request->getBool( 'reverse' );
                $this->sortByValue = $request->getBool( 'sortbyvalue' );
 
@@ -87,8 +88,8 @@ class SpecialPagesWithProp extends QueryPage {
                                'type' => 'namespaceselect',
                                'name' => 'namespace',
                                'label-message' => 'namespace',
-                               'all' => null,
-                               'default' => null,
+                               'all' => '',
+                               'default' => $this->ns,
                        ],
                        'reverse' => [
                                'type' => 'check',
@@ -120,7 +121,6 @@ class SpecialPagesWithProp extends QueryPage {
 
        public function onSubmit( $data, $form ) {
                $this->propName = $data['propname'];
-               $this->ns = $data['namespace'];
                parent::execute( $data['propname'] );
        }
 
@@ -167,7 +167,7 @@ class SpecialPagesWithProp extends QueryPage {
                        'options' => []
                ];
 
-               if ( $this->ns && isset( $this->ns ) ) {
+               if ( $this->ns !== null ) {
                        $query['conds']['page_namespace'] = $this->ns;
                }
 
index 67177b7..750e2c3 100644 (file)
@@ -667,7 +667,7 @@ class SpecialRevisionDelete extends UnlistedSpecialPage {
                $this->getOutput()->setPageTitle( $this->msg( 'actionfailed' ) );
                $this->getOutput()->wrapWikiTextAsInterface(
                        'errorbox',
-                       $status->getWikiText( $this->typeLabels['failure'] )
+                       $status->getWikiText( $this->typeLabels['failure'], false, $this->getLanguage() )
                );
                $this->showForm();
        }
index d3d3bd7..c6f0721 100644 (file)
@@ -1216,7 +1216,8 @@ class SpecialUndelete extends SpecialPage {
                                '<div id="mw-error-cannotundelete">' .
                                $status->getWikiText(
                                        'cannotundelete',
-                                       'cannotundelete'
+                                       'cannotundelete',
+                                       $this->getLanguage()
                                ) . '</div>'
                        );
                }
@@ -1228,7 +1229,8 @@ class SpecialUndelete extends SpecialPage {
                                'error',
                                $status->getWikiText(
                                        'undelete-error-short',
-                                       'undelete-error-long'
+                                       'undelete-error-long',
+                                       $this->getLanguage()
                                )
                        );
                }
index e7c2e42..a2edca0 100644 (file)
@@ -488,7 +488,9 @@ class SpecialUpload extends SpecialPage {
                // Fetch the file if required
                $status = $this->mUpload->fetchFile();
                if ( !$status->isOK() ) {
-                       $this->showUploadError( $this->getOutput()->parseAsInterface( $status->getWikiText() ) );
+                       $this->showUploadError( $this->getOutput()->parseAsInterface(
+                               $status->getWikiText( false, false, $this->getLanguage() )
+                       ) );
 
                        return;
                }
@@ -559,7 +561,7 @@ class SpecialUpload extends SpecialPage {
                                $changeTags, $this->getUser() );
                        if ( !$changeTagsStatus->isOK() ) {
                                $this->showUploadError( $this->getOutput()->parseAsInterface(
-                                       $changeTagsStatus->getWikiText()
+                                       $changeTagsStatus->getWikiText( false, false, $this->getLanguage() )
                                ) );
 
                                return;
@@ -576,7 +578,9 @@ class SpecialUpload extends SpecialPage {
 
                if ( !$status->isGood() ) {
                        $this->showRecoverableUploadError(
-                               $this->getOutput()->parseAsInterface( $status->getWikiText() )
+                               $this->getOutput()->parseAsInterface(
+                                       $status->getWikiText( false, false, $this->getLanguage() )
+                               )
                        );
 
                        return;
index 585699d..28626ea 100644 (file)
@@ -177,7 +177,9 @@ class UserrightsPage extends SpecialPage {
 
                        // save settings
                        if ( !$fetchedStatus->isOK() ) {
-                               $this->getOutput()->addWikiTextAsInterface( $fetchedStatus->getWikiText() );
+                               $this->getOutput()->addWikiTextAsInterface(
+                                       $fetchedStatus->getWikiText( false, false, $this->getLanguage() )
+                               );
 
                                return;
                        }
@@ -208,7 +210,9 @@ class UserrightsPage extends SpecialPage {
                                        return;
                                } else {
                                        // Print an error message and redisplay the form
-                                       $out->wrapWikiTextAsInterface( 'error', $status->getWikiText() );
+                                       $out->wrapWikiTextAsInterface(
+                                               'error', $status->getWikiText( false, false, $this->getLanguage() )
+                                       );
                                }
                        }
                }
@@ -482,7 +486,9 @@ class UserrightsPage extends SpecialPage {
        function editUserGroupsForm( $username ) {
                $status = $this->fetchUser( $username, true );
                if ( !$status->isOK() ) {
-                       $this->getOutput()->addWikiTextAsInterface( $status->getWikiText() );
+                       $this->getOutput()->addWikiTextAsInterface(
+                               $status->getWikiText( false, false, $this->getLanguage() )
+                       );
 
                        return;
                }
index eb98420..a209419 100644 (file)
        "createacct-another-email-ph": "Въведете електронна поща",
        "createaccountmail": "Използване на случайна временна парола, която се изпраща на посочената електронната поща",
        "createacct-realname": "Истинско име (незадължително)",
-       "createacct-reason": "Причина",
+       "createacct-reason": "Причина (публично видима)",
        "createacct-reason-ph": "Защо създавате друга сметка",
        "createacct-reason-help": "Съобщение, показвано в дневника на създадени сметки",
        "createacct-submit": "Създаване на сметката",
index 52f9327..c8b6b6c 100644 (file)
        "listfiles-userdoesnotexist": "ব্যবহারকারী অ্যাকাউন্ট \"$1\" নিবন্ধিত নয়।",
        "imgfile": "ফাইল",
        "listfiles": "ছবির তালিকা",
+       "listfiles_subpage": "$1 কর্তৃক আপলোডসমূহ",
        "listfiles_thumb": "সংক্ষেপচিত্র",
        "listfiles_date": "তারিখ",
        "listfiles_name": "নাম",
        "unprotected-js": "নিরাপত্তার কারণে জাভাস্ক্রিপ্ট অনিরাপদ পৃষ্ঠা থেকে লোড করা যাবে না। শুধুমাত্র মিডিয়াউইকি: নামস্থান বা ব্যবহারকারী উপপাতায় জাভাস্ক্রিপ্ট তৈরি করুন",
        "userlogout-continue": "আপনি কি প্রস্থান করতে চান?",
        "rest-prefix-mismatch": "অনুরোধকৃত পথ ($1) রেস্ট API মূলপথের ($2) ভিতরে ছিল না।",
-       "rest-wrong-method": "à¦\85নà§\81রà§\8bধ à¦ªà¦¦à§\8dধতি ($1) à¦¸à¦\82শà§\8dলিষà§\8dà¦\9f à¦ªà¦¥à§\87র ($2) {{PLURAL:$3|à¦\9cনà§\8dয à¦\85নà§\81মà§\8bদিত à¦ªà¦¦à§\8dধতি|à¦\9cনà§\8dয à¦\85নà§\81মà§\8bদিত à¦ªà¦¦à§\8dধতিà¦\97à§\81লির à¦\85নà§\8dতরà§\8dভà§\81à¦\95à§\8dত}} à¦¨à¦¯à¦¼",
+       "rest-wrong-method": "à¦\85নà§\81রà§\8bধ à¦ªà¦¦à§\8dধতি ($1) à¦\8fà¦\87 à¦ªà¦¥à§\87র {{PLURAL:$3|à¦\9cনà§\8dয à¦\85নà§\81মà§\8bদিত à¦ªà¦¦à§\8dধতির|à¦\9cনà§\8dয à¦\85নà§\81মà§\8bদিত à¦ªà¦¦à§\8dধতিà¦\97à§\81লির}} à¦\85নà§\8dতরà§\8dভà§\81à¦\95à§\8dত à¦¨à¦¯à¦¼ ($2)",
        "rest-no-match": "অনুরোধ করা আপেক্ষিক পথ ($1) কোনও পরিচিত হ্যান্ডলারের সাথে মেলে না"
 }
index 3171e5e..d2056c4 100644 (file)
        "sitejspreview": "'''ХӀара хьалх хьажар ду, хӀара JavaScript-код.'''\n'''хӀинца Ӏалашйина яц!'''",
        "updated": "(Карла йаькхина)",
        "note": "'''Билгалдаккхар:'''",
-       "previewnote": "'''Дагахь дита хьайна! ХӀара деккъа хьалххе хьажар хилар.'''\nХьан хийцамаш хӀинца а дӀабазбина бац!.",
+       "previewnote": "'''Дагахь дита! ХӀара хьалххе хьажар хилар.'''\nХьан хийцамаш хӀинца а дӀабазбина бац!.",
        "continue-editing": "Кхин дӀа тадар",
        "session_fail_preview": "Сервер лара ца йира ахьа бина хийцамаш дӀаязба. Кхиъ цкъа а гӀортахь.\nНагахь санна хӀара гӀалат юха а далахь, [[Special:UserLogout|сеанс дӀа а къоьвлин]], юха а системин чугӀо.",
        "edit_form_incomplete": "'''Цхьайолу тадаран формаш серверан тӀекхаьчча яц. Тидаме хьажа хьай нисдарш доьхна дуй, ТӀакха южу гӀорта.'''",
index 58360c8..884bd4d 100644 (file)
@@ -64,7 +64,7 @@
        "tog-watchmoves": "Přidávat mnou přesouvané stránky a soubory mezi sledované",
        "tog-watchdeletion": "Přidávat stránky a soubory, které smažu, mezi sledované",
        "tog-watchuploads": "Přidávat mnou načtené soubory ke sledovaným",
-       "tog-watchrollback": "Přidávat stránky, které jsem {{GENDER:|vrátil|vrátila}} zpět, ke sledovaným",
+       "tog-watchrollback": "Přidávat stránky, kde jsem {{GENDER:|použil|použila}} vrácení zpět, ke sledovaným",
        "tog-minordefault": "Označovat editace implicitně jako malé",
        "tog-previewontop": "Zobrazovat náhled před editačním oknem (ne za ním)",
        "tog-previewonfirst": "Zobrazit při první editaci náhled",
@@ -92,7 +92,7 @@
        "tog-norollbackdiff": "Po vrácení změny nezobrazovat porovnání rozdílů",
        "tog-useeditwarning": "Upozornit, když budu opouštět editaci bez uložení změn",
        "tog-prefershttps": "Po přihlášení vždy používat zabezpečené připojení",
-       "tog-showrollbackconfirmation": "Při kliknutí na odkaz pro vrácení editace zobrazit žádost o potvrzení",
+       "tog-showrollbackconfirmation": "Při kliknutí na odkaz pro rychlý revert zobrazit žádost o potvrzení",
        "tog-requireemail": "Pro obnovu hesla vyžadovat e-mail",
        "underline-always": "Vždy",
        "underline-never": "Nikdy",
        "category_header": "Stránky v kategorii „$1“",
        "subcategories": "Podkategorie",
        "category-media-header": "Soubory v kategorii „$1“",
-       "category-empty": "''Tato kategorie neobsahuje žádné stránky či soubory.''",
+       "category-empty": "<em>Tato kategorie neobsahuje žádné stránky či soubory.</em>",
        "hidden-categories": "{{PLURAL:$1|Skrytá kategorie|Skryté kategorie|Skryté kategorie}}",
        "hidden-category-category": "Skryté kategorie",
        "category-subcat-count": "{{PLURAL:$2|V této kategorii je pouze následující podkategorie.|{{PLURAL:$1|Zobrazuje se jedna podkategorie|Zobrazují se $1 podkategorie|Zobrazuje se $1 podkategorií}} z celkového počtu $2 podkategorií v této kategorii.|{{PLURAL:$1|Zobrazuje se jedna podkategorie|Zobrazují se $1 podkategorie|Zobrazuje se $1 podkategorií}} z celkového počtu $2 podkategorií v této kategorii.}}",
index dad1eb8..5c60cff 100644 (file)
        "listfiles-userdoesnotexist": "Das Benutzerkonto „$1“ ist nicht registriert.",
        "imgfile": "Datei",
        "listfiles": "Dateiliste",
+       "listfiles_subpage": "Von $1 hochgeladene Dateien",
        "listfiles_thumb": "Vorschaubild",
        "listfiles_date": "Datum",
        "listfiles_name": "Name",
        "mycustomjsredirectprotected": "Du hast keine Berechtigung, diese JavaScript-Seite zu bearbeiten, da sie eine Weiterleitung, die nicht in deinen Benutzernamensraum zeigt, enthält.",
        "easydeflate-invaliddeflate": "Der angegebene Inhalt ist nicht ordnungsgemäß komprimiert",
        "unprotected-js": "Aus Sicherheitsgründen kann JavaScript-Code nicht mehr von ungeschützten Seiten geladen werden. Erstelle die JavaScript-Seite bitte ausschließlich im Namensraum „MediaWiki“ oder als Benutzerunterseite.",
-       "userlogout-continue": "Möchtest du dich abmelden?"
+       "userlogout-continue": "Möchtest du dich abmelden?",
+       "rest-prefix-mismatch": "Der angeforderte Pfad ($1) kannte nicht innerhalb des REST-API-Root-Pfades ($2) gefunden werden"
 }
index 601106d..67cdbad 100644 (file)
        "upload_directory_read_only": "Direktorê dosyayê ($1)î webserver de nieşkeno binuse.",
        "uploaderror": "Ğeletê bar kerdişî",
        "upload-recreate-warning": "'''Diqet: Yew dosya pê ena name wedariya ya zi vurniya.'''\n\nLogê wedariyayiş u berdişi seba ena pele a ti ra xezir kerda:",
-       "uploadtext": "Qey barkerdişê dosyayî, formê cêrinî bişuxulne.\nDosyayê ke vera cû bar biyê eke şima qayîl e ney dosyayan bivînê ya zî bigerî biewnê[[Special:FileList|listeyê dosyayê bar bîyaye]] (tekrar) bar bîyaye [[Special:Log/upload|rocaneyê barkerdişî]] de, hewn a şîyaye zî tîya de [[Special:Log/delete|rocaneyê hewn a kerdişî]] pawiyene.\n\nwexta şima qayîl e yew peli re dosya bierzî, formanê cêrinan ra yewi bişuxulne;\n* Qey xebitnayişê dosyayî: '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Dosya.jpg]]</nowiki></code>'''\n*Heto çep de zerreyê yew qutî de, qey xebitnayişi 'nuşteyê binîn' û 200 pikseli: '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Dosya.png|200px|thumb|left|alt metin]]</nowiki></code>'''\n* Dosya memocın, dosya te direk gırey bıerz: '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Dosya.ogg]]</nowiki></code>'''",
+       "uploadtext": "Seba '''dosya''' barkerdışi rê formê cerênê bıgurenê. Veri ra dosyeyê barbiyayeyan vênayış  u cıgeyrayışi rê bıewni rê [[Special:FileList|lista dosyeyan]], seba (fına) barbiyayeyan rê [[Special:Log/upload|rocekê barkerdışi]] u, esterıtan zi pela [[Special:Log/delete|rocekê esterıtışi]] de tepışiyeno.\n\nYew pele rê dosyacıkerdışi rê formanê cêrênan ra yewi bıgurenê;\n* Versiyonê gurenayışê dosyeyanê pêroyiyan rê: '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Dosya.jpg]]</nowiki></code>'''\n* Kışta çepê yew doreki miyan de, vêniyayo cı de  'metinê bıni' ra, 200 piksel ebadê dosyagurenayışi rê : '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Dosya.png|200px|thumb|left|alt metin]]</nowiki></code>'''\n* Dosyaya nêmusnayışi ra, dosya rê direkt gıredayışi rê : '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Dosya.ogg]]</nowiki></code>'''",
        "upload-permitted": "{{PLURAL:$2|Babetê|Babetên}} dosyayanê vêrdeyan: $1.",
        "upload-preferred": "{{PLURAL:$2|Babetê|Babetên}} dosyayanê tercihbiyayeyan: $1.",
        "upload-prohibited": "{{PLURAL:$2|Babetê|Babetên}} dosyayanê tometebiyayeyan: $1.",
        "maximum-size": "Ebatê maximumî",
        "pagesize": "(bitî)",
        "restriction-edit": "Bıvurne",
-       "restriction-move": "Bıkırış",
+       "restriction-move": "Bıkırışe",
        "restriction-create": "Vıraze",
        "restriction-upload": "Bar ke",
        "restriction-level-sysop": "tam pawiyayo",
        "lockfilenotwritable": "dosyaya qefılnayişê databaseyi ser ra çiyek nênusyena.",
        "databasenotlocked": "Database a nibiya.",
        "lockedbyandtime": "({{GENDER:$1|$1}} ra $2 tepya $3 biyo)",
-       "move-page": "$1 Bıkırış",
+       "move-page": "$1 Bıkırışe",
        "move-page-legend": "Pele bere",
        "movepagetext": "Pe form ki ho bın de, tı eşkeno name yew pele bıvurni u tarixê pele hemi ya zi pyeran beri.\nMa nameyê kıhanyeri keno pele redireksiyoni ser nameyê newe.\nTı eşkeno pele redireksiyoni ki şıno nameyê originali bıvurni.\nEg tı nıwazeno, ma tı ra rica keni tı [[Special:DoubleRedirects|double]] ya zi [[Special:BrokenRedirects|broken redirects]] qontrol bıki.\nTı gani qontrol bıki eg gıreyan şıno peleyanê raşti.\n\nTeme eka ser yew name de yew nuşte esti, sistemê ma '''nıeşkeno''' nuşte tı beri. Eka ser ena name de yew pele vengi esti, sistemê ma eşkeno nuşte tı beri.\nTı nıeşkeni name yew pele reyna bıvurni.\n\n'''Teme!'''\nEna transfer ser peleyanê populari zaf muhumo;\nMa tu ra rica keni, tı en verni dı qontrol bıki u bışıravi.",
        "movepagetext-noredirectfixer": " Gırwenayışê formê bınêni do namey perre newe vırazo, pêro vêrorê cı bıkırışo namey newe ser.\nMa namey kıhanêri keni perra serşıkıtışi ser nameyo newe.\nŞıma şenê perra serşıkıtışı zi berê namey raştıkên bıvırnên.\n\nEger şıma nêwazenê, ma şıma ra reca keni şıma [[Special:DoubleRedirects|açarnayışo (tadayışo) dılet]] ya zi [[Special:BrokenRedirects|açarnayışo (tadayışon) çewt]]i kontrol kerên.\nŞıma gani kontrol kerên eger linki şınê perranê raştan ser.\n\nTeme eger ser yew name de yew nuşte esto, sistemê wiki '''nêşeno''' nuştey şıma bıkırışo. Eger ser enê namey de yew perra venge esta, sistemê wiki şeno nuştey şıma bıkırışo.\nTı nıeşkeni name yew pele reyna bıvurni.\n\n'''İqaz!'''\nNo kırıştış şeno yew perra populere rê wışkên u nêpawiyay bo. Ma şıma ra reca kenime, kerdışê xo ra ver peyniyê cı bıvênên.",
index e387b77..74bc787 100644 (file)
        "exif-gpsspeed": "Хәрәкәт тизлеге",
        "exif-gpsdatestamp": "GPS датасы",
        "exif-keywords": "Иң мөһиме",
+       "exif-countrydest": "Күрсәтелгән ил",
+       "exif-countrycodedest": "Күрсәтелгән илнең коды",
+       "exif-provinceorstatedest": "Күрсәтелгән өлкә яки штат",
+       "exif-citydest": "Күрсәтелгән шәһәр",
+       "exif-sublocationdest": "Күрсәтелгән шәһәрнең җире",
+       "exif-objectname": "Кыска исем",
        "exif-headline": "Башисем",
        "exif-source": "Чыганак",
        "exif-contact": "Элемтә өчен мәгълүмат",
        "exif-iimversion": "IIM юрамасы",
        "exif-iimcategory": "Төркем",
        "exif-iimsupplementalcategory": "Өстәмә төркемнәр",
-       "exif-datetimereleased": "ЧÑ\8bгаÑ\80Ñ\8bлÑ\83 вакыты",
+       "exif-datetimereleased": "ЧÑ\8bгаÑ\80Ñ\8bлÑ\8bÑ\88 вакыты",
        "exif-identifier": "Идентификатор",
        "exif-cameraownername": "Камера иясе",
        "exif-label": "Билгеләү",
index 50d1db2..72c8fbe 100644 (file)
@@ -10,7 +10,8 @@
                        "Qiyue2001",
                        "Xiaomingyan",
                        "神樂坂秀吉",
-                       "予弦"
+                       "予弦",
+                       "Wenyuan Liu"
                ]
        },
        "exif-imagewidth": "宽度",
        "exif-scenetype-1": "直接照像图片",
        "exif-customrendered-0": "标准处理",
        "exif-customrendered-1": "自定义处理",
+       "exif-customrendered-2": "HDR(没有保留原始信息)",
+       "exif-customrendered-3": "HDR(保留原始信息)",
+       "exif-customrendered-4": "原始(用于HDR)",
+       "exif-customrendered-6": "全景",
+       "exif-customrendered-7": "竖向 HDR",
+       "exif-customrendered-8": "竖向",
        "exif-exposuremode-0": "自动曝光",
        "exif-exposuremode-1": "手动曝光",
        "exif-exposuremode-2": "自动曝光感知调节",
index b12faea..07f248d 100644 (file)
        "tooltip-pt-watchlist": "Une liste des pages dont vous suivez les modifications",
        "tooltip-pt-mycontris": "La liste de {{GENDER:|vos}} contributions",
        "tooltip-pt-anoncontribs": "Une liste des modifications effectuées depuis cette adresse IP",
-       "tooltip-pt-login": "Nous vous encourageons à vous connecter ; ce n’est cependant pas obligatoire",
+       "tooltip-pt-login": "Nous vous encourageons à vous connecter ; ce n’est cependant pas obligatoire.",
        "tooltip-pt-login-private": "Vous devez vous connecter pour utiliser ce wiki",
        "tooltip-pt-logout": "Se déconnecter",
-       "tooltip-pt-createaccount": "Nous vous encourageons à créer un compte utilisateur et vous connecter; ce n’est cependant pas obligatoire",
+       "tooltip-pt-createaccount": "Nous vous encourageons à créer un compte utilisateur et vous connecter ; ce n’est cependant pas obligatoire.",
        "tooltip-ca-talk": "Discussion au sujet de cette page de contenu",
        "tooltip-ca-edit": "Modifier le wikicode",
        "tooltip-ca-addsection": "Commencer une nouvelle section",
        "pageinfo-hidden-categories": "{{PLURAL:$1|Catégorie cachée|Catégories cachées}} ($1)",
        "pageinfo-templates": "{{PLURAL:$1|Modèle inclu|Modèles inclus}} ($1)",
        "pageinfo-transclusions": "{{PLURAL:$1|Page dans laquelle|Pages dans lesquelles}} cette page est incluse ($1)",
-       "pageinfo-toolboxlink": "Information sur la page",
+       "pageinfo-toolboxlink": "Informations sur la page",
        "pageinfo-redirectsto": "Rediriger vers",
        "pageinfo-redirectsto-info": "info",
        "pageinfo-contentpage": "Comptée comme page de contenu",
index fb03342..714f258 100644 (file)
        "listfiles-userdoesnotexist": "חשבון המשתמש \"$1\" אינו רשום.",
        "imgfile": "קובץ",
        "listfiles": "רשימת קבצים",
+       "listfiles_subpage": "העלאות של $1",
        "listfiles_thumb": "תמונה ממוזערת",
        "listfiles_date": "תאריך",
        "listfiles_name": "שם",
index ddad4da..8fc0095 100644 (file)
        "prefs-resetpass": "promijeni zaporku",
        "prefs-changeemail": "promijeni ili ukloni adresu e-pošte",
        "prefs-setemail": "Postavite adresu e-pošte",
-       "prefs-email": "Mogućnosti e-maila",
+       "prefs-email": "Mogućnosti e-pošte",
        "prefs-rendering": "Izgled",
        "saveprefs": "Spremi",
        "restoreprefs": "Vrati sve postavke na prvobitno zadane (u svim odjeljcima)",
        "prefs-custom-js": "Prilagođen JS",
        "prefs-common-config": "Dijeljeni CSS/JSON/JavaScript za sve izglede:",
        "prefs-reset-intro": "Možete koristiti ovu stranicu za povrat Vaših postavki na prvotne postavke. Ovo se ne može poništiti.",
-       "prefs-emailconfirm-label": "Potvrda e-mail adrese:",
+       "prefs-emailconfirm-label": "Potvrda adrese e-pošte:",
        "youremail": "Vaša adresa e-pošte:",
        "username": "Ime {{GENDER:$1|suradnika|suradnice}}:",
        "prefs-memberingroups": "{{GENDER:$2|Suradnik je član|Suradnica je članica}} {{PLURAL:$1|sljedeće skupine|sljedećih skupina}}:",
index 4bb5750..a346ed2 100644 (file)
        "createaccountmail": "Átmeneti, véletlenszerű jelszó beállítása és kiküldése a megadott e-mail-címre",
        "createaccountmail-help": "A jelszó megismerése nélkül készíthető valaki másnak fiók.",
        "createacct-realname": "Igazi neved (nem kötelező)",
-       "createacct-reason": "Indoklás",
+       "createacct-reason": "Indoklás (nyilvánosan naplózva)",
        "createacct-reason-ph": "Miért hozol létre egy másik fiókot",
        "createacct-reason-help": "A fióklétrehozási naplóban megjelenő üzenet",
        "createacct-submit": "Felhasználói fiók létrehozása",
        "rcfilters-preference-help": "Friss változtatások betöltése szűrők közti keresés és kiemelések lehetősége nélkül.",
        "rcfilters-watchlist-preference-label": "JavaScript nélküli felület használata",
        "rcfilters-watchlist-preference-help": "Figyelőlista betöltése szűrők közti keresés és kiemelések lehetősége nélkül.",
-       "rcfilters-filter-showlinkedfrom-label": "A következő lapra hivatkozó lapok változtatásainak megjelenítése",
+       "rcfilters-filter-showlinkedfrom-label": "A következő lapról hivatkozott lapok változtatásainak megjelenítése",
        "rcfilters-filter-showlinkedfrom-option-label": "A kiválasztott <strong>lapról</strong> hivatkozott lapok",
        "rcfilters-filter-showlinkedto-label": "A következő lapról hivatkozott lapok változtatásainak megjelenítése",
        "rcfilters-filter-showlinkedto-option-label": "A kiválasztott <strong>lapra</strong> hivatkozó lapok",
        "uploadstash-zero-length": "A fájl nulla méretű.",
        "invalid-chunk-offset": "Érvénytelen darab eltolás",
        "img-auth-accessdenied": "Hozzáférés megtagadva",
-       "img-auth-nopathinfo": "Hiányzó PATH_INFO.\nA szerver nincs beállítva, hogy továbbítsa ezt az információt.\nLehet, hogy CGI-alapú, és nem támogatja az img_auth-ot.\nLásd https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization!",
+       "img-auth-nopathinfo": "Hiányzó elérési út információ.\nA szerveredet úgy kell beállítanod, hogy továbbítsa a REQUEST_URI és/vagy a PATH_INFO változókat.\nHa már be vannak, próbáld engedélyezni a $wgUsePathInfo-t.\nLásd https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization!",
        "img-auth-notindir": "A kért elérési út nincs a beállított feltöltési könyvtárban.",
        "img-auth-badtitle": "Nem sikerült érvényes címet készíteni a(z) „$1” szövegből.",
        "img-auth-nofile": "A fájl („$1”) nem létezik.",
        "listfiles-userdoesnotexist": "A(z) „$1” felhasználó nincs regisztrálva.",
        "imgfile": "fájl",
        "listfiles": "Fájllista",
+       "listfiles_subpage": "$1 feltöltései",
        "listfiles_thumb": "Bélyegkép",
        "listfiles_date": "Dátum",
        "listfiles_name": "Név",
index 36f20bc..6bee178 100644 (file)
@@ -64,6 +64,7 @@
        "tog-useeditwarning": "Advertir me quando io quita un pagina de modification sin publicar le cambiamentos",
        "tog-prefershttps": "Sempre usar un connexion secur durante session aperte",
        "tog-showrollbackconfirmation": "Monstrar un demanda de confirmation al cliccar sur un ligamine de revocation",
+       "tog-requireemail": "Requirer e-mail pro reinitialisar contrasigno",
        "underline-always": "Sempre",
        "underline-never": "Nunquam",
        "underline-default": "Como definite per tu navigator o apparentia",
        "prefs-help-email": "Le adresse de e-mail es optional, ma es necessari pro le reinitialisation de tu contrasigno, in caso que tu lo oblida.",
        "prefs-help-email-others": "Tu pote etiam optar pro permitter que altere personas te contacta via tu pagina de usator o de discussion, sin necessitate de revelar tu identitate.",
        "prefs-help-email-required": "Un adresse de e-mail es obligatori.",
+       "prefs-help-requireemail": "Si es marcate, inviar messages pro reinitialisar contrasigno solmente si le persona reinitialisante forni non solmente le nomine de usator ma etiam le adresse de e-mail pro iste conto.",
        "prefs-info": "Informationes de base",
        "prefs-i18n": "Internationalisation",
        "prefs-signature": "Signatura",
        "listfiles-userdoesnotexist": "Le conto de usator \"$1\" non es registrate.",
        "imgfile": "file",
        "listfiles": "Lista de files",
+       "listfiles_subpage": "Files incargate per $1",
        "listfiles_thumb": "Miniatura",
        "listfiles_date": "Data",
        "listfiles_name": "Nomine",
        "ipblocklist-legend": "Cercar un usator blocate",
        "blocklist-userblocks": "Celar blocadas de conto",
        "blocklist-tempblocks": "Celar blocadas temporari",
+       "blocklist-indefblocks": "Celar blocadas infinite",
        "blocklist-addressblocks": "Celar blocadas de singule adresse IP",
        "blocklist-type": "Typo:",
        "blocklist-type-opt-all": "Totes",
        "mycustomjsredirectprotected": "Tu non ha le permission de modificar iste pagina JavaScript perque illo es un redirection e non puncta a un pagina in tu spatio de usator.",
        "easydeflate-invaliddeflate": "Le contento fornite non es correctemente comprimite",
        "unprotected-js": "Pro motivos de securitate, non es possibile cargar codice JavaScript de paginas non protegite. Crea JavaScript solmente in le spatio de nomines \"MediaWiki:\" o como un subpagina de usator.",
-       "userlogout-continue": "Vole tu clauder le session?"
+       "userlogout-continue": "Vole tu clauder le session?",
+       "rest-prefix-mismatch": "Le cammino requestate ($1) non es intra le cammino radice del REST API ($2)",
+       "rest-wrong-method": "Le methodo del requesta ($1) non es {{PLURAL:$3|le methodo|inter le methodos}} permittite pro iste cammino ($2)",
+       "rest-no-match": "Le cammino relative requestate ($1) non corresponde a un gestor cognoscite"
 }
index fa88ebd..5cbecc3 100644 (file)
        "listfiles-userdoesnotexist": "L'utenza \"$1\" non è registrata.",
        "imgfile": "file",
        "listfiles": "Elenco dei file",
+       "listfiles_subpage": "Caricamenti di $1",
        "listfiles_thumb": "Miniatura",
        "listfiles_date": "Data",
        "listfiles_name": "Nome",
index 8ffab44..e8081a4 100644 (file)
        "empty-username": "(사용 가능한 사용자 이름 없음)",
        "contribslink": "기여",
        "emaillink": "이메일 보내기",
-       "autoblocker": "당신의 IP 주소는 최근에 \"[[User:$1|$1]]\"님이 사용하였기 때문에 자동으로 차단되었습니다.\n$1님이 차단된 이유는 다음과 같습니다: \"$2\"",
+       "autoblocker": "당신의 IP 주소는 최근에 \"[[User:$1|$1]]\" 님이 사용하였기 때문에 자동으로 차단되었습니다.\n$1 님이 차단된 이유는 다음과 같습니다: \"$2\"",
        "blocklogpage": "차단 기록",
        "blocklog-showlog": "이 사용자는 과거에 차단된 기록이 있습니다.\n해당 사용자의 차단 기록은 다음과 같습니다:",
        "blocklog-showsuppresslog": "이 사용자는 과거에 차단된 적이 있으며, 그 기록이 숨겨져 있습니다.\n해당 사용자의 차단 기록은 다음과 같습니다:",
-       "blocklogentry": "님이 [[$1]]님을 $2 차단했습니다 $3",
+       "blocklogentry": "님이 [[$1]] 님을 $2 차단했습니다 $3",
        "reblock-logentry": " 님이 [[$1]] 님의 차단 기간을 $2(으)로 바꾸었습니다 $3",
        "blocklogtext": "이 목록은 사용자 차단/차단 해제 기록입니다.\n자동으로 차단된 IP 주소는 여기에 나오지 않습니다.\n[[Special:BlockList|여기]]에서 현재 차단된 사용자 목록을 볼 수 있습니다.",
        "unblocklogentry": "님이 $1님을 차단 해제했습니다",
index 5d12d28..5286b97 100644 (file)
        "emailuser-title-target": "Siųsti el. pašto žinutę {{GENDER:$1|naudotojui|naudotojai}}",
        "emailuser-title-notarget": "El. pašto vartotojas",
        "emailpagetext": "Jūs galite pasinaudoti šiuo pavyzdžiu, norėdami nusiųsti elektroninį laišką {{GENDER:$1|šiam naudotojui|šiai naudotojai}}.\nElektroninio pašto adresas, kurį įvedėte [[Special:Preferences|savo naudotojo nustatymuose]], bus rodomas kaip el. pašto siuntėjo adresas tam, kad gavėjas galėtų tiesiogiai jums atsakyti.",
-       "defemailsubject": "{{SITENAME}} el. pašto iš vartotojo \" $1 \"",
+       "defemailsubject": "{{SITENAME}} laiškas iš naudotojo „$1“",
        "usermaildisabled": "Naudotojo elektroninis paštas išjungtas",
        "usermaildisabledtext": "Jūs negalite siūlsti el. laiško kitiems šio wiki projekto naudotojams.",
        "noemailtitle": "Nėra el. pašto adreso",
index 3950d1f..3767ed8 100644 (file)
        "createaccountmail": "Mohon pakai kato sandi samantaro dan kirim ka alamaik surek elektronik nan alah disabuikkan.",
        "createaccountmail-help": "Indak dapek digunoan untuak mambuek akun urang lain tanpa tau kato sandinyo.",
        "createacct-realname": "Namo asli (opsional)",
-       "createacct-reason": "Alasan",
+       "createacct-reason": "Alasan (log publik)",
        "createacct-reason-ph": "Manga Sanak mambuek akun lain",
        "createacct-reason-help": "Pasan yang ditunjuakan dalam log pambuatan akun",
        "createacct-submit": "Buek akun Sanak",
        "right-import": "Mangimpor laman dari wiki lain",
        "right-importupload": "Mangimpor laman dari berkas nan dimuek",
        "right-autopatrol": "Suntiangan surang sacaro otomatih ditandoi tapantau",
+       "right-userrights": "Manyuntiang sadoalah hak pangguno",
+       "right-userrights-interwiki": "Manyuntiang hak pangguno-pangguno di wiki lain",
+       "right-siteadmin": "Mangunci jo mambukak kunci basis data",
+       "right-override-export-depth": "Ekspor laman tamasuak laman-laman takaik inggo kadalaman 5",
+       "right-sendemail": "Mangirim surel ka pangguno lain",
+       "right-managechangetags": "Buek jo matikan [[Special:Tags|tag]]",
+       "right-applychangetags": "Terapkan [[Special:Tags|tags]] basamoan jo parubahan pangguno",
+       "right-changetags": "Tambah jo apuih [[Special:Tags|tag]] arbitrari pado tiok-tiok  revisi jo entri log",
+       "right-deletechangetags": "ApuIh [[Special:Tags|tag]] dari basisdata",
+       "grant-generic": "\"$1\" bundel hak akses",
+       "grant-group-page-interaction": "Barinteraksi jo laman",
+       "grant-group-file-interaction": "Barinteraksi jo media",
+       "grant-group-watchlist-interaction": "Barinteraksi jo daftar pantauan Sanak",
        "grant-group-email": "Kirim surel",
+       "grant-group-high-volume": "Malakukan aktivitas nan amaik banyak",
+       "grant-group-customization": "Kustomisasi jo preferensi",
+       "grant-group-administration": "Malakukan tindakan administratif",
+       "grant-group-private-information": "Akses data pribadi tantang Sanak",
+       "grant-group-other": "Aktivitas lain-lain",
+       "grant-blockusers": "Sakek jo bukak panyakekan pangguno",
        "grant-createaccount": "Buek akun",
        "grant-createeditmovepage": "Buek, suntiang, dan pindahkan laman",
        "grant-delete": "Hapuih laman, revisi, dan log entri",
+       "grant-editinterface": "Suntiang ruang namo MediaWiki jo JSON pangguno untuak kasadoalahan situs",
+       "grant-editmycssjs": "Manyuntiang laman CSS/JSON/JavaScript Sanak",
+       "grant-editmyoptions": "Manyuntiang preferensi pangguno Sanak jo konfigurasi JSON",
+       "grant-editmywatchlist": "Suntiang daftar pantauan Sanak",
+       "grant-editsiteconfig": "Suntiang CSS/JS pangguno untuak kasadoalahan situs",
+       "grant-editpage": "Manyuntiang laman nan ado",
+       "grant-editprotected": "Manyuntiang laman nan dilinduangi",
+       "grant-highvolume": "Panyuntiangan jo volume tinggi",
+       "grant-oversight": "Suruakan pangguno jo revisinyo",
+       "grant-patrol": "Tandoi laman tapatroli",
+       "grant-privateinfo": "Akses informasi pribadi",
+       "grant-protect": "Malinduangi jo mambukak palinduangan laman",
+       "grant-rollback": "Mambaliakan parubahan pado laman",
+       "grant-sendemail": "Mangirim surel ka pangguno lain",
+       "grant-uploadeditmovefile": "Maunggah, mangganti, jo mamindahan berkas",
+       "grant-uploadfile": "Muek berkas baru",
        "grant-basic": "Akses dasar",
+       "grant-viewdeleted": "Mancaliak laman jo berkas nan diapuih",
+       "grant-viewmywatchlist": "Caliak daftar pantauan Sanak",
+       "grant-viewrestrictedlogs": "Caliak entri log tabateh",
        "newuserlogpage": "Log pangguno baru",
        "newuserlogpagetext": "Di bawah ko log pandaftaran pangguno baru",
        "rightslog": "Log parubahan hak akses",
        "action-createpage": "buek laman ko",
        "action-createtalk": "buek laman rundiang ko",
        "action-createaccount": "buek akun pangguno ko",
+       "action-autocreateaccount": "buek otommatis akun pangguno lua",
+       "action-history": "Caliak riwayaik suntiangan laman ko",
        "action-minoredit": "tandoi sabagai suntiangan ketek",
        "action-move": "pindahan laman ko",
        "action-move-subpages": "pindahkan laman ko, jo sublamannyo",
        "action-move-rootuserpages": "pindahan laman pangguno",
+       "action-move-categorypages": "Pindahan halaman kategori",
        "action-movefile": "pindahkan berkas ko",
        "action-upload": "muek berkas ko",
        "action-reupload": "timpo berkas lamo",
+       "action-reupload-shared": "manimpo berkas nan alah ado di tampek panyimpanan berkas basamo",
+       "action-upload_by_url": "mamuek berkas ko dari sabuah alamaik URL",
        "action-writeapi": "manggunoan panulisan API",
+       "action-delete": "Hapuih laman ko",
+       "action-deleterevision": "Apuih revisi",
+       "action-deletelogentry": "apuih entri log",
+       "action-deletedhistory": "mancaliak versi tadaulu laman nan alah diapuih",
+       "action-deletedtext": "caliak teks revisi nan diapuih",
+       "action-browsearchive": "Cari laman nan dihapuih",
+       "action-undelete": "batalkan pangapuihan laman",
+       "action-suppressrevision": "tinjau jo baliakan revisi nan disuruakan",
+       "action-suppressionlog": "mancaliak log privat ko",
+       "action-block": "Sakek pangguno lain dari panyuntiangan",
+       "action-protect": "mangganti tingkek palinduangan laman ko",
+       "action-rollback": "mambaliakan sacaro capek suntiangan-suntiangan pangguno tarakhia nan manyuntiang laman tatantu",
        "action-import": "impor laman dari wiki lain",
+       "action-importupload": "maimpor laman ko dari berkas nan dimuek",
+       "action-patrol": "manandoi suntiangan pangguno lain sabagai tapatroli",
+       "action-autopatrol": "manandoi suntiangan Sanak surang sabagai tapatroli",
+       "action-unwatchedpages": "mancaliak daftar laman nan indak tapantau",
+       "action-mergehistory": "manggabuangkan revisi-revisi tadaulu dari laman ko",
+       "action-userrights": "manyuntiang sadoalah hak pangguno",
+       "action-userrights-interwiki": "manyuntiang hak pangguno-pangguno dari wiki lain",
+       "action-siteadmin": "mangunci jo mambukak basisdata",
+       "action-sendemail": "kirim surel",
+       "action-editmyoptions": "manyuntiang preferensi Sanak",
+       "action-editmywatchlist": "suntiang daftar pantauan Sanak",
+       "action-viewmywatchlist": "caliak daftar pantauan Sanak",
+       "action-viewmyprivateinfo": "caliak informasi pribadi Sanak",
+       "action-editmyprivateinfo": "manyuntiang informasi pribadi Sanak",
+       "action-editcontentmodel": "manyuntiang model konten sabuah laman",
+       "action-managechangetags": "buek jo matikan tag",
+       "action-applychangetags": "terapkan tag basamoan jo parubahan Sanak",
+       "action-changetags": "Tambah jo apuih [[Special:Tags|tag]] arbitrari pado tiok-tiok  revisi jo entri log",
+       "action-deletechangetags": "apuih tag dari basisdata",
+       "action-purge": "apuih singgahan laman ko",
+       "action-apihighlimits": "manggunoan bateh labiah tinggi dalam kueri API",
+       "action-autoconfirmed": "indak dipangaruahi bateh laju babasis IP",
+       "action-bigdelete": "Apuih halaman nan banyak versi tadahulunyo",
+       "action-blockemail": "manyakek pangiriman surel dek pangguno",
+       "action-bot": "dipalakukan sabagai proses otomatis",
+       "action-editprotected": "manyuntiang laman talinduangi sabagai \"{{int:protect-level-sysop}}\"",
+       "action-editsemiprotected": "manyuntiang laman nan talinduangi sabagai \"{{int:protect-level-sysop}}\"",
+       "action-editinterface": "manyuntiang antarmuko pangguno",
+       "action-editusercss": "manyuntiang berkas CSS pangguno lain",
+       "action-edituserjson": "manyuntiang berkas JSON pangguno lain",
+       "action-edituserjs": "manyuntiang berkas JS pangguno lain",
+       "action-editsitecss": "manyunting CSS untuak kasadoalahan situs",
+       "action-editsitejson": "suntiang JSON untuak kasadoalahan situs",
+       "action-editsitejs": "suntiang JavaScript untuak kasadoalahan situs",
+       "action-editmyusercss": "suntiang berkas CSS pangguno Sanak",
+       "action-editmyuserjson": "suntiang berkas JSON pangguno Sanak",
+       "action-editmyuserjs": "suntiang berkas JavaScript pangguno Sanak",
+       "action-editmyuserjsredirect": "suntiang berkas JavaScript Sanak nan marupokan aliahan.",
+       "action-viewsuppressed": "caliak parubahan nan tasuruak dari sadoalah pangguno",
+       "action-hideuser": "sakek namo pangguno jo suruakan dari publik",
+       "action-ipblock-exempt": "abaikan panyakekan IP, panyakekan otomatis, jo rantang panyakekan",
+       "action-unblockself": "malapehan sakek surang",
+       "action-noratelimit": "indak dipangaruahi jo pambatehan jumlah suntiangan",
+       "action-reupload-own": "manimpo berkas nan dimuek surang",
+       "action-nominornewtalk": "indak ado tando suntiangan ketek di laman rundiang mamicu pasan baru",
+       "action-markbotedits": "tandoi pambaliakan revisi sabagai suntiangan bot",
+       "action-patrolmarks": "caliak panandoan patroli parubahan tabaru",
+       "action-override-export-depth": "ekspor laman tamasuak laman-laman takaik inggo kadalaman 5",
+       "action-suppressredirect": "indak mambuek pangaliahan wakatu mamindahan laman",
        "nchanges": "$1 {{PLURAL:$1|parubahan}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|sajak kunjuangan tarakhia}}",
        "enhancedrc-history": "versi",
        "recentchanges": "Parubahan baru",
        "recentchanges-legend": "Piliahan parubahan baru",
        "rcfilters-filter-newpages-label": "Laman baru",
        "rcfilters-filter-categorization-label": "Parubahan kategori",
        "rcfilters-filter-logactions-label": "Tindakan tacataik",
+       "rcfilters-filter-lastrevision-label": "Revisi tabaru",
+       "rcfilters-filter-lastrevision-description": "Anyo parubahan tabaru pado laman ko.",
        "rcfilters-view-tags": "Suntiangan ditandoi",
        "rcfilters-liveupdates-button": "Parubahan langsuang",
        "rcfilters-liveupdates-button-title-on": "Matian parubahan langsuang",
index 6fcee4e..d7e5a1c 100644 (file)
        "viewsource": "Brontekst bekyken",
        "viewsource-title": "Bron bekyken van $1",
        "actionthrottled": "Handeling teagenholden",
-       "actionthrottledtext": "As maotregel tegen t plaotsen van alderhaande moek, is t antal keren da'j disse haandeling in n korte tied uutvoeren kunnen beteund. Je hebben de limiet overschrejen. Probeer t over n antal minuten weer.",
-       "protectedpagetext": "Disse zied is beveiligd. Bewarken of aandere haandelingen bin niet meugelik.",
-       "viewsourcetext": "Je kunnen de brontekste van disse zied bewarken en bekieken.",
-       "viewyourtext": "Je kunnen <strong>joew bewarkingen</strong> an de brontekste van disse zied bekieken en kopiëren.",
-       "protectedinterface": "Op disse zied steet tekste die gebruukt wördt veur systeemteksten van disse wiki. Allinnig beheerders kunnen disse zied bewarken.\nUm vertalingen veur alle wiki's derbie te zetten of te wiezigen, gebruuk [https://translatewiki.net/ translatewiki.net], t vertaalprojekt veur MediaWiki.",
-       "editinginterface": "<strong>Waorschuwing:</strong> je bewarken n zied die gebruukt wördt deur de programmatuur. \nWa'j disse zied wiezigen is van invleud op t gebrukersuterlik veur aander gebrukers van disse wiki.",
-       "translateinterface": "Um vertalingen veur alle wiki's te doon of te wiezigen ku'j gebruukmaken van [https://translatewiki.net/ translatewiki.net], t vertaalprojekt veur MediaWiki.",
-       "cascadeprotected": "Disse zied is beveiligd umdat t veurkömp in de volgende {{PLURAL:$1|zied|ziejen}}, die beveiligd {{PLURAL:$1|is|bin}} mit de \"kaskade\"-opsie:\n$2",
-       "namespaceprotected": "Je maggen gien ziejen in de '''$1'''-naamruumte bewarken.",
-       "customcssprotected": "Je kunnen disse CSS-zied niet bewarken, umdat der persoonlike instellingen van n aandere gebruker in staon.",
-       "customjsprotected": "Je kunnen disse JavaScript-zied niet bewarken, umdat der persoonlike instellingen van n aandere gebruker in staon.",
-       "mycustomcssprotected": "Je hebben gien toestemming um disse CSS-zied te bewarken.",
-       "mycustomjsprotected": "Je hebben gien rechten um disse JavaScript-zied te bewarken.",
-       "myprivateinfoprotected": "Je hebben gien rechten um joew priveegegevens an te passen.",
-       "mypreferencesprotected": "Je hebben gien rechten um joew veurkeuren an te passen.",
-       "ns-specialprotected": "Spesiale ziejen kunnen niet bewarkt wörden.",
-       "titleprotected": "t Anmaken van disse zied is beveiligd deur [[User:$1|$1]].\nDe op-egeven reden is <em>$2</em>.",
-       "filereadonlyerror": "Kon t bestaand \"$1\" niet anpassen umdat de bestaandsmap \"$2\" op dit moment op allinnig-lezen steet.\n\nDe op-egeven reden is: \"$3\".",
+       "actionthrottledtext": "As måtregel teagen misbruuk, is et antal keyren dat jy disse handeling in een korte tyd uutvoren künnet betöänd. Jy hebbet de limit oaverskreaden. Probeer et oaver een antal minuten weader.",
+       "protectedpagetext": "Disse syde is beveiligd. Bewarken of andere handelingen binnet neet möägelik.",
+       "viewsourcetext": "Jy künnet de brontekst van disse syde bewarken en bekyken.",
+       "viewyourtext": "Jy künnet <strong>juw bewarkingen</strong> an de brontekst van disse syde bekyken en kopieren.",
+       "protectedinterface": "Up disse syde steyt tekst dee bruked wördt vöär systeemteksten van disse wiki, en is beveiligd üm misbruuk te vöärkommen. Bruuk [https://translatewiki.net/ translatewiki.net], et lokaliseringsprojekt vöär MediaWiki, üm oaversetingen vöär alle wikis to te vogen of te wysigen.",
+       "editinginterface": "<strong>Wårsküwing:</strong> jy bewarket een syde dee teksten bruukt vöär de brukersümgeaving van de programmatuur. \nWat jy up disse syde wysigen is van invlööd up de brukersümgeaving van andere brukers van disse wiki.",
+       "translateinterface": "Üm oaversettingen vöär alle wikis to te vogen of te wysigen, kün jy [https://translatewiki.net/ translatewiki.net] bruken, et lokaliseringsprojekt vöär MediaWiki.",
+       "cascadeprotected": "Disse syde is beveiligd ümdat et vöärkümt in de volgende {{PLURAL:$1|syde|syden}}, dee beveiligd {{PLURAL:$1|is|binnet}} mid de \"kaskade\"-opty:\n$2",
+       "namespaceprotected": "Jy möäget geen syden in de <strong>$1</strong>-naamruumde bewarken.",
+       "customcssprotected": "Jy möäget disse CSS-syde neet bewarken, ümdat der persoonlike instellingen van een andere bruker in stån.",
+       "customjsprotected": "Jy möäget disse JavaScript-syde neet bewarken, ümdat der persoonlike instellingen van een andere bruker in stån.",
+       "mycustomcssprotected": "Jy hebbet geen rechten üm disse CSS-syde te bewarken.",
+       "mycustomjsprotected": "Jy hebbet geen rechten üm disse JavaScript-syde te bewarken.",
+       "myprivateinfoprotected": "Jy hebbet geen rechten üm juw priveegegeavens te bewarken.",
+       "mypreferencesprotected": "Jy hebbet geen rechten üm juw vöärköären an te passen.",
+       "ns-specialprotected": "Speciale syden künnet neet bewarked wörden.",
+       "titleprotected": "Et anmaken van disse syde is beveiligd döär [[User:$1|$1]].\nDe upgeaven readen is <em>$2</em>.",
+       "filereadonlyerror": "Kun et bestand \"$1\" neet anpassen ümdat de bestandsmap \"$2\" up dit moment up allinnig-leasen steyt.\n\nDe upgeaven readen is: \"$3\".",
        "invalidtitle-knownnamespace": "Ongeldige titel mit naamruumte \"$2\" en tekste \"$3\"",
        "invalidtitle-unknownnamespace": "Ongeldige titel mit onbekend naamruumtenummer $1 en tekste \"$2\"",
-       "exception-nologin": "Neet an-emelded",
+       "exception-nologin": "Neet anmelded",
        "exception-nologin-text": "Um disse zied te bekieken of disse haandeling uut te kunnen voeren mu'j [[Special:Userlogin|an-emeld]] ween bie disse wiki.",
        "virus-badscanner": "Slichte konfigurasie: onbekend antivirusprogramma: ''$1''",
        "virus-scanfailed": "inlezen is mislokt (kode $1)",
        "logouttext": "'''Je bin noen aofemeld.'''\n\nt Kan ween dat der wat ziejen bin die weeregeven wörden as of je an-emeld bin totda'j t tussengeheugen van joew webkieker leegmaken.",
        "welcomeuser": "Welkom, $1!",
        "welcomecreation-msg": "Joew gebruker is an-emaakt.\nVergeet niet joew [[Special:Preferences|veurkeuren veur {{SITENAME}}]] an te passen.",
-       "yourname": "Gebrukersname",
-       "userlogin-yourname": "Gebrukersname",
-       "userlogin-yourname-ph": "Geef joew gebrukersnaam op",
-       "createacct-another-username-ph": "Vul de gebrukersnaam in",
+       "yourname": "Brukersname",
+       "userlogin-yourname": "Brukersname",
+       "userlogin-yourname-ph": "Geav juw brukersname up",
+       "createacct-another-username-ph": "Geav de brukersname up",
        "yourpassword": "Wachtwoord",
        "userlogin-yourpassword": "Wachtwoord",
-       "userlogin-yourpassword-ph": "Geef joew wachtwoord op",
-       "createacct-yourpassword-ph": "Geef n wachtwoord op",
-       "yourpasswordagain": "Opniej invoeren",
-       "createacct-yourpasswordagain": "Wachtwoord bevestigen",
-       "createacct-yourpasswordagain-ph": "Geef t wachtwoord opniej op",
+       "userlogin-yourpassword-ph": "Geav juw wachtwoord up",
+       "createacct-yourpassword-ph": "Geav een wachtwoord up",
+       "yourpasswordagain": "Wachtwoord upny invoren",
+       "createacct-yourpasswordagain": "Bevästig wachtwoord",
+       "createacct-yourpasswordagain-ph": "Geav et wachtwoord upny up",
        "userlogin-remembermypassword": "Vanselv anmelden",
-       "userlogin-signwithsecure": "Beveiligde verbiending gebruken",
-       "yourdomainname": "Joew domein",
+       "userlogin-signwithsecure": "Beveiligde verbinding bruken",
+       "yourdomainname": "Juw domein",
        "password-change-forbidden": "Je kunnen joew wachtwoord niet wiezigen op disse wiki.",
        "externaldberror": "Der gung iets fout bie de externe authentisering, of je maggen je gebrukersprofiel niet bewarken.",
        "login": "Anmelden",
        "userinvalidconfigtitle": "'''Waorschuwing:''' der is gien uutvoering mit de naam \"$1\". Vergeet niet dat joew eigen .css- en .js-ziejen beginnen mit n kleine letter, bv. \"{{ns:user}}:Naam/'''v'''ector\" in plaotse van \"{{ns:user}}:Naam/'''V'''ector.css\".",
        "updated": "(Bewark)",
        "note": "'''Opmarking:'''",
-       "previewnote": "'''Waort je: dit is n naokiekzied.'''\nJoew tekste is niet op-esleugen!",
-       "continue-editing": "Gao naor t bewarkingsvienster",
+       "previewnote": "<strong>Denk derüm dat dit allinnig een nåkyksyde is.</strong>\nJuw wysigingen binnet noch neet seakerd!",
+       "continue-editing": "Gå nå et bewarkingsveld",
        "previewconflict": "Disse versie löt zien hoe de tekste in t bovenste veld deruut kömp te zien a'j de tekste opslaon.",
        "session_fail_preview": "'''De bewarking kan niet verwarkt wörden wegens n verlies an data.'''\nProbeer t laoter weer.\nAs t probleem dan nog steeds veurkömp, probeer dan [[Special:UserLogout|opniej an te melden]].",
        "session_fail_preview_html": "'''De bewarking kan niet verwarkt wörden wegens n verlies an data.'''\n\n''Umdat in {{SITENAME}} roewe HTML in-eschakeld is, is de weergave dervan verbörgen um te veurkoemen dat t JavaScript an-evöllen wörden.''\n\n'''As dit n legitieme wieziging is, probeer t dan opniej.'''\nAs t dan nog problemen gif, probeer dan um [[Special:UserLogout|opniej an te melden]].",
        "revdelete-unrestricted": "hef beparkingen veur beheerders deraof ehaold",
        "logentry-block-block": "$1 {{GENDER:$2|hef}} {{GENDER:$4|$3}} eblokkeerd veur de duur van $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|hef}} {{GENDER:$4|$3}} eblokkeerd veur de duur van $5 $6",
-       "logentry-move-move": "$1 hevt de syde $3 {{GENDER:$2|hernöömd}} når $4",
-       "logentry-move-move-noredirect": "$1 hevt de syde $3 {{GENDER:$2|hernöömd}} når $4 sunder een döärverwysing achter te låten",
-       "logentry-move-move_redir": "$1 hevt de syde $3 {{GENDER:$2|hernöömd}} når $4 oaver een döärverwysing hear",
-       "logentry-move-move_redir-noredirect": "$1 hevt de syde $3 {{GENDER:$2|hernöömd}} når $4 oaver een döärverwysing hear sunder een döärverwysing achter te låten",
+       "logentry-move-move": "$1 hevt de syde $3 {{GENDER:$2|hernöömd}} nå $4",
+       "logentry-move-move-noredirect": "$1 hevt de syde $3 {{GENDER:$2|hernöömd}} nå $4 sunder een döärverwysing achter te låten",
+       "logentry-move-move_redir": "$1 hevt de syde $3 {{GENDER:$2|hernöömd}} nå $4 oaver een döärverwysing hinne",
+       "logentry-move-move_redir-noredirect": "$1 hevt de syde $3 {{GENDER:$2|hernöömd}} nå $4 oaver een döärverwysing hinne sunder een döärverwysing achter te låten",
        "logentry-patrol-patrol": "$1 hef versie $4 van de zied $3 op {{GENDER:$2|nao-ekeken}} ezet",
        "logentry-patrol-patrol-auto": "$1 hef versie $4 van de zied $3 automaties op {{GENDER:$2|nao-ekeken}} ezet",
        "logentry-newusers-newusers": "Gebruker $1 is {{GENDER:$2|an-emaakt}}",
index 3d8548a..eb628a8 100644 (file)
        "illegalfilename": "ߞߟߏ ߘߏ߫ ߦߋ߫ ߞߐߕߐ߮ ߕߐ߮  \"$1\" ߘߐ߫ ߡߍ߲ ߠߊߘߤߊ߬ߣߍ߲߬ ߕߍ߫ ߞߐߜߍ ߞߎ߲߬ߕߐ߰ ߞߏ ߘߐ߫. \nߕߐ߯ ߜߘߍ߫ ߟߊ߫ ߞߐߕߐ߮ ߟߊ߫ ߖߊ߰ߣߌ߲߬ ߞߣߊ߬ ߕߴߊ߬ ߟߊߦߟߍ߬ߟߌ ߡߊߝߍߣߍ߲߫ ߠߊ߫ ߕߎ߲߯.",
        "filename-toolong": "ߞߐߕߐ߮ ߕߐ߮ ߡߊ߲ߞߊ߲߫ ߞߊ߬ ߕߊ߬ߡߌ߲߬ ߝߙߐ߬ߢߐ ߂߀߀ ߞߊ߲߬.",
        "badfilename": "ߞߐߕߐ߮ ߕߐ߮ ߓߘߊ߫ ߦߟߍ߬ߡߊ߲߫ ߞߵߊ߬ ߞߍ߫ \"$1\" ߘߌ߫",
+       "filetype-missing": "ߘߐ߬ߝߎ߬ߟߋ߲߬ߠߌ߲߬ߢ ߛߌ߫ߢ ߕߍ߫ ߞߐߜߍ ߣߌ߲߬ ߠߊ߫ (ߦߏ߫ \".jpg\")",
        "empty-file": "ߌ ߣߊ߬ ߞߐߕߐ߮ ߡߍ߲ ߞߙߊߓߊ߫ ߟߊ߫߸ ߊ߬ ߘߐߞߏߟߏ߲ ߠߋ߬ ߕߘߍ߬.",
        "file-too-large": "ߌ ߟߊ߫ ߞߐߕߐ߮ ߞߙߊߓߊߣߍ߲ ߓߏ߲߬ߓߊ߫ ߕߘߍ߬ ߞߏߖߎ߰߹",
        "filename-tooshort": "ߞߐߕߐ߮ ߕߐ߮ ߛߘߎ߬ߡߊ߲߬ ߞߏߖߎ߰.",
        "verification-error": "ߞߐߕߐ߮ ߣߌ߲߬ ߡߊ߫ ߕߊ߬ߡߌ߲߬ ߞߐߕߐ߮ ߝߛߍ߬ߝߛߍ߬ ߦߌߟߊ.",
        "hookaborted": "ߌ ߕߘߍ߬ ߦߋ߫ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߡߍ߲ ߞߍ߫ ߞߏ ߘߐ߫߸ ߊ߬ ߘߐߛߊ߬ߣߍ߲߬ ߦߋ߫ ߘߐ߬ߥߙߊ߬ߟߌ ߟߋ߬ ߓߟߏ߫.",
        "illegal-filename": "ߞߐߕߐ߮ ߕߐ߮ ߟߊߘߌ߬ߢߍ߬ߣߍ߲߬ ߕߍ߫.",
+       "overwrite": "ߕߋ߲߭ߕߋ߲߭ ߞߐߕߐ߮ ߖߏ߬ߛߌ߬ߟߌ ߟߊߘߌ߬ߢߍ߬ߣߍ߲߬ ߕߍ߫.",
        "unknown-error": "ߝߎ߬ߕߎ߲߬ߕߌ߬ ߡߊߟߐ߲ߓߊߟߌ ߘߏ߫ ߓߘߊ߫ ߓߌ߬ߟߵߊ߬ ߘߐ߫.",
        "tmp-create-error": "ߊ߬ ߕߍ߫ ߣߊ߬ ߥߊ߯ߕߌ߫ ߟߊߕߊߡߌ߲߫ ߞߐߕߐ߮ ߛߌ߲ߘߌ߫ ߟߊ߫.",
+       "tmp-write-error": "ߥߊ߯ߕߌߟߊߕߊߡߌ߲߫ ߞߐߕߐ߮ ߛߓߍߟߌ ߝߎ߬ߕߎ߲߬ߕߌ.",
+       "large-file": "ߊ߬ ߞߊ߬ߣߌ߲߬ߣߍ߲߬ ߦߋ߫ ߟߋ߬ ߞߏ߫ ߞߐߕߐ߮ ߞߊߣߊ߬ ߥߙߊ߬ $1 ߘߌ: ߞߐߕߐ߮ ߣߌ߲߬ ߘߏ߲߬ ߦߋ߫ $2.",
+       "largefileserver": "ߞߐߕߐ߮ ߓߏ߲߬ߓߊ߫ ߞߊ߬ ߕߊ߬ߡߌ߲߬ ߡߊ߬ߛߐ߬ߟߊ ߘߊߘߐߓߍ߲߬ߣߍ߲߫ ߡߍ߲ ߠߊߘߌ߬ߢߍ߬ ߞߊ߲ߡߊ߬.",
+       "windows-nonascii-filename": "ߥߞߌ ߣߌ߲߬ ߡߊ߫ ߛߕߍߘߋ߲߫ ߞߙߍߞߙߍߣߍ߲ ߞߐߡߊߓߌ߲ߓߌ߲߫ ߞߐߕߐ߮ ߕߐ߮ ߞߏ ߘߐ߫.",
+       "fileexists": "ߞߐߕߐ߮ ߡߍ߲ ߟߕߐ߬ ߦߋ߫ ߕߐ߮ ߣߌ߲߬ ߡߊ߬߸ ߏ߬ ߦߋ߫ ߦߋ߲߬ ߞߘߐ߬ߡߊ߲߫߸ ߖߊ߰ߣߌ߲߬ ߌ ߦߋ߫ <strong>[[:$1]]</strong> ߝߛߍ߬ߝߛߍ߬ ߣߌ߫ {{GENDER:|ߌ}} ߘߏ߲߬ ߟߊߣߍ߲߫ ߡߊ߫ ߞߴߊ߬ ߟߊ߫߸ ߣߴߌ ߦߴߊ߬ ߡߊߝߊ߬ߟߋ߲߬ߞߏ ߘߐ߫ [[$1|ߞߝߊ߬ߟߋ߲ߛߋ߲]]",
        "uploadwarning": "ߟߊ߬ߦߟߍ߬ߟߌ ߖߊ߬ߛߙߋ߬ߡߊ߬ߟߊ",
        "uploadwarning-text": "ߞߐߕߐ߮ ߘߎ߰ߟߊ߬ߘߐ߫ ߞߊ߲ߛߓߍߟߌ ߡߊ߬ߦߟߍ߬ߡߊ߲߫ ߖߊ߰ߣߌ߲߬߸ ߞߵߊ߬ ߡߊߝߍߣߍ߲߫ ߕߎ߲߯.",
        "savefile": "ߞߐߕߐ߮ ߟߊߞߎ߲߬ߘߎ߬",
        "lockmanager-notlocked": "ߊ߬ ߕߍ߫ ߣߊ߬ ߛߐ߲߬ ߠߊ߫ \"$1\" ߟߊߞߊ߬ ߟߊ߫߸ ߊ߬ ߛߐ߰ߣߍ߲߬ ߕߍ߫.",
        "lockmanager-fail-closelock": "ߊ߬ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫ \"$1\" ߞߐߕߐ߮ ߛߐ߰ߣߍ߲ ߘߊߕߎ߲߯ ߠߊ߫.",
        "lockmanager-fail-deletelock": "ߊ߬ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫ \"$1\" ߞߐߕߐ߯ ߛߐ߰ߣߍ߲ ߖߏ߰ߛߌ߬ ߟߊ߫.",
+       "lockmanager-fail-acquirelock": "ߌ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫ ߛߐ߰ߟߌ ߛߐ߬ߘߐ߲߬ ߠߊ߫  \"$1\" ߞߊ߲߬.",
        "lockmanager-fail-releaselock": "ߌ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫ ߛߐ߰ߟߌ ߓߐ߫ ߟߊ߫  \"$1\" ߞߊ߲߬.",
        "lockmanager-fail-db-release": "ߌ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫ ߛߐ߰ߟߌ ߓߐ߫ ߟߊ߫ ߓߟߏߡߟߊߝߊ߲ $1 ߞߊ߲߬.",
        "lockmanager-fail-svr-release": "ߌ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫ ߛߐ߰ߟߌ ߓߐ߫ ߟߊ߫ ߡߊ߬ߛߐ߬ߟߊ $1 ߞߊ߲߬.",
        "license-header": "ߟߊ߬ߘߌ߬ߢߍ߬ߟߌ ߦߴߌ ߘߐ߫",
        "nolicense": "ߊ߬ ߡߊ߫ ߓߊߕߐ߬ߡߐ߲߬",
        "licenses-edit": "ߕߌ߰ߦߊ ߢߣߊߕߊߟߌ ߡߊߦߟߍ߬ߡߊ߲߫",
+       "license-nopreview": "(ߟߊ߬ߕߎ߲߰ߠߊ߫ ߕߴߦߋ߲߬)",
        "upload_source_file": "(ߌ ߟߊ߫ ߞߐߕߐ߯ ߛߎߥߊ߲ߘߌߣߍ߲ ߠߎ߬ ߞߊ߬ ߝߘߊ߫ ߌ ߟߊ߫ ߕߟߋ߬ߓߊ߮ ߟߊ߫)",
        "listfiles-delete": "ߊ߬ ߖߏ߬ߛߌ߬",
        "listfiles-summary": "ߞߐߜߍ߫ ߓߟߏߡߊߞߊ߬ߣߍ߲ ߣߌ߲߬ ߦߴߌ ߟߊ߫ ߞߐߕߐ߯ ߟߊߦߟߍ߬ߣߍ߲ ߠߎ߬ ߓߍ߯ ߟߋ߬ ߦߌ߬ߘߊ߬ ߟߊ߫",
        "listfiles-userdoesnotexist": "ߟߊ߬ߓߊ߰ߙߊ߬ ߖߊߕߋߘߊ \"$1\" ߟߊߞߎ߲߬ߘߎ߬ߣߍ߲߫ ߕߍ߫.",
        "imgfile": "ߞߐߕߐ߮",
        "listfiles": "ߞߐߕߐ߮ ߛߙߍߘߍ",
+       "listfiles_subpage": "ߊ߬ ߟߊߦߟߍ߬ߣߍ߲߬ ߦߋ߫ $1 ߟߋ߬ ߓߟߏ߫",
        "listfiles_thumb": "ߞߝߊ߬ߟߋ߲ߛߋ߲",
        "listfiles_date": "ߕߎ߬ߡߊ߬ߘߊ",
        "listfiles_name": "ߕߐ߮",
        "sharedupload": "ߞߐߕߐ߮ ߣߌ߲߬ ߝߘߊߣߍ߲߫ ߦߋ߫ $1 ߊ߬ ߣߴߊ߬ ߘߌ߫ ߛߋ߫ ߟߊߓߊ߯ߙߊ߫ ߟߊ߫ ߖߊ߬ߕߋ߬ߘߐ߬ߛߌ߰ ߜߘߍ߫ ߟߎ߫ ߘߐ߫.",
        "sharedupload-desc-there": "ߞߐߕߐ߮ ߣߌ߲߬ ߝߘߊߣߍ߲߫ ߦߋ߫ $1 ߟߋ߬ ߟߊ߫߸ ߊ߬ ߣߴߊ߬ ߟߊߓߊ߯ߙߊߣߍ߲߫ ߘߌ߫ ߞߍ߫ ߖߊ߬ߕߋ߬ߘߐ߬ߛߌ߰ ߜߘߍ߫ ߟߎ߫ ߘߐ߫. ߖߊ߰ߣߌ߲߬ ߌ ߦߋ߫ [$2 ߞߐߕߐ߮ ߞߊ߲߬ߛߓߍߟߌ ߞߐߜߍ ߘߐߜߍ߫|ߞߌ߬ߓߊ߬ߙߏ߬ߦߊ߬ ߡߞߊ߬ߝߏ߬ߟߌ߬ ߞߏ ߘߐ߫]",
        "sharedupload-desc-here": "ߘߐ߬ߛߙߋ ߣߌ߲߬ ߦߋ߫ ߦߊ߲߬ ߠߋ߫ $1 ߖߊ߬ߕߋ߬ߘߐ߬ߛߌ߮ ߕߐ߭ ߟߎ߬ ߞߏ߬ߣߌ߲ ߘߌ߫ ߛߴߊ߬ ߟߊߓߊ߯ߙߊ߫ ߟߊ߫. ߊ߬ ߕߐ߯ ߛߓߍߟߌ ߦߙߐ [$2 ߞߐߕߐ߮ ߞߊ߲߬ߛߓߍߟߌ ߞߐߜߍ] ߟߋ߬ ߦߋ߫ ߘߎ߰ߟߊ ߘߐ߫ ߣߌ߲߬.",
+       "sharedupload-desc-edit": "ߞߐߕߐ߮ ߣߌ߲߬ ߝߘߊߣߍ߲߫ ߦߋ߫ $1 ߟߋ߬ ߟߊ߫߸ ߊ߬ ߘߏ߲߬ ߠߊߓߊ߯ߙߊߣߍ߲߫ ߘߌ߫ ߞߍ߫ ߖߊ߬ߕߋ߬ߘߐ߬ߛߌ߰ ߜߘߍ߫ ߟߎ߫ ߘߐ߫.\nߕߎ߬ߡߊ߬ߘߐ߫ ߌ ߘߌ߫ ߞߴߊ߬ ߝߍ߬ ߞߴߊ߬ ߞߊ߲߬ߛߓߍߟߌ ߡߊߦߟߍ߬ߡߊ߲߫ ߊ߬ [$2 ߞߐߜߍ ߞߊ߲߬ߛߓߍ߬ߟߌ߬ ߞߐߜߍ] ߘߐ߫.",
+       "sharedupload-desc-create": "ߞߐߕߐ߮ ߣߌ߲߬ ߝߘߊߣߍ߲߫ ߦߋ߫ $1 ߟߋ߬ ߟߊ߫߸ ߊ߬ ߘߏ߲߬ ߠߊߓߊ߯ߙߊߣߍ߲߫ ߘߌ߫ ߞߍ߫ ߖߊ߬ߕߋ߬ߘߐ߬ߛߌ߰ ߜߘߍ߫ ߟߎ߫ ߘߐ߫.\nߕߎ߬ߡߊ߬ߘߐ߫ ߌ ߘߌ߫ ߞߴߊ߬ ߝߍ߫ ߞߴߊ߬ ߞߊ߲߬ߛߓߍߟߌ ߡߊߦߟߍ߬ߡߊ߲߫ ߊ߬ [$2 ߞߐߕߐ߮ ߞߊ߲߬ߛߓߍ߬ߟߌ߬ ߞߐߜߍ] ߘߐ߫",
        "filepage-nofile": "ߕߐ߮ ߣߌ߲߬ ߞߐߕߐ߯ ߛߎ߯ ߕߍ߫ ߦߋ߲߬",
+       "filepage-nofile-link": "ߞߐߕߐ߯ ߛߌ߫ ߕߍ߫ ߕߐ߮ ߣߌ߲߬ ߠߊ߫߸ ߞߏ߬ߣߌ߲߬ ߌ ߘߌ߫ ߛߋ߫ [ߊ߬ $1 ߟߊߦߟߍ߬ ߟߊ߫]",
        "uploadnewversion-linktext": "ߞߐߕߐ߮ ߣߌ߲߬ ߛߎ߯ߦߊ߫ ߞߎߘߊ߫ ߟߊߦߟߍ߬",
        "shared-repo-from": "ߞߊ߬ ߝߘߊ߫: $1",
+       "shared-repo": "ߟߊ߬ߖߍ߲߬ߛߍ߲߬ߣߍ߲ ߠߎ߬ ߝߊ߲",
        "upload-disallowed-here": "ߌ ߕߍߣߊ߬ ߞߐߜߍ ߣߌ߲߬ ߞߊ߲߬ߛߓߍ߫ ߟߊ߫.",
        "filerevert": "ߌ ߞߐߛߊ߬ߦߌ߬ $1",
        "filerevert-legend": "ߞߐߕߐ߯ ߟߊߛߊ߬ߦߌ߲߬ߣߍ߲",
index 6382bf4..55ab67b 100644 (file)
        "listfiles-userdoesnotexist": "A conta de usuário \"$1\" não está registrada.",
        "imgfile": "arquivo",
        "listfiles": "Lista de arquivos",
+       "listfiles_subpage": "Enviado por $1",
        "listfiles_thumb": "Miniatura",
        "listfiles_date": "Data",
        "listfiles_name": "Nome",
        "mycustomjsredirectprotected": "Você não tem permissão para editar esta página JavaScript porque é um redirecionamento e não aponta dentro do seu espaço do usuário.",
        "easydeflate-invaliddeflate": "O conteúdo fornecido não está devidamente comprimido",
        "unprotected-js": "Por razões de segurança o JavaScript não pode ser carregado de páginas desprotegidas. Por favor, crie apenas javascript no MediaWiki: namespace ou como uma subpágina do usuário",
-       "userlogout-continue": "Você quer sair?"
+       "userlogout-continue": "Você quer sair?",
+       "rest-prefix-mismatch": "O caminho pedido ($1) não estava no interior do caminho raiz da API REST ($2)",
+       "rest-wrong-method": "O método pedido ($1) não era {{PLURAL:$3|o método permitido para este caminho|um dos métodos permitidos para este caminho}} ($2)",
+       "rest-no-match": "O caminho relativo pedido ($1) não corresponde a nenhuma rotina de tratamento conhecida"
 }
index dc8c3a7..afbfd94 100644 (file)
        "listfiles-userdoesnotexist": "This message is displayed on [[Special:ListFiles]] when a invalid username is entered.",
        "imgfile": "{{Identical|File}}",
        "listfiles": "Page title and grouping label for the form displayed on [[Special:ListFiles]].\n{{Identical|List}}",
-       "listfiles_subpage": "Page title and grouping label for the form displayed on [[Special:ListFiles]].\n{{Identical|List}} when a username is selected. Parameters:\n * $1 - username",
+       "listfiles_subpage": "Page title and grouping label for the form displayed on [[Special:ListFiles]].\n\nParameters:\n* $1 - username\n\n{{Identical|List}} when a username is selected.",
        "listfiles_thumb": "{{Identical|Thumbnail}}",
        "listfiles_date": "Column header for the result table displayed on [[Special:ListFiles]].\n{{Identical|Date}}",
        "listfiles_name": "Column header for the result table displayed on [[Special:ListFiles]].\n{{Identical|Name}}",
index 819ee94..6cc866d 100644 (file)
        "userinvalidconfigtitle": "<strong>Avertizare:</strong> Nu există skinul „$1”.\nPaginile .css, .json și .js specifice utilizatorilor au titluri care încep cu literă mică; de exemplu {{ns:user}}:Foo/vector.css în loc de {{ns:user}}:Foo/Vector.css.",
        "updated": "(Actualizat)",
        "note": "'''Notă:'''",
-       "previewnote": "'''Țineți cont că aceasta este doar o previzualizare.'''\nModificările dumneavoastră nu au fost încă salvate!",
+       "previewnote": "<strong>Țineți cont că aceasta este doar o previzualizare.</strong>\nModificările dumneavoastră nu au fost încă salvate!",
        "continue-editing": "Mergi la zona de editare",
        "previewconflict": "Această pre-vizualizare reflectă textul din caseta de sus, respectiv felul în care va arăta articolul dacă alegeți să-l salvați acum.",
        "session_fail_preview": "Ne pare rău! Nu am putut procesa modificarea dumneavoastră din cauza pierderii datelor sesiunii.\n\nEste posibil să vă fi deconectat. <strong>Vă rugăm să verificați dacă sunteți încă conectat și să încercați din nou</strong>.\nDacă tot nu funcționează, încercați să [[Special:UserLogout|închideți sesiunea]] și să vă autentificați din nou. Verificați și dacă navigatorul dumneavoastră permite module cookie de la acest site.",
index 03c99c2..b846a3f 100644 (file)
@@ -60,6 +60,7 @@
        "tog-useeditwarning": "Avvisave quanne jie lasse 'na pàgene cangiate senze ca agghie sarvate le cangiaminde",
        "tog-prefershttps": "Ause sembre 'na connessione secure quanne trase",
        "tog-showrollbackconfirmation": "Fà 'ndrucà 'na richieste de conferme quanne ste cazze sus a 'nu collegamende de annullamende",
+       "tog-requireemail": "Richeiste email pe l'azzeramende d'a passuord",
        "underline-always": "Sembre",
        "underline-never": "Maje",
        "underline-default": "Valore de default d'u browser o scheme",
        "content-model-css": "CSS",
        "content-json-empty-object": "Oggette vacande",
        "content-json-empty-array": "Matrice vacande",
+       "unsupported-content-model": "<strong>Attenziò:</strong> 'u modelle de condenute $1 non g'è supportate jndr'à sta uicchi.",
+       "unsupported-content-diff": "Le differenze non ge sò supportate pu modelle de condenute $1.",
+       "unsupported-content-diff2": "Le differenze 'mbrà le modelle de condenute $1 e $2 non ge sò supportate sus a sta uicchi.",
        "deprecated-self-close-category": "Lè pàggene ca ausane le tag HTML auto-achiuse invalide",
        "duplicate-args-warning": "<strong>Attenziò:</strong> [[:$1]] ste chiame [[:$2]] cu cchiù de 'nu valore pu parametre \"$3\". Sulamende l'urteme valore date avène ausate.",
        "duplicate-args-category": "Pàggene ca ausane le argumende a doppie jndr'à le chiamate d'u template",
        "listfiles-userdoesnotexist": "Nome utende \"$1\" non g'è reggistrate.",
        "imgfile": "file",
        "listfiles": "Liste de le fail",
+       "listfiles_subpage": "Carecaminde da $1",
        "listfiles_thumb": "Miniature",
        "listfiles_date": "Sciurne",
        "listfiles_name": "Nome",
index 2301e11..d3475a5 100644 (file)
                        "ЛингвоЧел",
                        "OlegVeliky",
                        "Saimongoltinio",
-                       "Wikisaurus"
+                       "Wikisaurus",
+                       "Katunchik"
                ]
        },
        "tog-underline": "Подчёркивание ссылок:",
        "createaccountmail": "Использовать сгенерированный случайным образом временный пароль и выслать его на указанный адрес электронной почты",
        "createaccountmail-help": "Может использоваться, чтобы создать учётную запись для другого лица, не узнавая пароль.",
        "createacct-realname": "Настоящее имя (необязательно)",
-       "createacct-reason": "Причина",
+       "createacct-reason": "Причина (публично видимая)",
        "createacct-reason-ph": "Зачем вы создаёте другую учётную запись",
        "createacct-reason-help": "Сообщение, отображаемое в журнале создания учётных записей",
        "createacct-submit": "Создать учётную запись",
        "listfiles-userdoesnotexist": "Учётная запись «$1» не зарегистрирована.",
        "imgfile": "файл",
        "listfiles": "Список файлов",
+       "listfiles_subpage": "Загрузки $1",
        "listfiles_thumb": "Миниатюра",
        "listfiles_date": "Дата",
        "listfiles_name": "Имя файла",
        "ipblocklist-legend": "Поиск заблокированного участника",
        "blocklist-userblocks": "Скрыть блокировки учётных записей",
        "blocklist-tempblocks": "Скрыть временные блокировки",
-       "blocklist-indefblocks": "СкÑ\80Ñ\8bÑ\82Ñ\8c Ð½ÐµÐ¾Ð¿Ñ\80еделÑ\91нные блокировки",
+       "blocklist-indefblocks": "СкÑ\80Ñ\8bÑ\82Ñ\8c Ð±ÐµÑ\81Ñ\81Ñ\80оÑ\87ные блокировки",
        "blocklist-addressblocks": "Скрыть блокировки отдельных IP",
        "blocklist-type": "Тип:",
        "blocklist-type-opt-all": "Все",
        "mycustomjsredirectprotected": "У вас нет прав на редактирование этой JavaScript-страницы, так как она является перенаправлением и не указывает внутрь вашего пространства участника.",
        "easydeflate-invaliddeflate": "Предоставленное содержимое не спущено надлежащим образом",
        "unprotected-js": "По соображениям безопасности JavaScript нельзя загружать с незащищённых страниц. Пожалуйста, создавайте скрипты только в пространстве имён MediaWiki: или как подстраницы участника.",
-       "userlogout-continue": "Вы хотите выйти?"
+       "userlogout-continue": "Вы хотите выйти?",
+       "rest-prefix-mismatch": "Запрашиваемый путь ($1) не найден внутри корневого пути REST API ($2)",
+       "rest-wrong-method": "Метод запроса ($1) не был {{{{PLURAL:$3|}}|разрешенным методом для этого пути|одним из разрешенных методов для этого пути}} ($2)",
+       "rest-no-match": "Запрошенный относительный путь ($1) не соответствует ни одному известному обработчику"
 }
index 494b61b..61af209 100644 (file)
        "noarticletext": "ᱱᱮᱛᱚᱜ ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟᱨᱮ ᱪᱮᱫᱜᱮ ᱵᱟᱹᱱᱩᱜ-ᱟ᱾\nᱮᱴᱟᱜ ᱥᱟᱦᱴᱟᱨᱮᱢ [[Special:Search/{{PAGENAME}}|ᱱᱚᱶᱟ ᱥᱟᱦᱴᱟ ᱧᱩᱛᱩᱢ ᱥᱮᱸᱫᱽᱨᱟᱭ ᱢᱮ]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ᱡᱚᱲᱟᱣᱟᱱ ᱞᱚᱜᱽ ᱠᱚ ᱥᱮᱸᱫᱽᱨᱟᱭ ᱢᱮ],\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} ᱱᱚᱶᱟ ᱥᱟᱦᱴᱟ ᱥᱟᱯᱲᱟᱣ ᱢᱮ]</span>.",
        "noarticletext-nopermission": "ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟᱨᱮ ᱱᱤᱛᱚᱜ ᱪᱮᱫᱜᱮ ᱚᱞ ᱵᱟᱹᱱᱩᱜ-ᱟ᱾\n\nᱟᱢ [[Special:Search/{{PAGENAME}}|ᱱᱚᱭᱟ ᱥᱟᱦᱴᱟᱨᱮᱱᱟᱜ ᱧᱤᱛᱩᱢᱮᱢ ᱥᱮᱸᱫᱽᱨᱟ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ]] ᱮᱴᱟᱜ ᱥᱟᱦᱴᱟ ᱠᱚᱨᱮᱦᱚᱸ,\nᱟᱨᱵᱟᱝ <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs]</span>.",
        "userpage-userdoesnotexist": "\"<nowiki>$1</nowiki>\" ᱧᱩᱛᱩᱢᱟᱱ ᱡᱟᱸᱦᱟᱸᱭ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱜ ᱦᱤᱥᱟᱹᱵ ᱠᱷᱟᱛᱷᱟ ᱫᱚ ᱵᱟᱝ ᱨᱮᱥᱴᱨᱤ ᱦᱩᱭ ᱟᱠᱟᱱᱟ᱾\nᱫᱟᱭᱟᱠᱟᱛᱮ ᱵᱤᱰᱟᱹᱣ ᱠᱟᱛᱮᱛ ᱧᱮᱞᱢᱮ ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱫᱚ ᱵᱮᱱᱟᱣ/ᱥᱟᱯᱲᱟᱣ ᱢᱮᱱᱮᱫ ᱠᱟᱱᱟ ᱥᱮ ᱵᱟᱝ᱾",
-       "userpage-userdoesnotexist-view": "ᱵᱮᱵᱦá±\9fᱨᱤᱭá±\9fá±\9c \"$1\" á±®á± á±\9fᱣᱱᱴ ᱫᱚ ᱵᱟᱝ ᱨᱮᱥᱴᱨᱤ ᱟᱠᱟᱱᱟ᱾",
+       "userpage-userdoesnotexist-view": "ᱵᱮᱵᱦá±\9fᱨᱤᱭá±\9fá±¹ \"$1\" á±®á± á±\9fᱶᱩᱴ ᱫᱚ ᱵᱟᱝ ᱨᱮᱥᱴᱨᱤ ᱟᱠᱟᱱᱟ᱾",
        "blocked-notice-logextract": "ᱱᱩᱭ ᱵᱮᱵᱦᱟᱨᱤᱡ ᱫᱚ ᱱᱮᱛᱚᱜ ᱮ ᱥᱮᱥᱫᱜᱮᱭᱟ᱾\nᱨᱮᱯᱷᱟᱨᱮᱱᱥ ᱞᱟᱹᱜᱤᱛᱛᱮ ᱱᱟᱣᱟᱱᱟᱜ ᱵᱚᱞᱚᱜ ᱠᱩᱨᱩᱢᱩᱴᱩ ᱞᱟᱛᱟᱨᱨᱮ ᱮᱢ ᱦᱩᱭᱱᱟ:",
        "clearyourcache": "<strong>ᱧᱮᱛᱮᱞ:</strong> ᱨᱩᱠᱷᱤᱭᱟᱹ ᱦᱩᱭ ᱠᱟᱛᱮ, ᱟᱢᱟᱜ ᱵᱨᱟᱣᱡᱚᱨ ᱠᱮᱪ ᱵᱟᱭᱯᱟᱥ ᱦᱩᱭᱩᱜ ᱛᱟᱢᱟ ᱚᱫᱚᱞ ᱠᱚ ᱧᱮᱞ ᱞᱟᱹᱜᱤᱫ ᱾\n* <strong>ᱯᱷᱟᱭᱟᱨᱯᱷᱚᱠᱥ / ᱥᱟᱯᱷᱟᱨᱤ:</strong> Hold <em>Shift</em> while clicking <em>Reload</em>, or press either <em>Ctrl-F5</em> or <em>Ctrl-R</em> (<em>⌘-R</em> on a Mac)\n* <strong>Google Chrome:</strong> Press <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> on a Mac)\n* <strong>Internet Explorer:</strong> Hold <em>Ctrl</em> while clicking <em>Refresh</em>, or press <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Go to <em>Menu → Settings</em> (<em>Opera → Preferences</em> on a Mac) and then to <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
        "updated": "(ᱩᱛᱷᱱᱟᱣ ᱜᱮᱭᱟ)",
        "prefs-skin": "ᱦᱟᱨᱛᱟ",
        "skin-preview": "ᱧᱮᱞ ᱵᱤᱰᱟᱹᱣ",
        "datedefault": "ᱠᱩᱥᱤ ᱵᱟᱹᱱᱩᱜ-ᱟ",
-       "prefs-user-pages": "ᱵᱮᱵᱦá±\9fᱨᱤᱭá±\9fá±\9c ᱥᱟᱦᱴᱟᱠᱚ",
+       "prefs-user-pages": "ᱵᱮᱵᱷá±\9fᱨᱤᱭá±\9fá±¹ ᱥᱟᱦᱴᱟᱠᱚ",
        "prefs-rc": "ᱨᱚᱠᱟ ᱵᱚᱫᱚᱞᱠᱚ",
        "prefs-watchlist": "ᱧᱮᱞᱟᱜ ᱞᱤᱥᱴᱤ",
        "prefs-editwatchlist": "ᱧᱮᱞᱟᱜ ᱞᱤᱥᱴᱤ ᱥᱟᱯᱲᱟᱣ",
        "prefs-editor": "ᱥᱟᱯᱲᱮᱛ",
        "prefs-preview": "ᱧᱮᱞ ᱵᱤᱰᱟᱹᱣ",
        "prefs-diffs": "ᱵᱷᱮᱯᱮᱫ",
-       "userrights": "ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱜ ᱟᱹᱭᱫᱟᱹᱨᱤ ᱠᱩ",
+       "userrights": "ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱜ ᱟᱹᱭᱫᱟᱹᱨᱤ ᱠᱩ",
        "userrights-lookup-user": "ᱢᱤᱫᱴᱮᱱ ᱵᱮᱵᱦᱟᱨᱤ ᱴᱷᱤᱠᱤ ᱢᱮ",
-       "userrights-user-editname": "ᱵᱮᱵᱦá±\9fᱨᱤᱭá±\9fá±\9c á±§á±¤á±\9bᱩᱢ á±µá±\9aá±\9eá±\9aá±­ ᱢᱮ:",
+       "userrights-user-editname": "ᱵᱮᱵᱷá±\9fᱨᱤᱭá±\9fá±\9c á±§á±¤á±\9bᱩᱢ á±\9fᱫᱮᱨ ᱢᱮ:",
        "editusergroup": "ᱵᱮᱵᱦᱟᱨᱤ ᱜᱟᱶᱛᱟᱠᱩ ᱩᱰᱩᱜᱽ ᱢᱮ",
        "userrights-editusergroup": "ᱥᱟᱯᱲᱟᱣ {{GENDER:$1|ᱵᱮᱵᱦᱟᱨᱤ}} ᱜᱟᱶᱛᱟᱠᱩ",
        "saveusergroups": "ᱨᱩᱠᱷᱤᱭᱟᱹ {{GENDER:$1|ᱵᱮᱵᱦᱟᱨᱤ}} ᱜᱟᱶᱛᱟᱠᱩ",
        "tooltip-namespace_association": "ᱱᱚᱶᱟ ᱵᱟᱠᱥᱟ ᱴᱤᱠ ᱢᱮ ᱨᱚᱯᱚᱲ ᱵᱟᱝᱠᱷᱟᱱ ᱥᱟᱛᱟᱢ ᱨᱟᱠᱷᱟ ᱧᱩᱛᱩᱢ ᱵᱟᱪᱷᱚᱱ ᱟᱠᱟᱱ ᱨᱟᱠᱷᱟ ᱧᱩᱛᱩᱢ ᱥᱟᱶ ᱡᱚᱯᱚᱲᱟᱣ ᱟᱠᱟᱱᱟᱜ",
        "blanknamespace": "(ᱢᱩᱬᱩᱛ)",
        "contributions": "{{GENDER:$1|ᱵᱮᱵᱦᱟᱨᱤᱭᱟᱹ}} ᱮᱱᱮᱢᱠᱩ",
-       "contributions-title": "$1 á±µá±®á±µá±¦ᱟᱨᱤᱭᱟᱜ ᱮᱱᱮᱢᱠᱩ",
+       "contributions-title": "$1 á±µá±®á±µá±·ᱟᱨᱤᱭᱟᱜ ᱮᱱᱮᱢᱠᱩ",
        "mycontris": "ᱮᱱᱮᱢᱠᱩ",
        "anoncontribs": "ᱮᱱᱮᱢᱠᱩ",
        "contribsub2": "{{GENDER:$3|$1}} ($2) ᱞᱟᱹᱜᱤᱫ ᱛᱮ",
        "sp-contributions-logs": "ᱛᱟᱞᱟᱠᱩ",
        "sp-contributions-talk": "ᱨᱚᱲ",
        "sp-contributions-search": "ᱮᱱᱮᱢᱠᱩ ᱞᱟᱹᱜᱤᱛ ᱥᱮᱸᱫᱨᱟ",
-       "sp-contributions-username": "IP á±´á±·á±¤á± á±\9fᱹᱱá±\9f á±¥á±® á±µá±®á±µá±¦á±\9fᱨᱤᱭá±\9fá±\9c ᱧᱩᱛᱩᱢ",
+       "sp-contributions-username": "IP á±´á±·á±¤á± á±\9fᱹᱱá±\9f á±¥á±® á±µá±®á±µá±·á±\9fᱨᱤᱭá±\9fá±¹ ᱧᱩᱛᱩᱢ",
        "sp-contributions-toponly": "ᱱᱮᱛᱟᱨ ᱥᱩᱫᱷᱨᱟᱹᱣ ᱠᱚᱨᱮᱭᱟᱜ ᱥᱟᱯᱲᱟᱣ ᱠᱟᱹᱢᱤᱠᱚ ᱩᱫᱩᱜᱽ ᱢᱮ",
        "sp-contributions-newonly": "ᱥᱩᱢᱩᱝ ᱟᱹᱨᱩᱠᱚ ᱥᱚᱫᱚᱨᱢᱮ ᱡᱟᱦᱟᱸ ᱥᱟᱦᱟᱴᱟ ᱫᱚ ᱥᱤᱨᱡᱟᱹᱣᱟᱜ ᱠᱟᱱᱟ",
        "sp-contributions-submit": "ᱥᱮᱸᱫᱽᱨᱟ",
        "reblock-logentry": "ᱵᱚᱫᱚᱞᱮᱱᱟ ᱵᱚᱸᱫ ᱥᱟᱡᱟᱣᱠᱚ [[$1]] ᱞᱟᱹᱜᱤᱫ ᱪᱟᱵᱟᱜ ᱚᱠᱛᱚ $2 $3 ᱥᱟᱶ",
        "block-log-flags-nocreate": "ᱮᱠᱟᱶᱩᱴ ᱵᱮᱱᱟᱣ ᱵᱚᱸᱫᱽ ᱜᱮᱭᱟ",
        "block-log-flags-noemail": "ᱤᱢᱮᱞ ᱵᱚᱸᱫᱷ ᱜᱮᱭᱟ",
-       "block-log-flags-hiddenname": "ᱵᱮᱵᱦá±\9fᱨᱤᱭá±\9fá±\9c ᱧᱩᱛᱩᱢ ᱩᱠᱩ ᱜᱮᱭᱟ",
+       "block-log-flags-hiddenname": "ᱵᱮᱵᱷá±\9fᱨᱤᱭá±\9fá±¹ ᱧᱩᱛᱩᱢ ᱩᱠᱩ ᱜᱮᱭᱟ",
        "proxyblocker": "ᱯᱨᱚᱠᱥᱤ ᱮᱥᱮᱫᱤᱡ",
        "movepagebtn": "ᱥᱟᱦᱴᱟ ᱩᱪᱟᱹᱲᱢᱮ",
        "pagemovedsub": "ᱚᱪᱟᱜ ᱫᱚ ᱦᱩᱭᱱᱟ",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|ᱩᱪᱟᱹᱲᱠᱮᱜ-ᱟᱭ}} ᱥᱟᱦᱴᱟ $3 to $4 ᱢᱚᱦᱰᱟ ᱵᱤᱱ ᱵᱟᱹᱜᱤ ᱠᱟᱛᱮ",
        "logentry-move-move_redir": "ᱥᱟᱦᱴᱟ $3 ᱠᱷᱚᱱ $4 ᱛᱮ $1 {{GENDER:$2|ᱩᱪᱟᱹᱲ ᱠᱮᱫᱼᱟᱭ}} ᱢᱚᱸᱦᱰᱟ ᱥᱟᱶᱛᱮ",
        "logentry-patrol-patrol-auto": "$1 ᱟᱡᱛᱮᱜᱮ {{GENDER:$2|ᱪᱤᱱᱦᱟᱹᱭᱮᱱᱟ}} $4 ᱧᱮᱞᱟᱹᱨᱩ $3 ᱥᱟᱦᱴᱟ ᱨᱮᱱᱟᱜ ᱾",
-       "logentry-newusers-create": "ᱵᱮᱵᱦá±\9fᱨᱤᱭá±\9fá±\9c á±¦á±¤á±¥á±\9fᱹᱵ $1 á±«á±\9a {{GENDER:$2|á±\9bᱮᱭá±\9fᱨᱱᱟ}}",
+       "logentry-newusers-create": "ᱵᱮᱵᱷá±\9fᱨᱤᱭá±\9fá±¹ á±®á± á±\9fᱶᱩᱴ $1 á±«á±\9a {{GENDER:$2|á±\9bᱮᱭá±\9fᱨᱮᱱᱟ}}",
        "logentry-newusers-autocreate": "ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱠᱷᱟᱛᱟ $1 ᱫᱚ {{GENDER:$2|ᱛᱮᱭᱟᱨᱮᱱᱟ}} ᱟᱡᱛᱮᱜᱮ",
        "logentry-upload-upload": "$1 {{GENDER:$2|ᱞᱟᱫᱮᱭᱮᱱᱟ}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|ᱞᱟᱫᱮᱭᱮᱱᱟ}} ᱢᱤᱫ ᱱᱟᱶᱟ ᱵᱷᱟᱨᱥᱚᱱ $3 ᱨᱮᱱᱟᱜ",
index 71b6a90..756ee8a 100644 (file)
        "listfiles-userdoesnotexist": "Korisnički račun \"$1\" nije registrovan.",
        "imgfile": "datoteka",
        "listfiles": "Spisak slika",
+       "listfiles_subpage": "Postavljene datoteke $1",
        "listfiles_thumb": "Smanjeni pregled",
        "listfiles_date": "Datum",
        "listfiles_name": "Naziv",
index 5e55228..78d9ce7 100644 (file)
@@ -88,6 +88,7 @@
        "tog-norollbackdiff": "Vynechať rozdiel po vykonaní rollbacku",
        "tog-useeditwarning": "Upozorniť ma, keď opúšťam upravovaciu stránku s neuloženými zmenami",
        "tog-prefershttps": "Po prihlásení používať vždy zabezpečené pripojenie",
+       "tog-requireemail": "Pre obnovu hesla vyžadovať e-mail",
        "underline-always": "Vždy",
        "underline-never": "Nikdy",
        "underline-default": "Podľa nastavení prehliadača alebo témy vzhľadu",
        "returnto": "Späť na $1.",
        "tagline": "Z {{GRAMMAR:genitív|{{SITENAME}}}}",
        "help": "Pomoc",
+       "help-mediawiki": "Nápoveda k MediaWiki",
        "search": "Hľadať",
        "search-ignored-headings": " #<!-- tento riadok je nutné nechať bez zmeny --> <pre>\n# Nadpisy, ktoré bude vyhľadávanie ignorovať.\n# Tieto zmenu sa prejavia akonáhle bude stránka s nadpisom zaindexovaná.\n# Reindexovanie stránky môžete vynútiť uložením prázdnej úpravy.\n# Syntax je nasledovná:\n#   * Všetko počínajúc znakom „#“ do konca riadka je komentár.\n#   * Každý neprázdny riadok je presný názov, ktorý má byť ignorovaný, presne ako je napísaný, pričom na veľkosti písmen záleží.\nReferencie\nExterné odkazy\nPozri aj\n #</pre> <!-- tento riadok je nutné nechať bez zmeny -->",
        "searchbutton": "Hľadať",
        "badarticleerror": "Na tejto stránke túto činnosť nemožno vykonať.",
        "cannotdelete": "Nebolo možné zmazať stránku alebo súbor „$1“.\nMožno ju už zmazal nieto iný.",
        "cannotdelete-title": "Nemôžete zmazať stránku „$1“",
+       "delete-scheduled": "Zmazanie stránky „$1“ bolo naplánované.\nBuďte, prosím, trpezliví.",
        "delete-hook-aborted": "Zmazanie zrušila prídavná funkcia (prípojný bod syntaktického analyzátora).\nNeudala vysvetlenie.",
        "no-null-revision": "Nepodarilo sa vytvoriť novú prázdnu revíziu stránky „$1“",
        "badtitle": "Neplatný nadpis",
        "customcssprotected": "Nemáte právo upravovať túto CSS stránku, pretože obsahuje osobné nastavenie iného používateľa.",
        "customjsonprotected": "Nemáte právo upravovať túto JSON stránku, pretože obsahuje osobné nastavenie iného používateľa.",
        "customjsprotected": "Nemáte právo upravovať túto JavaScript stránku, pretože obsahuje osobné nastavenie iného používateľa.",
+       "sitecssprotected": "Nemáte oprávnenie editovať túto stránku s CSS, pretože to môže mať dopad na všetkých návštevníkov.",
        "mycustomcssprotected": "Nemáte povolenie na úpravu tejto CSS stránky.",
        "mycustomjsonprotected": "Nemáte povolenie na úpravu tejto JSON stránky.",
        "mycustomjsprotected": "Nemáte povolenie na úpravu tejto JavaScriptovej stránky.",
        "createaccountmail": "Použiť dočasné náhodné heslo a poslať ho na uvedenú e-mailovú adresu",
        "createaccountmail-help": "Môže byť použité na vytvorenie účtu pre inú osobu bez prezradenia hesla.",
        "createacct-realname": "Skutočné meno (nepovinné)",
-       "createacct-reason": "Dôvod",
+       "createacct-reason": "Dôvod (verejne zaznamenaný)",
        "createacct-reason-ph": "Prečo si vytvárate ďalší účet",
        "createacct-reason-help": "Správa zobrazená v knihe nových používateľov",
        "createacct-submit": "Vytvoriť si účet",
        "badretype": "Zadané heslá nie sú rovnaké.",
        "usernameinprogress": "Vytváranie účtu s týmto menom už prebieha. Prosím, počkajte.",
        "userexists": "Zadané používateľské meno sa už používa.\nProsím, zvoľte si iné meno.",
+       "createacct-normalization": "Vaše používateľské meno bude z technických dôvodov upravené na „$2“.",
        "loginerror": "Chyba pri prihlasovaní",
        "createacct-error": "Chyba pri vytváraní účtu",
        "createaccounterror": "Nepodarilo sa vytvoriť účet: $1",
        "nosuchusershort": "V súčasnosti neexistuje používateľ s menom „$1“. Skontrolujte preklepy.",
        "nouserspecified": "Musíte uviesť meno používateľa.",
        "login-userblocked": "Tento používateľ je zablokovaný. Nie je mu dovolené prihlásiť sa.",
-       "wrongpassword": "Zadané heslo je nesprávne. Prosím, skúste to znova.",
+       "wrongpassword": "Zadané používateľské meno alebo heslo je nesprávne. Prosím, skúste to znova.",
        "wrongpasswordempty": "Zadané heslo bolo prázdne. Prosím, skúste to znova.",
        "passwordtooshort": "Heslo musí mať dĺžku aspoň $1 {{PLURAL:$1|znak|znaky|znakov}}.",
        "passwordtoolong": "Heslá nemôžu byť dlhšie než {{PLURAL:$1|1 znak|$1 znaky|$1 znakov}}.",
-       "passwordtoopopular": "Nie je možné použiť priveľmi frekventované heslá. Zvoľte si prosím iné, menej frekventované heslo.",
+       "passwordtoopopular": "Nie je možné použiť priveľmi frekventované heslá. Zvoľte si, prosím, iné heslo, ktoré je zložitejšie uhádnuť.",
+       "passwordinlargeblacklist": "Zadané heslo je uvedené na zozname veľmi často používaných hesiel. Zvoľte si, prosím, unikátnejšie heslo.",
        "password-name-match": "Vaše heslo musí byť iné ako vaše používateľské meno.",
        "password-login-forbidden": "Použitie tohto používateľského mena a hesla bolo zakázané.",
        "mailmypassword": "Obnoviť heslo",
        "resetpass-submit-loggedin": "Zmeniť heslo",
        "resetpass-submit-cancel": "Zrušiť",
        "resetpass-wrong-oldpass": "Neplatné, dočasné alebo aktuálne heslo.\nJe možné, že sa vám už podarilo úspešne zmeniť svoje heslo alebo ste si vyžiadali nové dočasné heslo.",
-       "resetpass-recycled": "Ako nové heslo si prosím nastavte niečo iné než súčasné heslo.",
+       "resetpass-recycled": "Ako nové heslo si, prosím, nastavte niečo iné ako súčasné heslo.",
        "resetpass-temp-emailed": "Prihlasujete sa dočasným heslom, zaslaným e-mailom. Aby ste dokončili prihlásenie, nastavte si tu nové heslo:",
        "resetpass-temp-password": "Dočasné heslo:",
        "resetpass-abort-generic": "Zmena hesla bola zablokovaná rozšírením.",
        "autoblockedtext": "Vaša IP adresa bola automaticky zablokovaná, pretože ju používa iný používateľ, ktorého zablokoval $1.\nUdaný dôvod zablokovania:\n\n:''$2''\n\n* Blokovanie začalo: $8\n* Blokovanie vyprší: $6\n* Blokovanie sa týka: $7\n\nAk potrebujete informácie o blokovaní, môžete kontaktovať $1 alebo niektorého iného\n[[{{MediaWiki:Grouppage-sysop}}|správcu]].\n\nPozn.: Nemôžete použiť funkciu „{{int:emailuser}}“, ak ste si vo svojich\n[[Special:Preferences|používateľských nastaveniach]] nezaregistrovali platnú e-mailovú adresu.\n\nVaša aktuálna IP adresa je $3. ID vášho blokovania je $5.\nProsím, uveďte tieto podrobnosti v akýchkoľvek otázkach, ktoré sa opýtate.",
        "systemblockedtext": "Vaša IP adresa bola automaticky zablokovaná.\nUdaný dôvod zablokovania:\n\n:<em>$2</em>\n\n* Blokovanie začalo: $8\n* Blokovanie vyprší: $6\n* Blokovanie sa týka: $7\n\nVaša aktuálna IP adresa je $3.\nProsím, uveďte tieto podrobnosti v akýchkoľvek otázkach, ktoré sa opýtate.",
        "blockednoreason": "nebol uvedený dôvod",
+       "blockedtext-composite-no-ids": "Vaša IP adresa sa objavuje na niekoľkých čiernych listinách",
+       "blockedtext-composite-reason": "Na váš účet a/alebo vašu IP adresu sa vzťahuje viac blokovaní.",
        "whitelistedittext": "Aby ste mohli upravovať stránky, musíte sa $1",
        "confirmedittext": "Pred úpravami stránok musíte potvrdiť vašu e-mailovú adresu. Prosím, nastavte a overte svoju e-mailovú adresu v [[Special:Preferences|používateľských nastaveniach]].",
        "nosuchsectiontitle": "Sekcia nebola nájdená",
        "nocreate-loggedin": "Nemáte povolenie vytvárať nové stránky.",
        "sectioneditnotsupported-title": "Úprava sekcie nie je podporovaná",
        "sectioneditnotsupported-text": "Táto stránka úprav nepodporuje úpravu sekcie.",
+       "modeleditnotsupported-title": "Editácia nie je podporovaná",
        "permissionserrors": "Chyba oprávnenia",
        "permissionserrorstext": "Na to nemáte povolenie z {{PLURAL:$1|nasledujúceho dôvodu|nasledujúcich dôvodov}}:",
        "permissionserrorstext-withaction": "Nemáte oprávnenie $2 z {{PLURAL:$1|nasledovného dôvodu|nasledovných dôvodov}}:",
        "postedit-confirmation-created": "Stránka bola vytvorená.",
        "postedit-confirmation-restored": "Stránka bola obnovená.",
        "postedit-confirmation-saved": "Vaša úprava bola uložená.",
+       "postedit-confirmation-published": "Vaša úprava bola zverejnená.",
        "edit-already-exists": "Nebolo možné vytvoriť novú stránku.\nUž existuje.",
        "defaultmessagetext": "Predvolený text správy",
        "content-failed-to-parse": "Nepodarilo sa spracovať obsah $2 pre model $1: $3",
        "search-file-match": "(výskyt v obsahu súboru)",
        "search-suggest": "Mali ste na mysli „$1“?",
        "search-rewritten": "Zobrazujú sa výsledky pre $1. Vyhľadať namiesto toho $2.",
-       "search-interwiki-caption": "Sesterské projekty",
+       "search-interwiki-caption": "Výsledky zo sesterských projektov",
        "search-interwiki-default": "Výsledky z $1:",
        "search-interwiki-more": "(viac)",
        "search-interwiki-more-results": "ďalšie výsledky",
        "prefs-advancedwatchlist": "Rozšírené možnosti",
        "prefs-displayrc": "Možnosti zobrazenia",
        "prefs-displaywatchlist": "Možnosti zobrazenia",
+       "prefs-changesrc": "Zobrazené zmeny",
        "prefs-changeswatchlist": "Zobrazené zmeny",
        "prefs-pageswatchlist": "Sledované stránky",
        "prefs-tokenwatchlist": "Kľúč",
        "prefs-help-prefershttps": "Táto voľba sa prejaví pri vašom ďalšom prihlásení.",
        "prefswarning-warning": "Vykonali ste zmeny v nastaveniach, ktoré zatiaľ nie sú uložené. Ak túto stránku opustíte bez kliknutia na „$1“, vaše nastavenia sa neaktualizujú.",
        "prefs-tabs-navigation-hint": "Tip: prepínať medzi záložkami môžete aj pomocou šípok vľavo a vpravo.",
-       "userrights": "Spravovanie používateľských práv",
-       "userrights-lookup-user": "Spravovať členstvo používateľa v skupinách",
+       "userrights": "Používateľské práva",
+       "userrights-lookup-user": "Vybrať používateľa",
        "userrights-user-editname": "Zadajte meno používateľa:",
-       "editusergroup": "Upraviť skupiny {{GENDER:$1|používateľa|používateľky}}",
+       "editusergroup": "Načítať skupiny používateľov",
        "editinguser": "Zmena práv používateľa '''[[User:$1|$1]]''' $2",
        "viewinguserrights": "Prehliadanie práv {{GENDER:$1|používateľa|používateľky}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Upraviť skupiny používateľa",
        "userrights-nodatabase": "Databáza $1 neexistuje alebo nie je lokálna.",
        "userrights-changeable-col": "Skupiny, ktoré môžete zmeniť",
        "userrights-unchangeable-col": "Skupiny, ktoré nemôžete zmeniť",
+       "userrights-expiry-othertime": "Iný čas:",
        "userrights-conflict": "Konflikt zmien práv používateľov! Prosím, skontrolujte ho a potvrďte svoje zmeny.",
        "group": "Skupina:",
        "group-user": "Používatelia",
        "grant-createeditmovepage": "Vytvárať, upravovať a presúvať stránky",
        "grant-delete": "Odstraňovať stránky, revízie a položky záznamu",
        "grant-editinterface": "Upravovať menný priestor MediaWiki a projektový/používateľský JSON",
-       "grant-editmycssjs": "Upravovať váš používateľský CSS/JavaScript",
+       "grant-editmycssjs": "Upravovať váš používateľský CSS/JSON/JavaScript",
        "grant-editmyoptions": "Upravovať nastavenia vášho používateľského účtu",
        "grant-editmywatchlist": "Upravovať váš zoznam sledovaných stránok",
        "grant-editsiteconfig": "Upravovať projektové a používateľské CSS/JS súbory",
        "action-upload_by_url": "nahrať tento súbor z URL adresy",
        "action-writeapi": "použiť API na zápis",
        "action-delete": "zmazať túto stránku",
-       "action-deleterevision": "zmazať túto revíziu",
+       "action-deleterevision": "zmazať revízie",
        "action-deletelogentry": "mazať záznamy",
        "action-deletedhistory": "zobraziť históriu zmazaných revízií tejto stránky",
        "action-deletedtext": "zobraziť si zmazané texty revízií",
        "rcfilters-savedqueries-already-saved": "Tieto filtre sú už uložené. Zmeňte niektoré nastavenia, ak chcete vytvoriť nový uložený filter.",
        "rcfilters-restore-default-filters": "Obnoviť predvolené filtre",
        "rcfilters-clear-all-filters": "Zrušiť všetky filtre",
-       "rcfilters-show-new-changes": "Zobraziť najnovšie zmeny",
-       "rcfilters-search-placeholder": "Filtrovať posledné úpravy (vyhľadávajte alebo začnite písať)",
+       "rcfilters-show-new-changes": "Zobraziť zmeny od $1",
+       "rcfilters-search-placeholder": "Filtrovať posledné úpravy (použite menu alebo vyhľadajte názov filtra)",
+       "rcfilters-search-placeholder-mobile": "Filtre",
        "rcfilters-invalid-filter": "Neplatný filter",
        "rcfilters-empty-filter": "Žiadne aktívne filtre. Všetky príspevky sú zobrazené.",
        "rcfilters-filterlist-title": "Filtre",
        "rcfilters-watchlist-markseen-button": "Označiť všetky úpravy ako zobrazené",
        "rcfilters-watchlist-edit-watchlist-button": "Upraviť zoznam sledovaných stránok",
        "rcfilters-watchlist-showupdated": "Zmeny stránok, ktoré ste od ich zmeny nenavštívili, sú zobrazené <strong>hrubo</strong> s vyplneným krúžkom.",
-       "rcfilters-preference-label": "Skryť vylepšenú verziu posledných úprav",
+       "rcfilters-preference-label": "Použiť rozhranie bez JavaScriptu",
        "rcfilters-preference-help": "Zruší novú podobu rozhrania z roku 2017 a všetky nástroje odvtedy pridané.",
        "rcfilters-watchlist-preference-label": "Skryť vylepšenú verziu sledovaných stránok",
        "rcfilters-watchlist-preference-help": "Zruší novú podobu rozhrania z roku 2017 a všetky nástroje odvtedy pridané.",
        "backend-fail-contenttype": "Nebolo možné určiť typ obsahu súboru, ktorý sa má uložiť na „$1“.",
        "backend-fail-batchsize": "Do úložiska bola zaslaná dávka s $1 {{PLURAL:$1|operáciou|operáciami}}; limit je $2 {{PLURAL:$2|operácia|operácie|operácií}}.",
        "backend-fail-usable": "Nie je možné čítať alebo zapísať súbor  $1  kvôli nedostatočným povoleniam alebo chýbajúcim adresárom/kontajnerom.",
+       "backend-fail-stat": "Nepodarilo sa načítať stav súboru „$1“.",
        "filejournal-fail-dbconnect": "Nepodarilo sa pripojiť k žurnálovej databáze úložiska „$1“.",
        "filejournal-fail-dbquery": "Nepodarilo sa aktualizovať žurnálovú databázu úložiska „$1“.",
        "lockmanager-notlocked": "Nepodarilo sa odomknúť zámok „$1“; nie je zamknutý.",
        "uploadstash-refresh": "Obnoviť zoznam súborov",
        "uploadstash-thumbnail": "zobraziť náhľad",
        "uploadstash-exception": "Načítaný súbor sa nepodarilo uložiť do skrýše ($1): „$2“.",
+       "uploadstash-bad-path": "Cesta neexistuje.",
+       "uploadstash-bad-path-invalid": "Cesta nie je platná.",
+       "uploadstash-bad-path-unknown-type": "Neznámy typ „$1“.",
+       "uploadstash-bad-path-unrecognized-thumb-name": "Nerozpoznaný názov náhľadu.",
+       "uploadstash-file-not-found-no-thumb": "Nepodarilo sa získať náhľad.",
        "invalid-chunk-offset": "Neplatný posun bloku",
        "img-auth-accessdenied": "Prístup zamietnutý",
        "img-auth-nopathinfo": "Váš server nie je nastavený tak, aby poskytoval tieto informácie.\nMôže byť založený na CGI a nedokáže podporovať img_auth.\nPozri https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "http-timed-out": "Vyhradený čas požiadavky HTTP vypršal.",
        "http-curl-error": "Chyba pri sťahovaní URL: $1",
        "http-bad-status": "Počas požiadavky HTTP nastal problém: $1 $2",
+       "http-internal-error": "Interná chyba HTTP.",
        "upload-curl-error6": "Nedostupný URL",
        "upload-curl-error6-text": "Poskytnutý URL nebol dostupný. Prosím, skontrolujte znova, že URL je správny a lokalita je dostupná.",
        "upload-curl-error28": "Vypršal čas vyhradený pre nahrávanie",
        "listfiles-userdoesnotexist": "Používateľské konto „$1“ nie je zaregistrované.",
        "imgfile": "súbor",
        "listfiles": "Zoznam obrázkov",
+       "listfiles_subpage": "Súbory {{GENDER:$1|používateľa|používateľky}} $1",
        "listfiles_thumb": "Náhľad",
        "listfiles_date": "Dátum",
        "listfiles_name": "Názov",
        "listfiles_size": "Veľkosť (v bajtoch)",
        "listfiles_description": "Popis",
        "listfiles_count": "Verzie",
-       "listfiles-show-all": "Vrátane starších verzií obrázkov",
+       "listfiles-show-all": "Zahrnúť staré verzie súborov",
        "listfiles-latestversion": "Aktuálna verzia",
        "listfiles-latestversion-yes": "Áno",
        "listfiles-latestversion-no": "Nie",
        "pageswithprop-legend": "Stránky s vlastnosťou stránky",
        "pageswithprop-text": "Táto stránka obsahuje stránky, ktoré používajú konkrétnu vlastnosť stránky.",
        "pageswithprop-prop": "Názov vlastnosti:",
+       "pageswithprop-reverse": "Zoradiť v opačnom poradí",
+       "pageswithprop-sortbyvalue": "Zoradiť podľa hodnoty vlastnosti",
        "pageswithprop-submit": "Vykonať",
        "pageswithprop-prophidden-long": "dlhá hodnota textovej vlastnosti bola skrytá ($1)",
        "pageswithprop-prophidden-binary": "hodnota binárnej vlastnosti bola skrytá ($1)",
        "deadendpages": "Slepé stránky",
        "deadendpagestext": "Nasledujúce stránky neodkazujú na žiadne iné stránky na {{GRAMMAR:lokál|{{SITENAME}}}}.",
        "protectedpages": "Zamknuté stránky",
+       "protectedpages-filters": "Filtre:",
        "protectedpages-indef": "Zamknutia iba na neurčito",
        "protectedpages-summary": "Táto stránka obsahuje zoznam existujúcich stránok, ktoré sú momentálne zamknuté. Zoznam názvov zamknutých proti vytvoreniu nájdete na stránke [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Iba kaskádové zamykanie",
        "apisandbox-submit": "Odoslať dopyt",
        "apisandbox-reset": "Vyčistiť",
        "apisandbox-retry": "Skúsiť znova",
+       "apisandbox-helpurls": "Odkazy na nápovedu",
        "apisandbox-examples": "Príklady",
+       "apisandbox-dynamic-parameters": "Doplnkové parametre",
+       "apisandbox-dynamic-parameters-add-label": "Pridať parameter:",
+       "apisandbox-dynamic-parameters-add-placeholder": "Meno parametra",
+       "apisandbox-add-multi": "Pridať",
+       "apisandbox-submit-invalid-fields-title": "Niektoré polia sú neplatné",
+       "apisandbox-submit-invalid-fields-message": "Opravte označené polia a skúste to znova.",
        "apisandbox-results": "Výsledky",
        "apisandbox-request-url-label": "URL požiadavky:",
+       "apisandbox-continue": "Pokračovať",
+       "apisandbox-continue-clear": "Vymazať",
+       "apisandbox-multivalue-all-namespaces": "$1 (Všetky menné priestory)",
+       "apisandbox-multivalue-all-values": "$1 (Všetky hodnoty)",
        "booksources": "Knižné zdroje",
        "booksources-search-legend": "Vyhľadávať knižné zdroje",
        "booksources-search": "Hľadať",
        "speciallogtitlelabel": "Cieľ (názov alebo {{ns:user}}:Používateľské meno):",
        "log": "Záznamy",
        "logeventslist-submit": "Zobraziť",
+       "logeventslist-more-filters": "Zobraziť ďalšie záznamy:",
        "logeventslist-patrol-log": "Kniha preverených úprav",
        "logeventslist-tag-log": "Kniha značiek",
        "all-logs-page": "Všetky verejné záznamy",
        "sessionfailure": "Zdá sa, že je problém s vašou prihlasovacou reláciou;\ntáto akcia bola zrušená ako prevencia proti zneužitiu relácie (session).\nProsím, stlačte \"naspäť\", obnovte stránku, z ktorej ste sa sem dostali, a skúste to znova.",
        "changecontentmodel": "Zmeniť model obsahu stránky",
        "changecontentmodel-legend": "Zmeniť model obsahu",
-       "changecontentmodel-title-label": "Názov stránky",
-       "changecontentmodel-model-label": "Nový model obsahu",
+       "changecontentmodel-title-label": "Názov stránky:",
+       "changecontentmodel-model-label": "Nový model obsahu:",
        "changecontentmodel-reason-label": "Dôvod:",
        "changecontentmodel-submit": "Zmeniť",
        "changecontentmodel-success-title": "Model obsahu bol zmenený",
        "ipbreason": "Dôvod:",
        "ipbreason-dropdown": "* Bežné dôvody blokovania\n** Zámerné vkladanie chybných informácií\n** Mazanie obsahu stránok\n** Spam odkazy na externé stránky\n** Vkladanie nezmyslov do stránok\n** Zastrašujúce správanie/obťažovanie\n** Zneužívanie viacerých účtov\n** Neprípustné používateľské meno",
        "ipb-hardblock": "Zabrániť prihláseným používateľom upravovať z tejto IP adresy",
-       "ipbcreateaccount": "Zabrániť vytváraniu účtov",
-       "ipbemailban": "Zabrániť používateľovi posielať e-maily",
+       "ipbcreateaccount": "Vytváranie účtov",
+       "ipbemailban": "Posielanie e-mailov",
        "ipbenableautoblock": "Automaticky blokovať poslednú IP adresu, ktorú tento používateľ použil, a všetky ďalšie adresy, z ktorých sa pokúsi upravovať.",
        "ipbsubmit": "Zablokovať tohto používateľa",
        "ipbother": "Iný čas",
        "ipboptions": "2 hodiny:2 hours,1 deň:1 day,3 dni:3 days,1 týždeň:1 week,2 týždne:2 weeks,1 mesiac:1 month,3 mesiace:3 months,6 mesiacov:6 months,1 rok:1 year,na neurčito:infinite",
        "ipbhidename": "Skryť meno používateľa z úprav a zoznamov",
        "ipbwatchuser": "Sledovať používateľskú a diskusnú stránku tohto používateľa",
-       "ipb-disableusertalk": "Zabrániť tomuto používateľovi upravovať vlastnú diskusnú stránku, kým je zablokovaný",
+       "ipb-disableusertalk": "Upravovanie vlastnej diskusnej stránky",
        "ipb-change-block": "Znovu zablokovať používateľa s týmito voľbami",
        "ipb-confirm": "Potvrdiť blokovanie",
        "badipaddress": "IP adresa má nesprávny formát.",
        "createaccountblock": "tvorba účtov bola zablokovaná",
        "emailblock": "e-mail blokovaný",
        "blocklist-nousertalk": "nemôže upravovať svoju diskusnú stránku",
+       "blocklist-editing-page": "stránky",
+       "blocklist-editing-ns": "menné priestory",
        "ipblocklist-empty": "Zoznam blokovaní je prázdny.",
-       "ipblocklist-no-results": "Požadovaná IP adresa alebo používateľské meno nie je blokovaná.",
+       "ipblocklist-no-results": "Nebolo nájdené žiadne zablokovanie danej IP adresy alebo používateľa.",
        "blocklink": "zablokovať",
        "unblocklink": "odblokovať",
        "change-blocklink": "zmeniť blokovanie",
+       "empty-username": "(používateľské meno nie je dostupné)",
        "contribslink": "príspevky",
        "emaillink": "poslať e-mail",
        "autoblocker": "Boli ste automaticky zablokovaný, pretože vašu IP adresu nedávno použil „[[User:$1|$1]]“.\nDôvodom zablokovania redaktora $1 bolo „$2“",
        "newimages-summary": "Táto špeciálna stránka zobrazuje posledné nahrané súbory.",
        "newimages-legend": "Filter",
        "newimages-label": "Názov súboru (alebo jeho časť):",
+       "newimages-user": "IP adresa alebo používateľské meno",
        "newimages-showbots": "Zobraziť súbory nahrané botmi",
        "newimages-hidepatrolled": "Skryť preverené nahratia súborov",
+       "newimages-mediatype": "Typ multimédia:",
        "noimages": "Niet čo zobraziť.",
        "gallery-slideshow-toggle": "Prepnúť náhľady",
        "ilsubmit": "Hľadať",
        "confirm-unwatch-top": "Odstrániť túto stránku z vášho zoznamu sledovaných?",
        "confirm-rollback-button": "OK",
        "confirm-rollback-top": "Vrátiť úpravy na tejto stránke?",
+       "confirm-mcrundo-title": "Vrátiť späť zmenu",
+       "mcrundofailed": "Vrátenie úpravy sa nepodarilo",
        "quotation-marks": "„$1“",
        "imgmultipageprev": "← predošlá stránka",
        "imgmultipagenext": "ďalšia stránka →",
        "diff-form": "Rozdiely",
        "dberr-problems": "Prepáčte! Táto stránka má práve technické problémy.",
        "dberr-again": "Skúste niekoľko minút počkať a potom opäť načítať stránku.",
-       "dberr-info": "(Spojenie s databázovým serverom neúspešné: $1)",
-       "dberr-info-hidden": "(Nie je možné kontaktovať databázový server)",
+       "dberr-info": "(Nie je možné pripojiť sa k databáze: $1)",
+       "dberr-info-hidden": "(Nie je možné pripojiť sa k databáze)",
        "htmlform-invalid-input": "Niekotrý z údajov, ktoré ste zadali je problematický",
        "htmlform-select-badoption": "Hodnota, ktorú ste uviedli nie je platná.",
        "htmlform-int-invalid": "Hodnota, ktorú ste uviedli nie je celé číslo.",
        "logentry-protect-protect-cascade": "$1 {{GENDER:$2|zamkol|zamkla}} stránku $3 $4 [kaskádovým zámkom]",
        "logentry-protect-modify": "$1 {{GENDER:$2|zmenil|zmenila}} úroveň zámku stránky $3 $4",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|zmenil|zmenila}} úroveň zámku stránky $3 $4 [kaskádový zámok]",
-       "logentry-rights-rights": "$1 zmenil členstvo $3 v skupinách z $4 na $5",
+       "logentry-rights-rights": "$1 {{GENDER:$2|zmenil|zmenila}} členstvo {{GENDER:$6|používateľa|používateľky}} $3 v skupinách z $4 na $5",
        "logentry-rights-rights-legacy": "$1 zmenil členstvo $3 v skupinách",
        "logentry-rights-autopromote": "$1 bol automaticky povýšený z $4 na $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|pridal|pridala}} $3",
        "expandtemplates": "Substituovať šablóny",
        "expand_templates_intro": "Táto špeciálna stránka prijme na\nvstup text a rekurzívne substituuje všetky šablóny,\nktoré sú v ňom použité. Tiež expanduje funkcie\nsyntaktického analyzátora ako <nowiki>{{</nowiki>#language:...}}\na premenné ako <nowiki>{{</nowiki>CURRENTDAY}}—v podstate\ntakmer všetko v zložených zátvorkách. Robí to pomocou\nvolania relevantnej fázy syntaktického analyzátora\nsamotného MediaWiki.",
        "expand_templates_title": "Názov kontextu pre {{FULLPAGENAME}} atď.:",
-       "expand_templates_input": "Vstupný text:",
+       "expand_templates_input": "Vstupný wikitext:",
        "expand_templates_output": "Výsledok",
        "expand_templates_xml_output": "XML výstup",
        "expand_templates_html_output": "Surový HTML výstup",
        "date-range-from": "Od dátumu:",
        "date-range-to": "Po dátum:",
        "randomrootpage": "Náhodná koreňová stránka",
+       "authmanager-provider-password": "Autentifikácia pomocou hesla",
        "changecredentials": "Zmena prihlasovacích údajov",
+       "changecredentials-submit": "Zmeniť prihlasovacie údaje",
        "removecredentials": "Odstránenie prihlasovacích údajov",
+       "credentialsform-provider": "Typ prihlasovacích údajov:",
+       "credentialsform-account": "Názov účtu:",
        "userjsispublic": "Uvedomte si prosím, že podstránky s JavaScriptom by nemali obsahovať tajné údaje, pretože sú viditeľné ostatným používateľom.",
        "usercssispublic": "Uvedomte si prosím, že podstránky s CSS by nemali obsahovať tajné údaje, pretože sú viditeľné ostatným používateľom.",
        "passwordpolicies": "Pravidlá pre heslá"
index e888fda..d9be5c2 100644 (file)
        "createaccountmail": "Ustvari začasno naključno geslo in ga pošlji na spodaj navedeni e-poštni naslov",
        "createaccountmail-help": "Se lahko uporablja za ustvarjanje računa za drugo osebo brez da bi vedeli geslo.",
        "createacct-realname": "Pravo ime (izbirno)",
-       "createacct-reason": "Razlog",
+       "createacct-reason": "Razlog (javno zabeležen)",
        "createacct-reason-ph": "Zakaj ustvarjate drug račun",
        "createacct-reason-help": "Sporočilo, prikazano v dnevniku ustvarjanja računov",
        "createacct-submit": "Ustvarite svoj račun",
        "listfiles-userdoesnotexist": "Uporabniški račun »$1« ni registriran.",
        "imgfile": "dat.",
        "listfiles": "Seznam datotek",
+       "listfiles_subpage": "Nalaganja $1",
        "listfiles_thumb": "Sličica",
        "listfiles_date": "Datum",
        "listfiles_name": "Ime",
        "mycustomjsredirectprotected": "Nimate pravic za urejanje te strani z JavaScriptom, ker je preusmeritev in ne kaže v vaš uporabniški prostor.",
        "easydeflate-invaliddeflate": "Dana vsebina ni pravilno stisnjena",
        "unprotected-js": "Iz varnostnih razlogov JavaScripta ni možno naložiti z nezaščitenih strani. Prosimo, da JavaScript ustvarite samo v imenskem prostoru MediaWiki ali kot uporabniško podstran.",
-       "userlogout-continue": "Se želite odjaviti?"
+       "userlogout-continue": "Se želite odjaviti?",
+       "rest-prefix-mismatch": "Zahtevana pot ($1) ni bila znotraj korenske poti REST API ($2)",
+       "rest-wrong-method": "Zahtevana metoda ($1) ni {{PLURAL:$3|veljavna metoda|ena od veljavnih metod}} za to pot ($2)",
+       "rest-no-match": "Zahtevana relativna pot ($1) se ne ujema z nobenim znanim krmilnikom"
 }
index 1dc3039..583ef08 100644 (file)
        "createaccountmail": "Використати тимчасовий випадковий пароль і надіслати його на вказану адресу електронної пошти",
        "createaccountmail-help": "Може використовуватися, щоб створити обліковий запис для іншої особи, не дізнаючись пароль.",
        "createacct-realname": "Справжнє ім'я (не обов'язково)",
-       "createacct-reason": "Причина",
+       "createacct-reason": "Причина (публічно видима)",
        "createacct-reason-ph": "Чому ви створюєте інший обліковий запис",
        "createacct-reason-help": "Повідомлення, що показується в журналі створення облікових записів",
        "createacct-submit": "Створіть ваш обліковий запис",
index e084d76..9c00f4f 100644 (file)
        "ipblocklist-legend": "查找被封禁用户",
        "blocklist-userblocks": "隐藏账户封禁",
        "blocklist-tempblocks": "隐藏临时封禁",
+       "blocklist-indefblocks": "隐藏无限期封禁",
        "blocklist-addressblocks": "隐藏单个IP封禁",
        "blocklist-type": "类型:",
        "blocklist-type-opt-all": "全部",
index c607eb0..2bce867 100644 (file)
        "tog-useeditwarning": "在我離開未儲存的編輯頁面時警告我",
        "tog-prefershttps": "登入時永遠使用安全連線",
        "tog-showrollbackconfirmation": "當點擊回退連結時顯示確認提示",
+       "tog-requireemail": "需要電子郵件用來重設密碼",
        "underline-always": "永遠使用",
        "underline-never": "永不使用",
        "underline-default": "佈景主題或瀏覽器預設",
        "createaccountmail": "使用臨時的隨機密碼,並將它寄至指定的電子郵件地址",
        "createaccountmail-help": "可用來建立其他人的帳號 (不需要知道密碼)。",
        "createacct-realname": "真實姓名 (選填)",
-       "createacct-reason": "原因",
+       "createacct-reason": "原因(公開記錄)",
        "createacct-reason-ph": "您為什麼要建立另一個帳號",
        "createacct-reason-help": "顯示於帳號建立日誌的訊息",
        "createacct-submit": "建立您的帳號",
        "changeemail-oldemail": "目前的電子郵件地址:",
        "changeemail-newemail": "新的電子郵件地址:",
        "changeemail-newemail-help": "若您想移除您的電子郵件地址,此欄位應留空。若移除電子郵件地址您將無法重設忘記的密碼並且將不會再收到來自此 wiki 的電子郵件。",
-       "changeemail-none": "(無)",
+       "changeemail-none": "(無)",
        "changeemail-password": "您於 {{SITENAME}} 的密碼:",
        "changeemail-submit": "變更電子郵件",
        "changeemail-throttled": "您最近嘗試了太多次登入。\n請等待 $1 後再試。",
        "undo-main-slot-only": "編輯無法還原,因為有包含到在主分配之外的內容。",
        "undo-norev": "此編輯不存在或已被刪除,無法還原。",
        "undo-nochange": "此編輯已被還原。",
-       "undo-summary": "取消由 [[Special:Contributions/$2|$2]] ([[User talk:$2|討論]]) 所作出的修訂 $1",
+       "undo-summary": "取消由[[Special:Contributions/$2|$2]]([[User talk:$2|討論]])所作出的修訂$1",
+       "undo-summary-anon": "取消由[[Special:Contributions/$2|$2]]所作出的修訂$1",
        "undo-summary-username-hidden": "還原隱藏使用者的修訂 $1",
        "cantcreateaccount-text": "自這個 IP 位址 (<strong>$1</strong>) 建立帳號已經被 [[User:$3|$3]] 封鎖。\n\n$3 封鎖的原因是$2",
        "cantcreateaccount-range-text": "來自 IP 位址範圍 <strong>$1</strong>,包含您的 IP 位址 (<strong>$4</strong>) 所建立的帳號已經被 [[User:$3|$3]] 封鎖。\n\n$3 封鎖的原因是 <em>$2</em>",
        "prefs-help-gender": "此偏好設定為選填欄位。\n系統會使用您選擇的方式稱呼您,對他人提及您時也會使用適當語法稱呼。\n此項資訊會被公開。",
        "email": "Email",
        "prefs-help-realname": "真實姓名為選填欄位。\n若提供,真實姓名可能會用來作為您的作品的署名。",
-       "prefs-help-email": "電子郵件地址為選填欄位。\n但在重設密碼時會使用,而您很有可能會忘記密碼。",
+       "prefs-help-email": "電子郵件地址為選填欄位,但是當您忘記密碼而要重設時需要此資訊。",
        "prefs-help-email-others": "您亦可以選擇讓其他使用者透過您的電子郵件、使用者頁面或討論頁面的連結與您聯絡。\n您的電子郵件地址不會洩漏給其他要聯絡您的使用者。",
        "prefs-help-email-required": "電子郵件地址是必填項目。",
+       "prefs-help-requireemail": "如果選取,則只有在重設密碼的人同時提供此帳戶的使用者名稱和電子郵件時,才會發送重設密碼的電子郵件。",
        "prefs-info": "基本資訊",
        "prefs-i18n": "國際化",
        "prefs-signature": "簽名",
        "listfiles-userdoesnotexist": "使用者帳號 \"$1\" 尚未註冊。",
        "imgfile": "檔案",
        "listfiles": "檔案清單",
+       "listfiles_subpage": "由 $1 上傳",
        "listfiles_thumb": "縮圖",
        "listfiles_date": "日期",
        "listfiles_name": "名稱",
        "alreadyrolled": "無法回退由[[User:$2|$2]]([[User talk:$2|討論]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]])所作的最後一次編輯[[:$1]],已有其他人編輯或回退了該頁面。\n\n最後一次編輯該頁面的使用者是[[User:$3|$3]]([[User talk:$3|討論]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]])。",
        "editcomment": "編輯摘要為:<em>$1</em>。",
        "revertpage": "已還原[[Special:Contributions/$2|$2]]([[User talk:$2|討論]])的編輯至最後由[[User:$1|$1]]所修訂的版本",
+       "revertpage-anon": "已還原[[Special:Contributions/$2|$2]]的編輯至最後由[[User:$1|$1]]所修訂的版本",
        "revertpage-nouser": "已還原隱藏使用者的編輯為最後 {{GENDER:$1|[[User:$1|$1]]}} 修訂的版本",
        "rollback-success": "已還原{{GENDER:$3|$1}}所做的編輯;變更回由{{GENDER:$4|$2}}修訂的最後一個版本。",
        "sessionfailure-title": "連線階段失敗",
        "ipblocklist-legend": "搜尋已封鎖的使用者",
        "blocklist-userblocks": "隱藏帳號封鎖",
        "blocklist-tempblocks": "隱藏暫時封鎖",
+       "blocklist-indefblocks": "隱藏無限期封鎖",
        "blocklist-addressblocks": "隱藏單一 IP 封鎖",
        "blocklist-type": "類型:",
        "blocklist-type-opt-all": "所有",
        "mycustomjsredirectprotected": "您無權編輯此JavaScript頁面,因為它是重新導向,且不是重新導向到您的用戶空間。",
        "easydeflate-invaliddeflate": "提供的內容未被正常的壓縮",
        "unprotected-js": "基於安全因素,JavaScript 不能從未保護的頁面來載入。請僅在 MediaWiki:命名空間或使用者子頁面中建立 JavaScript。",
-       "userlogout-continue": "您想要登出嗎?"
+       "userlogout-continue": "您想要登出嗎?",
+       "rest-prefix-mismatch": "請求的路徑($1)不在REST API的根路徑($2)內",
+       "rest-wrong-method": "請求的方法($1)不是{{PLURAL:$3|此路徑允許的方法|此路徑允許的方法之一}}($2)",
+       "rest-no-match": "請求的相對路徑($1)不符合任何已知的處理器"
 }
index b63a2e2..c1a1b07 100644 (file)
@@ -52,7 +52,7 @@ class AddChangeTag extends Maintenance {
                );
 
                if ( !$status->isGood() ) {
-                       $this->fatalError( $status->getWikiText( null, null, 'en' ) );
+                       $this->fatalError( $status->getMessage( false, false, 'en' )->text() );
                }
 
                $this->output( "$tag was created.\n" );
index e7df448..aa45154 100644 (file)
@@ -60,7 +60,7 @@ class ChangePassword extends Maintenance {
                if ( $status->isGood() ) {
                        $this->output( "Password set for " . $user->getName() . "\n" );
                } else {
-                       $this->fatalError( $status->getWikiText( null, null, 'en' ) );
+                       $this->fatalError( $status->getMessage( false, false, 'en' )->text() );
                }
        }
 }
index da241e5..2c81adf 100644 (file)
@@ -163,7 +163,7 @@ class CleanupCaps extends TableCleanup {
                        $mp = MediaWikiServices::getInstance()->getMovePageFactory()
                                ->newMovePage( $current, $target );
                        $status = $mp->move( $this->user, $reason, $createRedirect );
-                       $ok = $status->isOK() ? 'OK' : $status->getWikiText( false, false, 'en' );
+                       $ok = $status->isOK() ? 'OK' : $status->getMessage( false, false, 'en' )->text();
                        $this->output( "\"$display\" -> \"$targetDisplay\": $ok\n" );
                }
 
index ce40638..9e36742 100644 (file)
@@ -260,7 +260,7 @@ class CopyFileBackend extends Maintenance {
                        // Note: prepare() is usually fast for key/value backends
                        $status = $dst->prepare( [ 'dir' => dirname( $dstPath ), 'bypassReadOnly' => 1 ] );
                        if ( !$status->isOK() ) {
-                               $this->error( print_r( Status::wrap( $status )->getWikiText(), true ) );
+                               $this->error( Status::wrap( $status )->getMessage( false, false, 'en' )->text() );
                                $this->fatalError( "$domainId: Could not copy $srcPath to $dstPath." );
                        }
                        $ops[] = [ 'op' => 'store',
@@ -277,7 +277,7 @@ class CopyFileBackend extends Maintenance {
                }
                $elapsed_ms = floor( ( microtime( true ) - $t_start ) * 1000 );
                if ( !$status->isOK() ) {
-                       $this->error( print_r( Status::wrap( $status )->getWikiText(), true ) );
+                       $this->error( Status::wrap( $status )->getMessage( false, false, 'en' )->text() );
                        $this->fatalError( "$domainId: Could not copy file batch." );
                } elseif ( count( $copiedRel ) ) {
                        $this->output( "\n\tCopied these file(s) [{$elapsed_ms}ms]:\n\t" .
@@ -314,7 +314,7 @@ class CopyFileBackend extends Maintenance {
                }
                $elapsed_ms = floor( ( microtime( true ) - $t_start ) * 1000 );
                if ( !$status->isOK() ) {
-                       $this->error( print_r( Status::wrap( $status )->getWikiText(), true ) );
+                       $this->error( Status::wrap( $status )->getMessage( false, false, 'en' )->text() );
                        $this->fatalError( "$domainId: Could not delete file batch." );
                } elseif ( count( $deletedRel ) ) {
                        $this->output( "\n\tDeleted these file(s) [{$elapsed_ms}ms]:\n\t" .
index 505168e..b92735b 100644 (file)
@@ -121,7 +121,7 @@ class CreateAndPromote extends Maintenance {
                                false
                        );
                        if ( !$status->isGood() ) {
-                               $this->fatalError( $status->getWikiText( null, null, 'en' ) );
+                               $this->fatalError( $status->getMessage( false, false, 'en' )->text() );
                        }
                }
 
@@ -134,7 +134,7 @@ class CreateAndPromote extends Maintenance {
                                        'retype' => $password,
                                ] );
                                if ( !$status->isGood() ) {
-                                       throw new PasswordError( $status->getWikiText( null, null, 'en' ) );
+                                       throw new PasswordError( $status->getMessage( false, false, 'en' )->text() );
                                }
                                if ( $exists ) {
                                        $this->output( "Password set.\n" );
index 3609cf2..825e9ca 100644 (file)
@@ -122,7 +122,7 @@ class EditCLI extends Maintenance {
                        $exit = 1;
                }
                if ( !$status->isGood() ) {
-                       $this->output( $status->getWikiText( false, false, 'en' ) . "\n" );
+                       $this->output( $status->getMessage( false, false, 'en' )->text() . "\n" );
                }
                exit( $exit );
        }
index d5f94ad..6640148 100644 (file)
@@ -326,7 +326,7 @@ TEXT
                        $statusRootPage = $importer->setTargetRootPage( $this->getOption( 'rootpage' ) );
                        if ( !$statusRootPage->isGood() ) {
                                // Die here so that it doesn't print "Done!"
-                               $this->fatalError( $statusRootPage->getMessage()->text() );
+                               $this->fatalError( $statusRootPage->getMessage( false, false, 'en' )->text() );
                                return false;
                        }
                }
index 954f36d..0c4ff0a 100644 (file)
@@ -326,7 +326,7 @@ class ImportImages extends Maintenance {
                                        $archive = $image->publish( $file, $flags, $publishOptions );
                                        if ( !$archive->isGood() ) {
                                                $this->output( "failed. (" .
-                                                        $archive->getWikiText( false, false, 'en' ) .
+                                                        $archive->getMessage( false, false, 'en' )->text() .
                                                         ")\n" );
                                                $failed++;
                                                continue;
index 16b8ccf..20254b0 100644 (file)
@@ -118,7 +118,7 @@ class CommandLineInstaller extends Maintenance {
                try {
                        $installer = InstallerOverrides::getCliInstaller( $siteName, $adminName, $this->mOptions );
                } catch ( \MediaWiki\Installer\InstallException $e ) {
-                       $this->output( $e->getStatus()->getMessage()->text() . "\n" );
+                       $this->output( $e->getStatus()->getMessage( false, false, 'en' )->text() . "\n" );
                        return false;
                }
 
index 09f3120..b54ed45 100644 (file)
@@ -111,7 +111,7 @@ class MoveBatch extends Maintenance {
                                ->newMovePage( $source, $dest );
                        $status = $mp->move( $wgUser, $reason, !$noredirects );
                        if ( !$status->isOK() ) {
-                               $this->output( "\nFAILED: " . $status->getWikiText( false, false, 'en' ) );
+                               $this->output( "\nFAILED: " . $status->getMessage( false, false, 'en' )->text() );
                        }
                        $this->commitTransaction( $dbw, __METHOD__ );
                        $this->output( "\n" );
index db8a19a..264ba57 100644 (file)
@@ -143,6 +143,10 @@ class RefreshFileHeaders extends Maintenance {
                $this->output( "Done. Updated headers for $count file(s).\n" );
        }
 
+       /**
+        * @param LocalRepo $repo
+        * @param array $backendOperations
+        */
        protected function updateFileHeaders( $repo, $backendOperations ) {
                $status = $repo->getBackend()->doQuickOperations( $backendOperations );
 
index 20bd405..de307a6 100644 (file)
                                .toggleClass( 'mw-collapsible-toggle-expanded', wasCollapsed );
                }
 
+               // Toggle `aria-expanded` attribute, if requested (for default and premade togglers by default).
+               if ( options.toggleARIA ) {
+                       $toggle.attr( 'aria-expanded', wasCollapsed ? 'true' : 'false' );
+               }
+
                // Toggle the text ("Show"/"Hide") within elements tagged with mw-collapsible-text
                if ( options.toggleText ) {
                        collapseText = options.toggleText.collapseText;
                        actionHandler = function ( e, opts ) {
                                var defaultOpts = {
                                        toggleClasses: true,
+                                       toggleARIA: true,
                                        toggleText: { collapseText: collapseText, expandText: expandText }
                                };
                                opts = $.extend( defaultOpts, options, opts );
 
                        // Attach event handlers to togglelink
                        $toggle.on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler )
+                               .attr( 'aria-expanded', 'true' )
                                .prop( 'tabIndex', 0 );
 
                        $( this ).data( 'mw-collapsible', {
index 75dae92..13ef390 100644 (file)
@@ -378,7 +378,6 @@ a.new {
 .warningbox,
 .successbox {
        color: #000;
-       display: inline-block;
        margin-bottom: 1em;
        border: 1px solid;
        padding: 0.5em 1em;
index 667c2ba..a36e409 100644 (file)
@@ -24,7 +24,7 @@
                this.drawCarousel();
                this.setSizeRequirement();
                this.toggleThumbnails( !!this.$gallery.attr( 'data-showthumbnails' ) );
-               this.showCurrentImage();
+               this.showCurrentImage( true );
 
                // Events
                $( window ).on(
 
        /**
         * Displays the image set as {@link #$currentImage} in the carousel.
+        *
+        * @param {boolean} init Image being show during gallery init (i.e. first image)
         */
-       mw.GallerySlideshow.prototype.showCurrentImage = function () {
+       mw.GallerySlideshow.prototype.showCurrentImage = function ( init ) {
                var $thumbnail, $imgLink,
                        $imageLi = this.getCurrentImage(),
                        $caption = $imageLi.find( '.gallerytext' );
                        if ( this.$thumbnail.attr( 'src' ) === $thumbnail.attr( 'src' ) ) {
                                this.$img.attr( 'src', info.thumburl );
                                this.setImageSize();
-                               mw.hook( 'wikipage.content' ).fire( this.$imgContainer );
+                               // Don't fire hook twice during init
+                               if ( !init ) {
+                                       mw.hook( 'wikipage.content' ).fire( this.$imgContainer );
+                               }
 
                                // Pre-fetch the next image
                                this.loadImage( this.getNextImage().find( 'img' ) );
index 4541c58..a0ac0ca 100644 (file)
                        // Generate the same URL on client side as the one generated in ImagePage::openShowImage.
                        // We avoid using the URL in the link directly since it could have been manipulated (T68608)
                        page = Number( mw.util.getParamValue( 'page', this.href ) );
-                       url = mw.util.getUrl( mw.config.get( 'wgPageName' ), { page: page } );
+                       url = mw.util.getUrl( null, { page: page } );
 
                        switchPage( url );
                        e.preventDefault();
index 01318c9..1d364ce 100644 (file)
        //
        // Markup:
        // <form class="mw-ui-vform">
-       //   <div class="errorbox">An error occurred</div>
+       //   <div class="errorbox">
+       //     <ul><li>An error occurred. There are problems with some of your input.</li></ul>
+       //   </div>
        //   <div class="warningbox">A warning to be noted</div>
        //   <div class="successbox">Action successful!</div>
-       //   <div class="error">A different kind of error</div>
-       //   <div class="error">
-       //     <ul><li>There are problems with some of your input.</li></ul>
-       //   </div>
        //   <div class="mw-ui-vform-field">
        //     <input type="text" value="input" class="mw-ui-input">
        //   </div>
        // </form>
        //
        // Styleguide 5.2.
-       .error,
-       .warning,
        .errorbox,
        .warningbox,
        .successbox {
                word-wrap: break-word;
        }
 
-       // Colours taken from those for .errorbox in shared.css
-       .error {
-               background-color: @backgroundColorError;
-               color: @colorTextEmphasized;
-               border: 1px solid @borderColorError;
-       }
-
-       // Colours taken from those for .warningbox in shared.css
-       .warning {
-               background-color: @backgroundColorWarning;
-               color: @colorTextEmphasized;
-               border: 1px solid @borderColorWarning;
-       }
-
        // This specifies styling for individual field validation error messages.
        // Show them below the fields to prevent line break glitches, and leave
        // some space between the field and the error message box.
        .mw-ui-vform-field {
-               .error,
-               .warning {
-                       display: block;
+               .errorbox,
+               .warningbox {
                        margin-top: 5px;
                }
        }
index ce3f2e2..ca400bf 100644 (file)
@@ -45,6 +45,6 @@ trait MediaWikiCoversValidator {
                        }
                }
 
-               $this->assertEquals( '', $bad );
+               $this->assertSame( '', $bad );
        }
 }
index ecd5c05..27cbed5 100644 (file)
@@ -1821,27 +1821,30 @@ abstract class MediaWikiIntegrationTestCase extends PHPUnit\Framework\TestCase {
        /**
         * Empty all tables so they can be repopulated for tests
         *
-        * @param Database $db|null Database to reset
-        * @param array $tablesUsed Tables to reset
+        * @param IDatabase $db|null Database to reset
+        * @param string[] $tablesUsed Tables to reset
         */
-       private function resetDB( $db, $tablesUsed ) {
+       private function resetDB( IDatabase $db = null, array $tablesUsed ) {
                if ( $db ) {
-                       $userTables = [ 'user', 'user_groups', 'user_properties', 'actor' ];
-                       $pageTables = [
-                               'page', 'revision', 'ip_changes', 'revision_comment_temp', 'comment', 'archive',
-                               'revision_actor_temp', 'slots', 'content', 'content_models', 'slot_roles',
-                               'change_tag',
-                       ];
-                       $loggingTables = [
-                               'logging', 'log_search', 'change_tag',
+                       // some groups of tables are connected such that if any is used, all should be cleared
+                       $extraTables = [
+                               'user' => [ 'user', 'user_groups', 'user_properties', 'actor' ],
+                               'page' => [ 'page', 'revision', 'ip_changes', 'revision_comment_temp', 'comment', 'archive',
+                                       'revision_actor_temp', 'slots', 'content', 'content_models', 'slot_roles',
+                                       'change_tag' ],
+                               'logging' => [ 'logging', 'log_search', 'change_tag' ],
                        ];
-                       $coreDBDataTables = array_merge( $userTables, $pageTables );
+                       $coreDBDataTables = array_merge( $extraTables['user'], $extraTables['page'] );
 
-                       // some groups of tables are connected such that if any is used, all should be cleared
-                       $extraTables = [];
-                       if ( array_intersect( $tablesUsed, $userTables ) ) {
-                               $extraTables[] = $userTables;
+                       foreach ( $extraTables as $i => $group ) {
+                               if ( !array_intersect( $tablesUsed, $group ) ) {
+                                       unset( $extraTables[$i] );
+                               }
+                       }
+                       $extraTables = array_values( $extraTables );
+                       $tablesUsed = array_unique( array_merge( $tablesUsed, ...$extraTables ) );
 
+                       if ( in_array( 'user', $tablesUsed ) ) {
                                TestUserRegistry::clear();
 
                                // Reset $wgUser, which is probably 127.0.0.1, as its loaded data is probably not valid
@@ -1850,15 +1853,6 @@ abstract class MediaWikiIntegrationTestCase extends PHPUnit\Framework\TestCase {
                                global $wgUser;
                                $wgUser->clearInstanceCache( $wgUser->mFrom );
                        }
-                       if ( array_intersect( $tablesUsed, $pageTables ) ) {
-                               $extraTables[] = $pageTables;
-                       }
-                       if ( array_intersect( $tablesUsed, $loggingTables ) ) {
-                               $extraTables[] = $loggingTables;
-                       }
-                       if ( $extraTables !== [] ) {
-                               $tablesUsed = array_unique( array_merge( $tablesUsed, ...$extraTables ) );
-                       }
 
                        // Postgres uses mwuser/pagecontent
                        // instead of user/text. But Postgres does not remap the
@@ -2393,32 +2387,6 @@ abstract class MediaWikiIntegrationTestCase extends PHPUnit\Framework\TestCase {
                $this->mergeMwGlobalArrayValue( 'wgHooks', [ $hookName => [ $handler ] ] );
        }
 
-       /**
-        * Check whether file contains given data.
-        * @param string $fileName
-        * @param string $actualData
-        * @param bool $createIfMissing If true, and file does not exist, create it with given data
-        *                              and skip the test.
-        * @param string $msg
-        * @since 1.30
-        */
-       protected function assertFileContains(
-               $fileName,
-               $actualData,
-               $createIfMissing = false,
-               $msg = ''
-       ) {
-               if ( $createIfMissing ) {
-                       if ( !file_exists( $fileName ) ) {
-                               file_put_contents( $fileName, $actualData );
-                               $this->markTestSkipped( "Data file $fileName does not exist" );
-                       }
-               } else {
-                       self::assertFileExists( $fileName );
-               }
-               self::assertEquals( file_get_contents( $fileName ), $actualData, $msg );
-       }
-
        /**
         * Edits or creates a page/revision
         * @param string $pageName Page title
index 4ccfe39..918b51b 100644 (file)
@@ -29,4 +29,30 @@ trait MediaWikiTestCaseTrait {
                $mock->expects( $this->never() )->method( $this->anythingBut( '__destruct' ) );
                return $mock;
        }
+
+       /**
+        * Check whether file contains given data.
+        * @param string $fileName
+        * @param string $actualData
+        * @param bool $createIfMissing If true, and file does not exist, create it with given data
+        *                              and skip the test.
+        * @param string $msg
+        * @since 1.30
+        */
+       protected function assertFileContains(
+               $fileName,
+               $actualData,
+               $createIfMissing = false,
+               $msg = ''
+       ) {
+               if ( $createIfMissing ) {
+                       if ( !file_exists( $fileName ) ) {
+                               file_put_contents( $fileName, $actualData );
+                               $this->markTestSkipped( "Data file $fileName does not exist" );
+                       }
+               } else {
+                       self::assertFileExists( $fileName );
+               }
+               self::assertEquals( file_get_contents( $fileName ), $actualData, $msg );
+       }
 }
index d2540f6..1f9465d 100644 (file)
@@ -351,7 +351,7 @@ class EditPageTest extends MediaWikiLangTestCase {
 
                wfGetDB( DB_MASTER )->commit( __METHOD__ );
 
-               $this->assertEquals( 0, DeferredUpdates::pendingUpdatesCount(), 'No deferred updates' );
+               $this->assertSame( 0, DeferredUpdates::pendingUpdatesCount(), 'No deferred updates' );
 
                if ( $expectedCode != EditPage::AS_BLANK_ARTICLE ) {
                        $latest = $page->getLatest();
index c054caa..7b7f6b9 100644 (file)
@@ -50,7 +50,7 @@ class FauxRequestTest extends PHPUnit\Framework\TestCase {
        public function testGetText() {
                $req = new FauxRequest( [ 'x' => 'Value' ] );
                $this->assertEquals( 'Value', $req->getText( 'x' ) );
-               $this->assertEquals( '', $req->getText( 'z' ) );
+               $this->assertSame( '', $req->getText( 'z' ) );
        }
 
        /**
@@ -287,8 +287,8 @@ class FauxRequestTest extends PHPUnit\Framework\TestCase {
         */
        public function testDummies() {
                $req = new FauxRequest();
-               $this->assertEquals( '', $req->getRawQueryString() );
-               $this->assertEquals( '', $req->getRawPostString() );
-               $this->assertEquals( '', $req->getRawInput() );
+               $this->assertSame( '', $req->getRawQueryString() );
+               $this->assertSame( '', $req->getRawPostString() );
+               $this->assertSame( '', $req->getRawInput() );
        }
 }
index 5d83b7e..4401410 100644 (file)
@@ -161,12 +161,12 @@ class HtmlTest extends MediaWikiTestCase {
         * @covers Html::expandAttributes
         */
        public function testExpandAttributesForBooleans() {
-               $this->assertEquals(
+               $this->assertSame(
                        '',
                        Html::expandAttributes( [ 'selected' => false ] ),
                        'Boolean attributes do not generates output when value is false'
                );
-               $this->assertEquals(
+               $this->assertSame(
                        '',
                        Html::expandAttributes( [ 'selected' => null ] ),
                        'Boolean attributes do not generates output when value is null'
index fe32507..dcac471 100644 (file)
@@ -453,7 +453,7 @@ class LinkerTest extends MediaWikiLangTestCase {
                $user = $context->getUser();
                $user->setOption( 'showrollbackconfirmation', $rollbackEnabled );
 
-               $this->assertEquals( 0, Title::newFromText( $title )->getArticleID() );
+               $this->assertSame( 0, Title::newFromText( $title )->getArticleID() );
                $pageData = $this->insertPage( $title );
                $page = WikiPage::factory( $pageData['title'] );
 
index d34ba0a..e4c068f 100644 (file)
@@ -227,7 +227,7 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
 
                // This should do nothing. In particular, it should not create a service instance.
                $services->resetServiceForTesting( 'Test' );
-               $this->assertEquals( 0, $serviceCounter, 'No service instance should be created yet.' );
+               $this->assertSame( 0, $serviceCounter, 'No service instance should be created yet.' );
 
                $oldInstance = $services->getService( 'Test' );
                $this->assertEquals( 1, $serviceCounter, 'A service instance should exit now.' );
index aa6e494..6ab56eb 100644 (file)
@@ -93,7 +93,7 @@ class OutputPageTest extends MediaWikiTestCase {
                                'Some syndication links should be there' );
                } else {
                        $this->assertFalse( $outputPage->isSyndicated(), 'No syndication should be offered' );
-                       $this->assertEquals( 0, count( $outputPage->getSyndicationLinks() ),
+                       $this->assertSame( 0, count( $outputPage->getSyndicationLinks() ),
                                'No syndication links should be there' );
                }
        }
index c0ff44b..e4d6b54 100644 (file)
@@ -3,12 +3,17 @@
 namespace MediaWiki\Tests\Revision;
 
 use CommentStoreComment;
+use ContentHandler;
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Revision\MutableRevisionRecord;
 use MediaWiki\Revision\RevisionRecord;
 use MediaWiki\Revision\SlotRecord;
+use MediaWiki\Storage\SqlBlobStore;
+use Revision;
+use StatusValue;
 use TextContent;
 use Title;
+use Wikimedia\TestingAccessWrapper;
 use WikitextContent;
 
 /**
@@ -239,4 +244,49 @@ class McrRevisionStoreDbTest extends RevisionStoreDbTestBase {
                        ]
                ] ], $result->getErrors() );
        }
+
+       /**
+        * @covers \MediaWiki\Revision\RevisionStore::newRevisionsFromBatch
+        */
+       public function testNewRevisionFromBatchUsesGetBlobBatch() {
+               $page1 = $this->getTestPage();
+               $text = __METHOD__ . 'b-ä';
+               $editStatus = $this->editPage( $page1->getTitle()->getPrefixedDBkey(), $text . '1' );
+               $this->assertTrue( $editStatus->isGood(), 'Sanity: must create revision 1' );
+               /** @var Revision $rev1 */
+               $rev1 = $editStatus->getValue()['revision'];
+
+               $contentAddress = $rev1->getRevisionRecord()->getSlot( SlotRecord::MAIN )->getAddress();
+               $mockBlobStore = $this->getMockBuilder( SqlBlobStore::class )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $mockBlobStore
+                       ->expects( $this->once() )
+                       ->method( 'getBlobBatch' )
+                       ->with( [ $contentAddress ], $this->anything() )
+                       ->willReturn( StatusValue::newGood( [
+                               $contentAddress => 'Content_From_Mock'
+                       ] ) );
+               $mockBlobStore
+                       ->expects( $this->never() )
+                       ->method( 'getBlob' );
+
+               $revStore = MediaWikiServices::getInstance()
+                       ->getRevisionStoreFactory()
+                       ->getRevisionStore();
+               $wrappedRevStore = TestingAccessWrapper::newFromObject( $revStore );
+               $wrappedRevStore->blobStore = $mockBlobStore;
+
+               $result = $revStore->newRevisionsFromBatch(
+                       [ $this->revisionToRow( $rev1 ) ],
+                       [
+                               'slots' => [ SlotRecord::MAIN ],
+                               'content' => true
+                       ]
+               );
+               $this->assertTrue( $result->isGood() );
+               $this->assertSame( 'Content_From_Mock',
+                       ContentHandler::getContentText( $result->getValue()[$rev1->getId()]
+                               ->getContent( SlotRecord::MAIN ) ) );
+       }
 }
index 76190e0..4040ffc 100644 (file)
@@ -4,8 +4,10 @@ namespace MediaWiki\Tests\Revision;
 
 use CommentStoreComment;
 use Content;
+use ContentHandler;
 use Exception;
 use HashBagOStuff;
+use IDBAccessObject;
 use InvalidArgumentException;
 use Language;
 use MediaWiki\Linker\LinkTarget;
@@ -105,7 +107,7 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
         * @return WikiPage
         */
        protected function getTestPage( $pageTitle = null ) {
-               if ( !is_null( $pageTitle ) && $this->testPage ) {
+               if ( is_null( $pageTitle ) && $this->testPage ) {
                        return $this->testPage;
                }
 
@@ -1992,23 +1994,17 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
        ) {
                $page1 = $this->getTestPage();
                $text = __METHOD__ . 'b-ä';
+               $editStatus = $this->editPage( $page1->getTitle()->getPrefixedDBkey(), $text . '1' );
+               $this->assertTrue( $editStatus->isGood(), 'Sanity: must create revision 1' );
                /** @var Revision $rev1 */
-               $rev1 = $page1->doEditContent(
-                       new WikitextContent( $text . '1' ),
-                       __METHOD__ . 'b',
-                       0,
-                       false,
-                       $this->getTestUser()->getUser()
-               )->value['revision'];
+               $rev1 = $editStatus->getValue()['revision'];
+
                $page2 = $this->getTestPage( $otherPageTitle );
+               $editStatus = $this->editPage( $page2->getTitle()->getPrefixedDBkey(), $text . '2' );
+               $this->assertTrue( $editStatus->isGood(), 'Sanity: must create revision 2' );
                /** @var Revision $rev2 */
-               $rev2 = $page2->doEditContent(
-                       new WikitextContent( $text . '2' ),
-                       __METHOD__ . 'b',
-                       0,
-                       false,
-                       $this->getTestUser()->getUser()
-               )->value['revision'];
+               $rev2 = $editStatus->getValue()['revision'];
+
                $store = MediaWikiServices::getInstance()->getRevisionStore();
                $result = $store->newRevisionsFromBatch(
                        [ $this->revisionToRow( $rev1 ), $this->revisionToRow( $rev2 ) ],
@@ -2016,14 +2012,15 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
                );
                $this->assertTrue( $result->isGood() );
                $this->assertEmpty( $result->getErrors() );
+               /** @var RevisionRecord[] $records */
                $records = $result->getValue();
                $this->assertRevisionRecordMatchesRevision( $rev1, $records[$rev1->getId()] );
                $this->assertRevisionRecordMatchesRevision( $rev2, $records[$rev2->getId()] );
 
                $this->assertSame( $text . '1',
-                       $records[$rev1->getId()]->getContent( SlotRecord::MAIN )->serialize() );
+                       ContentHandler::getContentText( $records[$rev1->getId()]->getContent( SlotRecord::MAIN ) ) );
                $this->assertSame( $text . '2',
-                       $records[$rev2->getId()]->getContent( SlotRecord::MAIN )->serialize() );
+                       ContentHandler::getContentText( $records[$rev2->getId()]->getContent( SlotRecord::MAIN ) ) );
                $this->assertEquals( $page1->getTitle()->getDBkey(),
                        $records[$rev1->getId()]->getPageAsLinkTarget()->getDBkey() );
                $this->assertEquals( $page2->getTitle()->getDBkey(),
@@ -2046,4 +2043,41 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
                $this->assertEmpty( $result->getValue() );
                $this->assertEmpty( $result->getErrors() );
        }
+
+       /**
+        * @covers \MediaWiki\Revision\RevisionStore::newRevisionsFromBatch
+        */
+       public function testNewRevisionsFromBatch_wrongTitle() {
+               $page1 = $this->getTestPage();
+               $text = __METHOD__ . 'b-ä';
+               $editStatus = $this->editPage( $page1->getTitle()->getPrefixedDBkey(), $text . '1' );
+               $this->assertTrue( $editStatus->isGood(), 'Sanity: must create revision 1' );
+               /** @var Revision $rev1 */
+               $rev1 = $editStatus->getValue()['revision'];
+
+               $this->setExpectedException( InvalidArgumentException::class );
+               MediaWikiServices::getInstance()->getRevisionStore()
+                       ->newRevisionsFromBatch(
+                               [ $this->revisionToRow( $rev1 ) ],
+                               [],
+                               IDBAccessObject::READ_NORMAL,
+                               $this->getTestPage( 'Title_Other_Then_The_One_Revision_Belongs_To' )->getTitle()
+                       );
+       }
+
+       /**
+        * @covers \MediaWiki\Revision\RevisionStore::newRevisionsFromBatch
+        */
+       public function testNewRevisionsFromBatch_DuplicateRows() {
+               $page1 = $this->getTestPage();
+               $text = __METHOD__ . 'b-ä';
+               $editStatus = $this->editPage( $page1->getTitle()->getPrefixedDBkey(), $text . '1' );
+               $this->assertTrue( $editStatus->isGood(), 'Sanity: must create revision 1' );
+               /** @var Revision $rev1 */
+               $rev1 = $editStatus->getValue()['revision'];
+
+               $this->setExpectedException( InvalidArgumentException::class );
+               MediaWikiServices::getInstance()->getRevisionStore()
+                       ->newRevisionsFromBatch( [ $this->revisionToRow( $rev1 ), $this->revisionToRow( $rev1 ) ] );
+       }
 }
index b0d89a6..ff9fa7b 100644 (file)
@@ -21,7 +21,7 @@ class SiteStatsTest extends MediaWikiTestCase {
                );
 
                $jobq->get( 'null' )->delete();  // clear jobqueue
-               $this->assertEquals( 0, $jobq->get( 'null' )->getSize(),
+               $this->assertSame( 0, $jobq->get( 'null' )->getSize(),
                        'Job queue for NullJob has been cleaned' );
 
                $cache->delete( $cache->makeKey( 'SiteStats', 'jobscount' ) );
@@ -29,7 +29,7 @@ class SiteStatsTest extends MediaWikiTestCase {
                        'jobs count is kept in process cache' );
 
                $cache->clearProcessCache();
-               $this->assertEquals( 0, SiteStats::jobs() );
+               $this->assertSame( 0, SiteStats::jobs() );
        }
 
 }
index 2148411..c64169f 100644 (file)
@@ -1062,7 +1062,7 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
 
                $this->db->endAtomic( __METHOD__ ); // run deferred updates
 
-               $this->assertEquals( 0, DeferredUpdates::pendingUpdatesCount(), 'No pending updates' );
+               $this->assertSame( 0, DeferredUpdates::pendingUpdatesCount(), 'No pending updates' );
        }
 
        /**
@@ -1095,7 +1095,7 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
 
                $this->db->endAtomic( __METHOD__ ); // run deferred updates
 
-               $this->assertEquals( 0, DeferredUpdates::pendingUpdatesCount(), 'No pending updates' );
+               $this->assertSame( 0, DeferredUpdates::pendingUpdatesCount(), 'No pending updates' );
                $this->assertNotFalse( $pcache->get( $page, $updater->getCanonicalParserOptions() ) );
        }
 
index 77d6f59..ec002e0 100644 (file)
@@ -327,7 +327,7 @@ class TitleMethodsTest extends MediaWikiLangTestCase {
 
                $title2 = Title::newFromText( 'Foo' );
                $this->assertNotSame( $title1, $title2, 'title cache should be empty' );
-               $this->assertEquals( 0, $linkCache->getGoodLinkID( 'Foo' ), 'link cache should be empty' );
+               $this->assertSame( 0, $linkCache->getGoodLinkID( 'Foo' ), 'link cache should be empty' );
        }
 
        public function provideGetLinkURL() {
index ab9abbb..f95505b 100644 (file)
@@ -46,7 +46,7 @@ class XmlTest extends MediaWikiTestCase {
                $this->assertNull( Xml::expandAttributes( null ),
                        'Converting a null list of attributes'
                );
-               $this->assertEquals( '', Xml::expandAttributes( [] ),
+               $this->assertSame( '', Xml::expandAttributes( [] ),
                        'Converting an empty list of attributes'
                );
        }
index fdc9c1b..b1b8a42 100644 (file)
@@ -214,7 +214,7 @@ class ApiPageSetTest extends ApiTestCase {
                        'titles' => 'User:' . implode( '|User:', $userNames ),
                ] );
 
-               $this->assertEquals( 0, $genderCache->misses,
+               $this->assertSame( 0, $genderCache->misses,
                        'ApiPageSet does not prefill the gender cache correctly' );
                $this->assertEquals( $userNames, array_keys( $genderCache->cache ),
                        'ApiPageSet does not prefill all users into the gender cache' );
index 2b08a81..26fedba 100644 (file)
@@ -1575,7 +1575,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
                $pages = array_values( $result[0]['query']['pages'] );
 
                $this->assertCount( 1, $pages );
-               $this->assertEquals( 0, $pages[0]['ns'] );
+               $this->assertSame( 0, $pages[0]['ns'] );
                $this->assertEquals( $this->getPrefixedText( $target ), $pages[0]['title'] );
                $this->assertArraySubsetsEqual(
                        $pages[0]['revisions'],
index c554fb3..b41c3e5 100644 (file)
@@ -535,7 +535,7 @@ class ApiQueryWatchlistRawIntegrationTest extends ApiTestCase {
                // $result[0]['query']['pages'] uses page ids as keys
                $item = array_values( $result[0]['query']['pages'] )[0];
 
-               $this->assertEquals( 0, $item['ns'] );
+               $this->assertSame( 0, $item['ns'] );
                $this->assertEquals( 'ApiQueryWatchlistRawIntegrationTestPage', $item['title'] );
        }
 
index 6d64a17..24d016e 100644 (file)
@@ -64,7 +64,7 @@ class ApiWatchTest extends ApiTestCase {
                                unset( $data[0]['query']['watchlist'][$index] );
                        }
                }
-               $this->assertEquals( 0, count( $data[0]['query']['watchlist'] ) );
+               $this->assertSame( 0, count( $data[0]['query']['watchlist'] ) );
 
                return $data;
        }
index f8be1d4..55d4e10 100644 (file)
@@ -2120,9 +2120,9 @@ class AuthManagerTest extends \MediaWikiTestCase {
                        }
 
                        if ( $created ) {
-                               $this->assertNotEquals( 0, \User::idFromName( $username ) );
+                               $this->assertNotNull( \User::idFromName( $username ) );
                        } else {
-                               $this->assertEquals( 0, \User::idFromName( $username ) );
+                               $this->assertNull( \User::idFromName( $username ) );
                        }
 
                        $first = false;
@@ -2474,7 +2474,7 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $this->assertEquals( $expect, $ret );
                $this->assertNotEquals( 0, $user->getId() );
                $this->assertSame( 'UTSysop', $user->getName() );
-               $this->assertEquals( 0, $session->getUser()->getId() );
+               $this->assertSame( 0, $session->getUser()->getId() );
                $this->assertSame( [
                        [ LogLevel::DEBUG, '{username} already exists locally' ],
                ], $logger->getBuffer() );
@@ -2489,9 +2489,9 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $ret = $this->manager->autoCreateUser( $user, AuthManager::AUTOCREATE_SOURCE_SESSION, true );
                $this->unhook( 'LocalUserCreated' );
                $this->assertEquals( \Status::newFatal( wfMessage( 'readonlytext', 'Because' ) ), $ret );
-               $this->assertEquals( 0, $user->getId() );
+               $this->assertSame( 0, $user->getId() );
                $this->assertNotEquals( $username, $user->getName() );
-               $this->assertEquals( 0, $session->getUser()->getId() );
+               $this->assertSame( 0, $session->getUser()->getId() );
                $this->assertSame( [
                        [ LogLevel::DEBUG, 'denied by wfReadOnly(): {reason}' ],
                ], $logger->getBuffer() );
@@ -2506,9 +2506,9 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $ret = $this->manager->autoCreateUser( $user, AuthManager::AUTOCREATE_SOURCE_SESSION, true );
                $this->unhook( 'LocalUserCreated' );
                $this->assertEquals( \Status::newFatal( 'test' ), $ret );
-               $this->assertEquals( 0, $user->getId() );
+               $this->assertSame( 0, $user->getId() );
                $this->assertNotEquals( $username, $user->getName() );
-               $this->assertEquals( 0, $session->getUser()->getId() );
+               $this->assertSame( 0, $session->getUser()->getId() );
                $this->assertSame( [
                        [ LogLevel::DEBUG, 'blacklisted in session {sessionid}' ],
                ], $logger->getBuffer() );
@@ -2521,9 +2521,9 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $ret = $this->manager->autoCreateUser( $user, AuthManager::AUTOCREATE_SOURCE_SESSION, true );
                $this->unhook( 'LocalUserCreated' );
                $this->assertEquals( \Status::newFatal( 'test2' ), $ret );
-               $this->assertEquals( 0, $user->getId() );
+               $this->assertSame( 0, $user->getId() );
                $this->assertNotEquals( $username, $user->getName() );
-               $this->assertEquals( 0, $session->getUser()->getId() );
+               $this->assertSame( 0, $session->getUser()->getId() );
                $this->assertSame( [
                        [ LogLevel::DEBUG, 'blacklisted in session {sessionid}' ],
                ], $logger->getBuffer() );
@@ -2536,9 +2536,9 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $ret = $this->manager->autoCreateUser( $user, AuthManager::AUTOCREATE_SOURCE_SESSION, true );
                $this->unhook( 'LocalUserCreated' );
                $this->assertEquals( \Status::newFatal( 'noname' ), $ret );
-               $this->assertEquals( 0, $user->getId() );
+               $this->assertSame( 0, $user->getId() );
                $this->assertNotEquals( $username . '@', $user->getId() );
-               $this->assertEquals( 0, $session->getUser()->getId() );
+               $this->assertSame( 0, $session->getUser()->getId() );
                $this->assertSame( [
                        [ LogLevel::DEBUG, 'name "{username}" is not creatable' ],
                ], $logger->getBuffer() );
@@ -2554,9 +2554,9 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $ret = $this->manager->autoCreateUser( $user, AuthManager::AUTOCREATE_SOURCE_SESSION, true );
                $this->unhook( 'LocalUserCreated' );
                $this->assertEquals( \Status::newFatal( 'authmanager-autocreate-noperm' ), $ret );
-               $this->assertEquals( 0, $user->getId() );
+               $this->assertSame( 0, $user->getId() );
                $this->assertNotEquals( $username, $user->getName() );
-               $this->assertEquals( 0, $session->getUser()->getId() );
+               $this->assertSame( 0, $session->getUser()->getId() );
                $this->assertSame( [
                        [ LogLevel::DEBUG, 'IP lacks the ability to create or autocreate accounts' ],
                ], $logger->getBuffer() );
@@ -2608,9 +2608,9 @@ class AuthManagerTest extends \MediaWikiTestCase {
                unset( $lock );
                $this->unhook( 'LocalUserCreated' );
                $this->assertEquals( \Status::newFatal( 'usernameinprogress' ), $ret );
-               $this->assertEquals( 0, $user->getId() );
+               $this->assertSame( 0, $user->getId() );
                $this->assertNotEquals( $username, $user->getName() );
-               $this->assertEquals( 0, $session->getUser()->getId() );
+               $this->assertSame( 0, $session->getUser()->getId() );
                $this->assertSame( [
                        [ LogLevel::DEBUG, 'Could not acquire account creation lock' ],
                ], $logger->getBuffer() );
@@ -2623,9 +2623,9 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $ret = $this->manager->autoCreateUser( $user, AuthManager::AUTOCREATE_SOURCE_SESSION, true );
                $this->unhook( 'LocalUserCreated' );
                $this->assertEquals( \Status::newFatal( 'fail-in-pre' ), $ret );
-               $this->assertEquals( 0, $user->getId() );
+               $this->assertSame( 0, $user->getId() );
                $this->assertNotEquals( $username, $user->getName() );
-               $this->assertEquals( 0, $session->getUser()->getId() );
+               $this->assertSame( 0, $session->getUser()->getId() );
                $this->assertSame( [
                        [ LogLevel::DEBUG, 'Provider denied creation of {username}: {reason}' ],
                ], $logger->getBuffer() );
@@ -2640,9 +2640,9 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $ret = $this->manager->autoCreateUser( $user, AuthManager::AUTOCREATE_SOURCE_SESSION, true );
                $this->unhook( 'LocalUserCreated' );
                $this->assertEquals( \Status::newFatal( 'fail-in-primary' ), $ret );
-               $this->assertEquals( 0, $user->getId() );
+               $this->assertSame( 0, $user->getId() );
                $this->assertNotEquals( $username, $user->getName() );
-               $this->assertEquals( 0, $session->getUser()->getId() );
+               $this->assertSame( 0, $session->getUser()->getId() );
                $this->assertSame( [
                        [ LogLevel::DEBUG, 'Provider denied creation of {username}: {reason}' ],
                ], $logger->getBuffer() );
@@ -2657,9 +2657,9 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $ret = $this->manager->autoCreateUser( $user, AuthManager::AUTOCREATE_SOURCE_SESSION, true );
                $this->unhook( 'LocalUserCreated' );
                $this->assertEquals( \Status::newFatal( 'fail-in-secondary' ), $ret );
-               $this->assertEquals( 0, $user->getId() );
+               $this->assertSame( 0, $user->getId() );
                $this->assertNotEquals( $username, $user->getName() );
-               $this->assertEquals( 0, $session->getUser()->getId() );
+               $this->assertSame( 0, $session->getUser()->getId() );
                $this->assertSame( [
                        [ LogLevel::DEBUG, 'Provider denied creation of {username}: {reason}' ],
                ], $logger->getBuffer() );
@@ -2678,9 +2678,9 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $ret = $this->manager->autoCreateUser( $user, AuthManager::AUTOCREATE_SOURCE_SESSION, true );
                $this->unhook( 'LocalUserCreated' );
                $this->assertEquals( \Status::newFatal( 'authmanager-autocreate-exception' ), $ret );
-               $this->assertEquals( 0, $user->getId() );
+               $this->assertSame( 0, $user->getId() );
                $this->assertNotEquals( $username, $user->getName() );
-               $this->assertEquals( 0, $session->getUser()->getId() );
+               $this->assertSame( 0, $session->getUser()->getId() );
                $this->assertSame( [
                        [ LogLevel::DEBUG, '{username} denied by prior creation attempt failures' ],
                ], $logger->getBuffer() );
@@ -2697,9 +2697,9 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $user->setName( $username );
                $ret = $this->manager->autoCreateUser( $user, AuthManager::AUTOCREATE_SOURCE_SESSION, true );
                $this->assertEquals( \Status::newFatal( 'because' ), $ret );
-               $this->assertEquals( 0, $user->getId() );
+               $this->assertSame( 0, $user->getId() );
                $this->assertNotEquals( $username, $user->getName() );
-               $this->assertEquals( 0, $session->getUser()->getId() );
+               $this->assertSame( 0, $session->getUser()->getId() );
                $this->assertSame( [
                        [ LogLevel::INFO, 'creating new user ({username}) - from: {from}' ],
                        [ LogLevel::ERROR, '{username} failed with message {msg}' ],
@@ -2723,8 +2723,8 @@ class AuthManagerTest extends \MediaWikiTestCase {
                } catch ( \Exception $ex ) {
                        $this->assertSame( 'Excepted', $ex->getMessage() );
                }
-               $this->assertEquals( 0, $user->getId() );
-               $this->assertEquals( 0, $session->getUser()->getId() );
+               $this->assertSame( 0, $user->getId() );
+               $this->assertSame( 0, $session->getUser()->getId() );
                $this->assertSame( [
                        [ LogLevel::INFO, 'creating new user ({username}) - from: {from}' ],
                        [ LogLevel::ERROR, '{username} failed with exception {exception}' ],
@@ -2790,7 +2790,7 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $this->assertEquals( \Status::newGood(), $ret );
                $this->assertNotEquals( 0, $user->getId() );
                $this->assertEquals( $username, $user->getName() );
-               $this->assertEquals( 0, $session->getUser()->getId() );
+               $this->assertSame( 0, $session->getUser()->getId() );
                $this->assertSame( [
                        [ LogLevel::INFO, 'creating new user ({username}) - from: {from}' ],
                ], $logger->getBuffer() );
index ebbfde2..b1e23ba 100644 (file)
@@ -282,7 +282,7 @@ class BlockRestrictionStoreTest extends \MediaWikiLangTestCase {
                        [ 'ir_ipb_id' => $block->getId() ]
                );
 
-               $this->assertEquals( 0, $result->numRows() );
+               $this->assertSame( 0, $result->numRows() );
        }
 
        /**
index 0ef571d..9182609 100644 (file)
@@ -314,7 +314,7 @@ class DatabaseBlockTest extends MediaWikiLangTestCase {
                $this->assertEquals( 'Meta>MetaWikiUser', $block->getBlocker()->getName(),
                        'Correct blocker name' );
                $this->assertEquals( 'Meta>MetaWikiUser', $block->getByName(), 'Correct blocker name' );
-               $this->assertEquals( 0, $block->getBy(), 'Correct blocker id' );
+               $this->assertSame( 0, $block->getBy(), 'Correct blocker id' );
        }
 
        protected function addXffBlocks() {
index 7abddd4..869236b 100644 (file)
@@ -124,7 +124,7 @@ class MessageCacheTest extends MediaWikiLangTestCase {
                $this->makePage( 'Go', 'de', 'Race!' );
                $dbw->endAtomic( __METHOD__ );
 
-               $this->assertEquals( 0,
+               $this->assertSame( 0,
                        DeferredUpdates::pendingUpdatesCount(),
                        'Post-commit deferred update triggers a run of all updates' );
 
@@ -155,7 +155,7 @@ class MessageCacheTest extends MediaWikiLangTestCase {
 
                // Populate one key
                $this->makePage( 'Key1', 'de', 'Value1' );
-               $this->assertEquals( 0,
+               $this->assertSame( 0,
                        DeferredUpdates::pendingUpdatesCount(),
                        'Post-commit deferred update triggers a run of all updates' );
                $this->assertEquals( 'Value1', $messageCache->get( 'Key1' ), 'Key1 was successfully edited' );
@@ -168,7 +168,7 @@ class MessageCacheTest extends MediaWikiLangTestCase {
 
                // Populate the second key
                $this->makePage( 'Key2', 'de', 'Value2' );
-               $this->assertEquals( 0,
+               $this->assertSame( 0,
                        DeferredUpdates::pendingUpdatesCount(),
                        'Post-commit deferred update triggers a run of all updates' );
                $this->assertEquals( 'Value2', $messageCache->get( 'Key2' ), 'Key2 was successfully edited' );
@@ -208,14 +208,14 @@ class MessageCacheTest extends MediaWikiLangTestCase {
 
                MessageCache::singleton()->getMsgFromNamespace( 'allpages', $wgContLanguageCode );
 
-               $this->assertEquals( 0, $dbr->trxLevel() );
+               $this->assertSame( 0, $dbr->trxLevel() );
                $dbr->setFlag( DBO_TRX, $dbr::REMEMBER_PRIOR ); // make queries trigger TRX
 
                MessageCache::singleton()->getMsgFromNamespace( 'go', $wgContLanguageCode );
 
                $dbr->restoreFlags();
 
-               $this->assertEquals( 0, $dbr->trxLevel(), "No DB read queries (content language)" );
+               $this->assertSame( 0, $dbr->trxLevel(), "No DB read queries (content language)" );
        }
 
        public function testNoDBAccessNonContentLanguage() {
@@ -223,14 +223,14 @@ class MessageCacheTest extends MediaWikiLangTestCase {
 
                MessageCache::singleton()->getMsgFromNamespace( 'allpages/nl', 'nl' );
 
-               $this->assertEquals( 0, $dbr->trxLevel() );
+               $this->assertSame( 0, $dbr->trxLevel() );
                $dbr->setFlag( DBO_TRX, $dbr::REMEMBER_PRIOR ); // make queries trigger TRX
 
                MessageCache::singleton()->getMsgFromNamespace( 'go/nl', 'nl' );
 
                $dbr->restoreFlags();
 
-               $this->assertEquals( 0, $dbr->trxLevel(), "No DB read queries (non-content language)" );
+               $this->assertSame( 0, $dbr->trxLevel(), "No DB read queries (non-content language)" );
        }
 
        /**
index 7ad6541..31929d3 100644 (file)
@@ -83,12 +83,12 @@ class CategoryMembershipChangeTest extends MediaWikiLangTestCase {
                $this->assertEquals( '(recentchanges-page-added-to-category: ' . self::$pageName . ')',
                        self::$lastNotifyArgs[3] );
                $this->assertEquals( self::$pageName, self::$lastNotifyArgs[4]->getPrefixedText() );
-               $this->assertEquals( 0, self::$lastNotifyArgs[5] );
-               $this->assertEquals( 0, self::$lastNotifyArgs[6] );
+               $this->assertSame( 0, self::$lastNotifyArgs[5] );
+               $this->assertSame( 0, self::$lastNotifyArgs[6] );
                $this->assertEquals( null, self::$lastNotifyArgs[7] );
                $this->assertEquals( 1, self::$lastNotifyArgs[8] );
                $this->assertEquals( null, self::$lastNotifyArgs[9] );
-               $this->assertEquals( 0, self::$lastNotifyArgs[10] );
+               $this->assertSame( 0, self::$lastNotifyArgs[10] );
        }
 
        public function testChangeRemovedNoRev() {
@@ -103,12 +103,12 @@ class CategoryMembershipChangeTest extends MediaWikiLangTestCase {
                $this->assertEquals( '(recentchanges-page-removed-from-category: ' . self::$pageName . ')',
                        self::$lastNotifyArgs[3] );
                $this->assertEquals( self::$pageName, self::$lastNotifyArgs[4]->getPrefixedText() );
-               $this->assertEquals( 0, self::$lastNotifyArgs[5] );
-               $this->assertEquals( 0, self::$lastNotifyArgs[6] );
+               $this->assertSame( 0, self::$lastNotifyArgs[5] );
+               $this->assertSame( 0, self::$lastNotifyArgs[6] );
                $this->assertEquals( null, self::$lastNotifyArgs[7] );
                $this->assertEquals( 1, self::$lastNotifyArgs[8] );
                $this->assertEquals( null, self::$lastNotifyArgs[9] );
-               $this->assertEquals( 0, self::$lastNotifyArgs[10] );
+               $this->assertSame( 0, self::$lastNotifyArgs[10] );
        }
 
        public function testChangeAddedWithRev() {
@@ -127,9 +127,9 @@ class CategoryMembershipChangeTest extends MediaWikiLangTestCase {
                $this->assertEquals( self::$pageRev->getParentId(), self::$lastNotifyArgs[5] );
                $this->assertEquals( $revision->getId(), self::$lastNotifyArgs[6] );
                $this->assertEquals( null, self::$lastNotifyArgs[7] );
-               $this->assertEquals( 0, self::$lastNotifyArgs[8] );
+               $this->assertSame( 0, self::$lastNotifyArgs[8] );
                $this->assertEquals( '127.0.0.1', self::$lastNotifyArgs[9] );
-               $this->assertEquals( 0, self::$lastNotifyArgs[10] );
+               $this->assertSame( 0, self::$lastNotifyArgs[10] );
        }
 
        public function testChangeRemovedWithRev() {
@@ -148,9 +148,9 @@ class CategoryMembershipChangeTest extends MediaWikiLangTestCase {
                $this->assertEquals( self::$pageRev->getParentId(), self::$lastNotifyArgs[5] );
                $this->assertEquals( $revision->getId(), self::$lastNotifyArgs[6] );
                $this->assertEquals( null, self::$lastNotifyArgs[7] );
-               $this->assertEquals( 0, self::$lastNotifyArgs[8] );
+               $this->assertSame( 0, self::$lastNotifyArgs[8] );
                $this->assertEquals( '127.0.0.1', self::$lastNotifyArgs[9] );
-               $this->assertEquals( 0, self::$lastNotifyArgs[10] );
+               $this->assertSame( 0, self::$lastNotifyArgs[10] );
        }
 
 }
index 1511d46..895a3cb 100644 (file)
@@ -76,7 +76,7 @@ class EnhancedChangesListTest extends MediaWikiLangTestCase {
                $recentChange2 = $this->getEditChange( '20131103092253' );
                $html = $enhancedChangesList->recentChangesLine( $recentChange2, false );
 
-               $this->assertEquals( '', $html );
+               $this->assertSame( '', $html );
        }
 
        public function testRecentChangesPrefix() {
index 8f914b7..a59ba7d 100644 (file)
@@ -61,7 +61,7 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
 
                $this->assertEquals( false, $cacheEntry->watched, 'watched' );
                $this->assertEquals( '21:21', $cacheEntry->timestamp, 'timestamp' );
-               $this->assertEquals( 0, $cacheEntry->numberofWatchingusers, 'watching users' );
+               $this->assertSame( 0, $cacheEntry->numberofWatchingusers, 'watching users' );
                $this->assertEquals( false, $cacheEntry->unpatrolled, 'unpatrolled' );
 
                $this->assertUserLinks( $user->getName(), $cacheEntry );
@@ -96,7 +96,7 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
 
                $this->assertEquals( false, $cacheEntry->watched, 'watched' );
                $this->assertEquals( '21:21', $cacheEntry->timestamp, 'timestamp' );
-               $this->assertEquals( 0, $cacheEntry->numberofWatchingusers, 'watching users' );
+               $this->assertSame( 0, $cacheEntry->numberofWatchingusers, 'watching users' );
                $this->assertEquals( false, $cacheEntry->unpatrolled, 'unpatrolled' );
 
                $this->assertDeleteLogLink( $cacheEntry );
@@ -130,7 +130,7 @@ class RCCacheEntryFactoryTest extends MediaWikiLangTestCase {
 
                $this->assertEquals( false, $cacheEntry->watched, 'watched' );
                $this->assertEquals( '21:21', $cacheEntry->timestamp, 'timestamp' );
-               $this->assertEquals( 0, $cacheEntry->numberofWatchingusers, 'watching users' );
+               $this->assertSame( 0, $cacheEntry->numberofWatchingusers, 'watching users' );
                $this->assertEquals( false, $cacheEntry->unpatrolled, 'unpatrolled' );
 
                $this->assertRevDel( $cacheEntry );
index e73b554..39b5380 100644 (file)
@@ -181,7 +181,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
                $content = null;
 
                $text = ContentHandler::getContentText( $content );
-               $this->assertEquals( '', $text );
+               $this->assertSame( '', $text );
        }
 
        public static function dataGetContentText_TextContent() {
index bc1d3c6..0572289 100644 (file)
@@ -49,7 +49,7 @@ class UnknownContentHandlerTest extends MediaWikiLangTestCase {
                $content = $handler->makeEmptyContent();
 
                $this->assertTrue( $content->isEmpty() );
-               $this->assertEquals( '', $content->getData() );
+               $this->assertSame( '', $content->getData() );
        }
 
        public static function dataIsSupportedFormat() {
index fd8e3ba..2b6f3f1 100644 (file)
@@ -139,7 +139,7 @@ class UnknownContentTest extends MediaWikiLangTestCase {
        public function testGetWikitextForTransclusion() {
                $content = $this->newContent( 'hello world.' );
 
-               $this->assertEquals( '', $content->getWikitextForTransclusion() );
+               $this->assertFalse( $content->getWikitextForTransclusion() );
        }
 
        /**
index b372e37..e18cecb 100644 (file)
@@ -64,7 +64,7 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
                $content = $this->handler->makeEmptyContent();
 
                $this->assertTrue( $content->isEmpty() );
-               $this->assertEquals( '', $content->getText() );
+               $this->assertSame( '', $content->getText() );
        }
 
        public static function dataIsSupportedFormat() {
index 32e71e0..3bb79e4 100644 (file)
@@ -49,7 +49,7 @@ class RequestContextTest extends MediaWikiTestCase {
 
                $oInfo = $context->exportSession();
                $this->assertEquals( '127.0.0.1', $oInfo['ip'], "Correct initial IP address." );
-               $this->assertEquals( 0, $oInfo['userId'], "Correct initial user ID." );
+               $this->assertSame( 0, $oInfo['userId'], "Correct initial user ID." );
                $this->assertFalse( MediaWiki\Session\SessionManager::getGlobalSession()->isPersistent(),
                        'Global session isn\'t persistent to start' );
 
index c789e83..f00499f 100644 (file)
@@ -187,7 +187,7 @@ class LBFactoryTest extends MediaWikiTestCase {
                };
 
                $factory = $this->newLBFactoryMultiLBs();
-               $this->assertEquals( 0, $countLBsFunc( $factory ) );
+               $this->assertSame( 0, $countLBsFunc( $factory ) );
                $dbw = $factory->getMainLB()->getConnection( DB_MASTER );
                $this->assertEquals( 1, $countLBsFunc( $factory ) );
                // Test that LoadBalancer instances made during pre-commit callbacks in do not
@@ -208,7 +208,7 @@ class LBFactoryTest extends MediaWikiTestCase {
 
                $called = 0;
                $factory = $this->newLBFactoryMultiLBs();
-               $this->assertEquals( 0, $countLBsFunc( $factory ) );
+               $this->assertSame( 0, $countLBsFunc( $factory ) );
                $dbw = $factory->getMainLB()->getConnection( DB_MASTER );
                $this->assertEquals( 1, $countLBsFunc( $factory ) );
                // Test that LoadBalancer instances made during pre-commit callbacks in do not
@@ -475,17 +475,16 @@ class LBFactoryTest extends MediaWikiTestCase {
                /** @var IMaintainableDatabase $db */
                $db = $lb->getConnection( DB_MASTER, [], '' );
 
-               $this->assertEquals(
+               $this->assertSame(
                        '',
                        $db->getDomainId(),
                        'Null domain ID handle used'
                );
-               $this->assertEquals(
-                       '',
+               $this->assertNull(
                        $db->getDBname(),
                        'Null domain ID handle used'
                );
-               $this->assertEquals(
+               $this->assertSame(
                        '',
                        $db->tablePrefix(),
                        'Main domain ID handle used; prefix is empty though'
@@ -555,7 +554,7 @@ class LBFactoryTest extends MediaWikiTestCase {
                /** @var IMaintainableDatabase $db */
                $db = $lb->getConnection( DB_MASTER, [], '' );
 
-               $this->assertEquals( '', $db->getDomainID(), "Null domain used" );
+               $this->assertSame( '', $db->getDomainID(), "Null domain used" );
 
                $this->assertEquals(
                        $this->quoteTable( $db, 'page' ),
@@ -717,7 +716,7 @@ class LBFactoryTest extends MediaWikiTestCase {
                $lb->forEachOpenConnection( function () use ( &$n ) {
                        ++$n;
                } );
-               $this->assertEquals( 0, $n, "Connections closed" );
+               $this->assertSame( 0, $n, "Connections closed" );
 
                $conn2 = $lb->getConnectionRef( DB_MASTER );
                $this->assertEquals(
index ccfcc18..f820f60 100644 (file)
@@ -20,8 +20,8 @@ class SiteStatsUpdateTest extends MediaWikiTestCase {
                $this->assertEquals( 1, $wrapped->pages );
                $this->assertEquals( 3, $wrapped->users );
                $this->assertEquals( 1, $wrapped->images );
-               $this->assertEquals( 0, $wrapped->edits );
-               $this->assertEquals( 0, $wrapped->articles );
+               $this->assertSame( 0, $wrapped->edits );
+               $this->assertSame( 0, $wrapped->articles );
        }
 
        /**
@@ -42,7 +42,7 @@ class SiteStatsUpdateTest extends MediaWikiTestCase {
                $fi = SiteStats::images();
                $ai = SiteStats::articles();
 
-               $this->assertEquals( 0, DeferredUpdates::pendingUpdatesCount() );
+               $this->assertSame( 0, DeferredUpdates::pendingUpdatesCount() );
 
                $dbw->begin( __METHOD__ ); // block opportunistic updates
 
@@ -64,7 +64,7 @@ class SiteStatsUpdateTest extends MediaWikiTestCase {
 
                $this->assertEquals( 1, DeferredUpdates::pendingUpdatesCount() );
                DeferredUpdates::doUpdates();
-               $this->assertEquals( 0, DeferredUpdates::pendingUpdatesCount() );
+               $this->assertSame( 0, DeferredUpdates::pendingUpdatesCount() );
 
                SiteStats::unload();
                $this->assertEquals( $pi + 2, SiteStats::pages(), 'page count' );
index e344d57..7bc7918 100644 (file)
@@ -2554,7 +2554,7 @@ class FileBackendTest extends MediaWikiTestCase {
                        $be->getReadIndexFromParams( [ 'latest' => 1 ] ),
                        'Reads with "latest" flag use backend 1'
                );
-               $this->assertEquals(
+               $this->assertSame(
                        0,
                        $be->getReadIndexFromParams( [ 'latest' => 0 ] ),
                        'Reads without "latest" flag use backend 0'
index 8f37805..fe5dba1 100644 (file)
@@ -52,7 +52,7 @@ class LocalFileTest extends MediaWikiTestCase {
         * @covers File::getHashPath
         */
        public function testGetHashPath() {
-               $this->assertEquals( '', $this->file_hl0->getHashPath() );
+               $this->assertSame( '', $this->file_hl0->getHashPath() );
                $this->assertEquals( 'a/a2/', $this->file_hl2->getHashPath() );
                $this->assertEquals( 'c/c4/', $this->file_lc->getHashPath() );
        }
index c9356b6..ff0a9eb 100644 (file)
@@ -109,7 +109,7 @@ class GuzzleHttpRequestTest extends MediaWikiTestCase {
                $s = $r->execute();
                $errorMsg = $s->getErrorsByType( 'error' )[0]['message'];
 
-               $this->assertEquals( 0, $r->getStatus() );
+               $this->assertSame( 0, $r->getStatus() );
                $this->assertEquals( 'http-invalid-url', $errorMsg );
        }
 
@@ -121,7 +121,7 @@ class GuzzleHttpRequestTest extends MediaWikiTestCase {
                $s = $r->execute();
                $errorMsg = $s->getErrorsByType( 'error' )[0]['message'];
 
-               $this->assertEquals( 0, $r->getStatus() );
+               $this->assertSame( 0, $r->getStatus() );
                $this->assertEquals( 'http-request-error', $errorMsg );
        }
 
@@ -133,7 +133,7 @@ class GuzzleHttpRequestTest extends MediaWikiTestCase {
                $s = $r->execute();
                $errorMsg = $s->getErrorsByType( 'error' )[0]['message'];
 
-               $this->assertEquals( 0, $r->getStatus() );
+               $this->assertSame( 0, $r->getStatus() );
                $this->assertEquals( 'http-timed-out', $errorMsg );
        }
 
index ef499a1..94b8c91 100644 (file)
@@ -14,7 +14,7 @@ class HttpTest extends MediaWikiTestCase {
                $this->hideDeprecated( 'Http::getProxy' );
 
                $this->setMwGlobals( 'wgHTTPProxy', false );
-               $this->assertEquals(
+               $this->assertSame(
                        '',
                        Http::getProxy(),
                        'default setting'
index 8f8dde5..1db7085 100644 (file)
@@ -108,8 +108,8 @@ class JobQueueTest extends MediaWikiTestCase {
                $this->assertTrue( $queue->isEmpty(), "Queue is empty ($desc)" );
 
                $queue->flushCaches();
-               $this->assertEquals( 0, $queue->getSize(), "Queue is empty ($desc)" );
-               $this->assertEquals( 0, $queue->getAcquiredCount(), "Queue is empty ($desc)" );
+               $this->assertSame( 0, $queue->getSize(), "Queue is empty ($desc)" );
+               $this->assertSame( 0, $queue->getAcquiredCount(), "Queue is empty ($desc)" );
 
                $this->assertNull( $queue->push( $this->newJob() ), "Push worked ($desc)" );
                $this->assertNull( $queue->batchPush( [ $this->newJob() ] ), "Push worked ($desc)" );
@@ -118,7 +118,7 @@ class JobQueueTest extends MediaWikiTestCase {
 
                $queue->flushCaches();
                $this->assertEquals( 2, $queue->getSize(), "Queue size is correct ($desc)" );
-               $this->assertEquals( 0, $queue->getAcquiredCount(), "No jobs active ($desc)" );
+               $this->assertSame( 0, $queue->getAcquiredCount(), "No jobs active ($desc)" );
                $jobs = iterator_to_array( $queue->getAllQueuedJobs() );
                $this->assertEquals( 2, count( $jobs ), "Queue iterator size is correct ($desc)" );
 
@@ -135,7 +135,7 @@ class JobQueueTest extends MediaWikiTestCase {
 
                $job2 = $queue->pop();
                $this->assertTrue( $queue->isEmpty(), "Queue is empty ($desc)" );
-               $this->assertEquals( 0, $queue->getSize(), "Queue is empty ($desc)" );
+               $this->assertSame( 0, $queue->getSize(), "Queue is empty ($desc)" );
 
                $queue->flushCaches();
                if ( $recycles ) {
@@ -152,7 +152,7 @@ class JobQueueTest extends MediaWikiTestCase {
                $queue->ack( $job2 );
 
                $queue->flushCaches();
-               $this->assertEquals( 0, $queue->getAcquiredCount(), "Active job count ($desc)" );
+               $this->assertSame( 0, $queue->getAcquiredCount(), "Active job count ($desc)" );
 
                $this->assertNull( $queue->batchPush( [ $this->newJob(), $this->newJob() ] ),
                        "Push worked ($desc)" );
@@ -161,7 +161,7 @@ class JobQueueTest extends MediaWikiTestCase {
                $queue->delete();
                $queue->flushCaches();
                $this->assertTrue( $queue->isEmpty(), "Queue is empty ($desc)" );
-               $this->assertEquals( 0, $queue->getSize(), "Queue is empty ($desc)" );
+               $this->assertSame( 0, $queue->getSize(), "Queue is empty ($desc)" );
        }
 
        /**
@@ -177,8 +177,8 @@ class JobQueueTest extends MediaWikiTestCase {
                $this->assertTrue( $queue->isEmpty(), "Queue is empty ($desc)" );
 
                $queue->flushCaches();
-               $this->assertEquals( 0, $queue->getSize(), "Queue is empty ($desc)" );
-               $this->assertEquals( 0, $queue->getAcquiredCount(), "Queue is empty ($desc)" );
+               $this->assertSame( 0, $queue->getSize(), "Queue is empty ($desc)" );
+               $this->assertSame( 0, $queue->getAcquiredCount(), "Queue is empty ($desc)" );
 
                $this->assertNull(
                        $queue->batchPush(
@@ -190,7 +190,7 @@ class JobQueueTest extends MediaWikiTestCase {
 
                $queue->flushCaches();
                $this->assertEquals( 1, $queue->getSize(), "Queue size is correct ($desc)" );
-               $this->assertEquals( 0, $queue->getAcquiredCount(), "No jobs active ($desc)" );
+               $this->assertSame( 0, $queue->getAcquiredCount(), "No jobs active ($desc)" );
 
                $this->assertNull(
                        $queue->batchPush(
@@ -203,13 +203,13 @@ class JobQueueTest extends MediaWikiTestCase {
 
                $queue->flushCaches();
                $this->assertEquals( 1, $queue->getSize(), "Queue size is correct ($desc)" );
-               $this->assertEquals( 0, $queue->getAcquiredCount(), "No jobs active ($desc)" );
+               $this->assertSame( 0, $queue->getAcquiredCount(), "No jobs active ($desc)" );
 
                $job1 = $queue->pop();
                $this->assertTrue( $queue->isEmpty(), "Queue is empty ($desc)" );
 
                $queue->flushCaches();
-               $this->assertEquals( 0, $queue->getSize(), "Queue is empty ($desc)" );
+               $this->assertSame( 0, $queue->getSize(), "Queue is empty ($desc)" );
                if ( $recycles ) {
                        $this->assertEquals( 1, $queue->getAcquiredCount(), "Active job count ($desc)" );
                }
@@ -217,7 +217,7 @@ class JobQueueTest extends MediaWikiTestCase {
                $queue->ack( $job1 );
 
                $queue->flushCaches();
-               $this->assertEquals( 0, $queue->getAcquiredCount(), "Active job count ($desc)" );
+               $this->assertSame( 0, $queue->getAcquiredCount(), "Active job count ($desc)" );
        }
 
        /**
@@ -256,8 +256,8 @@ class JobQueueTest extends MediaWikiTestCase {
                $this->assertTrue( $queue->isEmpty(), "Queue is empty ($desc)" );
 
                $queue->flushCaches();
-               $this->assertEquals( 0, $queue->getSize(), "Queue is empty ($desc)" );
-               $this->assertEquals( 0, $queue->getAcquiredCount(), "Queue is empty ($desc)" );
+               $this->assertSame( 0, $queue->getSize(), "Queue is empty ($desc)" );
+               $this->assertSame( 0, $queue->getAcquiredCount(), "Queue is empty ($desc)" );
 
                $root1 = Job::newRootJobParams( "nulljobspam:testId" ); // task ID/timestamp
                for ( $i = 0; $i < 5; ++$i ) {
@@ -282,7 +282,7 @@ class JobQueueTest extends MediaWikiTestCase {
 
                $queue->flushCaches();
                $this->assertEquals( 10, $queue->getSize(), "Queue size is correct ($desc)" );
-               $this->assertEquals( 0, $queue->getAcquiredCount(), "No jobs active ($desc)" );
+               $this->assertSame( 0, $queue->getAcquiredCount(), "No jobs active ($desc)" );
 
                $dupcount = 0;
                $jobs = [];
@@ -314,8 +314,8 @@ class JobQueueTest extends MediaWikiTestCase {
                $this->assertTrue( $queue->isEmpty(), "Queue is empty ($desc)" );
 
                $queue->flushCaches();
-               $this->assertEquals( 0, $queue->getSize(), "Queue is empty ($desc)" );
-               $this->assertEquals( 0, $queue->getAcquiredCount(), "Queue is empty ($desc)" );
+               $this->assertSame( 0, $queue->getSize(), "Queue is empty ($desc)" );
+               $this->assertSame( 0, $queue->getAcquiredCount(), "Queue is empty ($desc)" );
 
                for ( $i = 0; $i < 10; ++$i ) {
                        $this->assertNull( $queue->push( $this->newJob( $i ) ), "Push worked ($desc)" );
@@ -332,8 +332,8 @@ class JobQueueTest extends MediaWikiTestCase {
                $this->assertFalse( $queue->pop(), "Queue is not empty ($desc)" );
 
                $queue->flushCaches();
-               $this->assertEquals( 0, $queue->getSize(), "Queue is empty ($desc)" );
-               $this->assertEquals( 0, $queue->getAcquiredCount(), "No jobs active ($desc)" );
+               $this->assertSame( 0, $queue->getSize(), "Queue is empty ($desc)" );
+               $this->assertSame( 0, $queue->getAcquiredCount(), "No jobs active ($desc)" );
        }
 
        /**
index 90b57f2..c7596bf 100644 (file)
@@ -66,7 +66,7 @@ class ClearUserWatchlistJobTest extends MediaWikiTestCase {
                $this->assertEquals( 1, JobQueueGroup::singleton()->getQueueSizes()['clearUserWatchlist'] );
                $this->assertEquals( 2, $watchedItemStore->countWatchedItems( $user ) );
                $this->runJobs( 1 );
-               $this->assertEquals( 0, JobQueueGroup::singleton()->getQueueSizes()['clearUserWatchlist'] );
+               $this->assertSame( 0, JobQueueGroup::singleton()->getQueueSizes()['clearUserWatchlist'] );
                $this->assertEquals( 2, $watchedItemStore->countWatchedItems( $user ) );
 
                $this->assertTrue( $watchedItemStore->isWatched( $user, new TitleValue( 0, 'C' ) ) );
index 8e91e70..78af366 100644 (file)
@@ -16,7 +16,7 @@ class ProcessCacheLRUTest extends PHPUnit\Framework\TestCase {
         * Compare against an array so we get the cache content difference.
         */
        protected function assertCacheEmpty( $cache, $msg = 'Cache should be empty' ) {
-               $this->assertEquals( 0, $cache->getEntriesCount(), $msg );
+               $this->assertSame( 0, $cache->getEntriesCount(), $msg );
        }
 
        /**
index 581a518..90abd8c 100644 (file)
@@ -55,7 +55,7 @@ class TimingTest extends PHPUnit\Framework\TestCase {
                $this->assertEquals( 'a', $entry['name'] );
                $this->assertEquals( 'mark', $entry['entryType'] );
                $this->assertArrayHasKey( 'startTime', $entry );
-               $this->assertEquals( 0, $entry['duration'] );
+               $this->assertSame( 0, $entry['duration'] );
 
                usleep( 100 );
                $timing->mark( 'a' );
index 332e23b..3e08250 100644 (file)
@@ -82,7 +82,7 @@ class HashBagOStuffTest extends PHPUnit\Framework\TestCase {
                $cache->set( 'bar', 1, 10 );
                $cache->set( 'baz', 1, -10 );
 
-               $this->assertEquals( 0, $cacheInternal->bag['foo'][$cache::KEY_EXP], 'Indefinite' );
+               $this->assertSame( 0, $cacheInternal->bag['foo'][$cache::KEY_EXP], 'Indefinite' );
                // 2 seconds tolerance
                $this->assertEquals( time() + 10, $cacheInternal->bag['bar'][$cache::KEY_EXP], 'Future', 2 );
                $this->assertEquals( time() - 10, $cacheInternal->bag['baz'][$cache::KEY_EXP], 'Past', 2 );
index 076bf52..7c4c9bf 100644 (file)
@@ -318,7 +318,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $v = $cache->getWithSetCallback(
                        $key, 30, $func, [ 'lowTTL' => 0, 'lockTSE' => 5 ] + $extOpts );
                $this->assertEquals( $value, $v, "Value returned" );
-               $this->assertEquals( 0, $wasSet, "Value not regenerated" );
+               $this->assertSame( 0, $wasSet, "Value not regenerated" );
 
                $mockWallClock += 1;
 
@@ -584,7 +584,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $asycList[0](); // run the refresh callback
                $asycList = [];
                $this->assertEquals( 2, $wasSet, "Value calculated at later time" );
-               $this->assertEquals( 0, count( $asycList ), "No deferred refreshes added." );
+               $this->assertSame( 0, count( $asycList ), "No deferred refreshes added." );
                $v = $cache->getWithSetCallback( $key, 300, $func, $opts );
                $this->assertEquals( $value, $v, "New value stored" );
 
@@ -678,13 +678,13 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                        $keyedIds, 30, $genFunc, [ 'lowTTL' => 0, 'lockTSE' => 5 ] + $extOpts );
                $this->assertEquals( $value, $v[$keyB], "Value returned" );
                $this->assertEquals( 1, $wasSet, "Value regenerated" );
-               $this->assertEquals( 0, $cache->getWarmupKeyMisses(), "Keys warmed in warmup cache" );
+               $this->assertSame( 0, $cache->getWarmupKeyMisses(), "Keys warmed in warmup cache" );
 
                $v = $cache->getMultiWithSetCallback(
                        $keyedIds, 30, $genFunc, [ 'lowTTL' => 0, 'lockTSE' => 5 ] + $extOpts );
                $this->assertEquals( $value, $v[$keyB], "Value returned" );
                $this->assertEquals( 1, $wasSet, "Value not regenerated" );
-               $this->assertEquals( 0, $cache->getWarmupKeyMisses(), "Keys warmed in warmup cache" );
+               $this->assertSame( 0, $cache->getWarmupKeyMisses(), "Keys warmed in warmup cache" );
 
                $mockWallClock += 1;
 
@@ -846,13 +846,13 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                        $keyedIds, 30, $genFunc, [ 'lowTTL' => 0 ] + $extOpts );
                $this->assertEquals( $value, $v[$keyB], "Value returned" );
                $this->assertEquals( 1, $wasSet, "Value regenerated" );
-               $this->assertEquals( 0, $cache->getWarmupKeyMisses(), "Keys warmed in warmup cache" );
+               $this->assertSame( 0, $cache->getWarmupKeyMisses(), "Keys warmed in warmup cache" );
 
                $v = $cache->getMultiWithUnionSetCallback(
                        $keyedIds, 30, $genFunc, [ 'lowTTL' => 0 ] + $extOpts );
                $this->assertEquals( $value, $v[$keyB], "Value returned" );
                $this->assertEquals( 1, $wasSet, "Value not regenerated" );
-               $this->assertEquals( 0, $cache->getWarmupKeyMisses(), "Keys warmed in warmup cache" );
+               $this->assertSame( 0, $cache->getWarmupKeyMisses(), "Keys warmed in warmup cache" );
 
                $mockWallClock += 1;
 
@@ -1478,7 +1478,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $wasSet = 0;
                $v = $cache->getWithSetCallback( $key, 30, $funcV2, $verOpts + $extOpts );
                $this->assertEquals( $valueV2, $v, "Value not regenerated (secondary key)" );
-               $this->assertEquals( 0, $wasSet, "Value not regenerated (secondary key)" );
+               $this->assertSame( 0, $wasSet, "Value not regenerated (secondary key)" );
 
                // Clear out the older or unversioned key
                $cache->delete( $key, 0 );
index 4419533..16f6a6c 100644 (file)
@@ -2014,7 +2014,7 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
                $this->database->startAtomic( __METHOD__ );
                $wrapper->trxStatus = Database::STATUS_TRX_ERROR;
                $this->database->rollback( __METHOD__ );
-               $this->assertEquals( 0, $this->database->trxLevel() );
+               $this->assertSame( 0, $this->database->trxLevel() );
                $this->assertEquals( Database::STATUS_TRX_NONE, $wrapper->trxStatus() );
                $this->assertLastSql( 'BEGIN; ROLLBACK' );
 
@@ -2024,7 +2024,7 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
                $this->database->endAtomic( __METHOD__ );
                $this->assertEquals( Database::STATUS_TRX_NONE, $wrapper->trxStatus() );
                $this->assertLastSql( 'BEGIN; DELETE FROM x WHERE field = \'1\'; COMMIT' );
-               $this->assertEquals( 0, $this->database->trxLevel(), 'Use after rollback()' );
+               $this->assertSame( 0, $this->database->trxLevel(), 'Use after rollback()' );
 
                $this->database->begin( __METHOD__ );
                $this->database->startAtomic( __METHOD__, Database::ATOMIC_CANCELABLE );
@@ -2038,7 +2038,7 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
                $this->database->commit( __METHOD__ );
                // phpcs:ignore Generic.Files.LineLength
                $this->assertLastSql( 'BEGIN; SAVEPOINT wikimedia_rdbms_atomic1; UPDATE y SET a = \'1\' WHERE field = \'1\'; ROLLBACK TO SAVEPOINT wikimedia_rdbms_atomic1; DELETE FROM y WHERE field = \'1\'; COMMIT' );
-               $this->assertEquals( 0, $this->database->trxLevel(), 'Use after rollback()' );
+               $this->assertSame( 0, $this->database->trxLevel(), 'Use after rollback()' );
 
                // Next transaction
                $this->database->startAtomic( __METHOD__ );
@@ -2047,7 +2047,7 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
                $this->database->endAtomic( __METHOD__ );
                $this->assertEquals( Database::STATUS_TRX_NONE, $wrapper->trxStatus() );
                $this->assertLastSql( 'BEGIN; DELETE FROM x WHERE field = \'3\'; COMMIT' );
-               $this->assertEquals( 0, $this->database->trxLevel() );
+               $this->assertSame( 0, $this->database->trxLevel() );
        }
 
        /**
@@ -2194,7 +2194,7 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
 
                $this->assertFalse( $this->database->isOpen() );
                $this->assertLastSql( 'BEGIN; DELETE FROM x WHERE field = \'3\'; ROLLBACK; SELECT 2' );
-               $this->assertEquals( 0, $this->database->trxLevel() );
+               $this->assertSame( 0, $this->database->trxLevel() );
        }
 
        /**
@@ -2223,7 +2223,7 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
 
                $this->assertFalse( $this->database->isOpen() );
                $this->assertLastSql( 'BEGIN; DELETE FROM x WHERE field = \'3\'; ROLLBACK; SELECT 2' );
-               $this->assertEquals( 0, $this->database->trxLevel() );
+               $this->assertSame( 0, $this->database->trxLevel() );
        }
 
        /**
@@ -2246,7 +2246,7 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
 
                $this->assertFalse( $this->database->isOpen() );
                $this->assertLastSql( 'BEGIN; DELETE FROM x WHERE field = \'3\'; ROLLBACK' );
-               $this->assertEquals( 0, $this->database->trxLevel() );
+               $this->assertSame( 0, $this->database->trxLevel() );
        }
 
        /**
@@ -2261,7 +2261,7 @@ class DatabaseSQLTest extends PHPUnit\Framework\TestCase {
 
                $this->assertFalse( $this->database->isOpen() );
                $this->assertLastSql( 'BEGIN; SELECT 1; ROLLBACK' );
-               $this->assertEquals( 0, $this->database->trxLevel() );
+               $this->assertSame( 0, $this->database->trxLevel() );
        }
 
        /**
index 93b1bf8..fddbab2 100644 (file)
@@ -490,13 +490,13 @@ class DatabaseTest extends PHPUnit\Framework\TestCase {
                $db->method( 'isOpen' )->willReturn( true );
                $db->method( 'getDBname' )->willReturn( 'unittest' );
 
-               $this->assertEquals( 0, $db->trxLevel() );
+               $this->assertSame( 0, $db->trxLevel() );
                $this->assertEquals( true, $db->lockIsFree( 'x', __METHOD__ ) );
                $this->assertEquals( true, $db->lock( 'x', __METHOD__ ) );
                $this->assertEquals( false, $db->lockIsFree( 'x', __METHOD__ ) );
                $this->assertEquals( true, $db->unlock( 'x', __METHOD__ ) );
                $this->assertEquals( true, $db->lockIsFree( 'x', __METHOD__ ) );
-               $this->assertEquals( 0, $db->trxLevel() );
+               $this->assertSame( 0, $db->trxLevel() );
 
                $db->setFlag( DBO_TRX );
                $this->assertEquals( true, $db->lockIsFree( 'x', __METHOD__ ) );
@@ -507,7 +507,7 @@ class DatabaseTest extends PHPUnit\Framework\TestCase {
                $db->clearFlag( DBO_TRX );
 
                // Pending writes with DBO_TRX
-               $this->assertEquals( 0, $db->trxLevel() );
+               $this->assertSame( 0, $db->trxLevel() );
                $this->assertTrue( $db->lockIsFree( 'meow', __METHOD__ ) );
                $db->setFlag( DBO_TRX );
                $db->query( "DELETE FROM test WHERE t = 1" ); // trigger DBO_TRX transaction before lock
@@ -521,7 +521,7 @@ class DatabaseTest extends PHPUnit\Framework\TestCase {
                $db->rollback( __METHOD__, IDatabase::FLUSHING_ALL_PEERS );
                // Pending writes without DBO_TRX
                $db->clearFlag( DBO_TRX );
-               $this->assertEquals( 0, $db->trxLevel() );
+               $this->assertSame( 0, $db->trxLevel() );
                $this->assertTrue( $db->lockIsFree( 'meow2', __METHOD__ ) );
                $db->begin( __METHOD__ );
                $db->query( "DELETE FROM test WHERE t = 1" ); // trigger DBO_TRX transaction before lock
@@ -535,17 +535,17 @@ class DatabaseTest extends PHPUnit\Framework\TestCase {
                $db->rollback( __METHOD__ );
                // No pending writes, with DBO_TRX
                $db->setFlag( DBO_TRX );
-               $this->assertEquals( 0, $db->trxLevel() );
+               $this->assertSame( 0, $db->trxLevel() );
                $this->assertTrue( $db->lockIsFree( 'wuff', __METHOD__ ) );
                $db->query( "SELECT 1", __METHOD__ );
                $this->assertEquals( 1, $db->trxLevel() );
                $lock = $db->getScopedLockAndFlush( 'wuff', __METHOD__, 1 );
-               $this->assertEquals( 0, $db->trxLevel() );
+               $this->assertSame( 0, $db->trxLevel() );
                $this->assertFalse( $db->lockIsFree( 'wuff', __METHOD__ ), 'Lock already acquired' );
                $db->rollback( __METHOD__, IDatabase::FLUSHING_ALL_PEERS );
                // No pending writes, without DBO_TRX
                $db->clearFlag( DBO_TRX );
-               $this->assertEquals( 0, $db->trxLevel() );
+               $this->assertSame( 0, $db->trxLevel() );
                $this->assertTrue( $db->lockIsFree( 'wuff2', __METHOD__ ) );
                $db->begin( __METHOD__ );
                try {
index b26a247..d176e39 100644 (file)
@@ -168,7 +168,7 @@ class LinkRendererTest extends MediaWikiLangTestCase {
 
                $linkRenderer = new LinkRenderer( $titleFormatter, $linkCache, $nsInfo );
                $linkRenderer->setStubThreshold( 0 );
-               $this->assertEquals(
+               $this->assertSame(
                        '',
                        $linkRenderer->getLinkClasses( $foobarTitle )
                );
@@ -186,7 +186,7 @@ class LinkRendererTest extends MediaWikiLangTestCase {
                );
 
                $linkRenderer->setStubThreshold( 20 );
-               $this->assertEquals(
+               $this->assertSame(
                        '',
                        $linkRenderer->getLinkClasses( $userTitle )
                );
index 630df54..8d0ddf8 100644 (file)
@@ -54,7 +54,7 @@ class JpegPixelFormatTest extends MediaWikiMediaTestCase {
                        '%[jpeg:sampling-factor]',
                        $path
                )->execute();
-               $this->assertEquals( 0,
+               $this->assertSame( 0,
                        $result->getExitCode(),
                        "ImageMagick's identify command should return success"
                );
index 22de935..4d7ff48 100644 (file)
@@ -72,9 +72,9 @@ class PNGMetadataExtractorTest extends MediaWikiTestCase {
                $meta = PNGMetadataExtractor::getMetadata( $this->filePath .
                        'Png-native-test.png' );
 
-               $this->assertEquals( 0, $meta['frameCount'] );
+               $this->assertSame( 0, $meta['frameCount'] );
                $this->assertEquals( 1, $meta['loopCount'] );
-               $this->assertEquals( 0, $meta['duration'] );
+               $this->assertSame( 0.0, $meta['duration'] );
        }
 
        /**
@@ -87,7 +87,7 @@ class PNGMetadataExtractorTest extends MediaWikiTestCase {
 
                $this->assertEquals( 20, $meta['frameCount'] );
                // Note loop count of 0 = infinity
-               $this->assertEquals( 0, $meta['loopCount'] );
+               $this->assertSame( 0, $meta['loopCount'] );
                $this->assertEquals( 1.5, $meta['duration'], '', 0.00001 );
        }
 
index f071e4b..f0d895e 100644 (file)
@@ -439,7 +439,7 @@ abstract class WikiPageDbTestBase extends MediaWikiLangTestCase {
                $n = $res->numRows();
                $res->free();
 
-               $this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' );
+               $this->assertSame( 0, $n, 'pagelinks should contain no more links from the page' );
        }
 
        /**
@@ -637,7 +637,7 @@ abstract class WikiPageDbTestBase extends MediaWikiLangTestCase {
                $n = $res->numRows();
                $res->free();
 
-               $this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' );
+               $this->assertSame( 0, $n, 'pagelinks should contain no more links from the page' );
        }
 
        /**
@@ -1577,20 +1577,20 @@ more stuff
                $page->updateCategoryCounts( [ 'A' ], [], 0 );
 
                $this->assertEquals( 1, Category::newFromName( 'A' )->getPageCount() );
-               $this->assertEquals( 0, Category::newFromName( 'B' )->getPageCount() );
-               $this->assertEquals( 0, Category::newFromName( 'C' )->getPageCount() );
+               $this->assertSame( 0, Category::newFromName( 'B' )->getPageCount() );
+               $this->assertSame( 0, Category::newFromName( 'C' )->getPageCount() );
 
                // Add a new category
                $page->updateCategoryCounts( [ 'B' ], [], 0 );
 
                $this->assertEquals( 1, Category::newFromName( 'A' )->getPageCount() );
                $this->assertEquals( 1, Category::newFromName( 'B' )->getPageCount() );
-               $this->assertEquals( 0, Category::newFromName( 'C' )->getPageCount() );
+               $this->assertSame( 0, Category::newFromName( 'C' )->getPageCount() );
 
                // Add and remove a category
                $page->updateCategoryCounts( [ 'C' ], [ 'A' ], 0 );
 
-               $this->assertEquals( 0, Category::newFromName( 'A' )->getPageCount() );
+               $this->assertSame( 0, Category::newFromName( 'A' )->getPageCount() );
                $this->assertEquals( 1, Category::newFromName( 'B' )->getPageCount() );
                $this->assertEquals( 1, Category::newFromName( 'C' )->getPageCount() );
        }
index 94e3461..be11d53 100644 (file)
@@ -718,7 +718,7 @@ END
                ] );
                $context = $this->getResourceLoaderContext( [], $rl );
 
-               $this->assertEquals(
+               $this->assertSame(
                        '',
                        $rl->getCombinedVersion( $context, [] ),
                        'empty list'
index 67493c4..8135d57 100644 (file)
@@ -7,7 +7,7 @@ class SearchNearMatchResultSetTest extends PHPUnit\Framework\TestCase {
         */
        public function testNumRows() {
                $resultSet = new SearchNearMatchResultSet( null );
-               $this->assertEquals( 0, $resultSet->numRows() );
+               $this->assertSame( 0, $resultSet->numRows() );
 
                $resultSet = new SearchNearMatchResultSet( Title::newMainPage() );
                $this->assertEquals( 1, $resultSet->numRows() );
index 5fb3ac0..0dd88bb 100644 (file)
@@ -65,7 +65,7 @@ class ShellTest extends MediaWikiTestCase {
 
                $wrapper = TestingAccessWrapper::newFromObject( $command );
                $this->assertEquals( $expected, $wrapper->command );
-               $this->assertEquals( 0, $wrapper->restrictions & Shell::NO_LOCALSETTINGS );
+               $this->assertSame( 0, $wrapper->restrictions & Shell::NO_LOCALSETTINGS );
        }
 
        public function provideMakeScriptCommand() {
index df12eba..fc04fb7 100644 (file)
@@ -149,7 +149,7 @@ class CachingSiteStoreTest extends \MediaWikiIntegrationTestCase {
                $this->assertNull( $site );
 
                $sites = $store->getSites();
-               $this->assertEquals( 0, $sites->count() );
+               $this->assertSame( 0, $sites->count() );
        }
 
        /**
index 14ee15b..e125d71 100644 (file)
@@ -138,7 +138,7 @@ class DBSiteStoreTest extends MediaWikiTestCase {
                $this->assertNull( $site );
 
                $sites = $store->getSites();
-               $this->assertEquals( 0, $sites->count() );
+               $this->assertSame( 0, $sites->count() );
        }
 
        /**
index 9ad61b2..2119d31 100644 (file)
@@ -222,7 +222,7 @@ class SiteTest extends MediaWikiTestCase {
                $path = '//acme.com/'; // protocol-relative URL
                $site->setPath( $type, $path );
 
-               $this->assertEquals( '', $site->getProtocol() );
+               $this->assertSame( '', $site->getProtocol() );
        }
 
        public static function provideGetPageUrl() {
index 2a4ba4b..f24255b 100644 (file)
@@ -559,10 +559,10 @@ class UserTest extends MediaWikiTestCase {
                $this->markTestSkippedIfDbType( 'postgres' );
 
                $users = User::findUsersByGroup( [] );
-               $this->assertEquals( 0, iterator_count( $users ) );
+               $this->assertSame( 0, iterator_count( $users ) );
 
                $users = User::findUsersByGroup( 'foo' );
-               $this->assertEquals( 0, iterator_count( $users ) );
+               $this->assertSame( 0, iterator_count( $users ) );
 
                $user = $this->getMutableTestUser( [ 'foo' ] )->getUser();
                $users = User::findUsersByGroup( 'foo' );
index fbb893e..e40417c 100644 (file)
@@ -1180,7 +1180,7 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
                $this->assertInstanceOf( WatchedItem::class, $watchedItem );
                $this->assertEquals( 1, $watchedItem->getUser()->getId() );
                $this->assertEquals( 'SomeDbKey', $watchedItem->getLinkTarget()->getDBkey() );
-               $this->assertEquals( 0, $watchedItem->getLinkTarget()->getNamespace() );
+               $this->assertSame( 0, $watchedItem->getLinkTarget()->getNamespace() );
        }
 
        public function testLoadWatchedItem_noItem() {
@@ -1382,7 +1382,7 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
                $this->assertInstanceOf( WatchedItem::class, $watchedItem );
                $this->assertEquals( 1, $watchedItem->getUser()->getId() );
                $this->assertEquals( 'SomeDbKey', $watchedItem->getLinkTarget()->getDBkey() );
-               $this->assertEquals( 0, $watchedItem->getLinkTarget()->getNamespace() );
+               $this->assertSame( 0, $watchedItem->getLinkTarget()->getNamespace() );
        }
 
        public function testGetWatchedItem_cachedItem() {
index 53edbf2..77fcff2 100644 (file)
@@ -233,7 +233,7 @@ class DatabaseSqliteTest extends \MediaWikiIntegrationTestCase {
                $index = $indexList->next();
                $this->assertEquals( 'baz_index2', $index->name );
                $this->assertEquals( '1', $index->unique );
-               $this->assertEquals( 0,
+               $this->assertSame( 0,
                        $db->selectField( 'sqlite_master', 'COUNT(*)', [ 'name' => 'baz' ] ),
                        'Create a temporary duplicate only'
                );
@@ -524,7 +524,7 @@ class DatabaseSqliteTest extends \MediaWikiIntegrationTestCase {
                $databaseCreation = $db->query( 'CREATE TABLE a ( a_1 )', __METHOD__ );
                $this->assertInstanceOf( ResultWrapper::class, $databaseCreation, "Failed to create table a" );
                $res = $db->select( 'a', '*' );
-               $this->assertEquals( 0, $db->numFields( $res ), "expects to get 0 fields for an empty table" );
+               $this->assertSame( 0, $db->numFields( $res ), "expects to get 0 fields for an empty table" );
                $insertion = $db->insert( 'a', [ 'a_1' => 10 ], __METHOD__ );
                $this->assertTrue( $insertion, "Insertion failed" );
                $res = $db->select( 'a', '*' );
index 2f6fa39..628d248 100644 (file)
@@ -1799,7 +1799,7 @@ class LanguageTest extends LanguageClassesTestCase {
                $s = $lang->getMessageFromDB( 'word-separator' );
                $c = $lang->getMessageFromDB( 'comma-separator' );
 
-               $this->assertEquals( '', $lang->listToText( [] ) );
+               $this->assertSame( '', $lang->listToText( [] ) );
                $this->assertEquals( 'a', $lang->listToText( [ 'a' ] ) );
                $this->assertEquals( "a{$and}{$s}b", $lang->listToText( [ 'a', 'b' ] ) );
                $this->assertEquals( "a{$c}b{$and}{$s}c", $lang->listToText( [ 'a', 'b', 'c' ] ) );
index 7647915..0387535 100644 (file)
@@ -185,7 +185,7 @@ abstract class DumpTestCase extends MediaWikiLangTestCase {
                // 2. Do the real output checking on our own.
                $lines = explode( "\n", $this->getActualOutput() );
                $this->assertGreaterThan( 1, count( $lines ), "Minimal lines of produced output" );
-               $this->assertEquals( '', array_pop( $lines ), "Output ends in LF" );
+               $this->assertSame( '', array_pop( $lines ), "Output ends in LF" );
                $timestamp_re = "[0-9]{4}-[01][0-9]-[0-3][0-9] [0-2][0-9]:[0-5][0-9]:[0-6][0-9]";
                foreach ( $lines as $line ) {
                        $this->assertRegExp(
index 4e1aced..17487ac 100644 (file)
@@ -50,7 +50,7 @@ class DiffOpTest extends \MediaWikiUnitTestCase {
         */
        public function testNorig() {
                $obj = new FakeDiffOp();
-               $this->assertEquals( 0, $obj->norig() );
+               $this->assertSame( 0, $obj->norig() );
                $obj->orig = [ 'foo' ];
                $this->assertEquals( 1, $obj->norig() );
        }
@@ -60,7 +60,7 @@ class DiffOpTest extends \MediaWikiUnitTestCase {
         */
        public function testNclosing() {
                $obj = new FakeDiffOp();
-               $this->assertEquals( 0, $obj->nclosing() );
+               $this->assertSame( 0, $obj->nclosing() );
                $obj->closing = [ 'foo' ];
                $this->assertEquals( 1, $obj->nclosing() );
        }
index cbfddd4..2c852e0 100644 (file)
@@ -7,7 +7,7 @@ class PasswordFactoryTest extends MediaWikiUnitTestCase {
        public function testConstruct() {
                $pf = new PasswordFactory();
                $this->assertEquals( [ '' ], array_keys( $pf->getTypes() ) );
-               $this->assertEquals( '', $pf->getDefaultType() );
+               $this->assertSame( '', $pf->getDefaultType() );
 
                $pf = new PasswordFactory( [
                        'foo' => [ 'class' => 'FooPassword' ],
index fb0309d..fce21f7 100644 (file)
@@ -27,7 +27,7 @@ class SearchSuggestionSetTest extends \MediaWikiUnitTestCase {
         */
        public function testAppend() {
                $set = SearchSuggestionSet::emptySuggestionSet();
-               $this->assertEquals( 0, $set->getSize() );
+               $this->assertSame( 0, $set->getSize() );
                $set->append( new SearchSuggestion( 3 ) );
                $this->assertEquals( 3, $set->getWorstScore() );
                $this->assertEquals( 3, $set->getBestScore() );
@@ -61,7 +61,7 @@ class SearchSuggestionSetTest extends \MediaWikiUnitTestCase {
         */
        public function testInsertBest() {
                $set = SearchSuggestionSet::emptySuggestionSet();
-               $this->assertEquals( 0, $set->getSize() );
+               $this->assertSame( 0, $set->getSize() );
                $set->prepend( new SearchSuggestion( 3 ) );
                $this->assertEquals( 3, $set->getWorstScore() );
                $this->assertEquals( 3, $set->getBestScore() );
@@ -104,7 +104,7 @@ class SearchSuggestionSetTest extends \MediaWikiUnitTestCase {
                $this->assertEquals( 10, $set->getSize() );
 
                $set->shrink( 0 );
-               $this->assertEquals( 0, $set->getSize() );
+               $this->assertSame( 0, $set->getSize() );
        }
 
        // TODO: test for fromTitles
index 6512e7d..72a89dd 100644 (file)
@@ -39,16 +39,8 @@ exports.config = {
        // Sauce Labs
        // ======
        // See http://webdriver.io/guide/services/sauce.html
-       // and https://docs.saucelabs.com/reference/platforms-configurator
-       services: [ 'sauce' ],
-       user: process.env.SAUCE_USERNAME,
-       key: process.env.SAUCE_ACCESS_KEY,
-
-       // Default timeout in milliseconds for Selenium Grid requests
-       connectionRetryTimeout: 90 * 1000,
-
-       // Default request retries count
-       connectionRetryCount: 3,
+       // and https://github.com/bermi/sauce-connect-launcher#advanced-usage
+       services: process.env.SAUCE_ACCESS_KEY ? [ 'sauce' ] : [],
 
        // ==================
        // Test Files