Merge "ApiLogin: Remove the first example of outdated flow"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 15 May 2019 21:09:28 +0000 (21:09 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 15 May 2019 21:09:28 +0000 (21:09 +0000)
135 files changed:
.phan/config.php
.phpcs.xml
RELEASE-NOTES-1.34
autoload.php
composer.json
includes/DefaultSettings.php
includes/FormOptions.php
includes/MediaWikiServices.php
includes/WebRequest.php
includes/WebStart.php
includes/actions/HistoryAction.php
includes/api/ApiBase.php
includes/api/ApiBlock.php
includes/api/ApiBlockInfoTrait.php
includes/api/ApiQueryBase.php
includes/api/ApiQueryUserInfo.php
includes/api/ApiUnblock.php
includes/api/i18n/fr.json
includes/api/i18n/he.json
includes/api/i18n/qqq.json
includes/api/i18n/zh-hans.json
includes/block/BlockManager.php
includes/cache/localisation/LCStoreCDB.php
includes/cache/localisation/LCStoreStaticArray.php
includes/cache/localisation/LocalisationCache.php
includes/changes/EnhancedChangesList.php
includes/changes/RCCacheEntry.php
includes/changetags/ChangeTags.php
includes/exception/MWException.php
includes/export/WikiExporter.php
includes/filerepo/FileRepoStatus.php [deleted file]
includes/http/HttpRequestFactory.php
includes/installer/i18n/ast.json
includes/installer/i18n/diq.json
includes/installer/i18n/ro.json
includes/installer/i18n/te.json
includes/jobqueue/JobQueueGroup.php
includes/libs/objectcache/MultiWriteBagOStuff.php
includes/media/Exif.php
includes/pager/Pager.php
includes/parser/CoreParserFunctions.php
includes/parser/ParserCache.php
includes/parser/ParserOutput.php
includes/parser/RemexStripTagHandler.php
includes/search/SearchEngine.php
includes/search/SearchResult.php
includes/specialpage/ChangesListSpecialPage.php
includes/specialpage/SpecialPage.php
includes/specials/SpecialWatchlist.php
includes/title/MediaWikiTitleCodec.php
includes/upload/exception/UploadChunkVerificationException.php
includes/watcheditem/WatchedItemStore.php
includes/watcheditem/WatchedItemStoreInterface.php
languages/i18n/aeb-arab.json
languages/i18n/ang.json
languages/i18n/ar.json
languages/i18n/ary.json
languages/i18n/ast.json
languages/i18n/az.json
languages/i18n/be-tarask.json
languages/i18n/bg.json
languages/i18n/bjn.json
languages/i18n/cs.json
languages/i18n/da.json
languages/i18n/diq.json
languages/i18n/ee.json
languages/i18n/el.json
languages/i18n/eo.json
languages/i18n/exif/ast.json
languages/i18n/exif/bjn.json
languages/i18n/exif/eo.json
languages/i18n/exif/te.json
languages/i18n/fa.json
languages/i18n/fr.json
languages/i18n/fy.json
languages/i18n/gl.json
languages/i18n/he.json
languages/i18n/hu.json
languages/i18n/hyw.json
languages/i18n/ia.json
languages/i18n/inh.json
languages/i18n/io.json
languages/i18n/lb.json
languages/i18n/lrc.json
languages/i18n/lt.json
languages/i18n/lv.json
languages/i18n/ml.json
languages/i18n/nqo.json
languages/i18n/pl.json
languages/i18n/qqq.json
languages/i18n/ro.json
languages/i18n/sv.json
languages/i18n/te.json
languages/i18n/th.json
languages/i18n/tly.json
languages/i18n/uk.json
languages/i18n/yue.json
languages/messages/MessagesSk.php
maintenance/7zip.inc [deleted file]
maintenance/doMaintenance.php
maintenance/dumpBackup.php
maintenance/dumpTextPass.php
maintenance/includes/BackupDumper.php
maintenance/includes/SevenZipStream.php [new file with mode: 0644]
maintenance/includes/TextPassDumper.php [new file with mode: 0644]
maintenance/removeInvalidEmails.php
maintenance/validateRegistrationFile.php
resources/Resources.php
resources/lib/foreign-resources.yaml
resources/lib/jquery.async.js [deleted file]
resources/src/mediawiki.api/upload.js
resources/src/mediawiki.feedback/feedback.js
tests/integration/includes/http/CurlHttpRequestTest.php
tests/integration/includes/http/MWHttpRequestTest.php [new file with mode: 0644]
tests/integration/includes/http/MWHttpRequestTestCase.php
tests/phan/bin/postprocess-phan.php
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/ResourceLoaderTestCase.php
tests/phpunit/includes/FormOptionsTest.php
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/api/ApiBaseTest.php
tests/phpunit/includes/api/ApiBlockInfoTraitTest.php
tests/phpunit/includes/api/ApiQueryUserInfoTest.php [new file with mode: 0644]
tests/phpunit/includes/content/JsonContentTest.php
tests/phpunit/includes/http/HttpRequestFactoryTest.php [new file with mode: 0644]
tests/phpunit/includes/http/HttpTest.php
tests/phpunit/includes/libs/CookieTest.php [new file with mode: 0644]
tests/phpunit/includes/resourceloader/ResourceLoaderImageTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderWikiModuleTest.php
tests/phpunit/includes/specialpage/ChangesListSpecialPageTest.php
tests/phpunit/includes/title/NamespaceInfoTest.php
tests/phpunit/languages/classes/LanguageSrTest.php
tests/phpunit/languages/classes/LanguageUzTest.php
tests/phpunit/mocks/search/MockSearchResult.php
tests/phpunit/tests/MediaWikiTestCaseTest.php

index 12e723d..3478977 100644 (file)
@@ -32,7 +32,6 @@ $cfg['file_list'] = array_merge(
        class_exists( PHPUnit_TextUI_Command::class ) ? [] : [ '.phan/stubs/phpunit4.php' ],
        class_exists( ProfilerExcimer::class ) ? [] : [ '.phan/stubs/excimer.php' ],
        [
-               'maintenance/7zip.inc',
                'maintenance/cleanupTable.inc',
                'maintenance/CodeCleanerGlobalsPass.inc',
                'maintenance/commandLine.inc',
index a9c658a..22b74b5 100644 (file)
                <exclude-pattern>*/includes/specials/SpecialWantedpages\.php</exclude-pattern>
                <exclude-pattern>*/includes/specials/SpecialWantedtemplates\.php</exclude-pattern>
                <exclude-pattern>*/includes/specials/SpecialWithoutinterwiki\.php</exclude-pattern>
-               <exclude-pattern>*/maintenance/7zip.inc</exclude-pattern>
                <exclude-pattern>*/maintenance/CodeCleanerGlobalsPass.inc</exclude-pattern>
                <exclude-pattern>*/maintenance/archives/upgradeLogging\.php</exclude-pattern>
                <exclude-pattern>*/maintenance/benchmarks/bench_HTTP_HTTPS\.php</exclude-pattern>
                <exclude-pattern>*/maintenance/cleanupTable.inc</exclude-pattern>
                <exclude-pattern>*/maintenance/cleanupTitles\.php</exclude-pattern>
                <exclude-pattern>*/maintenance/commandLine.inc</exclude-pattern>
-               <exclude-pattern>*/maintenance/dumpTextPass\.php</exclude-pattern>
                <exclude-pattern>*/maintenance/edit\.php</exclude-pattern>
                <exclude-pattern>*/maintenance/findDeprecated\.php</exclude-pattern>
                <exclude-pattern>*/maintenance/getText\.php</exclude-pattern>
                -->
                <exclude-pattern>*/includes/GlobalFunctions\.php</exclude-pattern>
                <exclude-pattern>*/includes/libs/filebackend/FSFileBackend\.php</exclude-pattern>
-               <exclude-pattern>*/maintenance/7zip\.inc</exclude-pattern>
+               <exclude-pattern>*/maintenance/includes/SevenZipStream\.php</exclude-pattern>
                <exclude-pattern>*/maintenance/populateImageSha1\.php</exclude-pattern>
        </rule>
        <rule ref="MediaWiki.Usage.ForbiddenFunctions.proc_open">
                <exclude-pattern>includes/export/DumpPipeOutput\.php</exclude-pattern>
                <exclude-pattern>includes/resourceloader/ResourceLoaderImage\.php</exclude-pattern>
                <exclude-pattern>includes/shell/Command\.php</exclude-pattern>
-               <exclude-pattern>maintenance/dumpTextPass\.php</exclude-pattern>
+               <exclude-pattern>maintenance/includes/TextPassDumper\.php</exclude-pattern>
                <exclude-pattern>maintenance/mysql\.php</exclude-pattern>
                <exclude-pattern>maintenance/storage/recompressTracked\.php</exclude-pattern>
                <exclude-pattern>tests/parser/editTests\.php</exclude-pattern>
index 03a42c2..2531be2 100644 (file)
@@ -27,7 +27,12 @@ For notes on 1.33.x and older releases, see HISTORY.
 === Configuration changes for system administrators in 1.34 ===
 
 ==== New configuration ====
-* …
+* $wgAllowExternalReqID (T201409) - This configuration setting controls whether
+  Mediawiki accepts the request ID set by the incoming request via the
+  `X-Request-Id` header. If set to `true`, that value will be used throughout
+  the code as the request identificator. Otherwise, the sent header will be
+  ignored and the request ID will either be taken from Apache's mod_unique
+  module or will be generated by Mediawiki itself (depending on the set-up).
 
 ==== Changed configuration ====
 * …
@@ -50,9 +55,14 @@ For notes on 1.33.x and older releases, see HISTORY.
 ==== Changed external libraries ====
 * Updated Mustache from 1.0.0 to v3.0.1.
 * Updated OOUI from v0.31.3 to v0.31.5.
+* Updated composer/semver from 1.4.2 to 1.5.0.
+* Updated composer/spdx-licenses from 1.4.0 to 1.5.1 (dev-only).
+* Updated mediawiki/codesniffer from 25.0.0 to 26.0.0 (dev-only).
+* Updated cssjanus/cssjanus from 1.2.1 to 1.3.0.
 * …
 
 ==== Removed external libraries ====
+* The jquery.async module, deprecated in 1.33, was removed.
 * …
 
 === Bug fixes in 1.34 ===
@@ -147,6 +157,15 @@ because of Phabricator reports.
 * OutputPage::getModuleScripts(), ParserOutput::getModuleScripts(), deprecated
   in 1.33, have been removed.
 * User::getPasswordValidity(), deprecated in 1.33, has been removed.
+* ApiQueryBase::prepareUrlQuerySearchString(), deprecated in 1.33, has been
+  removed.
+* ChangeTags::purgeTagUsageCache(), deprecated in 1.33, has been removed.
+* JobQueueGroup::pushLazyJobs(), deprecated in 1.33, has been removed.
+* MediaWikiTestCase::stashMwGlobals(), deprecated in 1.32, has been removed.
+* SearchEngine::transformSearchTerm(), deprecated in 1.32, has been removed.
+* The Block typehint only refers to blocks stored in the database. It should be
+  updated to AbstractBlock in cases where any type of block could be expected.
+* FileRepoStatus, deprecated in 1.25, has been removed.
 * …
 
 === Deprecations in 1.34 ===
@@ -182,6 +201,9 @@ because of Phabricator reports.
 * The getSubjectPage, getTalkPage, and getOtherPage of Title are deprecated.
   Use NamespaceInfo's getSubjectPage, getTalkPage, and getAssociatedPage.
 * MWMessagePack class, no longer used, has been deprecated in 1.34.
+* The Block class is separated into Block (for blocks stored in the database),
+  and SystemBlock (for temporary blocks created by the system). SystemBlock
+  should be used when creating any temporary blocks.
 
 === Other changes in 1.34 ===
 * …
index cdfa3e9..275d20e 100644 (file)
@@ -528,7 +528,6 @@ $wgAutoloadLocalClasses = [
        'FileOpBatch' => __DIR__ . '/includes/libs/filebackend/FileOpBatch.php',
        'FileOpPerfTest' => __DIR__ . '/maintenance/fileOpPerfTest.php',
        'FileRepo' => __DIR__ . '/includes/filerepo/FileRepo.php',
-       'FileRepoStatus' => __DIR__ . '/includes/filerepo/FileRepoStatus.php',
        'FindDeprecated' => __DIR__ . '/maintenance/findDeprecated.php',
        'FindHooks' => __DIR__ . '/maintenance/findHooks.php',
        'FindMissingFiles' => __DIR__ . '/maintenance/findMissingFiles.php',
@@ -1321,7 +1320,7 @@ $wgAutoloadLocalClasses = [
        'SearchUpdate' => __DIR__ . '/includes/deferred/SearchUpdate.php',
        'SectionProfileCallback' => __DIR__ . '/includes/profiler/SectionProfileCallback.php',
        'SectionProfiler' => __DIR__ . '/includes/profiler/SectionProfiler.php',
-       'SevenZipStream' => __DIR__ . '/maintenance/7zip.inc',
+       'SevenZipStream' => __DIR__ . '/maintenance/includes/SevenZipStream.php',
        'ShiConverter' => __DIR__ . '/languages/classes/LanguageShi.php',
        'ShortPagesPage' => __DIR__ . '/includes/specials/SpecialShortpages.php',
        'ShowJobs' => __DIR__ . '/maintenance/showJobs.php',
@@ -1476,7 +1475,7 @@ $wgAutoloadLocalClasses = [
        'TemplatesOnThisPageFormatter' => __DIR__ . '/includes/TemplatesOnThisPageFormatter.php',
        'TextContent' => __DIR__ . '/includes/content/TextContent.php',
        'TextContentHandler' => __DIR__ . '/includes/content/TextContentHandler.php',
-       'TextPassDumper' => __DIR__ . '/maintenance/dumpTextPass.php',
+       'TextPassDumper' => __DIR__ . '/maintenance/includes/TextPassDumper.php',
        'TextSlotDiffRenderer' => __DIR__ . '/includes/diff/TextSlotDiffRenderer.php',
        'TextStatsOutput' => __DIR__ . '/maintenance/language/StatOutputs.php',
        'TgConverter' => __DIR__ . '/languages/classes/LanguageTg.php',
index a2dcaa1..1c7f22a 100644 (file)
@@ -17,8 +17,8 @@
                "wiki": "https://www.mediawiki.org/"
        },
        "require": {
-               "composer/semver": "1.4.2",
-               "cssjanus/cssjanus": "1.2.1",
+               "composer/semver": "1.5.0",
+               "cssjanus/cssjanus": "1.3.0",
                "ext-ctype": "*",
                "ext-fileinfo": "*",
                "ext-iconv": "*",
        },
        "require-dev": {
                "cache/integration-tests": "0.16.0",
-               "composer/spdx-licenses": "1.4.0",
+               "composer/spdx-licenses": "1.5.1",
                "giorgiosironi/eris": "^0.10.0",
                "hamcrest/hamcrest-php": "^2.0",
                "jakub-onderka/php-console-highlighter": "0.3.2",
                "jakub-onderka/php-parallel-lint": "0.9.2",
                "justinrainbow/json-schema": "~5.2",
-               "mediawiki/mediawiki-codesniffer": "25.0.0",
+               "mediawiki/mediawiki-codesniffer": "26.0.0",
                "monolog/monolog": "~1.22.1",
                "nikic/php-parser": "3.1.5",
                "seld/jsonlint": "1.7.1",
index 0f7a606..28e9ec8 100644 (file)
@@ -8430,6 +8430,13 @@ $wgLocalVirtualHosts = [];
  */
 $wgHTTPConnectTimeout = 5e0;
 
+/**
+ * Whether to respect/honour the request ID provided by the incoming request
+ * via the `X-Request-Id` header. Set to `true` if the entity sitting in front
+ * of Mediawiki sanitises external requests. Default: `false`.
+ */
+$wgAllowExternalReqID = false;
+
 /** @} */ # End HTTP client }
 
 /************************************************************************//**
index a6e01cc..0131855 100644 (file)
@@ -384,6 +384,7 @@ class FormOptions implements ArrayAccess {
         * @see https://www.php.net/manual/en/class.arrayaccess.php
         */
        /* @{ */
+
        /**
         * Whether the option exists.
         * @param string $name
index 9dbfc1b..eca5b9d 100644 (file)
@@ -226,6 +226,7 @@ class MediaWikiServices extends ServiceContainer {
        }
 
        /** @noinspection PhpDocSignatureInspection */
+
        /**
         * Salvages the state of any salvageable service instances in $other.
         *
index 7da092f..76d94b2 100644 (file)
@@ -275,8 +275,18 @@ class WebRequest {
        public static function getRequestId() {
                // This method is called from various error handlers and should be kept simple.
 
-               if ( !self::$reqId ) {
-                       self::$reqId = $_SERVER['UNIQUE_ID'] ?? wfRandomString( 24 );
+               if ( self::$reqId ) {
+                       return self::$reqId;
+               }
+
+               global $wgAllowExternalReqID;
+
+               self::$reqId = $_SERVER['UNIQUE_ID'] ?? wfRandomString( 24 );
+               if ( $wgAllowExternalReqID ) {
+                       $id = RequestContext::getMain()->getRequest()->getHeader( 'X-Request-Id' );
+                       if ( $id ) {
+                               self::$reqId = $id;
+                       }
                }
 
                return self::$reqId;
index 878dd3e..c83fdea 100644 (file)
@@ -50,6 +50,7 @@ if ( !defined( 'MW_CONFIG_CALLBACK' ) ) {
                define( 'MW_CONFIG_FILE', "$IP/LocalSettings.php" );
        }
        if ( !is_readable( MW_CONFIG_FILE ) ) {
+
                function wfWebStartNoLocalSettings() {
                        # LocalSettings.php is the per-site customization file. If it does not exist
                        # the wiki installer needs to be launched or the generated file uploaded to
@@ -58,12 +59,14 @@ if ( !defined( 'MW_CONFIG_CALLBACK' ) ) {
                        require_once "$IP/includes/NoLocalSettings.php";
                        die();
                }
+
                define( 'MW_CONFIG_CALLBACK', 'wfWebStartNoLocalSettings' );
        }
 }
 
 // Custom setup for WebStart entry point
 if ( !defined( 'MW_SETUP_CALLBACK' ) ) {
+
        function wfWebStartSetup() {
                // Initialise output buffering
                // Check for previously set up buffers, to avoid a mix of gzip and non-gzip output.
@@ -71,6 +74,7 @@ if ( !defined( 'MW_SETUP_CALLBACK' ) ) {
                        ob_start( 'MediaWiki\\OutputHandler::handle' );
                }
        }
+
        define( 'MW_SETUP_CALLBACK', 'wfWebStartSetup' );
 }
 
index 658ee48..706241a 100644 (file)
@@ -139,6 +139,7 @@ class HistoryAction extends FormlessAction {
                }
                return $year && $month && $day ? $year . '-' . $month . '-' . $day : '';
        }
+
        /**
         * Print the history page for an article.
         */
index 8d0d314..7cb2dbf 100644 (file)
@@ -1816,7 +1816,7 @@ abstract class ApiBase extends ContextSource {
                        if ( is_string( $error[0] ) && isset( self::$blockMsgMap[$error[0]] ) && $user->getBlock() ) {
                                list( $msg, $code ) = self::$blockMsgMap[$error[0]];
                                $status->fatal( ApiMessage::create( $msg, $code,
-                                       [ 'blockinfo' => $this->getBlockInfo( $user->getBlock() ) ]
+                                       [ 'blockinfo' => $this->getBlockDetails( $user->getBlock() ) ]
                                ) );
                        } else {
                                $status->fatal( ...$error );
@@ -1839,7 +1839,7 @@ abstract class ApiBase extends ContextSource {
                foreach ( self::$blockMsgMap as $msg => list( $apiMsg, $code ) ) {
                        if ( $status->hasMessage( $msg ) && $user->getBlock() ) {
                                $status->replaceMessage( $msg, ApiMessage::create( $apiMsg, $code,
-                                       [ 'blockinfo' => $this->getBlockInfo( $user->getBlock() ) ]
+                                       [ 'blockinfo' => $this->getBlockDetails( $user->getBlock() ) ]
                                ) );
                        }
                }
@@ -2029,7 +2029,7 @@ abstract class ApiBase extends ContextSource {
         * error handler and die with an error message including block info.
         *
         * @since 1.27
-        * @param Block $block The block used to generate the ApiUsageException
+        * @param AbstractBlock $block The block used to generate the ApiUsageException
         * @throws ApiUsageException always
         */
        public function dieBlocked( AbstractBlock $block ) {
@@ -2038,19 +2038,19 @@ abstract class ApiBase extends ContextSource {
                        $this->dieWithError(
                                'apierror-autoblocked',
                                'autoblocked',
-                               [ 'blockinfo' => $this->getBlockInfo( $block ) ]
+                               [ 'blockinfo' => $this->getBlockDetails( $block ) ]
                        );
                } elseif ( !$block->isSitewide() ) {
                        $this->dieWithError(
                                'apierror-blocked-partial',
                                'blocked',
-                               [ 'blockinfo' => $this->getBlockInfo( $block ) ]
+                               [ 'blockinfo' => $this->getBlockDetails( $block ) ]
                        );
                } else {
                        $this->dieWithError(
                                'apierror-blocked',
                                'blocked',
-                               [ 'blockinfo' => $this->getBlockInfo( $block ) ]
+                               [ 'blockinfo' => $this->getBlockDetails( $block ) ]
                        );
                }
        }
index 336943d..f7c2bce 100644 (file)
@@ -52,7 +52,7 @@ class ApiBlock extends ApiBase {
                                $this->dieWithError(
                                        $status,
                                        null,
-                                       [ 'blockinfo' => $this->getBlockInfo( $block ) ]
+                                       [ 'blockinfo' => $this->getBlockDetails( $block ) ]
                                );
                        }
                }
index 51da835..587a51f 100644 (file)
@@ -28,7 +28,7 @@ trait ApiBlockInfoTrait {
 
        /**
         * Get basic info about a given block
-        * @param Block $block
+        * @param AbstractBlock $block
         * @return array Array containing several keys:
         *  - blockid - ID of the block
         *  - blockedby - username of the blocker
@@ -38,7 +38,7 @@ trait ApiBlockInfoTrait {
         *  - blockexpiry - expiry time of the block
         *  - systemblocktype - system block type, if any
         */
-       private function getBlockInfo( AbstractBlock $block ) {
+       private function getBlockDetails( AbstractBlock $block ) {
                $vals = [];
                $vals['blockid'] = $block->getId();
                $vals['blockedby'] = $block->getByName();
index d955b56..122e02f 100644 (file)
@@ -423,35 +423,6 @@ abstract class ApiQueryBase extends ApiBase {
                return Hooks::run( 'ApiQueryBaseProcessRow', [ $this, $row, &$data, &$hookData ] );
        }
 
-       /**
-        * @deprecated since 1.33, use LinkFilter::getQueryConditions() instead
-        * @param string|null $query
-        * @param string|null $protocol
-        * @return null|string
-        */
-       public function prepareUrlQuerySearchString( $query = null, $protocol = null ) {
-               wfDeprecated( __METHOD__, '1.33' );
-               $db = $this->getDB();
-               if ( $query !== null && $query !== '' ) {
-                       if ( is_null( $protocol ) ) {
-                               $protocol = 'http://';
-                       }
-
-                       $likeQuery = LinkFilter::makeLikeArray( $query, $protocol );
-                       if ( !$likeQuery ) {
-                               $this->dieWithError( 'apierror-badquery' );
-                       }
-
-                       $likeQuery = LinkFilter::keepOneWildcard( $likeQuery );
-
-                       return 'el_index ' . $db->buildLike( $likeQuery );
-               } elseif ( !is_null( $protocol ) ) {
-                       return 'el_index ' . $db->buildLike( "$protocol", $db->anyString() );
-               }
-
-               return null;
-       }
-
        /**
         * Filters hidden users (where the user doesn't have the right to view them)
         * Also adds relevant block information
index c495c6d..ba7280d 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  */
 
+use MediaWiki\Block\AbstractBlock;
 use MediaWiki\MediaWikiServices;
 
 /**
@@ -52,6 +53,26 @@ class ApiQueryUserInfo extends ApiQueryBase {
                $result->addValue( 'query', $this->getModuleName(), $r );
        }
 
+       /**
+        * Get basic info about a given block
+        *
+        * @deprecated since 1.34 Use ApiBlockInfoTrait::getBlockDetails() instead.
+        * @param AbstractBlock $block
+        * @return array See ApiBlockInfoTrait::getBlockDetails
+        */
+       public static function getBlockInfo( AbstractBlock $block ) {
+               wfDeprecated( __METHOD__, '1.34' );
+
+               // Hack to access a private method from a trait:
+               $dummy = new class {
+                       use ApiBlockInfoTrait {
+                               getBlockDetails as public;
+                       }
+               };
+
+               return $dummy->getBlockDetails( $block );
+       }
+
        /**
         * Get central user info
         * @param Config $config
@@ -104,7 +125,7 @@ class ApiQueryUserInfo extends ApiQueryBase {
                if ( isset( $this->prop['blockinfo'] ) ) {
                        $block = $user->getBlock();
                        if ( $block ) {
-                               $vals = array_merge( $vals, $this->getBlockInfo( $block ) );
+                               $vals = array_merge( $vals, $this->getBlockDetails( $block ) );
                        }
                }
 
index f038b96..1c72b67 100644 (file)
@@ -50,7 +50,7 @@ class ApiUnblock extends ApiBase {
                                $this->dieWithError(
                                        $status,
                                        null,
-                                       [ 'blockinfo' => $this->getBlockInfo( $block ) ]
+                                       [ 'blockinfo' => $this->getBlockDetails( $block ) ]
                                );
                        }
                }
index f0c6eec..e62d2bb 100644 (file)
                        "Thibaut120094",
                        "KATRINE1992",
                        "Kenjiraw",
-                       "Framawiki"
+                       "Framawiki",
+                       "Epok"
                ]
        },
-       "apihelp-main-extended-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Documentation]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Liste de diffusion]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annonces de l’API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bogues et demandes]\n</div>\n<strong>État :</strong> L’API MédiaWiki est une interface stable et mature qui est supportée et améliorée de façon active. Bien que nous essayions de l’éviter, nous pouvons avoir parfois besoin de faire des modifications impactantes ; inscrivez-vous à [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la liste de diffusion mediawiki-api-announce] pour être informé des mises à jour.\n\n<strong>Requêtes erronées :</strong> Si des requêtes erronées sont envoyées à l’API, un entête HTTP sera renvoyé avec la clé « MediaWiki-API-Error ». La valeur de cet entête et le code d’erreur renvoyé prendront la même valeur. Pour plus d’information, voyez [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Errors and warnings]].\n\n<p class=\"mw-apisandbox-link\"><strong>Test :</strong> Pour faciliter le test des requêtes de l’API, voyez [[Special:ApiSandbox]].</p>",
+       "apihelp-main-extended-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Documentation]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Liste de diffusion]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annonces de l’API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bogues et demandes]\n</div>\n<strong>État :</strong> L’API MediaWiki est une interface stable et mature qui est supportée et améliorée de façon active. Bien que nous essayions de l’éviter, nous pouvons avoir parfois besoin de faire des modifications impactantes ; inscrivez-vous à [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la liste de diffusion mediawiki-api-announce] pour être informé des mises à jour.\n\n<strong>Requêtes erronées :</strong> Si des requêtes erronées sont envoyées à l’API, un entête HTTP sera renvoyé avec la clé « MediaWiki-API-Error ». La valeur de cet entête et le code d’erreur renvoyé prendront la même valeur. Pour plus d’information, voyez [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Errors and warnings]].\n\n<p class=\"mw-apisandbox-link\"><strong>Test :</strong> Pour faciliter le test des requêtes à l’API, voyez [[Special:ApiSandbox]].</p>",
        "apihelp-main-param-action": "Quelle action effectuer.",
        "apihelp-main-param-format": "Le format de sortie.",
        "apihelp-main-param-maxlag": "La latence maximale peut être utilisée quand MédiaWiki est installé sur un cluster de base de données répliqué. Pour éviter des actions provoquant un supplément de latence de réplication de site, ce paramètre peut faire attendre le client jusqu’à ce que la latence de réplication soit inférieure à une valeur spécifiée. En cas de latence excessive, le code d’erreur <samp>maxlag</samp> est renvoyé avec un message tel que <samp>Attente de $host : $lag secondes de délai</samp>.<br />Voyez [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Manuel: paramètre Maxlag]] pour plus d’information.",
@@ -79,7 +80,7 @@
        "apihelp-checktoken-example-simple": "Tester la validité d'un jeton de <kbd>csrf</kbd>.",
        "apihelp-clearhasmsg-summary": "Efface le drapeau <code>hasmsg</code> pour l’utilisateur courant.",
        "apihelp-clearhasmsg-example-1": "Effacer le drapeau <code>hasmsg</code> pour l’utilisateur courant",
-       "apihelp-clientlogin-summary": "Se connecter au wiki en utilisant le flux interactif.",
+       "apihelp-clientlogin-summary": "Se connecter au wiki en utilisant la procédure interactive.",
        "apihelp-clientlogin-example-login": "Commencer le processus de connexion au wiki en tant qu’utilisateur <kbd>Exemple</kbd> avec le mot de passe <kbd>ExempleMotDePasse</kbd>.",
        "apihelp-clientlogin-example-login2": "Continuer la connexion après une réponse de l’<samp>IHM</samp> pour l’authentification à deux facteurs, en fournissant un <var>OATHToken</var> valant <kbd>987654</kbd>.",
        "apihelp-compare-summary": "Obtenir la différence entre deux pages.",
        "apihelp-emailuser-param-text": "Corps du courriel.",
        "apihelp-emailuser-param-ccme": "M’envoyer une copie de ce courriel.",
        "apihelp-emailuser-example-email": "Envoyer un courriel à l’utilisateur <kbd>WikiSysop</kbd> avec le texte <kbd>Content</kbd>.",
-       "apihelp-expandtemplates-summary": "Développe tous les modèles avec du wikitexte.",
+       "apihelp-expandtemplates-summary": "Réalise l’expansion des modèles en wikitexte.",
        "apihelp-expandtemplates-param-title": "Titre de la page.",
        "apihelp-expandtemplates-param-text": "Wikitexte à convertir.",
        "apihelp-expandtemplates-param-revid": "ID de révision, pour <code><nowiki>{{REVISIONID}}</nowiki></code> et les variables semblables.",
        "apihelp-import-example-import": "Importer [[meta:Help:ParserFunctions]] vers l’espace de noms 100 avec tout l’historique.",
        "apihelp-linkaccount-summary": "Lier un compte d’un fournisseur tiers à l’utilisateur actuel.",
        "apihelp-linkaccount-example-link": "Commencer le processus de liaison d’un compte depuis <kbd>Exemple</kbd>.",
-       "apihelp-login-summary": "Reconnecte et récupère les témoins (cookies) d'authentification.",
+       "apihelp-login-summary": "Se connecter et récupérer les témoins (cookies) d'authentification.",
        "apihelp-login-extended-description": "Cette action ne devrait être utilisée qu’en lien avec [[Special:BotPasswords]] ; l’utiliser pour la connexion du compte principal est désuet et peut échouer sans avertissement. Pour se connecter sans problème au compte principal, utiliser <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
        "apihelp-login-extended-description-nobotpasswords": "Cette action est désuète et peut échouer sans prévenir. Pour se connecter sans problème, utiliser <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
        "apihelp-login-param-name": "Nom d’utilisateur.",
        "apihelp-login-example-login": "Se connecter",
        "apihelp-logout-summary": "Se déconnecter et effacer les données de session.",
        "apihelp-logout-example-logout": "Déconnecter l’utilisateur actuel.",
-       "apihelp-managetags-summary": "Effectuer des tâches de gestion relatives à la modification des balises.",
+       "apihelp-managetags-summary": "Effectuer des tâches de gestion relatives aux balises de modification.",
        "apihelp-managetags-param-operation": "Quelle opération effectuer :\n;create:Créer une nouvelle balise de modification pour un usage manuel.\n;delete:Supprimer une balise de modification de la base de données, y compris la suppression de la marque de toutes les révisions, entrées de modification récente et entrées de journal dans lesquelles elle serait utilisée.\n;activate:Activer une balise de modification, permettant aux utilisateurs de l’appliquer manuellement.\n;deactivate:Désactiver une balise de modification, empêchant les utilisateurs de l’appliquer manuellement.",
        "apihelp-managetags-param-tag": "Balise à créer, supprimer, activer ou désactiver. Pour la création de balise, elle ne doit pas exister. Pour la suppression de balise, elle doit exister. Pour l’activation de balise, elle doit exister et ne pas être utilisée par une extension. Pour la désactivation de balise, elle doit être actuellement active et définie manuellement.",
        "apihelp-managetags-param-reason": "Un motif facultatif pour créer, supprimer, activer ou désactiver la balise.",
        "apihelp-purge-param-forcerecursivelinkupdate": "Mettre à jour la table des liens, et mettre à jour les tables de liens pour toute page qui utilise cette page comme modèle",
        "apihelp-purge-example-simple": "Purger les pages <kbd>Main Page</kbd> et <kbd>API</kbd>.",
        "apihelp-purge-example-generator": "Purger les 10 premières pages de l’espace de noms principal",
-       "apihelp-query-summary": "Extraire des données de et sur MediaWiki.",
+       "apihelp-query-summary": "Extraire des données de MediaWiki et à propos de celui-ci.",
        "apihelp-query-extended-description": "Toutes les modifications de données devront d’abord utiliser une requête pour obtenir un jeton, afin d’éviter les abus de la part de sites malveillants.",
        "apihelp-query-param-prop": "Quelles propriétés obtenir pour les pages demandées.",
        "apihelp-query-param-list": "Quelles listes obtenir.",
        "apihelp-query+alldeletedrevisions-param-generatetitles": "Utilisé comme générateur, générer des titres plutôt que des IDs de révision.",
        "apihelp-query+alldeletedrevisions-example-user": "Lister les 50 dernières contributions supprimées par l'utilisateur <kbd>Example</kbd>.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "Lister les 50 premières révisions supprimées dans l’espace de noms principal.",
-       "apihelp-query+allfileusages-summary": "Lister toutes les utilisations de fichiers, y compris celles n’existant pas.",
+       "apihelp-query+allfileusages-summary": "Lister toutes les utilisations de fichiers, y compris ceux n’existant pas.",
        "apihelp-query+allfileusages-param-from": "Le titre du fichier depuis lequel commencer l’énumération.",
        "apihelp-query+allfileusages-param-to": "Le titre du fichier auquel arrêter l’énumération.",
        "apihelp-query+allfileusages-param-prefix": "Rechercher tous les fichiers dont le titre commence par cette valeur.",
        "apihelp-query+categoryinfo-summary": "Renvoie les informations sur les catégories données.",
        "apihelp-query+categoryinfo-example-simple": "Obtenir des informations sur <kbd>Category:Foo</kbd> et <kbd>Category:Bar</kbd>.",
        "apihelp-query+categorymembers-summary": "Lister toutes les pages d’une catégorie donnée.",
-       "apihelp-query+categorymembers-param-title": "Quelle catégorie énumérer (obligatoire). Doit comprendre le préfixe <kbd>{{ns:category}}:</kbd>. Impossible à utiliser avec <var>$1pageid</var>.",
-       "apihelp-query+categorymembers-param-pageid": "ID de la page de la catégorie à énumérer. Impossible à utiliser avec <var>$1title</var>.",
+       "apihelp-query+categorymembers-param-title": "Quelle catégorie énumérer (obligatoire). Doit comprendre le préfixe <kbd>{{ns:category}}:</kbd>. Incompatible avec <var>$1pageid</var>.",
+       "apihelp-query+categorymembers-param-pageid": "ID de la page de la catégorie à énumérer. Incompatible avec <var>$1title</var>.",
        "apihelp-query+categorymembers-param-prop": "Quelles informations inclure :",
        "apihelp-query+categorymembers-paramvalue-prop-ids": "Ajoute l’ID de la page.",
        "apihelp-query+categorymembers-paramvalue-prop-title": "Ajoute le titre et l’ID de l’espace de noms de la page.",
        "apihelp-query+categorymembers-paramvalue-prop-sortkey": "Ajoute la clé de tri utilisée pour trier dans la catégorie (chaîne hexadécimale).",
        "apihelp-query+categorymembers-paramvalue-prop-sortkeyprefix": "Ajoute le préfixe de la clé de tri utilisé pour trier dans la catégorie (partie lisible de la clé de tri).",
-       "apihelp-query+categorymembers-paramvalue-prop-type": "Ajoute le type dans lequel a été catégorisée la page (<samp>page</samp>, <samp>subcat</samp> ou <samp>file</samp>).",
+       "apihelp-query+categorymembers-paramvalue-prop-type": "Ajoute le type avec lequel a été catégorisée la page (<samp>page</samp>, <samp>subcat</samp> ou <samp>file</samp>).",
        "apihelp-query+categorymembers-paramvalue-prop-timestamp": "Ajoute l’horodatage de l’inclusion de la page.",
        "apihelp-query+categorymembers-param-namespace": "Inclure uniquement les pages dans ces espaces de nom. Remarquez que <kbd>$1type=subcat</kbd> ou <kbd>$1type=file</kbd> peuvent  être utilisés à la place de <kbd>$1namespace=14</kbd> ou <kbd>6</kbd>.",
-       "apihelp-query+categorymembers-param-type": "Quel type de membres de la catégorie inclure. Ignoré quand <kbd>$1sort=timestamp</kbd> est positionné.",
+       "apihelp-query+categorymembers-param-type": "Quel type de membres de la catégorie inclure. Ignoré quand <kbd>$1sort=timestamp</kbd> est défini.",
        "apihelp-query+categorymembers-param-limit": "Le nombre maximal de pages à renvoyer.",
        "apihelp-query+categorymembers-param-sort": "Propriété par laquelle trier.",
        "apihelp-query+categorymembers-param-dir": "Dans quelle direction trier.",
        "apihelp-query+categorymembers-param-startsortkey": "Utiliser plutôt $1starthexsortkey.",
        "apihelp-query+categorymembers-param-endsortkey": "Utiliser plutôt $1endhexsortkey.",
        "apihelp-query+categorymembers-example-simple": "Obtenir les 10 premières pages de <kbd>Category:Physics</kbd>.",
-       "apihelp-query+categorymembers-example-generator": "Obtenir l’information sur les 10 premières pages de <kbd>Category:Physics</kbd>.",
+       "apihelp-query+categorymembers-example-generator": "Obtenir des informations sur les 10 premières pages de <kbd>Category:Physics</kbd>.",
        "apihelp-query+contributors-summary": "Obtenir la liste des contributeurs connectés et le nombre de contributeurs anonymes d’une page.",
        "apihelp-query+contributors-param-group": "Inclut uniquement les utilisateurs dans les groupes donnés. N'inclut pas les groupes implicites ou auto-promus comme *, user ou autoconfirmed.",
        "apihelp-query+contributors-param-excludegroup": "Exclure les utilisateurs des groupes donnés. Ne pas inclure les groupes implicites ou auto-promus comme *, user ou autoconfirmed.",
        "apihelp-query+contributors-param-excluderights": "Exclure les utilisateurs ayant les droits donnés. Ne pas inclure les droits accordés par les groupes implicites ou auto-promus comme *, user ou autoconfirmed.",
        "apihelp-query+contributors-param-limit": "Combien de contributeurs renvoyer.",
        "apihelp-query+contributors-example-simple": "Afficher les contributeurs dans la <kbd>Main Page</kbd>.",
-       "apihelp-query+deletedrevisions-summary": "Obtenir des informations sur la révision supprimée.",
+       "apihelp-query+deletedrevisions-summary": "Obtenir des informations sur une révision supprimée.",
        "apihelp-query+deletedrevisions-extended-description": "Peut être utilisé de différentes manières :\n# Obtenir les révisions supprimées pour un ensemble de pages, en donnant les titres ou les ids de page. Ordonné par titre  et horodatage.\n# Obtenir des données sur un ensemble de révisions supprimées en donnant leurs IDs et leurs ids de révision. Ordonné par ID de révision.",
        "apihelp-query+deletedrevisions-param-start": "L’horodatage auquel démarrer l’énumération. Ignoré lors du traitement d’une liste d’IDs de révisions.",
        "apihelp-query+deletedrevisions-param-end": "L’horodatage auquel arrêter l’énumération. Ignoré lors du traitement d’une liste d’IDs de révisions.",
        "apihelp-query+recentchanges-summary": "Énumérer les modifications récentes.",
        "apihelp-query+recentchanges-param-start": "L’horodatage auquel démarrer l’énumération.",
        "apihelp-query+recentchanges-param-end": "L’horodatage auquel arrêter l’énumération.",
-       "apihelp-query+recentchanges-param-namespace": "Filtrer les modifications uniquement sur ces espaces de noms.",
+       "apihelp-query+recentchanges-param-namespace": "Liste uniquement les modifications dans ces espaces de noms.",
        "apihelp-query+recentchanges-param-user": "Lister uniquement les modifications faites par cet utilisateur.",
        "apihelp-query+recentchanges-param-excludeuser": "Ne pas lister les modifications faites par cet utilisateur.",
        "apihelp-query+recentchanges-param-tag": "Lister uniquement les modifications marquées avec cette balise.",
        "apihelp-query+recentchanges-param-prop": "Inclure des informations supplémentaires :",
-       "apihelp-query+recentchanges-paramvalue-prop-user": "Ajoute l’utilisateur responsable de la modification et marque s'il s'agit d'une adresse IP.",
+       "apihelp-query+recentchanges-paramvalue-prop-user": "Ajoute l’utilisateur responsable de la modification, ainsi qu’un marqueur s’il s'agit d'une adresse IP.",
        "apihelp-query+recentchanges-paramvalue-prop-userid": "Ajoute l’ID de l’utilisateur responsable de la modification.",
        "apihelp-query+recentchanges-paramvalue-prop-comment": "Ajoute le commentaire de la modification.",
        "apihelp-query+recentchanges-paramvalue-prop-parsedcomment": "Ajoute le commentaire analysé pour la modification.",
        "apihelp-query+recentchanges-param-limit": "Combien de modifications renvoyer au total.",
        "apihelp-query+recentchanges-param-type": "Quels types de modification afficher.",
        "apihelp-query+recentchanges-param-toponly": "Lister uniquement les modifications qui sont de la dernière révision.",
-       "apihelp-query+recentchanges-param-title": "Filtrer les entrées vers celles relatives à une page.",
+       "apihelp-query+recentchanges-param-title": "Lister uniquement les entrées concernant une page donnée.",
        "apihelp-query+recentchanges-param-generaterevisions": "Utilisé comme générateur, générer des IDs de révision plutôt que des titres.\nLes entrées de modification récentes sans IDs de révision associé (par ex. la plupart des entrées de journaux) ne généreront rien.",
        "apihelp-query+recentchanges-example-simple": "Lister les modifications récentes",
        "apihelp-query+recentchanges-example-generator": "Obtenir l’information de page sur les modifications récentes non relues.",
        "apihelp-query+redirects-param-show": "Afficher uniquement les éléments correspondant à ces critères :\n;fragment:Afficher uniquement les redirections avec un fragment.\n;!fragment:Afficher uniquement les redirections sans fragment.",
        "apihelp-query+redirects-example-simple": "Obtenir une liste des redirections vers [[Main Page]]",
        "apihelp-query+redirects-example-generator": "Obtenir des informations sur toutes les redirections vers [[Main Page]]",
-       "apihelp-query+revisions-summary": "Récupèrer les informations de relecture.",
-       "apihelp-query+revisions-extended-description": "Peut être utilisé de différentes manières :\n# Obtenir des données sur un ensemble de pages (dernière révision), en mettant les titres ou les ids de page.\n# Obtenir les révisions d’une page donnée, en utilisant les titres ou les ids de page avec un début, une fin, ou une limite.\n# Obtenir des données sur un ensemble de révisions en donnant leurs IDs avec revids.",
+       "apihelp-query+revisions-summary": "Obtenir des informations sur une révision.",
+       "apihelp-query+revisions-extended-description": "Peut être utilisé de différentes manières :\n# Obtenir des données sur un ensemble de pages (dernière révision), en mettant les titres ou les ids de page.\n# Obtenir les révisions d’une page donnée, en utilisant les titres ou les ids de page avec un début, une fin ou une limite.\n# Obtenir des données sur un ensemble de révisions en donnant leurs IDs avec revids.",
        "apihelp-query+revisions-paraminfo-singlepageonly": "Utilisable uniquement avec une seule page (mode #2).",
-       "apihelp-query+revisions-param-startid": "Commencer l'énumération à partir de la date de cette revue. La revue doit exister, mais ne concerne pas forcément cette page.",
-       "apihelp-query+revisions-param-endid": "Arrêter l’énumération à la date de cette revue. La revue doit exister mais ne concerne pas forcément cette page.",
+       "apihelp-query+revisions-param-startid": "Commencer l’énumération à partir de la date de cette révision. La révision doit exister mais il n’est pas nécessaire que ce soit une révision de cette page.",
+       "apihelp-query+revisions-param-endid": "Arrêter l’énumération à la date de cette révision. La révision doit exister mais il n’est pas nécessaire que ce soit une révision de cette page.",
        "apihelp-query+revisions-param-start": "À quel horodatage de révision démarrer l’énumération.",
        "apihelp-query+revisions-param-end": "Énumérer jusqu’à cet horodatage.",
-       "apihelp-query+revisions-param-user": "Inclure uniquement les révisions faites par l’utilisateur.",
-       "apihelp-query+revisions-param-excludeuser": "Exclure les révisions faites par l’utilisateur.",
+       "apihelp-query+revisions-param-user": "Inclure uniquement les révisions faites par un utilisateur donné.",
+       "apihelp-query+revisions-param-excludeuser": "Exclure les révisions faites par un utilisateur donné.",
        "apihelp-query+revisions-param-tag": "Lister uniquement les révisions marquées avec cette balise.",
        "apihelp-query+revisions-param-token": "Quels jetons obtenir pour chaque révision.",
-       "apihelp-query+revisions-example-content": "Obtenir des données avec le contenu pour la dernière révision des titres <kbd>API</kbd> et <kbd>Main Page</kbd>.",
-       "apihelp-query+revisions-example-last5": "Obtenir les 5 dernières révisions de la <kbd>Main Page</kbd>.",
-       "apihelp-query+revisions-example-first5": "Obtenir les 5 premières révisions de la <kbd>Page principale</kbd>.",
-       "apihelp-query+revisions-example-first5-after": "Obtenir les 5 premières révisions de la <kbd>Page principale</kbd> faites après le 01/05/2006.",
-       "apihelp-query+revisions-example-first5-not-localhost": "Obtenir les 5 premières révisions de la <kbd>Page principale</kbd> qui n’ont pas été faites par l’utilisateur anonyme <kbd>127.0.0.1</kbd>.",
-       "apihelp-query+revisions-example-first5-user": "Obtenir les 5 premières révisions de la <kbd>Page principale</kbd> qui ont été faites par l’utilisateur <kbd>MédiaWiki par défaut</kbd>.",
+       "apihelp-query+revisions-example-content": "Obtenir des données pour la dernière révision des titres <kbd>API</kbd> et <kbd>Main Page</kbd>, y compris le contenu.",
+       "apihelp-query+revisions-example-last5": "Obtenir les 5 dernières révisions de <kbd>Main Page</kbd>.",
+       "apihelp-query+revisions-example-first5": "Obtenir les 5 premières révisions de <kbd>Main Page</kbd>.",
+       "apihelp-query+revisions-example-first5-after": "Obtenir les 5 premières révisions de <kbd>Main Page</kbd> faites après le 01/05/2006.",
+       "apihelp-query+revisions-example-first5-not-localhost": "Obtenir les 5 premières révisions de <kbd>Main Page</kbd> qui n’ont pas été faites par l’utilisateur anonyme <kbd>127.0.0.1</kbd>.",
+       "apihelp-query+revisions-example-first5-user": "Obtenir les 5 premières révisions de <kbd>Main Page</kbd> qui ont été faites par l’utilisateur <kbd>MediaWiki default</kbd>.",
        "apihelp-query+revisions+base-param-prop": "Quelles propriétés obtenir pour chaque révision :",
        "apihelp-query+revisions+base-paramvalue-prop-ids": "L’ID de la révision.",
-       "apihelp-query+revisions+base-paramvalue-prop-flags": "Marques de la révision (mineure).",
+       "apihelp-query+revisions+base-paramvalue-prop-flags": "Attributs de la révision (mineure).",
        "apihelp-query+revisions+base-paramvalue-prop-timestamp": "L’horodatage de la révision.",
        "apihelp-query+revisions+base-paramvalue-prop-user": "L’utilisateur qui a fait la révision.",
        "apihelp-query+revisions+base-paramvalue-prop-userid": "L’ID de l’utilisateur créateur de la révision.",
        "apihelp-query+revisions+base-paramvalue-prop-size": "Longueur (en octets) de la révision.",
        "apihelp-query+revisions+base-paramvalue-prop-slotsize": "Longueur (en octets) de chaque emplacement de révision.",
-       "apihelp-query+revisions+base-paramvalue-prop-sha1": "Hachage SHA-1 (base 16) de la révision.",
+       "apihelp-query+revisions+base-paramvalue-prop-sha1": "SHA-1 (base 16) de la révision.",
        "apihelp-query+revisions+base-paramvalue-prop-slotsha1": "SHA-1 (base 16) de chaque emplacement de révision.",
        "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "ID du modèle de contenu de chaque emplacement de révision.",
        "apihelp-query+revisions+base-paramvalue-prop-comment": "Commentaire de l’utilisateur sur la révision.",
        "apihelp-query+revisions+base-paramvalue-prop-roles": "Lister les rôles d’emplacement de contenu qui existent dans la révision.",
        "apihelp-query+revisions+base-paramvalue-prop-parsetree": "Utiliser  <kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd> ou <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd> à la place. L’arbre d’analyse XML du contenu de la révision (nécessite le modèle de contenu <code>$1</code>).",
        "apihelp-query+revisions+base-param-slots": "Pour quels emplacements de révision renvoyer des données, quand les propriétés relatives aux emplacements sont incluses dans <var>$1props</var>. Si omis, les données de l’emplacement <kbd>main</kbd> seront renvoyées dans un format rétro-compatible.",
-       "apihelp-query+revisions+base-param-limit": "Limiter le nombre de révisions retournées.",
+       "apihelp-query+revisions+base-param-limit": "Limiter le nombre de révisions renvoyées.",
        "apihelp-query+revisions+base-param-expandtemplates": "Utiliser <kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd> à la place. Développer les modèles dans le contenu de la révision (nécessite $1prop=content).",
        "apihelp-query+revisions+base-param-generatexml": "Utiliser <kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd> ou <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd> à la place. Générer l’arbre d’analyse XML pour le contenu de la révision (nécessite $1prop=content).",
        "apihelp-query+revisions+base-param-parse": "Utiliser <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd> à la place. Analyser le contenu de la révision (nécessite $1prop=content). Pour des raisons de performance, si cette option est utilisée, $1limit est forcé à 1.",
        "apihelp-unblock-param-tags": "Modifier les balises à appliquer à l’entrée dans le journal de blocage.",
        "apihelp-unblock-example-id": "Lever le blocage d’ID #<kbd>105</kbd>.",
        "apihelp-unblock-example-user": "Débloquer l’utilisateur <kbd>Bob</kbd> avec le motif <kbd>Désolé Bob</kbd>.",
-       "apihelp-undelete-summary": "Restituer les versions d'une page supprimée.",
+       "apihelp-undelete-summary": "Restaurer les versions d’une page supprimée.",
        "apihelp-undelete-extended-description": "Une liste des révisions supprimées (avec les horodatages) peut être récupérée via [[Special:ApiHelp/query+deletedrevisions|prop=deletedrevisions]], et une liste d’IDs de fichiers supprimés peut être récupérée via [[Special:ApiHelp/query+filearchive|list=filearchive]].",
        "apihelp-undelete-param-title": "Titre de la page à restaurer.",
        "apihelp-undelete-param-reason": "Motif de restauration.",
        "api-pageset-param-redirects-generator": "Résoudre automatiquement les redirections dans <var>$1titles</var>, <var>$1pageids</var> et <var>$1revids</var>, et dans les pages renvoyées par <var>$1generator</var>.",
        "api-pageset-param-redirects-nogenerator": "Résoudre automatiquement les redirections dans <var>$1titles</var>, <var>$1pageids</var> et <var>$1revids</var>.",
        "api-pageset-param-converttitles": "Convertir les titres dans d’autres variantes si nécessaire. Fonctionne uniquement si la langue de contenu du wiki prend en charge la conversion en variantes. Les langues qui prennent en charge la conversion en variantes incluent $1.",
-       "api-help-title": "API aide de MediaWiki",
+       "api-help-title": "Aide de l'API MediaWiki",
        "api-help-lead": "Ceci est une page d’aide de l’API de MediaWiki générée automatiquement.\n\nDocumentation et exemples : https://www.mediawiki.org/wiki/API",
        "api-help-main-header": "Module principal",
        "api-help-undocumented-module": "Aucune documentation pour le module $1.",
        "api-help-license-noname": "Licence : [[$1|Voir le lien]]",
        "api-help-license-unknown": "Licence : <span class=\"apihelp-unknown\">inconnue</span>",
        "api-help-parameters": "{{PLURAL:$1|Paramètre|Paramètres}} :",
-       "api-help-param-deprecated": "Désuet.",
+       "api-help-param-deprecated": "Obsolète.",
        "api-help-param-required": "Ce paramètre est obligatoire.",
        "api-help-param-templated": "Ceci est un [[Special:ApiHelp/main#main/templatedparams|paramètre de modèle]]. En faisant une requête, $2.",
        "api-help-param-templated-var-first": "<var>&#x7B;$1&#x7D;</var> dans le nom du paramètre doit être remplacé par des valeurs de <var>$2</var>",
        "api-help-param-list": "{{PLURAL:$1|1=Une des valeurs suivantes|2=Valeurs (séparées par <kbd>{{!}}</kbd> ou [[Special:ApiHelp/main#main/datatypes|autre]])}} : $2",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=Doit être vide|Peut être vide, ou $2}}",
        "api-help-param-limit": "Pas plus de $1 autorisé.",
-       "api-help-param-limit2": "Pas plus de $1 autorisé ($2 pour les robots).",
+       "api-help-param-limit2": "La valeur maximale autorisée est $1 ($2 pour les robots).",
        "api-help-param-integer-min": "{{PLURAL:$1|1=La valeur ne doit pas être inférieure|2=Les valeurs ne doivent pas être inférieures}} à $2.",
        "api-help-param-integer-max": "{{PLURAL:$1|1=La valeur ne doit pas être supérieure|2=Les valeurs ne doivent pas être supérieures}} à $3.",
        "api-help-param-integer-minmax": "{{PLURAL:$1|1=La valeur doit|2=Les valeurs doivent}} être entre $2 et $3.",
index 5992590..c72d60a 100644 (file)
        "apihelp-edit-param-text": "תוכן הדף.",
        "apihelp-edit-param-summary": "תקציר עריכה. גם כותרת פסקה כש־$1section=new ו־$1sectiontitle אינו מוגדר.",
        "apihelp-edit-param-tags": "אילו תגי שינוי להחיל על הגרסה.",
-       "apihelp-edit-param-minor": "ער×\99×\9b×\94 משנית.",
-       "apihelp-edit-param-notminor": "ש×\99× ×\95×\99 ×\9c×\90 ×\9eשנ×\99.",
+       "apihelp-edit-param-minor": "ס×\99×\9e×\95×\9f ×\94ער×\99×\9b×\94 ×\91ת×\95ר משנית.",
+       "apihelp-edit-param-notminor": "×\9c×\90 ×\9cס×\9e×\9f ×\90ת ×\94ער×\99×\9b×\94 ×\94×\96×\90ת ×\91ת×\95ר ×\9eשנ×\99ת ×\90פ×\99×\9c×\95 ×\9bש×\9e×\95פע×\9cת ×\94×\94×¢×\93פ×\94 \"{{int:tog-minordefault}}\".",
        "apihelp-edit-param-bot": "סימון עריכה זו כעריכת בוט.",
        "apihelp-edit-param-basetimestamp": "חותם־זמן של גרסת הבסיס, משמש לזיהוי התנגשויות עריכה. אפשר לקבל אותו באמצעות [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]].",
        "apihelp-edit-param-starttimestamp": "חותם־הזמן של תחילת תהליך העריכה, משמש לזיהוי התנגשויות. אפשר לקבל ערך מתאים באמצעות <var>[[Special:ApiHelp/main|curtimestamp]]</var> בעת תחילת תהליך העריכה (למשל בזמן טעינת תוכן הדף לעריכה).",
        "apihelp-query+filerepoinfo-paramvalue-prop-displayname": "שם אתר הוויקי של המאגר (בפורמט שמתאים לקריאה על־ידי אדם).",
        "apihelp-query+filerepoinfo-paramvalue-prop-favicon": "כתובת הצלמית של אתר הוויקי של המאגר, מתוך ההגדרה <var dir=\"ltr\">[[mw:Special:MyLanguage/Manual:$wgFavicon|$wgFavicon]]</var>.",
        "apihelp-query+filerepoinfo-paramvalue-prop-fetchDescription": "האם דפי תיאור של קבצים מאוחזרים מהמאגר הזה בעת צפייה בדפי תיאור של קבצים מקומיים.",
-       "apihelp-query+filerepoinfo-paramvalue-prop-initialCapital": "×\94×\90×\9d ×©×\9e×\95ת ×©×\9c ×§×\91צ×\99×\9d ×\9eת×\97×\99×\9c×\99×\9d ×\91×\90×\95ת ×\92×\93×\95×\9c×\94.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-initialCapital": "×\94×\90×\9d ×©×\9e×\95ת ×©×\9c ×§×\91צ×\99×\9d ×\9eת×\97×\99×\9c×\99×\9d ×\91×\90×\95ת ×¨×\99ש×\99ת.",
        "apihelp-query+filerepoinfo-paramvalue-prop-local": "האם המאגר הזה הוא המאגר המקומי או לא.",
        "apihelp-query+filerepoinfo-paramvalue-prop-name": "מפתח המאגר, שנמצא בשימוש למשל בערכים המוחזרים של <var dir=\"ltr\">[[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> ושל [[Special:ApiHelp/query+imageinfo|imageinfo]].",
        "apihelp-query+filerepoinfo-paramvalue-prop-rootUrl": "נתיב כתובת הבסיס עבור נתיבים של תמונות.",
index be336fb..06ac6a7 100644 (file)
@@ -13,7 +13,8 @@
                        "Siebrand",
                        "Purodha",
                        "Tacsipacsi",
-                       "D41D8CD98F"
+                       "D41D8CD98F",
+                       "Zoranzoki21"
                ]
        },
        "apihelp-main-summary": "{{doc-apihelp-summary|main}}",
        "apierror-unknownaction": "{{doc-apierror}}\n\nParameters:\n* $1 - Action provided.",
        "apierror-unknownerror-editpage": "{{doc-apierror}}\n\nParameters:\n* $1 - Error code (an integer).",
        "apierror-unknownerror-nocode": "{{doc-apierror}}",
-       "apierror-unknownerror": "{{doc-apierror}}\n\nParameters:\n* $1 - Error code (possibly a message key) not handled by ApiBase::parseMsg().",
+       "apierror-unknownerror": "{{doc-apierror}}\n\nParameters:\n* $1 - Error code (possibly a message key) not handled by an error handler.",
        "apierror-unknownformat": "{{doc-apierror}}\n\nParameters:\n* $1 - Format provided.",
        "apierror-unrecognizedparams": "{{doc-apierror}}\n\nParameters:\n* $1 - List of parameters.\n* $2 - Number of parameters.",
        "apierror-unrecognizedvalue": "{{doc-apierror}}\n\nParameters:\n* $1 - Parameter name.\n* $2 - Parameter value.",
index 38f74d6..57d9953 100644 (file)
@@ -26,7 +26,8 @@
                        "NeverBehave",
                        "Wbxshiori",
                        "Wxyveronica",
-                       "WhitePhosphorus"
+                       "WhitePhosphorus",
+                       "科劳"
                ]
        },
        "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 header将会返回一个包含\"MediaWiki-API-Error\"的值,随后header的值与error code将会送回并设置为相同的值。详细信息请参阅[[mw:Special:MyLanguage/API:Errors_and_warnings|API:错误与警告]]。\n\n<p class=\"mw-apisandbox-link\"><strong>测试中:</strong>测试API请求的易用性,请参见[[Special:ApiSandbox]]。</p>",
        "apihelp-edit-param-text": "页面内容。",
        "apihelp-edit-param-summary": "编辑摘要。当$1section=new且未设置$1sectiontitle时,还包括小节标题。",
        "apihelp-edit-param-tags": "应用到此修订的更改标签。",
-       "apihelp-edit-param-minor": "å°\8fç¼\96è¾\91ã\80\82",
+       "apihelp-edit-param-minor": "å°\86此次ç¼\96è¾\91æ \87记为å°\8fç¼\96è¾\91",
        "apihelp-edit-param-notminor": "不是小编辑。",
        "apihelp-edit-param-bot": "标记此编辑为机器人编辑。",
        "apihelp-edit-param-basetimestamp": "基础修订的时间戳,用于检测编辑冲突。可以通过[[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]]得到。",
index ba4c569..7b665ae 100644 (file)
@@ -111,7 +111,7 @@ class BlockManager {
         * @param bool $fromReplica Whether to check the replica DB first.
         *  To improve performance, non-critical checks are done against replica DBs.
         *  Check when actually saving should be done against master.
-        * @return Block|null The most relevant block, or null if there is no block.
+        * @return AbstractBlock|null The most relevant block, or null if there is no block.
         */
        public function getUserBlock( User $user, $fromReplica ) {
                $isAnon = $user->getId() === 0;
index 3455470..aad9439 100644 (file)
@@ -42,13 +42,11 @@ class LCStoreCDB implements LCStore {
        /** @var string Current language code */
        private $currentLang;
 
-       /** @var bool|string Cache directory. False if not set */
+       /** @var string Cache directory */
        private $directory;
 
        function __construct( $conf = [] ) {
-               global $wgCacheDirectory;
-
-               $this->directory = $conf['directory'] ?? $wgCacheDirectory;
+               $this->directory = $conf['directory'];
        }
 
        public function get( $code, $key ) {
index d3504a8..5911656 100644 (file)
@@ -39,9 +39,7 @@ class LCStoreStaticArray implements LCStore {
        private $directory;
 
        public function __construct( $conf = [] ) {
-               global $wgCacheDirectory;
-
-               $this->directory = $conf['directory'] ?? $wgCacheDirectory;
+               $this->directory = $conf['directory'];
        }
 
        public function startWrite( $code ) {
index 8a3a818..788eec3 100644 (file)
@@ -192,7 +192,11 @@ class LocalisationCache {
                global $wgCacheDirectory;
 
                $this->conf = $conf;
+
+               $directory = !empty( $conf['storeDirectory'] ) ? $conf['storeDirectory'] : $wgCacheDirectory;
                $storeArg = [];
+               $storeArg['directory'] = $directory;
+
                if ( !empty( $conf['storeClass'] ) ) {
                        $storeClass = $conf['storeClass'];
                } else {
@@ -209,10 +213,7 @@ class LocalisationCache {
                                        $storeClass = LCStoreStaticArray::class;
                                        break;
                                case 'detect':
-                                       if ( !empty( $conf['storeDirectory'] ) ) {
-                                               $storeClass = LCStoreCDB::class;
-                                       } elseif ( $wgCacheDirectory ) {
-                                               $storeArg['directory'] = $wgCacheDirectory;
+                                       if ( $directory ) {
                                                $storeClass = LCStoreCDB::class;
                                        } else {
                                                $storeClass = LCStoreDB::class;
@@ -227,9 +228,6 @@ class LocalisationCache {
                }
 
                wfDebugLog( 'caches', static::class . ": using store $storeClass" );
-               if ( !empty( $conf['storeDirectory'] ) ) {
-                       $storeArg['directory'] = $conf['storeDirectory'];
-               }
 
                $this->store = new $storeClass( $storeArg );
                foreach ( [ 'manualRecache', 'forceRecache' ] as $var ) {
index 8186059..8f32ba2 100644 (file)
@@ -184,9 +184,7 @@ class EnhancedChangesList extends ChangesList {
                        $tableClasses[] = Sanitizer::escapeClass( 'mw-changeslist-ns'
                                . $block[0]->mAttribs['rc_namespace'] . '-' . $block[0]->mAttribs['rc_title'] );
                }
-               if ( $block[0]->watched
-                       && $block[0]->mAttribs['rc_timestamp'] >= $block[0]->watched
-               ) {
+               if ( $block[0]->watched ) {
                        $tableClasses[] = 'mw-changeslist-line-watched';
                } else {
                        $tableClasses[] = 'mw-changeslist-line-not-watched';
@@ -219,7 +217,7 @@ class EnhancedChangesList extends ChangesList {
                foreach ( $block as $rcObj ) {
                        // If all log actions to this page were hidden, then don't
                        // give the name of the affected page for this block!
-                       if ( !$this->isDeleted( $rcObj, LogPage::DELETED_ACTION ) ) {
+                       if ( !static::isDeleted( $rcObj, LogPage::DELETED_ACTION ) ) {
                                $namehidden = false;
                        }
                        $u = $rcObj->userlink;
@@ -260,7 +258,8 @@ class EnhancedChangesList extends ChangesList {
                } elseif ( $allLogs ) {
                        $articleLink = $this->maybeWatchedLink( $block[0]->link, $block[0]->watched );
                } else {
-                       $articleLink = $this->getArticleLink( $block[0], $block[0]->unpatrolled, $block[0]->watched );
+                       $articleLink = $this->getArticleLink(
+                               $block[0], $block[0]->unpatrolled, $block[0]->watched );
                }
 
                $queryParams['curid'] = $curId;
@@ -386,9 +385,7 @@ class EnhancedChangesList extends ChangesList {
                $lineParams = [ 'targetTitle' => $rcObj->getTitle() ];
 
                $classes = [ 'mw-enhanced-rc' ];
-               if ( $rcObj->watched
-                       && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched
-               ) {
+               if ( $rcObj->watched ) {
                        $classes[] = 'mw-enhanced-watched';
                }
                $classes = array_merge( $classes, $this->getHTMLClasses( $rcObj, $rcObj->watched ) );
@@ -421,7 +418,7 @@ class EnhancedChangesList extends ChangesList {
                                [],
                                $params
                        );
-                       if ( $this->isDeleted( $rcObj, Revision::DELETED_TEXT ) ) {
+                       if ( static::isDeleted( $rcObj, Revision::DELETED_TEXT ) ) {
                                $link = '<span class="history-deleted">' . $link . '</span> ';
                        }
                }
@@ -503,7 +500,7 @@ class EnhancedChangesList extends ChangesList {
        /**
         * Generates amount of changes (linking to diff ) & link to history.
         *
-        * @param array $block
+        * @param RCCacheEntry[] $block
         * @param array $queryParams
         * @param bool $allLogs
         * @param bool $isnew
@@ -529,7 +526,7 @@ class EnhancedChangesList extends ChangesList {
                /** @var RCCacheEntry $rcObj */
                foreach ( $block as $rcObj ) {
                        // Same logic as below inside main foreach
-                       if ( $rcObj->watched && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched ) {
+                       if ( $rcObj->watched ) {
                                $sinceLast++;
                                $unvisitedOldid = $rcObj->mAttribs['rc_last_oldid'];
                        }
@@ -552,9 +549,10 @@ class EnhancedChangesList extends ChangesList {
                $block0 = $block[0];
                $last = $block[count( $block ) - 1];
                if ( !$allLogs ) {
-                       if ( !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() ) ||
+                       if (
                                $isnew ||
-                               $rcObj->mAttribs['rc_type'] == RC_CATEGORIZE
+                               $rcObj->mAttribs['rc_type'] == RC_CATEGORIZE ||
+                               !ChangesList::userCan( $rcObj, Revision::DELETED_TEXT, $this->getUser() )
                        ) {
                                $links['total-changes'] = Html::rawElement( 'span', [], $nchanges[$n] );
                        } else {
@@ -569,19 +567,24 @@ class EnhancedChangesList extends ChangesList {
                                                ]
                                        )
                                );
-                               if ( $sinceLast > 0 && $sinceLast < $n ) {
-                                       $links['total-changes-since-last'] = Html::rawElement( 'span', [],
-                                               $this->linkRenderer->makeKnownLink(
-                                                       $block0->getTitle(),
-                                                       new HtmlArmor( $sinceLastVisitMsg[$sinceLast] ),
-                                                       [ 'class' => 'mw-changeslist-groupdiff' ],
-                                                       $queryParams + [
-                                                               'diff' => $currentRevision,
-                                                               'oldid' => $unvisitedOldid,
-                                                       ]
-                                               )
-                                       );
-                               }
+                       }
+
+                       if (
+                               $rcObj->mAttribs['rc_type'] != RC_CATEGORIZE &&
+                               $sinceLast > 0 &&
+                               $sinceLast < $n
+                       ) {
+                               $links['total-changes-since-last'] = Html::rawElement( 'span', [],
+                                       $this->linkRenderer->makeKnownLink(
+                                               $block0->getTitle(),
+                                               new HtmlArmor( $sinceLastVisitMsg[$sinceLast] ),
+                                               [ 'class' => 'mw-changeslist-groupdiff' ],
+                                               $queryParams + [
+                                                       'diff' => $currentRevision,
+                                                       'oldid' => $unvisitedOldid,
+                                               ]
+                                       )
+                               );
                        }
                }
 
index 9f85aa1..6d9236a 100644 (file)
  */
 
 class RCCacheEntry extends RecentChange {
+       /** @var string|null */
        public $curlink;
+       /** @var string|null */
        public $difflink;
+       /** @var string|null */
        public $lastlink;
+       /** @var string|null */
        public $link;
+       /** @var string|null */
        public $timestamp;
+       /** @var bool|null */
        public $unpatrolled;
+       /** @var string|null */
        public $userlink;
+       /** @var string|null */
        public $usertalklink;
+       /** @var bool|null */
        public $watched;
-       public $mAttribs;
-       public $mExtra;
 
        /**
         * @param RecentChange $rc
index 0601397..9146429 100644 (file)
@@ -1470,15 +1470,6 @@ class ChangeTags {
                MediaWikiServices::getInstance()->getChangeTagDefStore()->reloadMap();
        }
 
-       /**
-        * Invalidates the tag statistics cache only.
-        * @since 1.25
-        * @deprecated since 1.33 the cache this purges no longer exists
-        */
-       public static function purgeTagUsageCache() {
-               wfDeprecated( __METHOD__, '1.33' );
-       }
-
        /**
         * Returns a map of any tags used on the wiki to number of edits
         * tagged with them, ordered descending by the hitcount.
index cb7ff19..c16d9f7 100644 (file)
@@ -252,6 +252,7 @@ class MWException extends Exception {
                        header( $header );
                }
        }
+
        private static function statusHeader( $code ) {
                if ( !headers_sent() ) {
                        HttpStatus::header( $code );
index e02cd83..ca63dfe 100644 (file)
@@ -83,13 +83,18 @@ class WikiExporter {
         *   - limit: maximum number of rows to return
         *   - dir: "asc" or "desc" timestamp order
         * @param int $text One of WikiExporter::TEXT or WikiExporter::STUB
+        * @param null|array $limitNamespaces Comma-separated list of namespace numbers
+        *   to limit results
         */
-       function __construct( $db, $history = self::CURRENT, $text = self::TEXT ) {
+       function __construct( $db, $history = self::CURRENT, $text = self::TEXT,
+                       $limitNamespaces = null
+       ) {
                $this->db = $db;
                $this->history = $history;
                $this->writer = new XmlDumpWriter( $text, self::schemaVersion() );
                $this->sink = new DumpOutput();
                $this->text = $text;
+               $this->limitNamespaces = $limitNamespaces;
        }
 
        /**
@@ -468,6 +473,11 @@ class WikiExporter {
         */
        protected function outputPageStreamBatch( $results, $lastRow ) {
                foreach ( $results as $row ) {
+                       if ( $this->limitNamespaces &&
+                               !in_array( $row->page_namespace, $this->limitNamespaces ) ) {
+                               $lastRow = $row;
+                               continue;
+                       }
                        if ( $lastRow === null ||
                                $lastRow->page_namespace !== $row->page_namespace ||
                                $lastRow->page_title !== $row->page_title ) {
diff --git a/includes/filerepo/FileRepoStatus.php b/includes/filerepo/FileRepoStatus.php
deleted file mode 100644 (file)
index 538e9bc..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-/**
- * Generic operation result for FileRepo-related operations.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup FileRepo
- */
-
-/**
- * Generic operation result class for FileRepo-related operations
- * @ingroup FileRepo
- * @deprecated since 1.25
- */
-class FileRepoStatus extends Status {
-}
index 08520b7..8e5567b 100644 (file)
@@ -140,7 +140,7 @@ class HttpRequestFactory {
         * @return string|null
         */
        public function get( $url, array $options = [], $caller = __METHOD__ ) {
-               $this->request( 'GET', $url, $options, $caller );
+               return $this->request( 'GET', $url, $options, $caller );
        }
 
        /**
@@ -153,7 +153,7 @@ class HttpRequestFactory {
         * @return string|null
         */
        public function post( $url, array $options = [], $caller = __METHOD__ ) {
-               $this->request( 'POST', $url, $options, $caller );
+               return $this->request( 'POST', $url, $options, $caller );
        }
 
        /**
index 9432999..512f032 100644 (file)
        "config-db-prefix-help": "Si precises compartir una base de datos ente múltiples wikis, o ente MediaWiki y otra aplicación web, puedes optar por amestar un prefixu a tolos nomes de tabla pa evitar conflictos.\nNun utilices espacios.\n\nDe normal déxase esti campu vacío.",
        "config-mysql-old": "Precísase MySQL $1 o posterior. Tienes $2.",
        "config-db-port": "Puertu de la base de datos:",
-       "config-db-schema": "Esquema pa MediaWiki:",
+       "config-db-schema": "Esquema pa MediaWiki (ensin guiones):",
        "config-db-schema-help": "Esti esquema de vezu va tar bien.\nCamúdalos solo si sabes que lo precises.",
        "config-pg-test-error": "Nun puede coneutase cola base de datos <strong>$1</strong>: $2",
        "config-sqlite-dir": "Direutoriu de datos SQLite:",
        "config-invalid-db-server-oracle": "TNS inválidu pa la base de datos «$1».\nUsa una cadena «TNS Name» o «Easy Connect» ([http://docs.oracle.com/cd/E11882_01/network.112/e10836/naming.htm Métodos de nomenclatura d'Oracle]).",
        "config-invalid-db-name": "Nome inválidu de la base de datos «$1».\nUsa sólo lletres ASCII (a-z, A-Z), númberos (0-9), guiones baxos (_) y guiones (-).",
        "config-invalid-db-prefix": "Prefixu inválidu pa la base de datos «$1».\nUsa sólo lletres ASCII (a-z, A-Z), númberos (0-9), guiones baxos (_) y guiones (-).",
-       "config-connection-error": "$1.\n\nComprueba'l sirvidor, el nome d'usuariu y la contraseña, y tenta nuevamente.",
+       "config-connection-error": "$1.\n\nComprueba'l sirvidor, el nome d'usuariu y la contraseña, y tenta nuevamente.Si uses \"localhost\" como sirvidor de base de datos, tenta usando \"127.0.0.1\" nel so llugar (o viceversa).",
        "config-invalid-schema": "Esquema inválidu «$1» pa MediaWiki.\nUsa sólo lletres ASCII (a-z, A-Z), númberos (0-9) y guiones baxos (_).",
        "config-db-sys-create-oracle": "L'instalador namái sofita l'usu d'una cuenta SYSDBA pa la creación d'otra cuenta nueva.",
        "config-db-sys-user-exists-oracle": "La cuenta d'usuariu «$1» yá esiste. ¡SYSDBA sólo puede utilizase pa crear una nueva cuenta!",
index 4a98d5d..21c7249 100644 (file)
@@ -71,7 +71,7 @@
        "config-admin-name": "Nameyê şımayê karberi:",
        "config-admin-password": "Parola:",
        "config-admin-password-confirm": "Fına parola:",
-       "config-admin-email": "Adresa e-postey:",
+       "config-admin-email": "Adresa e-posteyi:",
        "config-profile-wiki": "Wiki Ak",
        "config-profile-private": "Bexse wiki",
        "config-license": "Heqa telifi û lisans:",
index dca1df5..66eca85 100644 (file)
@@ -9,7 +9,8 @@
                        "Strainu",
                        "Fitoschido",
                        "WebSourceContentRO",
-                       "MSClaudiu"
+                       "MSClaudiu",
+                       "Andrei Stroe"
                ]
        },
        "config-desc": "Programul de instalare pentru MediaWiki",
@@ -79,7 +80,7 @@
        "config-db-host": "Gazdă bază de date:",
        "config-db-host-oracle": "Baza de date TNS:",
        "config-db-wiki-settings": "Identificați acest wiki",
-       "config-db-name": "Numele bazei de date:",
+       "config-db-name": "Numele bazei de date (fără cratime):",
        "config-db-name-oracle": "Schema bazei de date:",
        "config-db-install-account": "Contul de utilizator pentru instalare",
        "config-db-username": "Nume de utilizator pentru baza de date:",
        "config-db-install-help": "Introduceți numele de utilizator și parola care vor fi utilizate pentru conexiunea la baza de date în timpul procesului de instalare.",
        "config-db-account-lock": "Folosește același nume de utilizator și parolă în timpul funcționării normale",
        "config-db-wiki-account": "Contul de utilizator pentru funcționarea normală",
-       "config-db-prefix": "Prefixul tabelelor din baza de date:",
+       "config-db-prefix": "Prefixul tabelelor din baza de date (fără cratime):",
        "config-db-port": "Portul bazei de date:",
-       "config-db-schema": "Schema pentru MediaWiki:",
+       "config-db-schema": "Schema pentru MediaWiki (fără cratime):",
        "config-sqlite-dir": "Director de date SQLite:",
        "config-oracle-def-ts": "Spațiu de stocare („tablespace”) implicit:",
        "config-oracle-temp-ts": "Spațiu de stocare („tablespace”) temporar:",
        "config-type-mysql": "MariaDB, MySQL sau compatibil",
        "config-type-mssql": "Microsoft SQL Server",
-       "config-header-mysql": "Setările MySQL",
+       "config-header-mysql": "Setările MariaDB/MySQL",
        "config-header-postgres": "Setări PostgreSQL",
        "config-header-sqlite": "Setări SQLite",
        "config-header-oracle": "Setări Oracle",
        "config-missing-db-name": "Trebuie să introduceți o valoare pentru „{{int:config-db-name}}”.",
        "config-missing-db-host": "Trebuie să introduceți o valoare pentru „{{int:config-db-host}}”.",
        "config-missing-db-server-oracle": "Trebuie să introduceți o valoare pentru „{{int:config-db-host-oracle}}”.",
-       "config-connection-error": "$1.\n\nVerificați gazda, numele de utilizator și parola și reîncercați.",
+       "config-connection-error": "$1.\n\nVerificați hostul, numele de utilizator și parola și reîncercați. Dacă folosiți „localhost” drept host al bazei de date, încercați mai bine „127.0.0.1” (sau invers).",
        "config-upgrade-done-no-regenerate": "Actualizare completă.\n\nAcum puteți [$1 începe să vă folosiți wikiul].",
        "config-regenerate": "Regenerare LocalSettings.php →",
        "config-unknown-collation": "AVERTISMENT: Baza de date folosește o colaționare nerecunoscută.",
        "config-db-web-account": "Contul bazei de date pentru accesul web.",
        "config-db-web-create": "Creați contul dacă nu există deja",
        "config-mysql-engine": "Motor de stocare:",
-       "config-mysql-innodb": "InnoDB",
+       "config-mysql-innodb": "InnoDB (recomandat)",
        "config-mysql-myisam": "MyISAM",
        "config-mssql-auth": "Tip de autentificare:",
        "config-site-name": "Numele wikiului:",
        "config-download-localsettings": "Descarcă <code>LocalSettings.php</code>",
        "config-help": "ajutor",
        "config-help-tooltip": "clic pentru a extinde",
-       "mainpagetext": "'''Programul Wiki a fost instalat cu succes.'''",
-       "mainpagedocfooter": "Consultați [https://meta.wikimedia.org/wiki/Help:Contents Ghidul utilizatorului (en)] pentru informații despre utilizarea software-ului wiki.\n\n== Primii pași ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista parametrilor configurabili (en)]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Întrebări frecvente despre MediaWiki (en)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discuții a MediaWiki (en)]"
+       "mainpagetext": "<strong>Programul Wiki a fost instalat.</strong>",
+       "mainpagedocfooter": "Consultați [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Ghidul utilizatorului] pentru informații despre utilizarea software-ului wiki.\n\n== Primii pași ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista de setări de configurare]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Întrebări frecvente despre MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de e-mail pentru release-urile MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localizați MediaWiki în limba dumneavoastră]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Învățați cum să combateți spamul pe wikiul dumneavoastră]"
 }
index 2fce89e..1460fec 100644 (file)
@@ -14,7 +14,7 @@
        "config-localsettings-cli-upgrade": "ఓ <code>LocalSettings.php</code> ఫైలు కనబడింది.\nఈ స్థాపనను ఉన్నతీకరించడానికి, దాని బదులు <code>update.php</code> ను రన్ చెయ్యండి.",
        "config-localsettings-key": "ఉన్నతీకరణ కీ:",
        "config-localsettings-badkey": "మీరిచ్చిన కీ తప్పు.",
-       "config-upgrade-key-missing": "MediaWiki యొక్క ఒక స్థాపన కనబడింది.\nదాన్ని ఉన్నతీకరించడానికి, కింది లైనును <code>LocalSettings.php</code> లో అట్టడుగున ఉంచండి:\n\n$1",
+       "config-upgrade-key-missing": "ఇప్పటికే ఉన్న MediaWiki స్థాపన కనబడింది.\nదాన్ని నవీకరించడానికి, కింది లైనును <code>LocalSettings.php</code> లో అట్టడుగున ఉంచండి:\n\n$1",
        "config-localsettings-incomplete": "ఇప్పటి <code>LocalSettings.php</code> అసంపూర్తిగా ఉన్నట్లుగా కనబడుతోంది.\n$1 చరరాశిని సెట్ చెయ్యలేదు.\nఈ చరరాశిని సెట్ చేస్తూ <code>LocalSettings.php</code> ను మార్చి, \"{{int:Config-continue}}\" ను నొక్కండి.",
        "config-localsettings-connection-error": "<code>LocalSettings.php</code> లో ఇచ్చిన సెట్టింగులను వాడుతూ డేటాబేసుకు కనెక్టు కాబోతే, లోపం తలెత్తింది. ఈ సెట్టింగులను సరిచేసి మళ్ళీ ప్రయత్నించండి.\n\n$1",
        "config-session-error": "సెషన్ను ప్రారంభించబోతే లోపం జరిగింది: $1",
        "config-mssql-auth": "ఆథెంటికేషన్ రకం:",
        "config-mssql-sqlauth": "SQL Server ఆథెంటికేషన్",
        "config-mssql-windowsauth": "విండోస్ ఆథెంటికేషన్",
-       "config-site-name": "విà°\95à±\80 à°¯à±\8aà°\95à±\8dà°\95 à°ªà±\87à°°à±\81:",
+       "config-site-name": "వికీ పేరు:",
        "config-site-name-help": "ఇది బ్రౌజరు టిటిలుబారు లోను, అనేక ఇతర చోట్లా కనిపిస్తుంది.",
        "config-site-name-blank": "ఓ సైటు పేరును ఇవ్వండి.",
        "config-project-namespace": "ప్రాజెక్టు పేరుబరి:",
index 83e5fb2..7a0d4ea 100644 (file)
@@ -187,10 +187,6 @@ class JobQueueGroup {
        /**
         * Buffer jobs for insertion via push() or call it now if in CLI mode
         *
-        * Note that pushLazyJobs() is registered as a deferred update just before
-        * DeferredUpdates::doUpdates() in MediaWiki and JobRunner classes in order
-        * to be executed as the very last deferred update (T100085, T154425).
-        *
         * @param IJobSpecification|IJobSpecification[] $jobs A single Job or a list of Jobs
         * @return void
         * @since 1.26
@@ -214,17 +210,6 @@ class JobQueueGroup {
                DeferredUpdates::addUpdate( new JobQueueEnqueueUpdate( $this->domain, $jobs ) );
        }
 
-       /**
-        * Push all jobs buffered via lazyPush() into their respective queues
-        *
-        * @return void
-        * @since 1.26
-        * @deprecated Since 1.33 Not needed anymore
-        */
-       public static function pushLazyJobs() {
-               wfDeprecated( __METHOD__, '1.33' );
-       }
-
        /**
         * Pop a job off one of the job queues
         *
index adb9bb8..1ed91ea 100644 (file)
@@ -136,6 +136,7 @@ class MultiWriteBagOStuff extends BagOStuff {
 
                return $value;
        }
+
        public function set( $key, $value, $exptime = 0, $flags = 0 ) {
                return $this->doWrite(
                        $this->cacheIndexes,
@@ -205,6 +206,7 @@ class MultiWriteBagOStuff extends BagOStuff {
                // Only the first cache is locked
                return $this->caches[0]->unlock( $key );
        }
+
        /**
         * Delete objects expiring before a certain date.
         *
@@ -289,6 +291,7 @@ class MultiWriteBagOStuff extends BagOStuff {
        public function clearLastError() {
                $this->caches[0]->clearLastError();
        }
+
        /**
         * Apply a write method to the backing caches specified by $indexes (in order)
         *
index 0fde386..6dfa8d3 100644 (file)
@@ -548,6 +548,7 @@ class Exif {
        /**#@+
         * @return array
         */
+
        /**
         * Get $this->mRawExifData
         * @return array
index edec490..9cfbfbf 100644 (file)
@@ -31,5 +31,6 @@
  */
 interface Pager {
        function getNavigationBar();
+
        function getBody();
 }
index 7ce96be..0c745c9 100644 (file)
@@ -514,6 +514,7 @@ class CoreParserFunctions {
        public static function numberofusers( $parser, $raw = null ) {
                return self::formatRaw( SiteStats::users(), $raw, $parser->getFunctionLang() );
        }
+
        public static function numberofactiveusers( $parser, $raw = null ) {
                return self::formatRaw( SiteStats::activeUsers(), $raw, $parser->getFunctionLang() );
        }
@@ -545,6 +546,7 @@ class CoreParserFunctions {
                        $parser->getFunctionLang()
                );
        }
+
        public static function numberingroup( $parser, $name = '', $raw = null ) {
                return self::formatRaw(
                        SiteStats::numberingroup( strtolower( $name ) ),
@@ -569,6 +571,7 @@ class CoreParserFunctions {
                }
                return str_replace( '_', ' ', $t->getNsText() );
        }
+
        public static function namespacee( $parser, $title = null ) {
                $t = Title::newFromText( $title );
                if ( is_null( $t ) ) {
@@ -576,6 +579,7 @@ class CoreParserFunctions {
                }
                return wfUrlencode( $t->getNsText() );
        }
+
        public static function namespacenumber( $parser, $title = null ) {
                $t = Title::newFromText( $title );
                if ( is_null( $t ) ) {
@@ -583,6 +587,7 @@ class CoreParserFunctions {
                }
                return $t->getNamespace();
        }
+
        public static function talkspace( $parser, $title = null ) {
                $t = Title::newFromText( $title );
                if ( is_null( $t ) || !$t->canHaveTalkPage() ) {
@@ -590,6 +595,7 @@ class CoreParserFunctions {
                }
                return str_replace( '_', ' ', $t->getTalkNsText() );
        }
+
        public static function talkspacee( $parser, $title = null ) {
                $t = Title::newFromText( $title );
                if ( is_null( $t ) || !$t->canHaveTalkPage() ) {
@@ -597,6 +603,7 @@ class CoreParserFunctions {
                }
                return wfUrlencode( $t->getTalkNsText() );
        }
+
        public static function subjectspace( $parser, $title = null ) {
                $t = Title::newFromText( $title );
                if ( is_null( $t ) ) {
@@ -604,6 +611,7 @@ class CoreParserFunctions {
                }
                return str_replace( '_', ' ', $t->getSubjectNsText() );
        }
+
        public static function subjectspacee( $parser, $title = null ) {
                $t = Title::newFromText( $title );
                if ( is_null( $t ) ) {
@@ -626,6 +634,7 @@ class CoreParserFunctions {
                }
                return wfEscapeWikiText( $t->getText() );
        }
+
        public static function pagenamee( $parser, $title = null ) {
                $t = Title::newFromText( $title );
                if ( is_null( $t ) ) {
@@ -633,6 +642,7 @@ class CoreParserFunctions {
                }
                return wfEscapeWikiText( $t->getPartialURL() );
        }
+
        public static function fullpagename( $parser, $title = null ) {
                $t = Title::newFromText( $title );
                if ( is_null( $t ) || !$t->canHaveTalkPage() ) {
@@ -640,6 +650,7 @@ class CoreParserFunctions {
                }
                return wfEscapeWikiText( $t->getPrefixedText() );
        }
+
        public static function fullpagenamee( $parser, $title = null ) {
                $t = Title::newFromText( $title );
                if ( is_null( $t ) || !$t->canHaveTalkPage() ) {
@@ -647,6 +658,7 @@ class CoreParserFunctions {
                }
                return wfEscapeWikiText( $t->getPrefixedURL() );
        }
+
        public static function subpagename( $parser, $title = null ) {
                $t = Title::newFromText( $title );
                if ( is_null( $t ) ) {
@@ -654,6 +666,7 @@ class CoreParserFunctions {
                }
                return wfEscapeWikiText( $t->getSubpageText() );
        }
+
        public static function subpagenamee( $parser, $title = null ) {
                $t = Title::newFromText( $title );
                if ( is_null( $t ) ) {
@@ -661,6 +674,7 @@ class CoreParserFunctions {
                }
                return wfEscapeWikiText( $t->getSubpageUrlForm() );
        }
+
        public static function rootpagename( $parser, $title = null ) {
                $t = Title::newFromText( $title );
                if ( is_null( $t ) ) {
@@ -668,6 +682,7 @@ class CoreParserFunctions {
                }
                return wfEscapeWikiText( $t->getRootText() );
        }
+
        public static function rootpagenamee( $parser, $title = null ) {
                $t = Title::newFromText( $title );
                if ( is_null( $t ) ) {
@@ -675,6 +690,7 @@ class CoreParserFunctions {
                }
                return wfEscapeWikiText( wfUrlencode( str_replace( ' ', '_', $t->getRootText() ) ) );
        }
+
        public static function basepagename( $parser, $title = null ) {
                $t = Title::newFromText( $title );
                if ( is_null( $t ) ) {
@@ -682,6 +698,7 @@ class CoreParserFunctions {
                }
                return wfEscapeWikiText( $t->getBaseText() );
        }
+
        public static function basepagenamee( $parser, $title = null ) {
                $t = Title::newFromText( $title );
                if ( is_null( $t ) ) {
@@ -689,6 +706,7 @@ class CoreParserFunctions {
                }
                return wfEscapeWikiText( wfUrlencode( str_replace( ' ', '_', $t->getBaseText() ) ) );
        }
+
        public static function talkpagename( $parser, $title = null ) {
                $t = Title::newFromText( $title );
                if ( is_null( $t ) || !$t->canHaveTalkPage() ) {
@@ -696,6 +714,7 @@ class CoreParserFunctions {
                }
                return wfEscapeWikiText( $t->getTalkPage()->getPrefixedText() );
        }
+
        public static function talkpagenamee( $parser, $title = null ) {
                $t = Title::newFromText( $title );
                if ( is_null( $t ) || !$t->canHaveTalkPage() ) {
@@ -703,6 +722,7 @@ class CoreParserFunctions {
                }
                return wfEscapeWikiText( $t->getTalkPage()->getPrefixedURL() );
        }
+
        public static function subjectpagename( $parser, $title = null ) {
                $t = Title::newFromText( $title );
                if ( is_null( $t ) ) {
@@ -710,6 +730,7 @@ class CoreParserFunctions {
                }
                return wfEscapeWikiText( $t->getSubjectPage()->getPrefixedText() );
        }
+
        public static function subjectpagenamee( $parser, $title = null ) {
                $t = Title::newFromText( $title );
                if ( is_null( $t ) ) {
index 8e8cd98..2585872 100644 (file)
@@ -57,6 +57,7 @@ class ParserCache {
         * @var string
         */
        private $cacheEpoch;
+
        /**
         * Get an instance of this object
         *
index cc70713..ef22a1f 100644 (file)
@@ -498,6 +498,7 @@ class ParserOutput extends CacheTime {
        public function setNoGallery( $value ) {
                $this->mNoGallery = (bool)$value;
        }
+
        public function getNoGallery() {
                return $this->mNoGallery;
        }
@@ -628,12 +629,15 @@ class ParserOutput extends CacheTime {
        public function setNewSection( $value ) {
                $this->mNewSection = (bool)$value;
        }
+
        public function hideNewSection( $value ) {
                $this->mHideNewSection = (bool)$value;
        }
+
        public function getHideNewSection() {
                return (bool)$this->mHideNewSection;
        }
+
        public function getNewSection() {
                return (bool)$this->mNewSection;
        }
index 2d75c86..cb85627 100644 (file)
@@ -9,6 +9,7 @@ use RemexHtml\Tokenizer\Tokenizer;
  */
 class RemexStripTagHandler implements TokenHandler {
        private $text = '';
+
        public function getResult() {
                return $this->text;
        }
@@ -16,15 +17,19 @@ class RemexStripTagHandler implements TokenHandler {
        function startDocument( Tokenizer $t, $fns, $fn ) {
                // Do nothing.
        }
+
        function endDocument( $pos ) {
                // Do nothing.
        }
+
        function error( $text, $pos ) {
                // Do nothing.
        }
+
        function characters( $text, $start, $length, $sourceStart, $sourceLength ) {
                $this->text .= substr( $text, $start, $length );
        }
+
        function startTag( $name, Attributes $attrs, $selfClose, $sourceStart, $sourceLength ) {
                // Inject whitespace for typical block-level tags to
                // prevent merging unrelated<br>words.
@@ -32,6 +37,7 @@ class RemexStripTagHandler implements TokenHandler {
                        $this->text .= ' ';
                }
        }
+
        function endTag( $name, $sourceStart, $sourceLength ) {
                // Inject whitespace for typical block-level tags to
                // prevent merging unrelated<br>words.
@@ -39,9 +45,11 @@ class RemexStripTagHandler implements TokenHandler {
                        $this->text .= ' ';
                }
        }
+
        function doctype( $name, $public, $system, $quirks, $sourceStart, $sourceLength ) {
                // Do nothing.
        }
+
        function comment( $text, $sourceStart, $sourceLength ) {
                // Do nothing.
        }
index b99c0d3..9771e88 100644 (file)
@@ -235,20 +235,6 @@ abstract class SearchEngine {
                return MediaWikiServices::getInstance()->getContentLanguage()->segmentByWord( $string );
        }
 
-       /**
-        * Transform search term in cases when parts of the query came as different
-        * GET params (when supported), e.g. for prefix queries:
-        * search=test&prefix=Main_Page/Archive -> test prefix:Main Page/Archive
-        * @param string $term
-        * @return string
-        * @deprecated since 1.32 this should now be handled internally by the
-        * search engine
-        */
-       public function transformSearchTerm( $term ) {
-               wfDeprecated( __METHOD__, '1.32' );
-               return $term;
-       }
-
        /**
         * Get service class to finding near matches.
         * @param Config $config Configuration to use for the matcher.
index bd19a84..f85c58f 100644 (file)
@@ -285,7 +285,7 @@ class SearchResult {
                if ( $extensionData instanceof Closure ) {
                        $this->extensionData = $extensionData;
                } elseif ( is_array( $extensionData ) ) {
-                       wfDeprecated( __METHOD__ . ' with array argument', 1.32 );
+                       wfDeprecated( __METHOD__ . ' with array argument', '1.32' );
                        $this->extensionData = function () use ( $extensionData ) {
                                return $extensionData;
                        };
index f4b574b..2470b41 100644 (file)
@@ -1190,6 +1190,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
        // to include data on filters that use the unstructured UI.  messageKeys is a
        // special top-level value, with the value being an array of the message keys to
        // send to the client.
+
        /**
         * Gets structured filter information needed by JS
         *
index bd0e24f..670a0b8 100644 (file)
@@ -162,6 +162,7 @@ class SpecialPage implements MessageLocalizer {
        }
 
        // @todo FIXME: Decide which syntax to use for this, and stick to it
+
        /**
         * Whether this special page is listed in Special:SpecialPages
         * @since 1.3 (r3583)
index 812f1b0..56f5c8f 100644 (file)
@@ -554,6 +554,9 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                                $rc->numberofWatchingusers = 0;
                        }
 
+                       // XXX: this treats pages with no unseen changes as "not on the watchlist" since
+                       // everything is on the watchlist and it is an easy way to make pages with unseen
+                       // changes appear bold. @TODO: clean this up.
                        $changeLine = $list->recentChangesLine( $rc, $unseen, $counter );
                        if ( $changeLine !== false ) {
                                $s .= $changeLine;
@@ -865,16 +868,16 @@ class SpecialWatchlist extends ChangesListSpecialPage {
         * @return bool User viewed the revision or a newer one
         */
        protected function isChangeEffectivelySeen( RecentChange $rc ) {
-               $lastVisitTs = $this->getLatestSeenTimestampIfHasUnseen( $rc );
+               $firstUnseen = $this->getLatestNotificationTimestamp( $rc );
 
-               return $lastVisitTs === null || $lastVisitTs > $rc->getAttribute( 'rc_timestamp' );
+               return ( $firstUnseen === null || $firstUnseen > $rc->getAttribute( 'rc_timestamp' ) );
        }
 
        /**
         * @param RecentChange $rc
-        * @return string|null TS_MW timestamp or null if all revision were seen
+        * @return string|null TS_MW timestamp of first unseen revision or null if there isn't one
         */
-       private function getLatestSeenTimestampIfHasUnseen( RecentChange $rc ) {
+       private function getLatestNotificationTimestamp( RecentChange $rc ) {
                return $this->watchStore->getLatestNotificationTimestamp(
                        $rc->getAttribute( 'wl_notificationtimestamp' ),
                        $rc->getPerformer(),
index 778fb3f..5021a1c 100644 (file)
@@ -283,7 +283,7 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
                # Strip Unicode bidi override characters.
                # Sometimes they slip into cut-n-pasted page titles, where the
                # override chars get included in list displays.
-               $dbkey = preg_replace( '/\xE2\x80[\x8E\x8F\xAA-\xAE]/S', '', $dbkey );
+               $dbkey = preg_replace( '/[\x{200E}\x{200F}\x{202A}-\x{202E}]+/u', '', $dbkey );
 
                # Clean up whitespace
                # Note: use of the /u option on preg_replace here will cause
index cee8c03..d7733ab 100644 (file)
@@ -23,6 +23,7 @@
 
 class UploadChunkVerificationException extends MWException {
        public $msg;
+
        public function __construct( array $res ) {
                $this->msg = wfMessage( ...$res );
                parent::__construct( wfMessage( ...$res )
index bd4360e..ec25002 100644 (file)
@@ -1103,6 +1103,14 @@ class WatchedItemStore implements WatchedItemStoreInterface, StatsdAwareInterfac
                return "{$target->getNamespace()}:{$target->getDBkey()}";
        }
 
+       /**
+        * @param UserIdentity $user
+        * @param LinkTarget $title
+        * @param WatchedItem $item
+        * @param bool $force
+        * @param int|bool $oldid The ID of the last revision that the user viewed
+        * @return bool|string|null
+        */
        private function getNotificationTimestamp(
                UserIdentity $user, LinkTarget $title, $item, $force, $oldid
        ) {
@@ -1112,7 +1120,8 @@ class WatchedItemStore implements WatchedItemStoreInterface, StatsdAwareInterfac
                }
 
                $oldRev = $this->revisionLookup->getRevisionById( $oldid );
-               if ( !$this->revisionLookup->getNextRevision( $oldRev, $title ) ) {
+               $nextRev = $this->revisionLookup->getNextRevision( $oldRev, $title );
+               if ( !$nextRev ) {
                        // Oldid given and is the latest revision for this title; clear the timestamp.
                        return null;
                }
@@ -1129,6 +1138,8 @@ class WatchedItemStore implements WatchedItemStoreInterface, StatsdAwareInterfac
                // Oldid given and isn't the latest; update the timestamp.
                // This will result in no further notification emails being sent!
                $notificationTimestamp = $this->revisionLookup->getTimestampFromId( $oldid );
+               // @FIXME: this should use getTimestamp() for consistency with updates on new edits
+               // $notificationTimestamp = $nextRev->getTimestamp(); // first unseen revision timestamp
 
                // We need to go one second to the future because of various strict comparisons
                // throughout the codebase
index 5ff29d0..1cf3288 100644 (file)
@@ -239,7 +239,7 @@ interface WatchedItemStoreInterface {
         * @param UserIdentity $editor The editor that triggered the update. Their notification
         *  timestamp will not be updated(they have already seen it)
         * @param LinkTarget $target The target to update timestamps for
-        * @param string $timestamp Set the update timestamp to this value
+        * @param string $timestamp Set the update (first unseen revision) timestamp to this value
         *
         * @return int[] Array of user IDs the timestamp has been updated for
         */
@@ -341,7 +341,7 @@ interface WatchedItemStoreInterface {
         * @param string|null $timestamp Value of wl_notificationtimestamp from the DB
         * @param UserIdentity $user
         * @param LinkTarget $target
-        * @return string|null TS_MW timestamp or null if all revision were seen
+        * @return string|null TS_MW timestamp of first unseen revision or null if there isn't one
         */
        public function getLatestNotificationTimestamp(
                $timestamp, UserIdentity $user, LinkTarget $target );
index 0c06ebf..70e707b 100644 (file)
        "rev-deleted-event": "(فعل السجل تمت إزالته)",
        "rev-deleted-user-contribs": "[اسم المستخدم أو عنوان الأيبي تمت إزالته - التعديل مخفي من المساهمات]",
        "rev-deleted-text-permission": "'''حُذِفت''' مراجعة هذه الصفحة.\nيمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
-       "rev-deleted-text-unhide": "'''حُذِفت''' مراجعة الصفحة هذه.\nيمكن العثور على تفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].\nمازال بإمكانك [$1 رؤية هذه المراجعة] إذا أردت المتابعة.",
+       "rev-deleted-text-unhide": "<strong>حُذِفت</strong> مراجعة الصفحة هذه.\nيمكن العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].\nمازال بإمكانك [$1 رؤية هذه المراجعة] إذا أردت المتابعة.",
        "rev-suppressed-text-unhide": "'''أُخفيت''' مراجعة الصفحة هذه.\nيمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل الإخفاء].\nبإمكانك [$1 رؤية هذه المراجعة] إذا أردت المتابعة.",
        "rev-deleted-text-view": "'''حُذِفت''' مراجعة هذه الصفحة.\nيمكنك رؤيتها؛ ويمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
        "rev-suppressed-text-view": "'''أُخفيت''' مراجعة الصفحة هذه.\nيمكنك رؤيتها؛ ويمكنك العثور على التفاصيل في  [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل الإخفاء].",
        "revdelete-suppress": "أخف البيانات عن مديري النظام والبقية",
        "revdelete-unsuppress": "إزالة الضوابط من المراجعات المسترجعة",
        "revdelete-log": "السبب:",
-       "revdelete-submit": "طبق على {{PLURAL:$1||المراجعة المختارة|المراجعتين المختارتين|المراجعات المختارة}}",
+       "revdelete-submit": "تطبÙ\8aق على {{PLURAL:$1||المراجعة المختارة|المراجعتين المختارتين|المراجعات المختارة}}",
        "revdelete-success": "'''تم تحديث رؤية المراجعات بنجاح.'''",
        "revdelete-failure": "'''تعذر تحديث رؤية المراجعة:'''\n$1",
        "logdelete-success": "'''تم ضبط رؤية السجلات بنجاح.'''",
index b3df9ec..a0c8293 100644 (file)
        "talk": "Mōtung",
        "views": "Sihþa",
        "toolbox": "Tōl",
+       "tool-link-userrights": "Andwend {{GENDER:$1|brucend}} heapas",
+       "tool-link-userrights-readonly": "Gehawa {{GENDER:$1|brucend}} heapas",
+       "tool-link-emailuser": "Send þissum {{GENDER:$1|brucend}} hrædærendgewrite",
        "imagepage": "Sēon ymelan tramet",
        "mediawikipage": "Sēon ǣrendgewrita tramet",
        "templatepage": "Sēon bysene tramet",
        "jumptonavigation": "þurhfōr",
        "jumptosearch": "sēcan",
        "view-pool-error": "Wālā, þā þegntōlas nū oferlīce wyrcaþ.\nTō mænige brūcendas gesēcaþ tō sēonne þisne tramet.\nWē biddaþ þæt þū abīde scortne tīman ǣr þū gesēce to sēonne þisne tramet eft.\n\n$1",
+       "generic-pool-error": "Eala, in hwile tide sindon þa þeowan ofergeladen.\nTo fela brucenda onginnaþ to hehawian þis geteoh.\nIc bide þec þe þu bide beforan þe þu aginne eft togang þisses geteoh.",
+       "pool-timeout": "Endhwilsearu abideð þæt loc",
        "pool-queuefull": "Pundfaldes forepenn is full",
        "pool-errorunknown": "Uncūþ wōh",
-       "pool-servererror": "Seo pundfaldgetalere þēgnung nis gearo",
+       "pool-servererror": "Seo pundfaldgetalere þēgnung nis gearo ($1).",
        "aboutsite": "Gecȳþness ymbe {{GRAMMAR:wrēgendlīc|{{SITENAME}}}}",
        "aboutpage": "Project:Gefrǣge",
        "copyright": "Man mæg innunge under $1 findan, būton þǣr hit is elles amearcod.",
        "filedeleteerror": "Ne cūðe forlēosan þā ymelan \"$1\".",
        "directorycreateerror": "We ne mot scieppan ymbfeng \"$1\"",
        "directoryreadonlyerror": "Ymbfeng \"$1\" is ræd-anlice",
-       "directorynotreadableerror": "Ymbfeng \"S1\" nis rædlic",
+       "directorynotreadableerror": "Ymbfeng \"$1\" nis rædlic",
        "filenotfound": "Ne cūðe findan ymelan \"$1\".",
        "unexpected": "Unbeþoht weorþ: \"$1\"=\"$2\"",
        "formerror": "Wōh: ne cūðe cȳþþugewrit forþsendan.",
index a950c79..582e539 100644 (file)
        "rev-deleted-user-contribs": "[اسم المستخدم أو عنوان الأيبي تمت إزالته - التعديل مخفي من المساهمات]",
        "rev-deleted-text-permission": "'''حُذِفت''' مراجعة هذه الصفحة.\nيمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
        "rev-suppressed-text-permission": "هذه النسخة قد <strong>أخفيت</strong> ([{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} تفاصيل].)",
-       "rev-deleted-text-unhide": "'''حُذِفت''' مراجعة الصفحة هذه.\nيمكن العثور على تفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].\nمازال بإمكانك [$1 رؤية هذه المراجعة] إذا أردت المتابعة.",
+       "rev-deleted-text-unhide": "<strong>حُذِفت</strong> مراجعة الصفحة هذه.\nيمكن العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].\nمازال بإمكانك [$1 رؤية هذه المراجعة] إذا أردت المتابعة.",
        "rev-suppressed-text-unhide": "'''أُخفيت''' مراجعة الصفحة هذه.\nيمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل الإخفاء].\nبإمكانك [$1 رؤية هذه المراجعة] إذا أردت المتابعة.",
        "rev-deleted-text-view": "'''حُذِفت''' مراجعة هذه الصفحة.\nيمكنك رؤيتها؛ ويمكنك العثور على التفاصيل في [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سجل الحذف].",
        "rev-suppressed-text-view": "'''أُخفيت''' مراجعة الصفحة هذه.\nيمكنك رؤيتها؛ ويمكنك العثور على التفاصيل في  [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} سجل الإخفاء].",
        "revdelete-suppress": "أخف البيانات عن مديري النظام والبقية",
        "revdelete-unsuppress": "إزالة الضوابط من المراجعات المسترجعة",
        "revdelete-log": "السبب:",
-       "revdelete-submit": "طبق على {{PLURAL:$1||المراجعة المختارة|المراجعتين المختارتين|المراجعات المختارة}}",
+       "revdelete-submit": "تطبÙ\8aق على {{PLURAL:$1||المراجعة المختارة|المراجعتين المختارتين|المراجعات المختارة}}",
        "revdelete-success": "تم تحديث رؤية المراجعات بنجاح.",
        "revdelete-failure": "'''تعذر تحديث رؤية المراجعة:'''\n$1",
        "logdelete-success": "تم ضبط رؤية السجلات بنجاح.",
        "recentchanges-page-removed-from-category-bundled": "أزيلت [[:$1]] من التصنيف، [[Special:WhatLinksHere/$1|هذه الصفحة مضمنة في صفحات أخرى]]",
        "autochange-username": "تغيير آلي لميدياويكي",
        "upload": "رفع ملف",
-       "uploadbtn": "ارÙ\81ع Ø§Ù\84Ù\85Ù\84Ù\81",
+       "uploadbtn": "رفع الملف",
        "reuploaddesc": "إلغاء الرفع والرجوع إلى استمارة الرفع",
        "upload-tryagain": "أرسل وصف ملف معدل",
        "upload-tryagain-nostash": "ارفع الملف المعاد رفعه والوصف المعدل",
index f9a01ad..0983f1b 100644 (file)
        "cancel": "lġi",
        "moredotdotdot": "Kṫer...",
        "mypage": "'Ṣ-Ṣefḫa dyali",
-       "mytalk": "Ṣefḫa dyal n-niqaċ",
+       "mytalk": "صفحة ديال النقاش",
        "anontalk": "hdr maa had l'ip",
        "navigation": "Navigasyon",
        "and": "&#32;o",
        "search-external": "Qeleb ĝla bera",
        "searchdisabled": "{{SITENAME}} ma ĥedamċ.\nImken lik ṫqeleb fe google.\nLaḫed ana imken ikono l-indexaṫ dial {{SITENAME}} qdam o ma bqaoċ ṣalḫin.",
        "preferences": "ṫfḍilaṫ",
-       "mypreferences": "Ḫajaṫ li kanfeḍḍel",
+       "mypreferences": "حاجات اللي كانفضل",
        "prefs-edits": "ĝadad ṫ-ṫĝdilaṫ:",
        "prefs-skin": "skin",
        "skin-preview": "L-Prévizualizasyon",
        "rcshowhidebots-show": "وري",
        "rcshowhidebots-hide": "خبي",
        "rcshowhideliu": "$1 l-mosṫeĥdimin l-mċejjlin",
+       "rcshowhideliu-show": "وري",
        "rcshowhideliu-hide": "خبي",
        "rcshowhideanons": "$1 mosṫeĥdimin mĥebbyin",
        "rcshowhideanons-hide": "خبي",
        "emailuserfooter": "Had l-imayl ṣifto « $1 » le « $2 » be waṣitaṫ « Ṣifet ċi imayl le l-mosṫeḫdim » fe {{SITENAME}}.",
        "usermessage-summary": "Ĥella waḫed l-meṣaj sistém.",
        "usermessage-editor": "Morasil s-sistém",
-       "watchlist": "L-Lista de s-suivi dyalṫi",
-       "mywatchlist": "L-Lista dyal s-suivi",
+       "watchlist": "الليسطا ديال السويڤي",
+       "mywatchlist": "الليسطا ديال السويڤي",
        "watchlistfor2": "Le $1 $2",
        "nowatchlist": "Ma kayna ḫṫa ċi ṣefḫa fe l-lista dyal s-suivi dyalṫek.",
        "watchlistanontext": "Ĝafak $1 baċ ṫċof ola baċ ṫṣayeb ṣ-ṣefḫaṫ li fe l-lista dyal s-suivi.",
        "blanknamespace": "(Re'si)",
        "contributions": "L-mosahamaṫ dyal l-mosṫeĥdim",
        "contributions-title": "L-Mosahamaṫ dyal $1",
-       "mycontris": "L-mosahamaṫ dyawli",
+       "mycontris": "لمساهمات دياولي",
+       "anoncontribs": "لمساهمات",
        "contribsub2": "Le $1 ($2)",
        "uctop": "l-foq",
        "month": "Men ċher (o qdem)",
index 8497c07..eafb23a 100644 (file)
@@ -61,6 +61,7 @@
        "tog-norollbackdiff": "Nun amosar diferencies depués de facer una restauración",
        "tog-useeditwarning": "Avisame cuando salga d'una páxina d'edición con cambios ensin guardar",
        "tog-prefershttps": "Usar siempre una conexón segura en aniciando sesión",
+       "tog-showrollbackconfirmation": "Amosar una pantalla de confirmación al faer clic nun enllaz de reversión",
        "underline-always": "Siempre",
        "underline-never": "Nunca",
        "underline-default": "Predeterminao del aspeutu o del restolador",
        "returnto": "Volver a $1.",
        "tagline": "De {{SITENAME}}",
        "help": "Ayuda",
+       "help-mediawiki": "Ayuda sobro MediaWiki",
        "search": "Buscar",
        "search-ignored-headings": " #<!-- dexar esta llinia exautamente como ta --> <pre>\n# Testeres que nun se tendrán en cuenta na gueta.\n# Los cambios fechos equí son efeutivos nel momentu que s'indexa la páxina cola testera.\n# Puede forzase'l reindexáu d'una páxina faciendo una edición nula.\n# La sintaxis ye la siguiente:\n#   * Tolo qu'hai dende un caráuter «#» al fin de llinia ye un comentariu\n#   * Cada llinia nun-balera ye'l títulu exautu a descartar, incluyendo mayúscules y too.\nReferencies\nEnllaces esternos\nVer tamién\n #</pre> <!-- dexar esta llinia exautamente como ta -->",
        "searchbutton": "Guetar",
        "badarticleerror": "Esta aición nun puede facese nesta páxina.",
        "cannotdelete": "Nun pudo desaniciase la páxina o'l ficheru «$1».\nSeique daquién yá lo desaniciara.",
        "cannotdelete-title": "La páxina «$1» nun puede desaniciase",
+       "delete-scheduled": "La páxina «$1» ta programada pa desaniciase.\nTen paciencia.",
        "delete-hook-aborted": "Desaniciu albortáu pol enganche.\nNun conseñó esplicación.",
        "no-null-revision": "Nun pudo crease una nueva revisión nula pa la páxina «$1»",
        "badtitle": "Títulu incorreutu",
        "badretype": "Les contraseñes qu'escribisti nun concuayen.",
        "usernameinprogress": "Yá ta creándose una cuenta pa esti nome d'usuariu.\nEspera.",
        "userexists": "El nome d'usuariu conseñáu yá ta usándose.\nPor favor escueyi un nome diferente.",
+       "createacct-normalization": "El to nome d'usuariu va axustase a \"$2\" por cuenta de torgues técniques.",
        "loginerror": "Error d'aniciu de sesión",
        "createacct-error": "Error de creación de cuenta",
        "createaccounterror": "Nun pudo crease la cuenta: $1",
        "passwordtooshort": "Les contraseñes han de tener polo menos {{PLURAL:$1|1 caráuter|$1 caráuteres}}.",
        "passwordtoolong": "Les contraseñes nun puen ser mayores de {{PLURAL:$1|1 caráuter|$1 caráuteres}}.",
        "passwordtoopopular": "Les contraseñes más escoyíes de vezu nun pueden usase. Escueye una contraseña más difícil d'aldovinar.",
+       "passwordinlargeblacklist": "La contraseña qu'escribisti ta na llista de contraseñes más usaes. Escueyi una contraseña menos corriente.",
        "password-name-match": "La contraseña tien de ser distinta del nome d'usuariu.",
        "password-login-forbidden": "Ta torgao usar esti nome d'usuariu y contraseña.",
        "mailmypassword": "Reaniciar contraseña",
        "resetpass-abort-generic": "Una estensión encaboxó'l cambiu de la contraseña.",
        "resetpass-expired": "La to contraseña caducó. Configura una nueva contraseña p'aniciar sesión.",
        "resetpass-expired-soft": "La contraseña caducó y precisa cambiase. Escueye agora una contraseña nueva, o pulsia «{{int:authprovider-resetpass-skip-label}}» pa cambiala sero.",
+       "resetpass-validity": "La contraseña nun ye válida: $1\n\nConfigura una contraseña nueva p'aniciar sesión.",
        "resetpass-validity-soft": "La contraseña nun ye válida: $1\n\nEscueye agora una contraseña nueva, o pulsia «{{int:authprovider-resetpass-skip-label}}» pa cambiala sero.",
        "passwordreset": "Reaniciar contraseña",
        "passwordreset-text-one": "Completa esti formulariu pa recibir per corréu una contraseña temporal.",
        "defaultmessagetext": "Testu predetermináu",
        "content-failed-to-parse": "Fallu al analizar el conteníu $2 pal modelu $1: $3",
        "invalid-content-data": "Datos del conteníu inválidos",
-       "content-not-allowed-here": "El conteníu «$1» nun se permite na páxina [[:$2]]",
+       "content-not-allowed-here": "El conteníu «$1» nun se permite na páxina [[:$2]] del segmentu \"$3\"",
        "editwarning-warning": "Salir d'esta páxina pue causar la perda de cualesquier cambiu fechu.\nSi anició sesión, pue desactivar esti avisu na seición «{{int:prefs-editing}}» de les preferencies.",
        "editpage-invalidcontentmodel-title": "El modelu de conteníu nun tien sofitu",
        "editpage-invalidcontentmodel-text": "El modelu de conteníu «$1»nun tien sofitu.",
        "editpage-notsupportedcontentformat-title": "El formatu del conteníu nun tien sofitu",
        "editpage-notsupportedcontentformat-text": "El formatu del conteníu, $1, nun tien sofitu del modelu de conteníu $2.",
+       "slot-name-main": "Principal",
        "content-model-wikitext": "testu wiki",
        "content-model-text": "testu simple",
        "content-model-javascript": "JavaScript",
        "page_first": "primera",
        "page_last": "cabera",
        "histlegend": "Seleición de diferencies: marca los botones de les versiones que quies comparar y calca <i>enter</i> o al botón d'abaxo.<br />\nLleenda: '''({{int:cur}})''' = diferencies cola versión actual, '''({{int:last}})''' = diferencies cola versión anterior, '''{{int:minoreditletter}}''' = edición menor.",
-       "history-fieldset-title": "Buscar revisiones",
+       "history-fieldset-title": "Filtrar revisiones",
        "history-show-deleted": "Sólo desaniciaes por revisión",
        "histfirst": "lo más antiguo",
        "histlast": "lo más nuevo",
        "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
-       "historyempty": "(balero)",
+       "historyempty": "balero",
        "history-feed-title": "Historial de revisiones",
        "history-feed-description": "Historial de revisiones d'esta páxina na wiki",
        "history-feed-item-nocomment": "$1 en $2",
        "timezonelegend": "Estaya horaria:",
        "localtime": "Hora llocal:",
        "timezoneuseserverdefault": "Usar la predeterminada de la wiki ($1)",
-       "timezoneuseoffset": "Otra (especificar allancia)",
+       "timezoneuseoffset": "Otra (especifica la diferencia horaria más abaxo)",
+       "timezone-useoffset-placeholder": "Valores d'exemplu: \"-07:00\" o \"01:00\"",
        "servertime": "Hora del sirvidor:",
        "guesstimezone": "Rellenar del navegador",
        "timezoneregion-africa": "África",
        "prefs-advancedwatchlist": "Opciones avanzaes",
        "prefs-displayrc": "Opciones de vista",
        "prefs-displaywatchlist": "Opciones de vista",
+       "prefs-changesrc": "Cambeos amosaos",
+       "prefs-changeswatchlist": "Cambeos amosaos",
+       "prefs-pageswatchlist": "Páxines vixilaes",
        "prefs-tokenwatchlist": "Pase",
        "prefs-diffs": "Diferencies",
        "prefs-help-prefershttps": "Esta preferencia aplicaráse nel siguiente aniciu de sesión.",
        "right-reupload-own": "Sustituir los ficheros esistentes xubíos por ún mesmu",
        "right-reupload-shared": "Anular llocalmente los ficheros del estoyu de multimedia compartíu",
        "right-upload_by_url": "Xubir ficheros dende una URL",
-       "right-purge": "Purgar sin confirmación la caché d'una páxina nel sitiu",
+       "right-purge": "Purgar la caché d'una páxina nel sitiu",
        "right-autoconfirmed": "Nun tar afeutáu por llendes de tasa basaes na IP",
        "right-bot": "Tratar como un procesu automatizáu",
        "right-nominornewtalk": "Nun amosar l'avisu de nuevos mensaxes cuando se faen ediciones menores en páxines d'alderique",
        "grant-delete": "Desaniciar páxines, revisiones y entraes del rexistru",
        "grant-editinterface": "Editar l'espaciu de nomes MediaWiki y los JSON del sitiu o d'usuariu",
        "grant-editmycssjs": "Editar los CSS/JSON/JavaScript d'usuariu propios",
-       "grant-editmyoptions": "Editar les preferencies d'usuariu propies",
+       "grant-editmyoptions": "Editar les preferencies d'usuariu y la configuración JSON",
        "grant-editmywatchlist": "Editar la llista de vixilancia propia",
        "grant-editsiteconfig": "Editar les páxines CSS/JS del sitiu o d'usuariu",
        "grant-editpage": "Editar páxines esistentes",
        "action-changetags": "amestar y desaniciar etiquetes arbitraries en revisiones individuales y entraes del rexistru",
        "action-deletechangetags": "desaniciar etiquetes de la base de datos",
        "action-purge": "purgar esta páxina",
+       "action-apihighlimits": "usar llendes mayores nes consultes API",
+       "action-bigdelete": "desaniciar páxines con historiales grandes",
+       "action-blockemail": "bloquiar a un usuariu l'unviu de corréu electrónicu",
+       "action-bot": "ser tratáu como un procesu automatizáu",
+       "action-editprotected": "editar páxines protexíes como \"{{int:protect-level-sysop}}\"",
+       "action-editsemiprotected": "editar páxines protexíes como \"{{int:protect-level-autoconfirmed}}\"",
+       "action-editinterface": "editar la interfaz d'usuariu",
+       "action-editusercss": "editar los ficheros CSS d'otros usuarios",
+       "action-edituserjson": "editar los ficheros JSON d'otros usuarios",
+       "action-edituserjs": "editar los ficheros JavaScript d'otros usuarios",
+       "action-editsitecss": "editar CSS global del sitiu",
+       "action-editsitejson": "editar JSON global del sitiu",
+       "action-editsitejs": "editar JavaScript global del sitiu",
+       "action-editmyusercss": "editar los ficheros CSS d'usuariu propios",
+       "action-editmyuserjson": "editar los ficheros JSON d'usuariu propios",
+       "action-editmyuserjs": "editar los ficheros JavaScript d'usuariu propios",
+       "action-viewsuppressed": "ver revisiones anubríes de cualquier usuariu",
        "nchanges": "{{PLURAL:$1|un cambiu|$1 cambios}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|dende la última visita}}",
        "enhancedrc-history": "historial",
        "rcfilters-savedqueries-already-saved": "Yá se guardaron estos filtros. Cambia la configuración pa crear un Filtru guardáu nuevu.",
        "rcfilters-restore-default-filters": "Restaurar los filtros predeterminaos",
        "rcfilters-clear-all-filters": "Borrar tolos filtros",
-       "rcfilters-show-new-changes": "Ver los cambeos más recién",
+       "rcfilters-show-new-changes": "Ver los cambeos nuevos dende $1",
        "rcfilters-search-placeholder": "Filtriar cambeos (usa'l menú o busca'l nome del filtru)",
        "rcfilters-invalid-filter": "Filtru inválidu",
        "rcfilters-empty-filter": "Nun hai filtros activos. Amuésense toles contribuciones.",
        "rcfilters-watchlist-edit-watchlist-button": "Edita la to llista de páxines siguíes",
        "rcfilters-watchlist-showupdated": "Los cambeos fechos en páxines que nun visitasti desque se ficieron apaecen en <strong>negrina</strong>, con marcadores sólidos.",
        "rcfilters-preference-label": "Usar la interfaz ensin JavaScript",
-       "rcfilters-preference-help": "Revierte'l rediseñu de la interfaz de 2017 y toles ferramientes añadíes d'entós aquí.",
-       "rcfilters-watchlist-preference-label": "Tapecer la versión ameyorada de la Llista de siguimientu",
-       "rcfilters-watchlist-preference-help": "Desfai el rediseñu de la interfaz de 2017 y toles ferramientes añadíes d'entós acá.",
+       "rcfilters-preference-help": "Carga los cambeos recién ensin filtros de busca nin funcionalidad de resaltáu.",
+       "rcfilters-watchlist-preference-label": "Usar la interfaz ensin JavaScript",
+       "rcfilters-watchlist-preference-help": "Carga la llista de siguimientu ensin filtros de busca nin la funcionalidad de resaltáu.",
        "rcfilters-filter-showlinkedfrom-label": "Amosar los cambios nes páxines enllazaes dende",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>Páxines enllazaes dende</strong> la páxina seleicionada",
        "rcfilters-filter-showlinkedto-label": "Amosar los cambios nes páxines qu'enllacen a",
        "prefixindex": "Toles páxines col prefixu",
        "prefixindex-namespace": "Toles páxines col prefixu (espaciu de nomes $1)",
        "prefixindex-submit": "Amosar",
-       "prefixindex-strip": "Cortar el prefixu na llista",
+       "prefixindex-strip": "Despintar el prefixu nes resultancies",
        "shortpages": "Páxines curties",
        "longpages": "Páxines llargues",
        "deadendpages": "Páxines ensin salida",
        "delete-confirm": "Desaniciar «$1»",
        "delete-legend": "Desaniciar",
        "historywarning": "<strong>Avisu:</strong> La páxina que vas desaniciar tien un historial con $1 {{PLURAL:$1|revisión|revisiones}}:",
-       "historyaction-submit": "Amosar",
+       "historyaction-submit": "Amosar revisiones",
        "confirmdeletetext": "Tas a piques d'esborrar una páxina xunto con tol so historial.\nPor favor confirma que ye lo que quies facer, qu'entiendes les consecuencies, y que lo tas faciendo acordies coles [[{{MediaWiki:Policy-url}}|polítiques]].",
        "actioncomplete": "Aición completada",
        "actionfailed": "Falló l'aición",
        "deleting-backlinks-warning": "<strong>Avisu:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|Otres páxines]] enllacen a, o trescluyen de, la páxina que tas a piques de desaniciar.",
        "deleting-subpages-warning": "<strong>Avisu:</strong> La páxina que vas desaniciar tien [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|una subpáxina|$1 subpáxines|51=más de 50 subpáxines}}]].",
        "rollback": "Revertir ediciones",
+       "rollback-confirmation-confirm": "Confirma:",
+       "rollback-confirmation-yes": "Reversión",
+       "rollback-confirmation-no": "Encaboxar",
        "rollbacklink": "revertir",
        "rollbacklinkcount": "revertir $1 {{PLURAL:$1|edición|ediciones}}",
        "rollbacklinkcount-morethan": "revertir más de $1 {{PLURAL:$1|edición|ediciones}}",
        "mycontris": "Collaboraciones",
        "anoncontribs": "Contribuciones",
        "contribsub2": "Pa {{GENDER:$3|$1}} ($2)",
+       "contributions-subtitle": "Pa {{GENDER:$3|$1}}",
        "contributions-userdoesnotexist": "La cuenta d'usuariu «$1» nun ta rexistrada.",
        "nocontribs": "Nun s'atoparon cambeos que coincidan con esi criteriu.",
        "uctop": "actual",
        "ipbreason": "Motivu:",
        "ipbreason-dropdown": "*Motivos comunes de bloquéu\n** Enxertamientu d'información falso\n** Dexar les páxines en blanco\n** Enllaces spam a páxines esternes\n** Enxertamientu de babayaes/enguedeyos nes páxines\n** Comportamientu intimidatoriu o d'acosu\n** Abusu de cuentes múltiples\n** Nome d'usuariu inaceutable",
        "ipb-hardblock": "Torgar que los usuarios coneutaos editen dende esta direición IP",
-       "ipbcreateaccount": "Torgar la creación de cuentes",
-       "ipbemailban": "Torgar al usuariu l'unviu de corréu electrónicu",
+       "ipbcreateaccount": "Creación de cuentes",
+       "ipbemailban": "Unviar correos",
        "ipbenableautoblock": "Bloquiar automáticamente la cabera direición IP usada por esti usuariu y toles IP posteriores dende les qu'intente editar",
        "ipbsubmit": "Bloquiar esti usuariu",
        "ipbother": "Otru periodu:",
        "ipboptions": "2 hores:2 hours,1 día:1 day,3 díes:3 days,1 selmana:1 week,2 selmanes:2 weeks,1 mes:1 month,3 meses:3 months,6 meses:6 months,1 añu:1 year,indefiníu:infinite",
        "ipbhidename": "Anubrir el nome d'usuariu d'ediciones y llistes",
        "ipbwatchuser": "Vixilar les páxines d'usuariu y d'alderique d'esti usuariu",
-       "ipb-disableusertalk": "Torgar qu'esti usuariu edite la so páxina d'alderique mentanto tea bloquiáu",
+       "ipb-disableusertalk": "Editar la páxina d'alderique propia",
        "ipb-change-block": "Volver a bloquiar l'usuariu con estos parámetros",
        "ipb-confirm": "Confirmar bloquéu",
+       "ipb-sitewide": "En tol sitiu",
+       "ipb-partial": "Parcial",
+       "ipb-pages-label": "Páxines",
+       "ipb-namespaces-label": "Espacios de nomes",
        "badipaddress": "Dirección IP inválida",
        "blockipsuccesssub": "Bloquéu fechu correctamente",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] ta {{GENDER:$1|bloquiáu|bloquiada}}.<br />\nMira na [[Special:BlockList|llista de bloqueos]] pa revisar los bloqueos.",
        "ipb-blocklist": "Ver los bloqueos esistentes",
        "ipb-blocklist-contribs": "Collaboraciones de {{GENDER:$1|$1}}",
        "ipb-blocklist-duration-left": "falten $1",
+       "block-actions": "Acciones a bloquiar:",
        "block-expiry": "Caducidá:",
+       "block-options": "Opciones adicionales:",
+       "block-prevent-edit": "Edición",
+       "block-reason": "Motivu:",
+       "block-target": "Nome d'usuariu o direición IP:",
        "unblockip": "Desbloquiar usuariu",
        "unblockiptext": "Usa'l formulariu d'abaxo pa restablecer l'accesu d'escritura a una direicion IP o a un nome d'usuariu previamente bloquiáu.",
        "ipusubmit": "Desaniciar esti bloquéu",
        "blocklist-userblocks": "Anubrir los bloqueos de cuenta",
        "blocklist-tempblocks": "Anubrir los bloqueos temporales",
        "blocklist-addressblocks": "Anubrir los bloqueos d'IP simples",
+       "blocklist-type": "Triba:",
+       "blocklist-type-opt-all": "Toes",
+       "blocklist-type-opt-sitewide": "En tol sitiu",
+       "blocklist-type-opt-partial": "Parcial",
        "blocklist-rangeblocks": "Anubrir los bloqueos de rangu",
        "blocklist-timestamp": "Marca d'hora",
        "blocklist-target": "Oxetivu",
        "createaccountblock": "creación de cuentes desactivada",
        "emailblock": "corréu electrónicu desactiváu",
        "blocklist-nousertalk": "nun puede editar la páxina d'alderique propia",
+       "blocklist-editing": "edición",
+       "blocklist-editing-sitewide": "edición (en tol sitiu)",
+       "blocklist-editing-page": "páxines",
+       "blocklist-editing-ns": "espacios de nomes",
        "ipblocklist-empty": "La llista de bloqueos ta vacia.",
-       "ipblocklist-no-results": "La direición IP o nome d'usuariu solicitáu nun ta bloquiáu.",
+       "ipblocklist-no-results": "Nun s'alcontraron bloqueos pa la direición IP o nome d'usuariu solicitáu.",
        "blocklink": "bloquiar",
        "unblocklink": "desbloquiar",
        "change-blocklink": "camudar el bloquéu",
        "pageinfo-display-title": "Amosar el títulu",
        "pageinfo-default-sort": "Clave d'ordenación predeterminada",
        "pageinfo-length": "Llonxitú de la páxina (en bytes)",
+       "pageinfo-namespace": "Espaciu de nomes",
        "pageinfo-article-id": "ID de la páxina",
        "pageinfo-language": "Llingua del conteníu de la páxina",
        "pageinfo-language-change": "camudar",
        "pageinfo-category-files": "Númberu de ficheros",
        "pageinfo-user-id": "ID d'usuariu",
        "pageinfo-file-hash": "Valor del hash criptográficu",
+       "pageinfo-view-protect-log": "Ver el rexistru de protecciones d'esta páxina.",
        "markaspatrolleddiff": "Marcar como supervisada",
        "markaspatrolledtext": "Marcar esta páxina como supervisada",
        "markaspatrolledtext-file": "Marcar esta versión del ficheru como patrullada",
        "previousdiff": "← Edición más antigua",
        "nextdiff": "Edición más nueva →",
        "mediawarning": "'''Avisu''': Esta triba de ficheru pue contener códigu maliciosu.\nAl executalu pues comprometer el to sistema.",
-       "imagemaxsize": "Llende del tamañu d'imaxe: <br /><em>(pa les páxines de descripción de ficheru)</em>",
+       "imagemaxsize": "Llende del tamañu d'imaxe nes páxines de descripción de ficheros:",
        "thumbsize": "Tamañu de la miniatura:",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|páxina|páxines}}",
        "file-info": "tamañu de ficheru: $1, triba MIME: $2",
        "confirm-unwatch-top": "¿Desaniciar esta páxina de la to llista de vixilancia?",
        "confirm-rollback-button": "Aceutar",
        "confirm-rollback-top": "¿Revertir les ediciones a esta páxina?",
+       "confirm-rollback-bottom": "Esta aición revertirá nel intre los cambios seleicionaos d'esta páxina.",
+       "confirm-mcrrestore-title": "Restaurar una revisión",
        "confirm-mcrundo-title": "Desfacer un cambéu",
        "mcrundofailed": "Falló desfacer",
        "mcrundo-missingparam": "Faltan parámetros riquíos na solicitú.",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|promocionó}} automáticamente de $4 a $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|xubió}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|xubió}} una versión nueva de $3",
-       "logentry-upload-revert": "$1 {{GENDER:$2|xubió}} $3",
+       "logentry-upload-revert": "$1 {{GENDER:$2|revirtió}} $3 a una versión anterior",
        "log-name-managetags": "Rexistru de xestión d'etiquetes",
        "log-description-managetags": "Esta páxina tien la llista de les xeres de xestión rellacionaes coles [[Special:Tags|etiquetes]]. El rexistru contien namái les aiciones feches manuamente por un alministrador; les etiquetes pueden crease o desaniciase pol software wiki ensin que quede grabada una entrada nesti rexistru.",
        "logentry-managetags-create": "$1 {{GENDER:$2|creó}} la etiqueta «$4»",
        "mw-widgets-titleinput-description-redirect": "redirixir a $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Amestar una categoría...",
        "mw-widgets-usersmultiselect-placeholder": "Amestar más...",
+       "mw-widgets-titlesmultiselect-placeholder": "Amestar más...",
        "date-range-from": "Dende la data:",
        "date-range-to": "Ata la data:",
        "sessionmanager-tie": "Nun puen combinase dellos tipos de solicitú d'identificación: $1.",
        "log-action-filter-suppress-reblock": "Supresión d'usuariu por rebloquéu",
        "log-action-filter-upload-upload": "Nueva carga",
        "log-action-filter-upload-overwrite": "Recargar",
+       "log-action-filter-upload-revert": "Revertir",
        "authmanager-authn-not-in-progress": "L'autenticación nun ta en cursu o los datos de sesión perdiéronse. Por favor, vuelve de nueves al principiu.",
        "authmanager-authn-no-primary": "Les credenciales apurríes nun pudieron autentificase.",
        "authmanager-authn-no-local-user": "Les credenciales apurríes nun tán asociaes con nengún usuariu nesta wiki.",
        "passwordpolicies-policy-passwordcannotmatchblacklist": "La contraseña nun puede casar con contraseñes torgaes específicamente",
        "passwordpolicies-policy-maximalpasswordlength": "La llonxitú de la contraseña tien de ser menor que {{PLURAL:$1|1 caráuter|$1 caráuteres}}",
        "passwordpolicies-policy-passwordcannotbepopular": "La contraseña nun puede {{PLURAL:$1|ser la contraseña más popular|tar na llista de $1 contraseñes populares}}",
+       "passwordpolicies-policy-passwordnotinlargeblacklist": "La contraseña nun pué tar na llista de les 100.000 contraseñes más usaes.",
+       "passwordpolicies-policyflag-forcechange": "tien de camudase al aniciar sesión",
+       "passwordpolicies-policyflag-suggestchangeonlogin": "suxerir cambiu al aniciar sesión",
        "easydeflate-invaliddeflate": "El conteníu dau nun ta comprimíu correutamente"
 }
index 1865722..1c12a3f 100644 (file)
        "username": "{{GENDER:$1|İstifadəçi adı}}:",
        "prefs-memberingroups": "{{GENDER:$2|Üzv}} olduğu {{PLURAL:$1|qrup}}:",
        "prefs-memberingroups-type": "$1",
-       "group-membership-link-with-expiry": "$1 ($2 qədər)",
+       "group-membership-link-with-expiry": "$1 ($2 tarixinə qədər)",
        "prefs-registration": "Qeydiyyat vaxtı:",
        "prefs-registration-date-time": "$1",
        "yourrealname": "Əsl adınız:",
        "mostrevisions": "Ən çox nəzərdən keçirilmiş (versiyalı) məqalələr",
        "prefixindex": "Prefiks indeksli bütün səhifələr",
        "prefixindex-submit": "Göstər",
+       "prefixindex-strip": "Nəticələrdə prefiksi gizlət",
        "shortpages": "Qısa səhifələr",
        "longpages": "Uzun səhifələr",
        "deadendpages": "Keçid verməyən səhifələr",
        "protectedtitles": "Mühafizəli başlıqlar",
        "listusers": "İstifadəçi siyahısı",
        "listusers-editsonly": "Yalnız redaktələri olan istifadəçiləri göstər",
+       "listusers-temporarygroupsonly": "Yalnız müvəqqəti istifadəçi qruplarında olan istifadəçiləri göstər",
        "listusers-creationsort": "Yaranma tarixinə görə sırala",
+       "listusers-desc": "Azalana doğru sırala",
        "usereditcount": "$1 {{PLURAL:$1|redaktə}}",
        "usercreated": "Saat $2, $1 tarixində {{GENDER:$3|qeydiyyatdan keçib}}",
        "newpages": "Yeni səhifələr",
        "listusers-blocked": "(bloklanıb)",
        "activeusers": "Aktiv istifadəçilərin siyahısı",
        "activeusers-count": "Son {{PLURAL:$3|gündə|$3 gündə}} $1 {{PLURAL:$1|redaktə|redaktə}}",
+       "activeusers-from": "İstifadəçi adı bu simvolla başlayanlardan sonrakıları göstər:",
        "activeusers-noresult": "İstifadəçi tapılmadı.",
        "listgrouprights": "İstifadəçi qruplarının hüquqları",
        "listgrouprights-summary": "Bu vikidə olan istifadəçi siyahıları və onların hüquqları aşağıda göstərilmişdir.\nFərdi hüquqlar haqqında əlavə məlumatı [[{{MediaWiki:Listgrouprights-helppage}}]] səhifəsində tapa bilərsiniz",
index efd2d4e..ef1a196 100644 (file)
        "action-markbotedits": "пазначэньне адкатаў як правак робатам",
        "action-patrolmarks": "прагляд адзнакаў патруляваньня апошніх зьменаў",
        "action-override-export-depth": "экспарт старонак, у тым ліку зьвязаных старонак з глыбінёй да 5",
+       "action-suppressredirect": "нестварэньне перанакіраваньняў з старонкі-крыніцы пры пераносе",
        "nchanges": "$1 {{PLURAL:$1|зьмена|зьмены|зьменаў}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|з апошняга візыту}}",
        "enhancedrc-history": "гісторыя",
        "mailnologin": "Няма адрасу атрымальніка",
        "mailnologintext": "Вы мусіце [[Special:UserLogin|ўвайсьці ў сыстэму]] і мець пацьверджаны адрас электроннай пошты ў вашых [[Special:Preferences|наладах]], каб дасылаць лісты іншым удзельнікам.",
        "emailuser": "Даслаць ліст",
-       "emailuser-title-target": "Адправіць гэта па электроннай пошце {{GENDER:$1|гэтаму ўдзельніку|гэтай удзельніцы}}",
-       "emailuser-title-notarget": "Ð\94аÑ\81лаÑ\86Ñ\8c Ð»Ñ\96Ñ\81Ñ\82 Ñ\9eдзелÑ\8cнÑ\96кÑ\83 Ñ\86Ñ\96 Ñ\9eдзелÑ\8cнÑ\96Ñ\86Ñ\8b Ð¿Ð° Ñ\8dлекÑ\82Ñ\80оннай Ð¿Ð¾Ñ\88Ñ\86е",
-       "emailpagetext": "Вы можаце выкарыстаць форму ніжэй, каб даслаць {{GENDER:$1|гэтаму ўдзельніку|гэтай удзельніцы}} ліст па электроннай пошце.\nАдрас электроннай пошты, які Вы пазначалі ў [[Special:Preferences|сваіх наладах]], будзе пазначаны ў полі ліста «Ад», і {{GENDER:$1|ўдзельнік|ўдзельніца}} зможа даслаць на гэты адрас адказ.",
-       "defemailsubject": "Ð\9bÑ\96Ñ\81Ñ\82 Ð· {{GRAMMAR:Ñ\80однÑ\8b|{{SITENAME}}}} Ð°Ð´ {{GENDER:$1|Ñ\83дзелÑ\8cнÑ\96ка|Ñ\83дзелÑ\8cнÑ\96Ñ\86Ñ\8b}} «$1»",
+       "emailuser-title-target": "Адправіць гэта электроннай поштай {{GENDER:$1|удзельніку|удзельніцы}}",
+       "emailuser-title-notarget": "Ð\94аÑ\81лаÑ\86Ñ\8c Ð»Ñ\96Ñ\81Ñ\82 Ñ\8dлекÑ\82Ñ\80оннай Ð¿Ð¾Ñ\88Ñ\82ай Ñ\83дзелÑ\8cнÑ\96кÑ\83 Ñ\86Ñ\96 Ñ\9eдзелÑ\8cнÑ\96Ñ\86Ñ\8b",
+       "emailpagetext": "Вы можаце выкарыстаць форму ніжэй, каб даслаць {{GENDER:$1|гэтаму ўдзельніку|гэтай удзельніцы}} ліст электроннай поштай.\nАдрас электроннай пошты, які вы пазначалі ў [[Special:Preferences|сваіх наладах]], будзе бачны ў полі ліста «Ад», і {{GENDER:$1|ўдзельнік|ўдзельніца}} зможа даслаць на гэты адрас адказ.",
+       "defemailsubject": "Ð\9bÑ\96Ñ\81Ñ\82 Ð°Ð´ {{GENDER:$1|Ñ\83дзелÑ\8cнÑ\96ка|Ñ\83дзелÑ\8cнÑ\96Ñ\86Ñ\8b}} {{GRAMMAR:Ñ\80однÑ\8b|{{SITENAME}}}} «$1»",
        "usermaildisabled": "Электронная пошта ўдзельніка адключаная",
        "usermaildisabledtext": "Вы ня можаце дасылаць электронныя лісты іншым удзельнікам {{GRAMMAR:родны|{{SITENAME}}}}",
        "noemailtitle": "Адрас электроннай пошты адсутнічае",
        "blocklist-userblocks": "Схаваць блякаваньні рахункаў",
        "blocklist-tempblocks": "Схаваць часовыя блякаваньні",
        "blocklist-addressblocks": "Схаваць блякаваньні асобных IP-адрасоў",
+       "blocklist-type": "Тып:",
+       "blocklist-type-opt-all": "Усе",
+       "blocklist-type-opt-sitewide": "На ўсім сайце",
+       "blocklist-type-opt-partial": "Частковае",
        "blocklist-rangeblocks": "Схаваць блякаваньні дыяпазонаў",
        "blocklist-timestamp": "Дата/час",
        "blocklist-target": "Мэта",
        "blocklink": "заблякаваць",
        "unblocklink": "разблякаваць",
        "change-blocklink": "зьмяніць блякаваньне",
+       "empty-username": "(імя ўдзельніка нядасягальнае)",
        "contribslink": "унёсак",
        "emaillink": "даслаць ліст",
        "autoblocker": "Вы аўтаматычна заблякаваныя, таму што Ваш IP-адрас нядаўна ўжываўся «[[User:$1|$1]]».\nПрычына блякаваньня $1 наступная: «$2»",
        "passwordpolicies-policyflag-forcechange": "мусіць быць зьменены па ўваходзе",
        "passwordpolicies-policyflag-suggestchangeonlogin": "прапаноўваць зьмену па ўваходзе",
        "easydeflate-invaliddeflate": "Пададзены зьмест ня сьціснуты адпаведным чынам",
-       "unprotected-js": "З прычынаў бясьпекі JavaScript ня можа быць загружаны зь неабароненых сайтаў. Калі ласка, стварайце javascript выключна ў прасторы назваў MediaWiki: ці як падстаронку ўдзельніка"
+       "unprotected-js": "З прычынаў бясьпекі JavaScript ня можа быць загружаны зь неабароненых сайтаў. Калі ласка, стварайце javascript выключна ў прасторы назваў MediaWiki: ці як падстаронку ўдзельніка",
+       "userlogout-continue": "Калі вы захочаце выйсьці з сыстэмы, калі ласка, [$1 пераходзьце на старонку выхаду].",
+       "userlogout-sessionerror": "Выхад з сыстэмы не адбыўся праз памылку сэсіі. Калі ласка, [$1 паспрабуйце зноў]."
 }
index 541508b..4fd0622 100644 (file)
        "rcfilters-savedqueries-already-saved": "Тези филтри вече са съхранени. Променете настройките си, за да създадете нов Запазен филтър.",
        "rcfilters-restore-default-filters": "Възстановяване на филтрите по подразбиране",
        "rcfilters-clear-all-filters": "Изчистване на всички филтри",
-       "rcfilters-show-new-changes": "Ð\9fÑ\80еглед Ð½Ð° Ð½Ð°Ð¹-новиÑ\82е Ð¿Ñ\80омени след $1",
+       "rcfilters-show-new-changes": "Ð\9fÑ\80еглед Ð½Ð° Ð¿Ñ\80омениÑ\82е Ð½Ð°Ð¿Ñ\80авени след $1",
        "rcfilters-search-placeholder": "Филтриране на промените (използвайте менюто или търсете по име на филтър)",
        "rcfilters-invalid-filter": "Невалиден филтър",
        "rcfilters-empty-filter": "Няма активни филтри. Показани са всички редакции.",
        "blocklist-editing-page": "страници",
        "blocklist-editing-ns": "именни пространства",
        "ipblocklist-empty": "Списъкът на блокиранията е празен.",
-       "ipblocklist-no-results": "Не са открити съвпадащи блокирания за избрания IP-адрес или потребител.",
+       "ipblocklist-no-results": "Не са открити блокирания за избрания IP-адрес или потребител.",
        "blocklink": "блокиране",
        "unblocklink": "отблокиране",
        "change-blocklink": "промяна на параметрите на блокирането",
        "ipb-otherblocks-header": "{{PLURAL:$1|Друго блокиране|Други блокирания}}",
        "unblock-hideuser": "Не можете да отблокирате този потребител, тъй като потребителското му име е скрито.",
        "ipb_cant_unblock": "Грешка: Не е намерен блок с номер $1. Вероятно потребителят е вече отблокиран.",
-       "ipb_blocked_as_range": "Грешка: IP-адресът $1 не може да бъде разблокиран, тъй като е част от блокирания регистър $2. Можете да разблокирате адреса, като разблокирате целия регистър.",
+       "ipb_blocked_as_range": "Грешка: IP-адресът $1 не може да бъде отблокиран, тъй като е част от блокирания регистър $2. Можете да отблокирате адреса, като отблокирате целия регистър.",
        "ip_range_invalid": "Невалиден диапазон на IP-адреси.",
        "ip_range_toolarge": "Забранено е блокиране на диапазони от IP адреси по-големи от /$1.",
        "ip_range_exceeded": "IP диапазонът превишава максималния диапазон. Позволен диапазон: /$1.",
        "sorbsreason": "IP-адресът Ви е записан като анонимно достъпен междинен сървър в DNSBL на {{SITENAME}}.",
        "sorbs_create_account_reason": "IP-адресът Ви е записан като анонимно достъпен междинен сървър в DNSBL на {{SITENAME}}.\nНе може да създадете сметка.",
        "cant-see-hidden-user": "Потребителят, който опитвате да блокирате, вече е блокиран и скрит. Тъй като нямате права да скривате потребители, не можете да видите или редактирате блокирането на потребителя.",
-       "ipbblocked": "Не можете да блокирате и разблокирате други потребители, защото Вие самият (самата) сте блокиран(а).",
-       "ipbnounblockself": "Нямате право да се разблокирате сам(а).",
+       "ipbblocked": "Не можете да блокирате и отблокирате други потребители, защото Вие самият (самата) сте блокиран(а).",
+       "ipbnounblockself": "Нямате право да се отблокирате сам(а).",
        "lockdb": "Заключване на базата от данни",
        "unlockdb": "Отключване на базата от данни",
        "lockdbtext": "Заключването на базата от данни ще попречи на всички потребители да редактират страници, да сменят своите настройки, да редактират своите списъци за наблюдение и на всички други техни действия, изискващи промени в базата данни.\nПотвърдете, че искате точно това и ще отключите базата от данни, когато привършите с работата по поддръжката.",
index 4c77b72..2c9e4b9 100644 (file)
        "oct": "Ukt",
        "nov": "Nup",
        "dec": "Dis",
-       "pagecategories": "{{PLURAL:$1|Tumbung|Tutumbung}}",
-       "category_header": "Tutungkaran dalam tumbung ''$1''",
-       "subcategories": "Sub-tumbung",
-       "category-media-header": "Média dalam tumbung \"$1\"",
-       "category-empty": "\"Kada tadapat artikal maupun média dalam tumbung ini.\"",
-       "hidden-categories": "{{PLURAL:$1|Tumbung tasungkup|Tutumbung tasungkup}}",
+       "pagecategories": "{{PLURAL:$1|Pilah}}",
+       "category_header": "Halaman dalam pilah \"$1\"",
+       "subcategories": "Sub-pilah",
+       "category-media-header": "Média dalam pilah \"$1\"",
+       "category-empty": "\"Kada tahaga tulisan maupun média dalam pilah ngini.\"",
+       "hidden-categories": "{{PLURAL:$1|Pilah tatukup}}",
        "hidden-category-category": "Tumbung tasungkup",
-       "category-subcat-count": "{{PLURAL:$2|Tumbung ngini baisi asa sub-tumbung barikut.|Tumbung ngini baisi {{PLURAL:$1|sub-tumbung|$1 sub-tutumbung}} barikut, matan sabarataan $2.}}",
+       "category-subcat-count": "{{PLURAL:$2|Pilah ngini baisi asa sub-pilah nangkaya ngini.|Pilih ngini baisi {{PLURAL:$1|sub-pilah|$1 sub-pilah}}, matan sabarataan $2.}}",
        "category-subcat-count-limited": "Tumbung ini baisi {{PLURAL:$1|sub-tumbung|$1 sub-tutumbung}} barikut.",
-       "category-article-count": "{{PLURAL:$2|Tumbung ni baisi asa tungkaran barikut haja.|Tutumbung ngini baisi {{PLURAL:$1|tungkaran|$1 tutungkaran}}, matan $2 sabarataan.}}",
+       "category-article-count": "{{PLURAL:$2|Pilah ngini baisi {{PLURAL:$1|$1 halaman}}, tumatan jumlah $2.}}",
        "category-article-count-limited": "Tumbung ini baisi {{PLURAL:$1|asa tungkaran|$1 tutungkaran}} barikut.",
-       "category-file-count": "{{PLURAL:$2|Tumbung ngini baisi {{PLURAL:$1|$1 barakas}}, matan jumlah $2.}}",
+       "category-file-count": "{{PLURAL:$2|Pilah ngini baisi {{PLURAL:$1|$1 barakas}}, matan jumlah $2.}}",
        "category-file-count-limited": "Tumbung ngini baisi {{PLURAL:$1|barakas|$1 barakas}} barikut.",
        "listingcontinuesabbrev": "samb.",
        "index-category": "Tungkaran tasusun bapadalakan kata",
        "returnto": "Bulik ka $1.",
        "tagline": "Matan {{SITENAME}}",
        "help": "Patulung",
-       "search": "Gagai",
-       "searchbutton": "Gagai",
+       "search": "Pangikihan",
+       "searchbutton": "Kikih",
        "go": "Tulak",
        "searcharticle": "Tulak",
        "history": "Riwayat tungkaran",
        "history_short": "Sajarah",
+       "history_small": "riwayat",
        "updatedmarker": "Dihanyari tumatan ilangan pauncitan ulun",
        "printableversion": "Nang kawa dicitak",
        "permalink": "Tautan tatap",
        "view": "Baca",
        "view-foreign": "Lihat di $1",
        "edit": "Babak",
+       "edit-local": "Babak pamaparan lukal",
        "create": "Ulah",
        "create-local": "Tambah pamaparan lukal",
        "delete": "Hapus",
-       "undelete_short": "Walang mahapus {{PLURAL:$1|asa babakan|$1 bababakan}}",
+       "undelete_short": "Pasah hapus {{PLURAL:$1|$1 babakan}}",
        "viewdeleted_short": "Tiringi {{PLURAL:$1|asa babakan tahapus|$1 bababakan tahapus}}",
        "protect": "Lindungi",
        "protect_change": "ubah",
        "redirectedfrom": "(Diugahakan matan $1)",
        "redirectpagesub": "Tungkaran paugahan",
        "redirectto": "Maugahakan ka:",
-       "lastmodifiedat": "Tungkaran ngini pahabisnya diubah wayah $1, pukul $2.",
+       "lastmodifiedat": "Halaman ngini pahabisan diubah wayah $1, pukul $2.",
        "viewcount": "Tungkaran ini sudah diungkai {{PLURAL:$1|kali|$1 kali}}.",
        "protectedpage": "Tungkaran nang dilindungi",
        "jumpto": "Malacung ka",
        "jumptonavigation": "napigasi",
-       "jumptosearch": "gagai",
+       "jumptosearch": "kikih",
        "view-pool-error": "Ampuni, server lagi limpuar kabaratan wayah ini.\nKabanyakan pamakai nang handak maniringi tungkaran ini.\nMuhun hadangi ha' sapandang sabalum Pian cubai pulang maungkai tungkaran ini.\n\n$1",
        "pool-timeout": "Habis waktu mahadangi gasan tasunduk",
        "pool-queuefull": "Antrian hibak",
        "disclaimerpage": "Project:Panyangkalan umum",
        "edithelp": "Patulung mambabak",
        "mainpage": "Tungkaran Tatambaian",
-       "mainpage-description": "Tungkaran Tatambaian",
+       "mainpage-description": "Halaman Tatambaian",
        "policy-url": "Project:Kaaripan",
-       "portal": "Saképéng bubuhan",
-       "portal-url": "Project:Saképéng bubuhan",
+       "portal": "Lawang bubuhan",
+       "portal-url": "Project:Lawang bubuhan",
        "privacy": "Kaaripan paribadi",
        "privacypage": "Project:Kaaripan paribadi",
        "badaccess": "Parijinan tasalah",
        "youhavenewmessages": "Pian baisi $1 ($2)",
        "youhavenewmessagesfromusers": "Pian baisi $1 matan {{PLURAL:$3|$3 pamakai lain}} ($2).",
        "youhavenewmessagesmanyusers": "Pian baisi $1 matan pamakai lain ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|pasan hanyar|pasan hanyar}}",
+       "newmessageslinkplural": "{{PLURAL:$1|sabuting pasan hanyar|999=pasan hanyar}}",
        "newmessagesdifflinkplural": "{{PLURAL:$1|paubahan|999=paubahan}} pauncitnya",
        "youhavenewmessagesmulti": "Pian baisi pasan hanyar dalam $1",
        "editsection": "babak",
        "editold": "babak",
        "viewsourceold": "tiringi asal mulanya",
        "editlink": "babak",
-       "viewsourcelink": "tiringi asal mulanya",
+       "viewsourcelink": "janaki asal mulanya",
        "editsectionhint": "Babak hagian: $1",
        "toc": "Isi",
        "showtoc": "tampaiakan",
        "site-atom-feed": "Kitihan Atum $1",
        "page-rss-feed": "Kitihan RSS ''$1''",
        "page-atom-feed": "Kitihan Atum ''$1''",
-       "red-link-title": "$1 (tungkaran baluman ada)",
+       "red-link-title": "$1 (halaman baluman ada)",
        "sort-descending": "Surtir baturun",
        "sort-ascending": "Surtir banaik",
-       "nstab-main": "Tungkaran",
+       "nstab-main": "Halaman",
        "nstab-user": "Pamakai",
        "nstab-media": "Média",
        "nstab-special": "Tungkaran istimiwa",
        "nstab-mediawiki": "Pasan",
        "nstab-template": "Citakan",
        "nstab-help": "Patulung",
-       "nstab-category": "Tumbung",
-       "mainpage-nstab": "Tungkaran Tatambaian",
+       "nstab-category": "Pilah",
+       "mainpage-nstab": "Halaman Tatambaian",
        "nosuchaction": "Kadada palakuan nangkaitu",
        "nosuchactiontext": "Tindakan nang diminta URL kada sah.\nPian tagasnya salah katik URL, atawa maumpati sabuting tautan nang kada bujur.\nNgini jua bisa ai ada bug di parangkat lunak nang dipuruk {{SITENAME}}.",
        "nosuchspecialpage": "Kadada tungkaran istimiwa nangitu",
        "perfcached": "Data barikut adalah timbuluk wan pina kada mutakhir. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
        "perfcachedts": "Data nang dudi ni adalah timbuluk, wan tauncit dihahanyari pada $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
        "querypage-no-updates": "Pamugaan matan tungkaran ngini rahat dipajahkan. Data nang ada di sia wayahini kada akan dimuat ulang.",
-       "viewsource": "Tiringi asal mulanya",
+       "viewsource": "Janaki asal mulanya",
        "viewsource-title": "Tiringi asalmula matan $1",
        "actionthrottled": "Kalakuan dikiripi",
        "actionthrottledtext": "Pian dibatasi gasan manggawi tindakan ngini talalu banyak dalam waktu handap, wan Pian sudah limpua batas nang dibarii. Silahkan cuba baasa imbah babarapa manit.",
        "resetpass_forbidden": "Katasunduk kada kawa diubah",
        "resetpass-no-info": "Pian musti babuat log hagan babuat ka tungkaran ini langsung.",
        "resetpass-submit-loggedin": "Ubah katasunduk",
-       "resetpass-submit-cancel": "Walangi",
+       "resetpass-submit-cancel": "Pasahakan",
        "resetpass-wrong-oldpass": "Katasunduk samantara atawa wayah ni kada sah.\nPian pinanya sudah barhasil maubah katasunduk Pian atawa maminta sabuting katasunduk pahadangan nang hanyar.",
        "resetpass-temp-password": "Katasunduk samantara:",
-       "passwordreset": "Bulikakan setelan katasunduk",
+       "passwordreset": "Ubah kata sandi",
        "passwordreset-disabled": "Mambulikakan setelan katasunduk dipajahakan hagan wiki ngini.",
        "passwordreset-username": "Ngaran pamakai:",
        "passwordreset-domain": "Dumain:",
        "accmailtitle": "Katasunduk takirim.",
        "accmailtext": "Sabuting katasunduk babarang gasan [[User talk:$1|$1]] sudah dikirim ka $2.\n\nKatasunduk gasan pamakai hanyar nangini kawa diubah di tungkaran ''[[Special:ChangePassword|ubah katasunduk]]'' imbah babuat log.",
        "newarticle": "(Hanyar)",
-       "newarticletext": "Pian maumpati sabuah tautan ka tungkaran nang baluman ada lagi. Gasan maulah tungkaran, mulai ja mangatik pada kutak di bawah (lihati [$1 tungkaran patulung] gasan panjalasan labih). Amun Pian ka sia cagaran tasalah, klik picikan '''back''' di panjalajah web Pian.",
-       "anontalkpagetext": "----''Ngini adalah tungkaran pamandiran gasan pamakai kada bangaran nang baluman ma-ulah akun pulang, atawa  kada mamakainya. Kami tapaksa mamakai numurik alamat IP hagan maminanduinya.\nAlamat IP nangkaini kawaai dipuruk ulih babarapa pamakai.\nAmun Pian adalah pamuruk kada bangaran wan marasa kumin nang kada pas ta ka Pian, muhun [[Special:CreateAccount|ulah sabuah akun]] atawa [[Special:UserLogin|babuat log]] gasan mahindari kabingungan awan pamakai kada bangaran lain kaina.",
+       "newarticletext": "Pian maumpati tautan ka tungkaran nang balum tasadia. Lamun handak maulah tungkaran itu, katiklah isi tungkaran di kutak di bawah ngini (janaki [$1 tungkaran patulung] gasan maklumat labih lanjut). Lamun pian kada bakurinah sampai ka tungkaran ngini, kalik picikan '''back''' di panjalajah wéb Pian.",
+       "anontalkpagetext": "----''Ngini adalah tungkaran pamandiran gasan pamakai kada bangaran nang baluman ma-ulah akun pulang, atawa  kada mamakainya. Kami tapaksa mamakai numurik alamat IP hagan maminanduinya.\nAlamat IP nangkaini kawaai dipuruk ulih babarapa pamakai.\nAmun Pian adalah pamakai kada bangaran wan marasa kumin nang kada pas ta ka Pian, muhun [[Special:CreateAccount|ulah sabuah akun]] atawa [[Special:UserLogin|babuat log]] gasan mahindari kabingungan awan pamakai kada bangaran lain kaina.",
        "noarticletext": "Damini kadada naskah di tungkaran ngini.\nPian kawa [[Special:Search/{{PAGENAME}}|manggagai gasan judul tungkaran ngini]] di tutungkaran lain, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mancari log tarait], atawa [{{fullurl:{{FULLPAGENAME}}|action=edit}} maulah tungkaran ngini]</span>.",
        "noarticletext-nopermission": "!Damini kadada naskah di tungkaran ngini.\nPian kawa [[Special:Search/{{PAGENAME}}|manggagai gasan judul tungkaran ngini]] di tutungkaran lain, atawa <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} manggagai log tarait]</span>, tagal Pian kada baisi ijin gasan maulah tungkaran ngini",
        "userpage-userdoesnotexist": "Akun pamakai \"<nowiki>$1</nowiki>\" kada tadaptar.\nMuhun pariksa/ditukui amun Pian handak maulah/mambabak tungkaran ngini.",
        "readonlywarning": "'''Paringatan: Basis data disunduk gasan diharagu, jadinya Pian kada kawa manyimpan babakan Pian wayahini.'''\nPian mungkin bagusnya manyalin wan malikap naskah ka sabuah barakas naskah wan simpan ngini gasan kainah.\n\nPambakal nang manyunduk manjalasakan kaini: $1",
        "protectedpagewarning": "'''Paringatan: Tungkaran ngini sudah dilindungi nang akibatnya pamakai awan hak istimiwa pambakal nang kawa mambabak ini.'''\nLog masuk pauncitnya disadiakan di bawah gasan rujukan:",
        "semiprotectedpagewarning": "'''Catatan:''' Tungkaran ngini sudah dilindungi nang akibatnya pamakai tadaptar haja nang kawa mambabak.\nLog masuk pauncitnya disadiakan di bawah gasan rujukan:",
-       "cascadeprotectedwarning": "<strong>Paringatan:</strong> Tungkaran ngini dilindungi jadinya pamakai lawan [[Special:ListGroupRights|hak aksis batantu] wara nang kawa mambabaknya maraga ditransklusiakan dalam {{PLURAL:$1|tungkaran|tungkaran-tungkaran}} nangbdilindungi barinting.",
+       "cascadeprotectedwarning": "<strong>Paringatan:</strong> Tungkaran ngini dilindungi jadinya pamakai lawan [[Special:ListGroupRights|hak aksis batantu] wara nang kawa mambabaknya maraga ditransklusiakan dalam {{PLURAL:$1|tungkaran|tungkaran-tungkaran}} nang dilindungi barinting.",
        "titleprotectedwarning": "'''Paringatan: Tungkaran ngini sudah dilindungi nang akibatnya [[Special:ListGroupRights|hak khas]] diparluakan hagan maulah ngini.'''\nLog masuk pauncitnya disadiakan di bawah gasan rujukan:",
-       "templatesused": "{{PLURAL:$1|Citakan|Citakan}} nang dipakai di tungkaran ngini:",
-       "templatesusedpreview": "{{PLURAL:$1|Citakan|Citakan}} nang dipakai di titilikan ngini:",
+       "templatesused": "{{PLURAL:$1|Citakan|Cicitakan}} nang dipakai di tungkaran ngini:",
+       "templatesusedpreview": "{{PLURAL:$1|Citakan|Cicitakan}} nang dipakai di titilikan ngini:",
        "templatesusedsection": "{{PLURAL:$1|Citakan|Cicitakan}} nang diguna'akan di hagian ini:",
        "template-protected": "(dilindungi)",
        "template-semiprotected": "(semi-dilindungi)",
-       "hiddencategories": "Tungkaran ini adalah angguta matan {{PLURAL:$1|1 tumbung tasungkup|$1 tumbung tasungkup}}:",
+       "hiddencategories": "Halaman ngini adalah angguta matan {{PLURAL:$1|1 pilah tatukup|$1 pilah tatukup}}:",
        "nocreatetext": "{{SITENAME}} lagi mambatasi kakawaan maulah tungkaran hanyar.\nPian kawa babulik wan mambabak sabuah tungkaran nag ada, atawa [[Special:UserLogin|lbabuat log atawa baulah sabuah akun]]",
        "nocreate-loggedin": "Pian kada baisi ijin hagan maulah tungkaran-tungkaran hanyar.",
        "sectioneditnotsupported-title": "Pambabakan hagian kada didukung",
        "undo-norev": "Babakan kada kawa diwalangi karana ini kadada atawa tahapus.",
        "undo-summary": "←Mawalangakan ralatan $1 ulih [[Special:Contributions/$2|$2]] ([[User talk:$2|Pandir]])",
        "cantcreateaccount-text": "Paulahan akun matan alamat IP ('''$1''') sudah diblukir ulih [[User:$3|$3]].\n\nAlasan nang dibari ulih $3 adalah ''$2''",
-       "viewpagelogs": "Tiringi log tungkaran ini",
+       "viewpagelogs": "Janaki log tungkaran ini",
        "nohistory": "Kadada halam babakan gasan tungkaran ini.",
        "currentrev": "Ralatan pahabisannya",
        "currentrev-asof": "Ralatan pahanyarnya pada $1",
        "revisionasof": "Ralatan matan $1",
        "revision-info": "Ralatan par $1 ulih {{GENDER:$6|$2}}$7",
-       "previousrevision": "←Ralatan talawas",
+       "previousrevision": "←Ralatan sabalumnya",
        "nextrevision": "Ralatan salanjutnya→",
        "currentrevisionlink": "Ralatan wayahini",
        "cur": "dmn",
        "histlast": "pahanyarnya",
        "historysize": "($1 {{PLURAL:$1|bita|bibita}})",
        "historyempty": "kusung",
-       "history-feed-title": "Ralatan halam",
-       "history-feed-description": "Ralatan halam gasan tungkaran ini pada wiki",
+       "history-feed-title": "Riwayat ralatan",
+       "history-feed-description": "Riwayat ralatan gasan tungkaran ngini pada wiki",
        "history-feed-item-nocomment": "$1 wayah $2",
        "history-feed-empty": "Tungkaran nang diminta kadada.\nIni pinanya sudah dihapus matan wiki ini, atawa dingarani lain.\nCubai [[Special:Search|gagai di wiki ini]] gasan tungkaran hanyar bakarabat.",
        "rev-deleted-comment": "(kasimpulan babakan dibuang)",
-       "rev-deleted-user": "(ngaran pamuruk dibuang)",
+       "rev-deleted-user": "(ngaran pamakai dihapus)",
        "rev-deleted-event": "(rincian log dihapus)",
-       "rev-deleted-user-contribs": "[ngaran pamuruk atawa alamat IP dibuang - babakan disungkupakan matan daptar sumbangan]",
+       "rev-deleted-user-contribs": "[ngaran pamakai atawa alamat IP dibuang - babakan disungkupakan matan daptar sumbangan]",
        "rev-deleted-text-permission": "Ralatan tungkaran ini sudah '''dihapus'''.\nRarincian kawa diugai dalam [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pahapusan].",
        "rev-deleted-text-unhide": "Ralatan tungkaran ini sudah '''dihapus'''.\nRarincian kawa diugai dalam [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pahapusan].\nSawagai pambakal Pian masih kawa [$1 maniringi ralatan ini] amun Pian hakun manarusakan.",
        "rev-suppressed-text-unhide": "Ralatan tungkaran ini sudah '''ditikin'''.\nRarincian kawa diugai dalam [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} log panikinan].\nSawagai pambakal Pian masih kawa [$1 maniringi ralatan ini] amun Pian hakun manarusakan.",
        "rev-showdeleted": "tampaiakan",
        "revisiondelete": "Hapus/kada mahapus ralatan-ralatan",
        "revdelete-nooldid-title": "Ralatan nag dituju kada sah",
-       "revdelete-nooldid-text": "Pian kada maajuakan sabuah ralatan(-ralatan) tatuju hagan malakuakan pungsi ini, ralatan nang dituju kadada, atawa Pian mancuba manyungkupakan ralatan parhatan ini.",
+       "revdelete-nooldid-text": "Pian kada maajuakan sabuah ralatan tatuju gasan malakuakan pungsi ini, ralatan nang dituju kadada, atawa Pian mancuba mamatak ralatan hahanyaran.",
        "revdelete-no-file": "Barakas nang diajuakan kadada.",
        "revdelete-show-file-confirm": "Pian bujurkah handak maniringi sabuah ralatan tahapus matan barakas \"<nowiki>$1</nowiki>\" $2 pada $3?",
        "revdelete-show-file-submit": "Iya-ai",
        "logdelete-selected": "{{PLURAL:$1|Log kajadian tapilih|Log kakajadian tapilih}}:",
        "revdelete-confirm": "Muhun yakinakan bahwasa Pian handak manggawi ini, bahwasa Pian paham sabab akibat, wan bahwasa Pian manggawi ini bapandal awan [[{{MediaWiki:Policy-url}}|kaaripan]].",
-       "revdelete-suppress-text": "Panikinan parlu dipuruk gasan kakasus baumpat ini:\n* Pina kawa jadi panjalasan pitnah\n* balalabihan panjalasan kada sasuai paribadi\n*: ''alamat badiam wan numur talipun, numur kaamanan susial, dll.''",
+       "revdelete-suppress-text": "Pamatakan ralatan dipakai gasan kasus-kasus imbahini <strong>wara</strong>:\n* informasi bapotensi mampitnah\n* informasi paribadi nang kada sapantasnha\n* <em>alamat rumah wan numur telepon, nomor kartu identitas, wan nang lain.</em>",
        "revdelete-legend": "Setel panampaian tabatas",
-       "revdelete-hide-text": "Sungkupakan naskah ralatan",
+       "revdelete-hide-text": "Teks ralatan",
        "revdelete-hide-image": "Sungkupakan isi barakas",
-       "revdelete-hide-name": "Sungkupakan palakuan wan nang dituju",
-       "revdelete-hide-comment": "Sungkupakan kasimpulan babakan",
-       "revdelete-hide-user": "Sungkupakan ngaran pamuruk/alamat IP pambabak",
+       "revdelete-hide-name": "Patak nang dituju wan parameter",
+       "revdelete-hide-comment": "Kasimpulan babakan",
+       "revdelete-hide-user": "Ngaran pamakai/alamat IP pambabak",
        "revdelete-hide-restricted": "Sungkupakan data matan pambakal nangkaya nang lain",
        "revdelete-radio-same": "(Ditangati maubah)",
-       "revdelete-radio-set": "Iya-ai",
-       "revdelete-radio-unset": "Kada",
+       "revdelete-radio-set": "Dipatak",
+       "revdelete-radio-unset": "Talihat",
        "revdelete-suppress": "Sungkupakan data matan pambakal nangkaya nang lain",
        "revdelete-unsuppress": "Buang pambatasan pada ralatan-ralatan nang dibulikakan",
        "revdelete-log": "Alasan:",
        "revdelete-submit": "Lamar hagan mamilih {{PLURAL:$1|ralatan|ralatan-ralatan}}",
-       "revdelete-success": "'''Panampaian ralatan bakulihan dimutakhirakan.'''",
+       "revdelete-success": "Katarlihatan ralatan kawa dihanyari.",
        "revdelete-failure": "'''Panampaian ralatan kada kawa dimutakhirakan:'''\n$1",
-       "logdelete-success": "'''Log panampaian bahasil disetel.'''",
+       "logdelete-success": "Log panampaian bahasil disetel.",
        "logdelete-failure": "'''Log panampaian kada kawa disetel:'''\n$1",
        "revdel-restore": "Ubah tampilan",
        "pagehist": "Sajarah tungkaran",
        "revdelete-no-change": "'''Paringatan:''' nang batanggal $1, $2 sudah baisi setélan kakawaan-dilihati.",
        "revdelete-concurrent-change": "Kasalahan magaganti nang batanggal $1, $2: nangini cungulnya suah diubah ulih urang lain pas Pian handak magaganti ini.\nMuhun pariksa lolog.",
        "revdelete-only-restricted": "Kasalahan manyungkup ngan batanggal $1, $2: Pian kada kawa manikin matan tiringan ulih papambakal kadada jua mamilih asa matan pilihan kawa-malihati.",
-       "revdelete-reason-dropdown": "*Aalasan umum pahapusan\n** Palangaran hak cipta\n** Kakadasasuaian panjalasan paribadi\n** Pina kawa jadi panjalasan pitnah",
+       "revdelete-reason-dropdown": "*Alasan umum pahapusan\n** Palanggaran hak cipta\n** Kumintar atawa informasi pribadi nang kada pantas\n** Ngaran pamakai nang kada pantas\n** Bapotensi mancamarakan ngaran baik",
        "revdelete-otherreason": "Alasan lain/tatambahan:",
        "revdelete-reasonotherlist": "Alasan lain",
        "revdelete-edit-reasonlist": "Aalasan pahapusan babakan",
        "mergehistory-same-destination": "Tungkaran-tungkaran asal mula wan tatuju kada kawa sama",
        "mergehistory-reason": "Alasan:",
        "mergelog": "Log panggabungan",
-       "revertmerge": "Walang panggabungan",
+       "revertmerge": "Pasah panggabungan",
        "mergelogpagetext": "Di bawah adalah daptar nang paling hanyar panggabungan matan sabuah tungkaran halam ka dalam nang lain.",
        "history-title": "Sajarah ralatan matan \"$1\"",
        "difference-title": "$1: Pabidaan ralatan",
        "diff-empty": "(Kadada bida)",
        "diff-multi-sameuser": "({{PLURAL:$1|$1 ralatan antara}} ulih pamakai nang sama kada ditampaiakan)",
        "diff-multi-otherusers": "({{PLURAL:$1|Satu ralatan antara|$1 ralatan antara}} ulih {{PLURAL:$2|satu pamakai lainnya|$2 pamakai}} kada ditampaiakan)",
-       "diff-multi-manyusers": "({{PLURAL:$1|Asa ralatan tangah|$1 raralatan tangah}} ulih labih pada $2 {{PLURAL:$2|pamuruk|papamuruk}} kada ditampaiakan)",
+       "diff-multi-manyusers": "({{PLURAL:$1|Satu|$1}} ralatan antara ulih labih matan $2 {{PLURAL:$2|satu|$2}} pamakai kada ditampaiakan)",
        "searchresults": "Kulihan panggagaian",
-       "searchresults-title": "Kulihan gagai gasan \"$1\"",
+       "searchresults-title": "Kulihan pangikihan gasan \"$1\"",
        "titlematches": "Judul tungkaran pas",
        "textmatches": "Naskah tungkaran pas",
        "notextmatches": "Kadada tungkaran banaskah pas",
        "search-section": "(hagian $1)",
        "search-file-match": "(rasuk lawan isi barakas)",
        "search-suggest": "Nginikah maksud Pian: $1",
-       "search-interwiki-caption": "Dingsanak rangka gawian",
-       "search-interwiki-default": "Kulihan $1",
+       "search-interwiki-caption": "Kulihat matan rangka gawian dangsanak",
+       "search-interwiki-default": "Kulihan matan $1:",
        "search-interwiki-more": "(lagi)",
        "search-relatedarticle": "Bakulaan",
        "searchrelated": "bakulaan",
        "prefs-watchlist": "Paitihan",
        "prefs-watchlist-days": "Rikinan hari-hari ditampaiakan di daptar itihan:",
        "prefs-watchlist-days-max": "Maksimum $1 {{PLURAL:$1|hari|hahari}}",
-       "prefs-watchlist-edits": "Rikinan paningginya matan paubahan hagan ditampaiakan pada singkaian daptar itihan:",
+       "prefs-watchlist-edits": "Rikinan paningginya matan paubahan gasan ditampaiakan pada daptar itihan:",
        "prefs-watchlist-edits-max": "Rikinan paningginya:1000",
        "prefs-watchlist-token": "Token itihan:",
        "prefs-misc": "Balalain",
        "prefs-resetpass": "Ubah katasunduk",
-       "prefs-changeemail": "Ganti suril",
+       "prefs-changeemail": "Babak atawa hapus alamat suril",
        "prefs-setemail": "Setel sabuah alamat suril",
        "prefs-email": "Pipilihan suril",
        "prefs-rendering": "Pancungulan",
        "saveprefs": "Simpan",
-       "restoreprefs": "Bulikakan samunyaan sesetélan default",
+       "restoreprefs": "Bulikakan samunyaan sesetélan bawaan (di sabarataan seksi)",
        "prefs-editing": "Pambabakan",
        "searchresultshead": "Gagai",
-       "stub-threshold": "Ambang watas gasan pormat <a href=\"#\" class=\"stub\">taautan rintisan</a>:",
+       "stub-threshold": "Ambang watas gasan pormat tautan rintisan ($1):",
        "stub-threshold-disabled": "Kada kawa-akan",
        "recentchangesdays": "Jumlah hari nang manampaiakan paubahan pahanyarnya:",
        "recentchangesdays-max": "Paling lawas $1 {{PLURAL:$1|hari|hahari}}",
-       "recentchangescount": "Rikinan babakan nang ditampaiakan default:",
-       "prefs-help-recentchangescount": "Ngini tamasuk paubahan pahanyarnya, sajarah halam tungkaran, wan log-log.",
+       "recentchangescount": "Rikinan babakan default gasan ditampaiakan di paubahan pahanyarnya, riwayat tungkaran, wan di tungkaran log:",
+       "prefs-help-recentchangescount": "Rikinan paningginya: 1000",
        "savedprefs": "Kakatujuan Pian sudah ham disimpan.",
        "timezonelegend": "Waktu banua:",
        "localtime": "Waktu damintu:",
        "timezoneregion-europe": "Irupa",
        "timezoneregion-indian": "Lalautan Hindia",
        "timezoneregion-pacific": "Lalautan Pasipik",
-       "allowemail": "Kawa'akan pamakai lain mangirim suril",
-       "prefs-searchoptions": "Papilihan manggagai",
+       "allowemail": "Kawa'akan pamakai lain mangirim suril lawan ulun",
+       "prefs-searchoptions": "Gagai",
        "prefs-namespaces": "Ngaran kamar",
        "default": "default",
        "prefs-files": "Barakas",
        "prefs-custom-css": "Saragamakan CSS",
        "prefs-custom-js": "Saraganakan JavaScript",
-       "prefs-common-config": "Babagi CSS/JavaScript gasan samunyaan skin:",
+       "prefs-common-config": "Babagi CSS/JavaScript gasan samunyaan kulimbit:",
        "prefs-reset-intro": "Pian kawa mamuruk tungkaran ini hagan setel bulik kakatujuan Pian ka default situs.\nIni kada kawa diwalangi.",
        "prefs-emailconfirm-label": "Payakinakan suril:",
        "youremail": "Suril:",
-       "username": "Ngaran pamuruk:",
-       "prefs-memberingroups": "Angguta matan {{PLURAL:$1|galambang|gagalambang}}:",
+       "username": "{{GENDER:$1|Ngaran pamakai}}:",
+       "prefs-memberingroups": "{{GENDER:$2|Angguta}}{{PLURAL:$1|galambang|gagalambang}}:",
        "prefs-registration": "Waktu pandaptaran:",
        "yourrealname": "Ngaran asli:",
        "yourlanguage": "Bahasa:",
        "prefs-help-signature": "Kumintar pada tungkaran pamandiran parlu ditandatangani awan \"<nowiki>~~~~</nowiki>\" nangapa akan taubah jadi tandatangan Pian wan waktu wayahini.",
        "badsig": "Tandatangan mantah kada sah.\nPariksa tag HTML.",
        "badsiglength": "Tapak tangan Sampian talalu panjang. Jangan malabihi pada $1 {{PLURAL:$1|karakter|karakter}}.",
-       "yourgender": "Janis kalamin:",
-       "gender-unknown": "Kada diajuakan",
-       "gender-male": "Lalakian",
-       "gender-female": "Bibinian",
-       "prefs-help-gender": "Opsional: dipuruk gasan mambaiki manyambat gindir ulih parangkat lunak. Panjalasan ngini akan tasingkai hagan umum.",
+       "yourgender": "Kaya apa pian handak dijalasakan?",
+       "gender-unknown": "Wayah manyambat pian, parangkat lunak pacangan mamakai kata netral wayah parlu",
+       "gender-male": "Inya (lakian) mambabak tungkaran wiki",
+       "gender-female": "Inya (binian) mambabak tungkaran wiki",
+       "prefs-help-gender": "Paraturan katujuan ngini opsional.\nParangkat lambik mamakai nilainya gasan maarahakan pian wan manyambat pian ka sabarataan pamakaian mamakai hiauan janis kalamin.\nInformasi nginji pacangan publik.",
        "email": "Suril",
        "prefs-help-realname": "Ngaran bujur adalah pilihan haja.\nAmun Pian mamilih manyadiakan ini, ini akan dipuruk gasan paminanduan kulihan gawian Pian.",
        "prefs-help-email": "Alamat suril adalah opsional, tagal pun parlu gasan mambulikakan setelan katasunduk, amunai Pian kada ingatan.",
        "prefs-diffs": "Bida",
        "userrights": "Pangalulaan hak-hak pamuruk",
        "userrights-lookup-user": "Mangalula gagalambang pamuruk",
-       "userrights-user-editname": "Buati sabuah ngaran pamuruk:",
+       "userrights-user-editname": "Masukakan ngaran pamakai:",
        "editusergroup": "Babak galambang pamuruk",
        "editinguser": "Ma-ubah hak ungkai pamuruk '''[[User:$1|$1]]''' $2",
        "userrights-editusergroup": "Babak galambang pamuruk",
        "userrights-groupsmember-auto": "Angguta tasirat matan:",
        "userrights-groups-help": "Pian kawa maubah galambang pamuruk ngini:\n* Kutak awan tanda cek artnya galambang pamuruk nang basangkutan\n* Kutak kada batanda cek artinya pamuruk ngini lainan angguta galambang ngitu\n* Tanda * manandai bahwasa Pian kada kawa mawalangi galambang ngitu amun Pian sudah manambahinya, atawa kabalikannya.",
        "userrights-reason": "Alasan:",
-       "userrights-no-interwiki": "Pian kada baisi ijin hagan mambabak hak pamuruk di wiki lain.",
+       "userrights-no-interwiki": "Pian kada baisi hak gasan maubah hak pamakai di wiki nang lain.",
        "userrights-nodatabase": "Basis data $1 kadada atawa lainan lukal.",
        "userrights-changeable-col": "Gagalambang nang Pian kawa ubah",
        "userrights-unchangeable-col": "Gagalambang nang Pian kada kawa ubah",
        "group-sysop-member": "{{GENDER:$1|pambakal}}",
        "group-bureaucrat-member": "{{GENDER:$1|birukrat}}",
        "group-suppress-member": "{{GENDER:$1|pangawas}}",
-       "grouppage-user": "{{ns:project}}: Pamuruk",
-       "grouppage-autoconfirmed": "{{ns:project}}: Pamuruk utumatis diyakinakan",
+       "grouppage-user": "{{ns:project}}: Pamakai",
+       "grouppage-autoconfirmed": "{{ns:project}}:Pamakai takunfirmasi utumatis",
        "grouppage-bot": "{{ns:project}}:Bot",
        "grouppage-sysop": "{{ns:project}}:Pambakal",
        "grouppage-bureaucrat": "{{ns:project}}:Birukrat",
        "right-minoredit": "Tandai bababakan sawagai sapalih",
        "right-move": "Mamindahakan tungkaran",
        "right-move-subpages": "Ugahakan tutungkaran awan subtumgkaran-nya",
-       "right-move-rootuserpages": "Ugahakan akar tutungkaran pamuruk",
+       "right-move-rootuserpages": "Mamindahakan tungkaran utama pamakai",
        "right-movefile": "Mamindahakan barakas",
        "right-suppressredirect": "Kada maulah paugahan matan tutungkaran asal mula parhatan tutungkan pindahan",
        "right-upload": "Unggahakan barakas",
        "right-bot": "Ditindak sawagai sabuah proses utumatis",
        "right-nominornewtalk": "Kadada babakan sapalih di tutungkaran pamandiran nang mancungulakan tampaian pasan puga",
        "right-apihighlimits": "Mamuruk watas kueri API tatinggi",
-       "right-writeapi": "Puruk panulisan API",
+       "right-writeapi": "Pakai panulisan API",
        "right-delete": "Mahapus tungkaran",
        "right-bigdelete": "Hapus tutungkaran awan hahalam ganal",
-       "right-deletelogentry": "Hapus wan walangakan pahapusan masukan log tartantu",
+       "right-deletelogentry": "Mahapus wan mamasahakan pahapusan masukan log tartantu",
        "right-deleterevision": "Mahapus wan mawalangi hapus raralatan tatantu matan tutungkaran",
        "right-deletedhistory": "Tiringi mamasukan halam tahapus, kada banaskah tarait",
        "right-deletedtext": "Tiringi naskah tahapus wan paubahan antar raralatan nang tahapus",
        "right-undelete": "Mambulikakan sabuah tungkaran tahapus",
        "right-suppressrevision": "Maniring pulang wan mambulikakan raralatan matan papambakal",
        "right-suppressionlog": "Tiringi log paribadi",
-       "right-block": "Blukir pamuruk lain mambabak",
-       "right-blockemail": "Blukir saurang pamuruk mangirimi suril",
+       "right-block": "Blukir pamakai lain matan pambabakan",
+       "right-blockemail": "Mamblukir pangiriman surél ulih pamakai",
        "right-hideuser": "Blukir sabuah ngaranpamuruk, sungkupakan ini matan umum",
        "right-ipblock-exempt": "Liwati blukir IP, blukir-utumatis wan aria blukir",
        "right-unblockself": "Lapas blukirnya surang",
        "right-protect": "Ubah tingkat parlindungan wan babakan tutungkaran nang diindungi",
        "right-editprotected": "Babak tungkaran nang dilindungi (kada parlindungan barenteng)",
-       "right-editinterface": "Babak antarmuha pamuruk ini",
+       "right-editinterface": "Mambabak antarmuha pamakai",
        "right-editusercss": "Babak pamruk lain babarakas CSS",
-       "right-edituserjson": "Babak pamuruk lain babarakas JSON",
-       "right-edituserjs": "Babak pamuruk lain babarakas JavaScript",
-       "right-rollback": "Mambulikakan hancap bababakan matan pamuruk tauncit nang mambabak sabuah tungkaran tatantu",
+       "right-edituserjson": "Mambabak barakas JSON pamakai lain",
+       "right-edituserjs": "Mambabak barakas JS pamakai lain",
+       "right-rollback": "Mambulikakan hancap babakan pamakai pauncitnya nang mambabak tungkaran tartantu",
        "right-markbotedits": "Tandai bababakan dibulikakan sawagai bababakan bot",
        "right-noratelimit": "Kada pangaruh awan watas rating",
        "right-import": "Impur tutungkaran matan wiwiki lain",
        "right-patrolmarks": "Tiringi tanda paubahan pahanyarnya",
        "right-unwatchedpages": "Tiringi sabuah daptar tutungkaran nang kada diitihi",
        "right-mergehistory": "Gabungakan halam matan tutungkaran",
-       "right-userrights": "Babak sabarataan hak pamuruk",
-       "right-userrights-interwiki": "Babak hahak pamuruk matan papamuruk wiwiki balain",
+       "right-userrights": "Babak sabarataan hak pamakai",
+       "right-userrights-interwiki": "Mambabak hak para pamakai di wiki lain",
        "right-siteadmin": "Sunduk wan buka sunduk basis data",
        "right-override-export-depth": "Ekspur tutungkaran tamasuk tutungkaran tataut sampai kadalaman 5",
        "right-sendemail": "Mangirim suril ka papamuruk lain",
        "newuserlogpage": "Log pamakai hanyar",
-       "newuserlogpagetext": "Ngini adalah sabuah log paulahan pamuruk.",
+       "newuserlogpagetext": "Di bawah ini log pandaptaran pamakai hanyar",
        "rightslog": "Log paubahan hak masuk",
        "rightslogtext": "Nangini sabuting log paubahan ka hak pamakai.",
        "action-read": "baca tungkaran ini",
        "action-minoredit": "tandai babakan ini sawagai sapalih",
        "action-move": "pindahakan tungkaran ini",
        "action-move-subpages": "pindahakan tungkaran ini, wan sub-tutungkarannya",
-       "action-move-rootuserpages": "mamindahakan akar tutungkaran pamuruk",
+       "action-move-rootuserpages": "mamindahakan laman utama pamakai",
        "action-movefile": "pindahakan barakas ini",
        "action-upload": "hunggahakan barakas ini",
        "action-reupload": "manimpa barakas nang ada",
        "action-undelete": "kada jadi mahapus tungkaran ini",
        "action-suppressrevision": "tilik wan bulikakan ralatan tasungkup ini",
        "action-suppressionlog": "tiringi log paribadi ini",
-       "action-block": "blukir pamuruk ini matan mambabak",
+       "action-block": "Blukir pamakai ngini matan mambabak",
        "action-protect": "Ubah tingkat parlindungan tungkaran ngini",
-       "action-rollback": "Mambulikakan hancap bababakan matan pamuruk tauncit nang mambabak sabuah tungkaran tatantu.",
+       "action-rollback": "Mambulikakan hancap babakan matan pamakai pauncitnya nang mambabak tungkaran tartantu.",
        "action-import": "Impur tungkaran ngini matan wiki lain",
        "action-importupload": "Impur tungkaran ngini matan sabuah barakas hunggahan",
        "action-patrol": "tandai babakan nang lain sawagai ta'awasi",
        "action-autopatrol": "Tandai babakan Pian sawagai ta'awasi",
        "action-unwatchedpages": "tiringi daptar tutungkaran nang kada diitihi",
        "action-mergehistory": "gabungakan halam matan tungkaran ngini",
-       "action-userrights": "babak sabarataan hak pamuruk",
-       "action-userrights-interwiki": "babak hak pamuruk matan papamuruk dalam wiwiki lain",
+       "action-userrights": "babak sabarataan hak pamakai",
+       "action-userrights-interwiki": "mambabak hak aksés matan pamakai di wiki lain",
        "action-siteadmin": "sunduk atawa bukasunduk basisdata",
        "action-sendemail": "Kirim suril",
        "nchanges": "$1 {{PLURAL:$1|paubahan|paubahan}}",
        "recentchangeslinked-feed": "Paubahan tarait",
        "recentchangeslinked-toolbox": "Paubahan tarait",
        "recentchangeslinked-title": "Paubahan nang tarait lawan \"$1\"",
-       "recentchangeslinked-summary": "Masukakan ngaran tungkaran gasan malihat paubahan pada halaman tapaut matan atawa ka tungkaran itu (amun handak malihat angguta sabuting tumbung, masukakan Tumbung:Ngaran tumbung). Paubahan pada [[Special:Watchlist|daptar itihan Pian]] talihat <strong>dicitak kandal</strong>.",
+       "recentchangeslinked-summary": "Masukakan ngaran halaman gasan malihat paubahan pada halaman tapaut matan atawa ka tungkaran itu (amun handak malihat angguta sabuting pilah, masukakan Pilah:Ngaran pilah). Paubahan pada [[Special:Watchlist|daptar itihan Pian]] talihat <strong>dicitak kandal</strong>.",
        "recentchangeslinked-page": "Ngaran tungkaran:",
        "recentchangeslinked-to": "Tampaiakan paubahan matan tutungkaran nang bataut lawan tungkaran nang disurungakan",
-       "upload": "Hunggahakan barakas",
+       "upload": "Unggah barakas",
        "uploadbtn": "Hunggahakan barakas",
-       "reuploaddesc": "Walang mahunggah wan babulik ka purmulir hunggahan",
+       "reuploaddesc": "Babulik ka furmulir paunggahan",
        "upload-tryagain": "Kirim katarangan barakas taubah",
        "uploadnologin": "Baluman babuat log",
        "uploadnologintext": "Pian musti [[Special:UserLogin|babuat log]] amun handak mahunggah babarakas.",
        "zip-bad": "Barakas ngini korup atawa pinanya barakas ZIP nang kada kawa dibaca.\nBarakas ngini kada kawa dipariksa  gasan kaamanan.",
        "zip-unsupported": "Barakas ngini adalah sabuah barakas ZIP nang dipuruk pitur ZIP nang kada disukung ulih MediaWiki.\nNgini kada kawa dipariksa gasan kaamanan.",
        "uploadstash": "Simpanan hunggahan",
-       "uploadstash-summary": "Tungkaran ngini manyadiakan ungkaian ka babarakas nang tahunggah (atawa dalam proses hunggahan) tapi baluman ditarbitakan ka wiki.\nBabarakas ngini kada kawa dilihat ka siapa pun kacuali pamuruk nang mahunggahnya.",
+       "uploadstash-summary": "Tungkaran ngini manyadiaakan ungkaian ka barakas nang taunggah (atawa dalam prosés unggahan) tapi baluman ditarbitakan ka wiki.\nBarakas ngini kada kawa dijanaki ka siapa pun kacuali pamakai nang maunggahnya.",
        "uploadstash-clear": "Kalarakan babarakas simpanan.",
        "uploadstash-nofiles": "Pian kada baisi babarakas simpanan.",
        "uploadstash-badtoken": "Aksi kada ruhui dilaksanaakan, pinanya karana babakan Pian sudah kadaluarsa. Cubai pulang.",
        "img-auth-isdir": "Pian mancuba hagan maungkai sabuah direktori \"$1\".\nHanya maungkai barakas dibulihakan.",
        "img-auth-streaming": "Streaming \"$1\".",
        "img-auth-public": "Pungsi img_auth.php mangaluarakan babarakas matan sabuah wiki paribadi.\nWiki ngini diatur sawagai wiki umum.\nGasan kaamanan baik, img_auth.php dipajahakan.",
-       "img-auth-noread": "Pamuruk kada baisi hak ungkai hagan mambaca \"$1\".",
+       "img-auth-noread": "Pamakai kada baisi hak ungkai gasan mambaca \"$1\".",
        "http-invalid-url": "URL kada sah: $1",
        "http-invalid-scheme": "URL lawan skema \"$1\" kada disukung.",
        "http-request-error": "Maminta HTTP gagal karana kasalah kada dikatahui.",
        "listfiles_thumb": "Pahalusan",
        "listfiles_date": "Tanggal",
        "listfiles_name": "Ngaran",
-       "listfiles_user": "Pamuruk",
+       "listfiles_user": "Pamakai",
        "listfiles_size": "Ukuran",
        "listfiles_description": "Pamaparan",
        "listfiles_count": "Janis",
        "file-anchor-link": "Barakas",
        "filehist": "Riwayat barakas",
-       "filehist-help": "Klik pada tanggal/waktu gasan maniringi barakas ngini pada wayah itu.",
+       "filehist-help": "Klik pada tanggal/waktu gasan manjanaki barakas ngini pada wayah itu.",
        "filehist-deleteall": "hapus samunyaan",
        "filehist-deleteone": "hapus",
        "filehist-revert": "bulikakan",
        "filehist-current": "daminian",
        "filehist-datetime": "Tanggal/Waktu",
-       "filehist-thumb": "Pahalusan",
+       "filehist-thumb": "Miniatur",
        "filehist-thumbtext": "Pahalusan gasan bantuk per $1",
-       "filehist-nothumb": "Kadada thumbnail",
+       "filehist-nothumb": "Kadada miniatur",
        "filehist-user": "Pamakai",
        "filehist-dimensions": "Matra",
        "filehist-filesize": "Ukuran barakas",
        "filehist-comment": "Ulasan",
        "imagelinks": "Tautan barakas",
        "linkstoimage": "{{PLURAL:$1|Tungkaran|$1 tungkaran}} nangini mamakai barakas ngini:",
-       "linkstoimage-more": "Labihan pada $1 {{PLURAL:$1|tatautan tungkaran|tautan tutungkaran}} ka barakas ngini.\nDaptar barikut manampaiakan {{PLURAL:$1|tautan panambaian tungkaran|$1 panambaian tatautan tungkaran}} ka barakas ngini haja.\nSabuah [[Special:WhatLinksHere/$2|daptar hibak]] tasadia.",
+       "linkstoimage-more": "Labih daripada $1 {{PLURAL:$1|pamakaian tungkaran|pamakaian tutungkaran}} ka barakas ngini.\nDaptar barikut manampaiakan {{PLURAL:$1|tungkaran panambaian|$1 tungkaran panambaiam}} nang mamakai barakas ngini haja.\nSabuah [[Special:WhatLinksHere/$2|daptar hibak]] tasadia.",
        "nolinkstoimage": "Kadada tutungkaran nang mamakai barakas ngini.",
        "morelinkstoimage": "Tiringi [[Special:WhatLinksHere/$1|tautan lagi]] ka barakas ngini.",
        "linkstoimage-redirect": "$1 (barakas paugahan) $2",
        "unusedtemplates": "Citakan nang kada dipuruk",
        "unusedtemplatestext": "Daptar barikut adalah samua tungkaran pada ngaran kamar {{ns:template}} nang kada dipuruk di tungkaran manapun.\nPariksa 'hulu tautan lain ka citakan itu sabalum mahapusnya.",
        "unusedtemplateswlh": "tautan lain",
-       "randompage": "Tungkaran babarang",
+       "randompage": "Halaman babarang",
        "randompage-nopages": "Kadada tungkaran pada {{PLURAL:$2||}}kamar ngaran ini: $1.",
        "randomredirect": "Paugahan babarang",
        "randomredirect-nopages": "Kada tadapat paugahan pada ngaran kamar \"$1\".",
        "statistics": "Statistik",
        "statistics-header-pages": "Statistik tungkaran",
        "statistics-header-edits": "Statistik babakan",
-       "statistics-header-users": "Statistik pamuruk",
+       "statistics-header-users": "Statistik pamakai",
        "statistics-header-hooks": "Statistik lainnya",
        "statistics-articles": "Tungkaran isi",
        "statistics-pages": "Jumlah tungkaran",
        "statistics-files": "Barakas nang dihunggahakan",
        "statistics-edits": "Jumlah babakan tumatan {{SITENAME}} dimulai",
        "statistics-edits-average": "Rata-rata babakan par tungkaran",
-       "statistics-users": "Jumlah pamuruk tadaptar",
-       "statistics-users-active": "Jumlah pamuruk aktip",
-       "statistics-users-active-desc": "Pamuruk nang sudah malakukan suatu aksi dalam {{PLURAL:$1|sahari|$1 hari}} tauncit.",
+       "statistics-users": "Jumlah pamakai tadaptar",
+       "statistics-users-active": "Jumlah pamakai aktip",
+       "statistics-users-active-desc": "Pamakai nang sudah malakukan suatu gawian dalam {{PLURAL:$1|sahari|$1 hari}} pauncitnya.",
        "doubleredirects": "Paugahan ganda",
        "doubleredirectstext": "Tungkaran ngini mandaptar tutungkaran nang maugah ka tutungkaran ugahan lain.\nTiap baris mangandung tautan ka ugahan panambaian wan kadua, sasarannya adalah ugahn kadua, nang biasanya tungkaran sasaran \"sabujurnya\", nang ugahan partama tuju.\nMasukan nang <del>Disilangi</del> sudah dibaiki.",
        "double-redirect-fixed-move": "[[$1]] sudah dipindahakan.\nNgini wayah ini sudah diugahakan ka [[$2]].",
        "unusedimagestext": "Babarakas barikut ada tagal kada diumpatakan di tungkaran mamana.\nMuhun catat bahwasa situs web lain pina-ai bataut ka sabuah barakas awan sabuah URL langsung, wan karana ngini masih-ha didaptar di sia biar gin aktip dipuruk.",
        "unusedcategoriestext": "Tumbung tutungkaran barikut ada, walaupun kadada tungkaran lain atawa tumbung mamuruknya.",
        "notargettitle": "Kadada tujuan",
-       "notargettext": "Pian kada maajuakan sabuah tungkaran atawa pamuruk sasaran malakuakan palakuan ini.",
+       "notargettext": "Pian kada manantuakan tungkaran atawa pamakai tujuan tugas ngini.",
        "nopagetitle": "Kadada tungkaran sasaran",
        "nopagetext": "Tungkaran sasaran nang Pian ajuakan kadada.",
        "pager-newer-n": "{{PLURAL:$1|labih hanyar 1|labih hanyar $1}}",
        "suppress": "Pangawasan",
        "querypage-disabled": "Tungkaran istimiwa ngini dikada-kawakan gasan alasan ginawi.",
        "booksources": "Buku bamula",
-       "booksources-search-legend": "Gagai gasan buku asal mula",
-       "booksources-search": "Gagai",
+       "booksources-search-legend": "Kikih di asal mula buku",
+       "booksources-search": "Kikih",
        "booksources-text": "Di bawah adalah sabuah daptar tautan ka situs lain nang manjual bubuku hanyar wan bakas, wan jua baisi panjalasan labih pasal bubuku nang Pian ugai:",
        "booksources-invalid-isbn": "ISBN nang dibari mancungul kada sah; pariksa kalua-ai tasalah marekap matan asal-mula aslinya.",
        "specialloguserlabel": "Pamakai:",
        "categories": "Tutumbung",
        "categoriespagetext": "{{PLURAL:$1|tumbung mangandung|tutumbung mangandung}} barikut baisi tutungkaran atawa midia.\n[[Special:UnusedCategories|Tumbung kada dipuruk]] kada ditampaiakan di sia.\nJanaki jua [[Special:WantedCategories|tutumbung nang dihandaki]].",
        "categoriesfrom": "Manampaiakan tutumbung mulai matan:",
-       "deletedcontributions": "Hapus sumbangan pamuruk",
-       "deletedcontributions-title": "Hapus sumbangan pamuruk",
+       "deletedcontributions": "Sumbangan nang dihapus",
+       "deletedcontributions-title": "Sumbangan nang dihapus",
        "sp-deletedcontributions-contribs": "Sumbangan",
        "linksearch": "Manggagai tautan luar",
        "linksearch-pat": "Gagai bapola:",
        "linksearch-error": "Kartu-liar mancungul pintang awalan matan ngaranhost.",
        "listusersfrom": "Manampaiakan papamuruk mulai matan:",
        "listusers-submit": "Tampaiakan",
-       "listusers-noresult": "Kadada pamuruk tatamu.",
+       "listusers-noresult": "Pamakai kada tahaga.",
        "listusers-blocked": "(diblukir)",
-       "activeusers": "Daptar pamuruk aktip",
+       "activeusers": "Daptar pamakai aktip",
        "activeusers-intro": "Ngini adalah sabuah daptar papamuruk sabuah bantuk kagiatan dalam tauncit $1 {{PLURAL:$1|hari|hahari}}.",
        "activeusers-count": "$1 {{PLURAL:$1|babak|babakan}} dalam tauncit {{PLURAL:$3|hari|$3 hahari}}",
        "activeusers-from": "Manampaiakan papamuruk mulai matan:",
        "activeusers-noresult": "Kadada papamuruk tatamu.",
-       "listgrouprights": "Galambang hak pamuruk",
-       "listgrouprights-summary": "Barikut adalah sabuah daptar matan galambang pamuruk nang ada di wiki ngini, lawan hak ungkai masing-masing.\nAda di [[{{MediaWiki:Listgrouprights-helppage}}|tambahan panjalasan]] pasal hak par urangan.",
+       "listgrouprights": "Daptar hak galambang",
+       "listgrouprights-summary": "Nangini daptar galambang pamakai nang tahaga di wiki ini, lawan daptar hak maungkai bubuhannya. Maklumat salanjutnya sual hak masing-masing kawa ditamuakan di [[{{MediaWiki:Listgrouprights-helppage}}|tungkaran patulung hak pamakai]].",
        "listgrouprights-key": "* <span class=\"listgrouprights-granted\">Hak nang balaku</span>\n* <span class=\"listgrouprights-revoked\">Hak nang dicukut</span>",
        "listgrouprights-group": "Galambang",
        "listgrouprights-rights": "Hak",
        "mailnologintext": "Pian musti [[Special:UserLogin|babuat log]] wan baisi sabuah alamat suril sah di [[Special:Preferences|kakatujuan]] Pian hagan mangirim suril ka papamuruk lain.",
        "emailuser": "Suril pamakai",
        "emailpagetext": "Pian kawa mamuruk purmulir di bawah hagan mangirim sabuah suril ka pamuruk ngini.\nAlamat sril Pian pintang [[Special:Preferences|kakatujuan pamuruk Pian]] akan cungul  sawagai \"Matan\" alamat suril, lalu-ai panarima akan kawa langsung mambalas ka Pian.",
-       "defemailsubject": "Suril {{SITENAME}} matan pamuruk \"$1\"",
-       "usermaildisabled": "Suril pamuruk dipajahakan",
+       "defemailsubject": "Surél {{SITENAME}} matan pamakai \"$1\"",
+       "usermaildisabled": "Surél pamakai dipajahakan",
        "usermaildisabledtext": "Pian kada kawa mangirim suril ka papamuruk lain di wiki ngini",
        "noemailtitle": "Kadada alamat suril",
-       "noemailtext": "Pamuruk ngini kada baisi sabuah alamat suril sah nang diajuakan.",
-       "nowikiemailtext": "Pamuruk ngini sudah mamilih kada manarima suril matan papamuruk lain.",
+       "noemailtext": "Pamakai ngini kada baisi alamat surél sah nang diajuakan.",
+       "nowikiemailtext": "Pamakai ngini sudah mamilih kada manarima surél matan pamakai lain.",
        "emailnotarget": "Kada-tasadia atawa ngaranpamuruk kada sah gasan panarima.",
        "emailtarget": "Buati ngaranpamuruk panarima",
        "emailusername": "Ngaranpamuruk:",
        "emailusernamesubmit": "Kirim",
-       "email-legend": "Kirimi sabuah suril ka pamuruk {{SITENAME}} lain",
+       "email-legend": "Kirimi surél ka pamakai {{SITENAME}} lainnya",
        "emailfrom": "Matan:",
        "emailto": "Hagan:",
        "emailsubject": "Parihal:",
        "unwatch": "Pasah maitihi",
        "unwatchthispage": "Mandak maitihi",
        "notanarticle": "Lainan sabuting tungkaran isi",
-       "notvisiblerev": "Ralatan tauncit ulih saurang pamuruk babida sudah dihapus",
-       "watchlist-details": "{{PLURAL:$1|$1 tungkaran|$1 tungkaran}} dalam daptar itihan Pian, kada mahitung tungkaran pamandiran.",
+       "notvisiblerev": "Ralatan sudah dihapus",
+       "watchlist-details": "Tahaga {{PLURAL:$1|$1 tungkaran|$1 tungkaran}} di daptar itihan Pian, (tamasuk tungkaran pamandiran).",
        "wlheader-enotif": "Suril pamadahan dipajahi.",
-       "wlheader-showupdated": "Tutungkaran nang ba-ubah tumatan ilangan tauncit Pian ditampaiakan dalam '''hurup kandal'''",
-       "wlnote": "Di bawah naya adalah {{PLURAL:$1|paubahan|'''$1''' paubahan}} tauncit dalam '''$2''' jam tauncit, par $3, $4.",
+       "wlheader-showupdated": "Tutungkaran nang ba-ubah tumatan ilangan tauncit Pian ditampaiakan dalam <strong>hurup kandal</strong>.",
+       "wlnote": "Dibawah ngini adalah {{PLURAL:$1|paubahan pahabisan|<strong>$1</strong> paubahan pahabisan}} dalam {{PLURAL:$2|sajam|<strong>$2</strong> jam}} par $3, $4.",
        "wlshowlast": "Tampaiakan $1 jam $2 hari pahabisan",
        "watchlist-options": "Pilihan daptar itihan",
        "watching": "Maitihi...",
        "unwatching": "Kada jadi maitihi...",
        "watcherrortext": "Sabuting kasalahan tajadi parhatan setelan paitihan Pian diubah gasan \"$1\".",
        "enotif_reset": "Tandai samunyaan tutungkaran sudah diilangi",
-       "enotif_impersonal_salutation": "Pamuruk {{SITENAME}}",
+       "enotif_impersonal_salutation": "Pamakai {{SITENAME}}",
        "enotif_subject_deleted": "Tungkaran $1 di {{SITENAME}} hudah dihapus ulih {{gender:$2|$2}}",
        "enotif_subject_created": "Tungkaran $1 di {{SITENAME}} hudah diulah ulih {{gender:$2|$2}}",
        "enotif_subject_moved": "Tungkaran $1 di {{SITENAME}} hudah dipindahakan ulih {{gender:$2|$2}}",
        "rollbacklinkcount": "bulikakan $1 {{PLURAL:$1|babakan}}",
        "rollbackfailed": "Guling-bulik luput",
        "cantrollback": "Kada kawa mambalikakan babakan;\npanyumbang tauncit adalah asa-asanya panulis tungkaran ngini.",
-       "alreadyrolled": "Kada kawa malakukan pambulikan ka ralatan tauncit [[:$1]] ulih [[User:$2|$2]] ([[User talk:$2|pandir]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\npamuruk lain sudah mambabak atawa malakukan pambulikan lawan tungkaran ini.\n\nBabakan tauncit dilakukan ulih [[User:$3|$3]] ([[User talk:$3|pandir]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
+       "alreadyrolled": "Kada kawa malakukan pambulikan ka ralatan pauncitnya [[:$1]] ulih [[User:$2|$2]] ([[User talk:$2|pandir]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\npamakai lain sudah mambabak atawa malakukan pambulikan lawan tungkaran ngini.\n\nBabakan pauncitnya dilakukan ulih [[User:$3|$3]] ([[User talk:$3|pandir]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Kumintar pambabakan adalah: <em>$1</em>.",
        "revertpage": "←Babakan [[Special:Contributions/$2|$2]] ([[User talk:$2|pandir]]) dibulikakan ka ralatan tauncit ulih [[User:$1|$1]]",
        "revertpage-nouser": "Pambulikan babakan ulih (pamuruk dihapus) ka babakan tauncit ulih [[User:$1|$1]]",
        "sp-contributions-newbies-title": "Sumbangan pamakai gasan akun hanyar",
        "sp-contributions-blocklog": "Log blukir",
        "sp-contributions-deleted": "Tahapus sumbangan pamuruk",
-       "sp-contributions-uploads": "hunggahan",
+       "sp-contributions-uploads": "unggahan",
        "sp-contributions-logs": "log",
        "sp-contributions-talk": "pandir",
        "sp-contributions-userrights": "pangalulaan hak-hak pamuruk",
-       "sp-contributions-blocked-notice": "Pamuruk ngini parhatan diblukir.\nLog blukir pahabisannya tasadia di bawah ni gasan rujukan:",
+       "sp-contributions-blocked-notice": "Pamakai ngini parhatan diblukir.\nLog blukir pahabisnya tasadia di bawah ngini gasan rujukan:",
        "sp-contributions-blocked-notice-anon": "Alamat IP ngini parhatan ini diblukir.\nLog blukir pahabisannya tasadia di bawah ngini gasan rujukan:",
-       "sp-contributions-search": "Gagai gasan sumbangan",
+       "sp-contributions-search": "Kikihi sumbangan",
        "sp-contributions-username": "Alamat IP atawa ngaran-pamakai:",
        "sp-contributions-toponly": "Tampaiakan wastu ralatan nang paling atas (pauncitnya)",
        "sp-contributions-newonly": "Hanya tampaiakan babakan nang barupa paulahan tungkaran",
-       "sp-contributions-submit": "Gagai",
-       "whatlinkshere": "Tautan apa di sia",
+       "sp-contributions-submit": "Kikih",
+       "whatlinkshere": "Tautan balik",
        "whatlinkshere-title": "Tungkaran-tungkaran nang batautan ka ''$1''",
        "whatlinkshere-page": "Tungkaran:",
        "linkshere": "Tungkaran-tungkaran barikut batautan ka '''$2''':",
        "whatlinkshere-hideredirs": "$1 paugahan",
        "whatlinkshere-hidetrans": "$1 transklusi",
        "whatlinkshere-hidelinks": "$1 tautan",
-       "whatlinkshere-hideimages": "$1 tautan pancitraan",
+       "whatlinkshere-hideimages": "$1 tautan barakas",
        "whatlinkshere-filters": "Saringan",
        "autoblockid": "Blukir utumatis #$1",
-       "block": "Blukir pamuruk",
-       "unblock": "Lapas blukir pamuruk",
+       "block": "Blukir pamakai",
+       "unblock": "Buka blukir pamakai",
        "blockip": "Blukir pamuruk",
        "blockiptext": "Puruk purmulir di bawah hagan mamblukir hak ungkai manulis matan sabuah alamat IP atawa ngaran-pamuruk.\nNgini dipuruk hagan mancagah vandalisma haja, wan sasuai awan [[{{MediaWiki:Policy-url}}|kabijakan]].\nIsi sabuah alasan khas di bawah (gasan cuntuh, manulisakan tutungkaran nang suah divandal)",
-       "ipaddressorusername": "Alamat IP atawa ngaran pamuruk:",
+       "ipaddressorusername": "Alamat IP atawa ngaran pamakai:",
        "ipbreason": "Alasan:",
-       "ipbreason-dropdown": "*Alasan awam pamblukiran\n** Mambuati panjalasan salah\n** Mambuang isi matan tutungkaran\n** Spam tautan ka luar\n** Mambuati pandiran kusung/ratik ka tutungkaran\n** Parilaku palecehan/intimidasi\n** Panyalahpurukan akun banyak\n** Ngaran-pamuruk kada-kawa-ditarima",
-       "ipb-hardblock": "Cagah pamuruk tadaptar gasan mambabak matan alamat IP ngini",
+       "ipbreason-dropdown": "*Alasan umum\n** Vandalisma\n** Mambariakan katarangan kada bujur alias palsu\n** Mahilangakan isi tungkaran\n** Spam tautan ka situs luar\n** Mangaradau ka tungkaran\n** Parilaku intimidasi/mancapa\n** Manyalahgunaakan babarapa akun\n** Ngaran pamakai kada layak",
+       "ipb-hardblock": "Tangati pamakai tadaptar gasan mambabak matan alamat IP ngini",
        "ipbcreateaccount": "Tangkal paulahan akun",
        "ipbemailban": "Tangkal pamuruk mangirimi suril",
-       "ipbenableautoblock": "Utumatis blukir alamat IP tauncit dipuruk ulih pamuruk ngini, wan sabarataan aalamat IP nang cuba dipuruk matan",
-       "ipbsubmit": "Blukir pamuruk ngini",
+       "ipbenableautoblock": "Utumatis blukir alamat IP pauncitnya nang dipakai pamakai ngini, wan sabarataan alamat IP nang cuba dipakai gasan mambabak.",
+       "ipbsubmit": "Blukir pamakai ngini",
        "ipbother": "Wayah lain:",
        "ipboptions": "2 jam:2 hours,1 hari:1 day,3 hari:3 days,1 minggu:1 week,2 minggu:2 weeks,1 bulan:1 month,3 bulan:3 months,6 bulan:6 months,1 tahun:1 year,salawasan:infinite",
        "ipbhidename": "Sungkupakan ngaranpamuruk matan babakan wan dadaptar",
-       "ipbwatchuser": "Itihi tutungkaran pamuruk wan pamandiran pamuruk ngini",
+       "ipbwatchuser": "Itihi tungkaran pamakai wan pamandiran pamakai ngini",
        "ipb-disableusertalk": "Tangkal pamuruk ngini mambabak tungkaran pamandirannya wayah diblukir",
-       "ipb-change-block": "Blukir pulang pamuruk lawan setelan ngingini",
+       "ipb-change-block": "Blukir pulang pamakai lawan setélan ngini",
        "ipb-confirm": "Yakinakan blukir",
        "badipaddress": "Alamat IP kada sah",
        "blockipsuccesssub": "Pamblukiran ruhui",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] hudah diblukir.<br />\nJanaki [[Special:BlockList|daptar dibluk]] hagan maniring-pulang blukir.",
        "ipb-blockingself": "Pian pasal mamblukir Pian surang! Bujurkah Pian mahandaki ngitu?",
-       "ipb-confirmhideuser": "Pian pasal mamblukir saurang pamuruk awan \"sungkupakan pamuruk\" di-kawa-akan. Ngini akan manikin/kadada ngaran pamuruk dalam samunyaan daptar wan log masukan. Pian yakin kah handak manggawi ngitu?",
+       "ipb-confirmhideuser": "Pian handak mamblukir saurang pamakai lawan \"sungkupakan pamakai\" di-kawa-akan. Ngini akan manikin/kadada ngaran pamakai dalam samunyaan daptar wan log masukan. Pian yakin kah handak manggawi ngitu?",
        "ipb-edit-dropdown": "Aalasan pamblukiran babakan",
        "ipb-unblock-addr": "Mahilangakan blukir $1",
        "ipb-unblock": "Lapas blukir sabuah ngaranpamuruk atawa alamat IP",
        "ipb-blocklist": "Tiringi blukir nang ada",
        "ipb-blocklist-contribs": "Sumbangan gasan $1",
        "block-expiry": "Kadaluwarsa:",
-       "unblockip": "Lapas blukir pamuruk",
-       "unblockiptext": "Puruk purmulir di bawah hagan manyimpan-pulang hak ungkai manulai sabuah alamat IP atawa ngaran-pamuruk nang sabalumnya diblukir.",
+       "unblockip": "Buka blukir pamakai",
+       "unblockiptext": "Pakai purmulir di bawah gasan manyimpan-pulang hak ungkai manulis sabuting alamat IP atawa ngaran-pamakai nang sabalumnya diblukir.",
        "ipusubmit": "Buang blukir ngini",
        "unblocked": "[[User:$1|$1]] sudah dicabut blukirnya",
        "unblocked-range": "$1 sudah dilapas blukirnya",
        "unblocked-id": "Blukir $1 sudah dibuang",
-       "blocklist": "Pamuruk tablukir",
+       "blocklist": "Daptar pamakai nang diblukir",
        "ipblocklist": "Pamakai tablukir",
-       "ipblocklist-legend": "Ugai saurang pamuruk tablukir",
+       "ipblocklist-legend": "Gagai saurang pamakai nang diblukir",
        "blocklist-userblocks": "Sungkupakan pamblukiran akun",
        "blocklist-tempblocks": "Sungkupakan pamblukiran samantara",
        "blocklist-addressblocks": "Sungkupakan pamblukiran asa IP",
        "emaillink": "kirim suril",
        "autoblocker": "Utumatis blukir karana alamat IP Pian hahanyar ni dipuruk ulih \"[[User:$1|$1]]\".\nAlasan nang dibari gasan pamblukiran $1 adalah: \"$2\"",
        "blocklogpage": "Log blukir",
-       "blocklog-showlog": "Pamuruk ngini diblukir sabalumnya.\nLog blukir disadiakan di bawah gasan rujukan:",
-       "blocklog-showsuppresslog": "Pamuruk ngini diblukir wan disungkupakan sabalumnya.\nLog panikinan disadiakan di bawah gasan rujukan:",
+       "blocklog-showlog": "Pamakai ngini diblukir sabalumnya.\nLog blukir disadiaakan di bawah gasan rujukan:",
+       "blocklog-showsuppresslog": "Pamakai ngini diblukir wan disungkupakan sabalumnya.\nLog panikinan disadiaakan di bawah gasan rujukan:",
        "blocklogentry": "mamblukir [[$1]] sampai wayah $2 $3",
        "reblock-logentry": "setelan blukir diubah gasan [[$1]] awan sabuah wayah kadaluarsa $2 $3",
-       "blocklogtext": "Ngini adalah log matan blukir wan lapas-blukir pamuruk.\nBlukir alamat IP utumatis kada tadaptar.\nJanaki [[Special:BlockList|daptar diblukir]] gasan daptar uprasi dibabat wan pamblukiran pahanyarnya.",
+       "blocklogtext": "Ngini itu log aksi pamblukiran wan pambukaan blukir ka pamakai.\nAlamat IP nang diblukir sacara utumatis kada tahaga di dalam daptar ngini.\nLihat [[Special:BlockList|daptar pamblukiran]] gasan samunyaan pamakai nang wayahini diblukir.",
        "unblocklogentry": "Mahilangakan blukir \"$1\"",
        "block-log-flags-anononly": "papamuruk kada bangaran haja",
        "block-log-flags-nocreate": "Paulahan akun dipajahakan",
        "block-log-flags-noemail": "suril diblukir",
        "block-log-flags-nousertalk": "kada kawa mambabak tungkaran pamandiran surang",
        "block-log-flags-angry-autoblock": "paningkatan utumatis-blukir dikawa-akan",
-       "block-log-flags-hiddenname": "ngaran-pamuruk tasungkup",
+       "block-log-flags-hiddenname": "ngaran pamakai tasuhuk",
        "range_block_disabled": "Ka-kawa-an pambakal hagan maulah blukir wilayah dikada-kawakan.",
        "ipb_expiry_invalid": "Wayah kadaluwarsa kada sah.",
-       "ipb_expiry_temp": "Pamblukiran ngaran-pamuruk tasungkup musti tatap.",
+       "ipb_expiry_temp": "Pamblukiran ngaran-pamakai tasuhuk musti tatap.",
        "ipb_hide_invalid": "Kada kawa manikin akun ngini; ngini pinanya baisi banyak banar babakan.",
        "ipb_already_blocked": "\"$1\" sudah diblukir",
        "ipb-needreblock": "$1 sudah diblukir. Pian handakkah maubah setelan ngini?",
        "ipb-otherblocks-header": "{{PLURAL:$1|pamblukiran|papamblukiran}} lain",
-       "unblock-hideuser": "Pian kada kawa malapas blukir  pamuruk ngini, karana ngaran pamuruknya sudah disungkupakan.",
+       "unblock-hideuser": "Pian kada kawa malapas blukir pamakai ngini, marga ngaran pamakainya sudah disungkupakan.",
        "ipb_cant_unblock": "Kasalahan: ID tablukir $1 kada ta-ugai. Ngini pinanya sudah dilapas-blukirnya.",
        "ipb_blocked_as_range": "Kasalahan: Alamat IP $1 kada diblukir langsung wan kada kawa dilaps-blukirnya.\nNgini, kayapa pun, diblukir sawagai palihan wilayah $2, nang kawa-ai dilapas-blukirnya.",
        "ip_range_invalid": "Jarak IP kada sah.",
        "proxyblockreason": "Alamat IP Pian diblukir karana ngini sabuah pruksi tabuka.\nMuhun hubungi Panyadia Layan Internet Pian atawa sukungan tiknik wan padahi sidin pasal masalah ka-amanan sarius ngini.",
        "sorbsreason": "Alamat IP Pian tadaptar sawagai pruksi tabuka dalam DNSBL dipuruk ulih {{SITENAME}}.",
        "sorbs_create_account_reason": "Alamat IP Pian tadaptar sawagai pruksi tabuka dalam DNSBL dipuruk ulih {{SITENAME}}.\nPian kada kawa maulah sabuah akun",
-       "cant-see-hidden-user": "Pamuruk nang Pian cuba blukir sudah diblukir wan tasungkup.\nTumatan Pian kada baisi hak mnyungkupakan pamuruk, Pian kada kawa manjanaki atawa mambabak pamblukiran pamuruk.",
-       "ipbblocked": "Pian kada kawa mamblukir atau malapas blukir pamuruk lain, karana Pian surang diblukir",
+       "cant-see-hidden-user": "Pamakai nang Pian cuba blukir sudah diblukir wan tasuhuk.\nSalawas Pian kada baisi hak manyungkupakan pamakai, Pian kada kawa manjanaki atawa mambabak pamblukiran pamakai.",
+       "ipbblocked": "Pian kada kawa mamblukir atau malapas blukir pamakai lain, marga Pian saurang diblukir.",
        "ipbnounblockself": "Pian kada dibulihakan malapas blukir Pian surang",
        "lockdb": "Sunduk basisdata",
        "unlockdb": "Lapas sunduk basisdata",
-       "lockdbtext": "Manyunduk data basis akan mamandakakan kakawa-an samunyaan pamuruk mambabak tutungkaran, maubah kakatujuan sidin, mambabak paitihin sidin, wan nang lainnya nang parlu maubah dalam data basis.\nMuhun yakinakan nang ngini bujur nang handak Pian gawi, wan Pian akan malapas-sunduk data basis amun paharaguan Pian tuntung.",
-       "unlockdbtext": "Malapas-sunduk data basis akan manyimpan-pulang kakawa-an samunyaan pamuruk hagan mambabak tutungkaran, maubah kakatujuan sidin, mambabak paitihan sidin, wan nang lainnya nang parlu maubah dalam data basis.\nMuhun yakinakan nang ngini nang Pian handak gawi.",
+       "lockdbtext": "Manyunduk basis data akan maampihakan kamampuan samunyaan pamakai mambabak tungkaran, maubah kakatujuan sidin, mambabak paitihin sidin, wan nang lainnya nang parlu diubah dalam basis data.\nMuhun yakinakan nangini bujur nang handak Pian gawi, wan Pian akan malapas-sunduk basis data amun paharaguan tuntung.",
+       "unlockdbtext": "Malapas sunduk basis data akan manyimpan-pulang kamampuan samunyaan pamakai gasan mambabak tungkaran, maubah kakatujuan sidin, mambabak paitihan sidin, wan nang lainnya nang parlu diubah dalam basis data.\nMuhun yakinakan nang ngini nang Pian handak gawi.",
        "lockconfirm": "I'ih, ulun bujuran handak manyunduk basisdata.",
        "unlockconfirm": "I'ih, ulun bujuran handak malapas sunduk basisdata.",
        "lockbtn": "Sunduk basisdata",
        "movepagetext": "Mamakai purmulir di bawah akan mangganti ngaran sabuting tungkaran, mamindahakan samunyaan halam ka ngaran nang hanyar. Judul lawas akan jadi sabuting tungkaran paugahan ka judul hanyar. Pian kawa mahanyari bahwasanya paugahan-paugahan manuju ka judul nang samustinya langsung. Amun kada, pastiakan pariksa gasan [[Special:DoubleRedirects|ganda]] atawa [[Special:BrokenRedirects|paugahan pagat]]. Pian batanggung jawab gasan mamastiakan tautan-tautan tatarusan manuju ka mana nang samustinya.\n\nCatatan bahwasanya tungkaran '''kada''' akan tapindah amun sudah ada tungkaran nang bangaran hanyar ngitu, kacuali amun tungkaran itu puang atawa sabuting paugahan wan kadada halam babakan.\n\n'''Paringatan!'''\nIni kawa maakibatakan paubahan kada taduga wan drastis gasan sabuting tungkaran rami; muhun mamastiakan Pian paham akibatnya sabalum manarusakan.",
        "movepagetext-noredirectfixer": "Mamakai purmulir di bawah akan mangganti ngaran sabuting tungkaran, mamindahakan samunyaan halam ka ngaran nang hanyar.\nJudul lawas akan jadi sabuting tungkaran paugahan ka judul hanyar.\nPastiakan pariksa gasan [[Special:DoubleRedirects|ganda]] atawa [[Special:BrokenRedirects|paugahan pagat]].\nPian batanggung jawab gasan mamastiakan tautan-tautan tatarusan manuju ka mana nang samustinya.\n\nCatatan bahwasanya tungkaran '''kada''' akan tapindah amun sudah ada tungkaran nang bangaran hanyar ngitu, kacuali amun tungkaran itu puang atawa sabuah paugahan wan kadada halam babakan.\n\n'''Paringatan!'''\nIni kawa maakibatakan paubahan kada taduga wan drastis gasan sabuah tungkaran rami; \nmuhun mamastiakan Pian paham akibatnya sabalum manarusakan.",
        "movepagetalktext": "Tungkaran pamandiran tarait akan langsung dipindahakan baimbai wan ini '''kacuali amun:'''\n*Sabuah tungkaran pamandiran nang kada puang sudah baisi awan judul hanyar, atawa\n*Pian kada manyuntring kutak di bawah.",
-       "moveuserpage-warning": "'''Paringatan:''' Pian pasal mamindahakan sabuah tungkaran pamuruk. Muhun catat tungkaran ngitu haja nang dipindah wan pamuruknya gin akan ''kada'' dingarani-pulang.",
-       "movenologintext": "Pian musti saurang pamuruk tadaptar wan [[Special:UserLogin|babuat log]] hagan mamindahakan sabuah tungkaran.",
+       "moveuserpage-warning": "'''Paringatan:''' Pian parhatan mamindahakan tungkaran pamakai. Parlu Pian tahu lamun cuma tungkaran nang akan dipindahakan tapi pamakai ''kada'' baganti ngaran.",
+       "movenologintext": "Pian musti manjadi pamakai tadaptar wan [[Special:UserLogin|babuat log]] gasan mamindahakan suatu tungkaran.",
        "movenotallowed": "Pian kada baisi ijin hagan mamindahakan tutungkaran.",
        "movenotallowedfile": "Pian kada baisi ijin hagan mamindahakan babarakas.",
-       "cant-move-user-page": "Pian kada baisi ijin hagan mamindahakan tutungkaran pamuruk (hagian matan sub-tutungkaran).",
-       "cant-move-to-user-page": "Pian kada baisi ijin hagan mamindahakan tutungkaran pamuruk (kacuali hagan sabuah sub-tutungkaran pamuruk).",
+       "cant-move-user-page": "Pian kada baisi ijin gasan mamindahakan tungkaran pamakai (tapisah matan sub-tutungkaran).",
+       "cant-move-to-user-page": "Pian kada baisi ijin gasan mamindahakan tungkaran ka suatu tungkaran pamakai (kacuali ka sub-tutungkaran pamakai).",
        "newtitle": "Ka judul hanyar:",
        "move-watch": "Itihi tungkaran asal mula wan tungkaran tujuan",
        "movepagebtn": "Pindahakan tungkaran",
        "imageinvalidfilename": "Ngaran barakas tujuan kada sah",
        "fix-double-redirects": "Mutakhirakan babarapa paugahan nang manitik ka judul asli",
        "move-leave-redirect": "Ulah paugahan ka judul hanyar",
-       "protectedpagemovewarning": "'''Paringatan''': Tungkaran ngini sudah dilindungi laluai pamuruk awan hak istimiwa pambakal haja nang kawa mamindahakan ngini.\nLog masuk pauncitan disadiakan di bawah gasan rujukan:",
+       "protectedpagemovewarning": "'''Paringatan''': Tungkaran ngini sudah dikunci wan cuma pamakai nang baisi hak pambakal haja nang kawa mamindahakannya.\nMasukan catatan pauncitnya disadiaakan di bawah gasan rujukan:",
        "semiprotectedpagemovewarning": "'''Catatan:''' Tungkaran ngini sudah dilindungi laluai pamuruk tadaptar haja nang kawa mamindahakan ngini.\nLog masuk pauncitan disadiakan di bawah gasan rujukan:",
        "move-over-sharedrepo": "==Barakas ada==\n[[:$1]] ada pintangan panyimpanan babagi. Mamindahakan sabuah barakas ka judul ngini akan manulis-tindih barakas babagi.",
        "file-exists-sharedrepo": "Ngaran barakas nang dipilih sudah dipuruk pintangan panyimpanan babagi.\nMuhun pilih ngaran lain.",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|ralatan|raralatan}} matan $2",
        "javascripttest": "Mantis JavaScript",
        "tooltip-pt-userpage": "Tungkaran {{GENDER:|pamakai Pian}}",
-       "tooltip-pt-anonuserpage": "Tungkaran pamuruk matan alamat IP Pian mambabak sawagai",
+       "tooltip-pt-anonuserpage": "Tungkaran pamakai IP Pian",
        "tooltip-pt-mytalk": "Tungkaran {{GENDER:|pamandiran Pian}}",
        "tooltip-pt-anontalk": "Pamandiran pasal bababakan matan alamat IP ngini",
        "tooltip-pt-preferences": "Kakatujuan {{GENDER:|Pian}}",
        "tooltip-pt-login": "Pian sabaiknya babuat ka dalam log; tagal ngini kada kawajiban pang",
        "tooltip-pt-logout": "Kaluar",
        "tooltip-pt-createaccount": "Pian dianjurakan gasan maulah akun wan babuat log; walau, hal itu kada wajib",
-       "tooltip-ca-talk": "Pamandiran pasal isi tungkaran",
-       "tooltip-ca-edit": "Babak tungkaran ini",
+       "tooltip-ca-talk": "Pamandiran pasal isi halaman",
+       "tooltip-ca-edit": "Babak halaman ngini",
        "tooltip-ca-addsection": "Mulai hagian hanyar",
        "tooltip-ca-viewsource": "Tungkaran ngini dilindungi. Pian kawa maniring asal mulanya.",
-       "tooltip-ca-history": "Raralatan bahari tungkaran ngini",
+       "tooltip-ca-history": "Ralatan bahari halaman ngini",
        "tooltip-ca-protect": "Lindungi tungkaran ini",
        "tooltip-ca-unprotect": "Ganti parlindungan tungkaran ngini",
        "tooltip-ca-delete": "Hapus tungkaran ini",
        "tooltip-ca-move": "Pindahakan tungkaran ngini",
        "tooltip-ca-watch": "Tambahi tungkaran ngini ka daptar itihan Pian",
        "tooltip-ca-unwatch": "Buang tungkaran ngini matan daptar itihan Pian",
-       "tooltip-search": "Gagai {{SITENAME}}",
-       "tooltip-search-go": "Tulak ka sabuah tungkaran bangaran sama munnya sudah ada",
-       "tooltip-search-fulltext": "Gagai tungkaran nang baisi naskah nangkaya ngini",
-       "tooltip-p-logo": "Ilangi tungkaran tatambaian",
+       "tooltip-search": "Kikih {{SITENAME}}",
+       "tooltip-search-go": "Tulak ka sabuting halaman bangaran sama lamunnya sudah ada",
+       "tooltip-search-fulltext": "Kikih halaman nang baisi naskah nangkaya ngini",
+       "tooltip-p-logo": "Ilangi halaman tatambaian",
        "tooltip-n-mainpage": "Ilangi tungkaran tatambaian",
-       "tooltip-n-mainpage-description": "Ilangi Tungkaran Tatambaian",
+       "tooltip-n-mainpage-description": "Ilangi Halaman Tatambaian",
        "tooltip-n-portal": "Pasal rangka-gawian, apa nang kawa pian gawi, di mana maugai sasuatu",
-       "tooltip-n-currentevents": "Gagai panjalasan prihal paristiwa damini",
+       "tooltip-n-currentevents": "Kikihi panjalasan pasal paristiwa damini",
        "tooltip-n-recentchanges": "Daptar paubahan pahanyarnya dalam wiki",
-       "tooltip-n-randompage": "Tampaiakan sabuah babarang tungkaran",
+       "tooltip-n-randompage": "Tampaiakan babarang halaman",
        "tooltip-n-help": "Wadah maugai patulung",
-       "tooltip-t-whatlinkshere": "Daptar samunyaan tungkaran wiki nang ada tautan ka sia",
-       "tooltip-t-recentchangeslinked": "Paubahan pahanyarnya dalam tutungkaran tataut matan tungkaran ngini",
+       "tooltip-t-whatlinkshere": "Daptar samunyaan halaman wiki nang ada tautan ka sini",
+       "tooltip-t-recentchangeslinked": "Paubahan pahanyarnya dalam halaman nang baisi tautan tumatan halaman ngini",
        "tooltip-feed-rss": "Kitihan RSS gasan tungkaran ini",
        "tooltip-feed-atom": "Kitihan Atum gasan tungkaran ngini",
        "tooltip-t-contributions": "Daptar sumbangan {{GENDER:$1|pamakai ngini}}",
-       "tooltip-t-emailuser": "Kirimi surel ka pamakai ini",
-       "tooltip-t-upload": "Hunggahakan babarakas",
-       "tooltip-t-specialpages": "Daptar samunyaan tungkaran istimiwa",
-       "tooltip-t-print": "Nang kawa dicitaknya tungkaran ngini",
-       "tooltip-t-permalink": "Tautan tatap ka raralatan tungkaran ngini",
-       "tooltip-ca-nstab-main": "Tiringi tungkaran isi",
+       "tooltip-t-emailuser": "Kirimi suril ka {{GENDER:$1|pamakai ngini}}",
+       "tooltip-t-upload": "Unggah barakas",
+       "tooltip-t-specialpages": "Daptar samunyaan halaman istimiwa",
+       "tooltip-t-print": "Vérsi citak halaman ngini",
+       "tooltip-t-permalink": "Tautan tatap ka ralatan halaman ngini",
+       "tooltip-ca-nstab-main": "Janaki halaman isi",
        "tooltip-ca-nstab-user": "Tiring tungkaran pamakai",
        "tooltip-ca-nstab-media": "Tiringi tungkaran media",
        "tooltip-ca-nstab-special": "Ngini tungkaran istimiwa, kada kawa dibabak.",
-       "tooltip-ca-nstab-project": "Tiringi tungkaran rangka gawian",
+       "tooltip-ca-nstab-project": "Janaki tungkaran rangka gawian",
        "tooltip-ca-nstab-image": "Tiringi barakas tungkaran",
-       "tooltip-ca-nstab-mediawiki": "Tiring sistim pasan",
-       "tooltip-ca-nstab-template": "Tiringi citakan",
+       "tooltip-ca-nstab-mediawiki": "Janaki pasan sistem",
+       "tooltip-ca-nstab-template": "Janaki citakan",
        "tooltip-ca-nstab-help": "Tiringi tungkaran patulung",
-       "tooltip-ca-nstab-category": "Lihati tungkaran tumbung",
-       "tooltip-minoredit": "Tandai ini sabagai sabuah pambabakan sapalih",
+       "tooltip-ca-nstab-category": "Janaki halaman pilah",
+       "tooltip-minoredit": "Tandai ngini sabagai sabutik pambabakan sapalih",
        "tooltip-save": "Simpan paubahan Pian",
        "tooltip-preview": "Tilik paubahan Pian, muhun pakai ngini sabalum manyimpan!",
        "tooltip-diff": "Tampaiakan nang apa paubahan nang Pian ulah",
        "tooltip-watchlistedit-raw-submit": "Hanyari daptar itihan",
        "tooltip-recreate": "Ulah pulang tungkaran biar gin suah dihapus",
        "tooltip-upload": "Mulai pangunggahan",
-       "tooltip-rollback": "Bulikakan ka babakan-babakan tungkaran ngini matan panyumbang tauncit dalam sakali klik.",
+       "tooltip-rollback": "\"Pambulik\" mamasahakan babakan-babakan di halaman ngini ka panyumbang pahabisan dalam satu kali kalik.",
        "tooltip-undo": "Mamantukakan ralatan ngini wan mambuka kutak pambabakan lawan mode tilik. Alasan kawa ditambahakan di kutak kasimpulan.",
        "tooltip-preferences-save": "Simpan kakatujuan",
        "tooltip-summary": "Buati sabuah kasimpulan handap",
        "anonymous": "{{PLURAL:$1|panuruk|papamuruk}} kada-bangaran {{SITENAME}}",
-       "siteuser": "Pamuruk {{SITENAME}} $1",
-       "anonuser": "Pamuruk kada bangaran {{SITENAME}} $1",
+       "siteuser": "Pamakai {{SITENAME}} $1",
+       "anonuser": "Pamakai kada bangaran {{SITENAME}} $1",
        "lastmodifiedatby": "Tungkaran ngini tauncit diubah pada $1, $2 ulih $3",
        "othercontribs": "Dipandalakan pada gawian ulih $1.",
        "others": "lainnya",
        "siteusers": "{{PLURAL:$2|pamuruk|papamuruk}} {{SITENAME}} $1",
-       "anonusers": "{{PLURAL:$2|pamuruk|papamuruk}} kada bangaran {{SITENAME}} $1",
+       "anonusers": "{{PLURAL:$2|pamakai|pamakai}} kada bangaran {{SITENAME}} $1",
        "creditspage": "Tungkaran kridit",
        "nocredits": "Kadada panjalasan kridit tasadia gasan tungkaran ngini.",
        "spamprotectiontitle": "Saringan pancagah spam",
        "pageinfo-content-model": "Mudil isi tungkaran",
        "pageinfo-robot-policy": "Pangindéksan ulih robot",
        "pageinfo-robot-index": "Dibulihakan",
-       "pageinfo-robot-noindex": "Kada kawa diindeks",
+       "pageinfo-robot-noindex": "Kada dibulihakan",
        "pageinfo-watchers": "Jumlah pa-itih tungkaran",
        "pageinfo-few-watchers": "Kurang matan $1 {{PLURAL:$1|pa-ilang}}",
        "pageinfo-redirects-name": "Jumlah paugahan ka tungkaran ngini",
        "pageinfo-authors": "Rikinan panulis nang balain",
        "pageinfo-recent-edits": "Jumlah babakan damini (dalam $1 pauncitnya)",
        "pageinfo-recent-authors": "Jumlah panulis nang babida damini",
-       "pageinfo-magic-words": "{{PLURAL:$1|Kata|Kata}} ajaib ($1)",
-       "pageinfo-hidden-categories": "{{PLURAL:$1|tumbung|tutumbung}}",
-       "pageinfo-templates": "{{PLURAL:$1|Citakan|Citakan}} nang ditransklusi ($1)",
+       "pageinfo-magic-words": "{{PLURAL:$1|Kata|Kata-kata}} ajaib ($1)",
+       "pageinfo-hidden-categories": "{{PLURAL:$1|Pilah|Pilah}} tatukup ($1)",
+       "pageinfo-templates": "{{PLURAL:$1|Citakan|Cicitakan}} nang ditransklusi ($1)",
        "pageinfo-transclusions": "{{PLURAL:$1|Tungkaran|Tutungkaran}} ditransklusikan pada ( $1 )",
-       "pageinfo-toolboxlink": "Maklumat tungkaran",
+       "pageinfo-toolboxlink": "Maklumat halaman",
        "pageinfo-redirectsto": "Ba-ugah ka",
        "pageinfo-redirectsto-info": "Maklumat",
        "pageinfo-contentpage": "Dirikin sabagai tungkaran isi",
        "filedelete-old-unregistered": "Ralatan barakas nang diajuakan \"$1\" kadada dalam data basis.",
        "filedelete-current-unregistered": "Barakas nang diajuakan \"$1\" kadada dalam data basis.",
        "filedelete-archive-read-only": "Direktori arkip \"$1\" kada kawa ditulisi ulih webserver.",
-       "previousdiff": "← Ralatan talawas",
+       "previousdiff": "← Ralatan sabalumnya",
        "nextdiff": "Ralatan labih hanyar →",
        "mediawarning": "'''Paringatan''': Barakas ngini pinanya mangandung kudi babahaya.\nManarusakan ngini, kawa manyarang sistem Pian.",
        "imagemaxsize": "Watas takaran gambar: <br />''(gasan barakas tutungkaran diskripsi)''",
        "namespacesall": "samunyaan",
        "monthsall": "samunyaan",
        "confirmemail": "Yakinakan alamat suril",
-       "confirmemail_noemail": "Pian kada baisi sabuah alamat suril nang sah dalam [[Special:Preferences|kakatujuan pamuruk]] Pian.",
+       "confirmemail_noemail": "Pian kada manjulungi alamat surél nang sah dalam [[Special:Preferences|kakatujuan pamakai]] Pian.",
        "confirmemail_text": "{{SITENAME}} mawajibakan Pian mayakinakan alamat suril Pian sabalum pitur-pitur suril dipurukakan.\nPicik tumbul di bawah ngini hagan mangirimi Pian sabuah suril payakinan ka alamat Pian.\nSi suril akan ada di dalam sabuah tautan bakudi;\nHandak si tautan ka panjalajah Pian hagan mayakinakan bahwasa alamat suril Pian sah.",
        "confirmemail_pending": "Sabuah kudi payakinan sudah tasuril ka Pian;\nAmun Pian hahanyar ni maulah akun Pian, Pian kawa lah mahadangi babarapa minit gasan ngini hagan sampai sabalum mancuba maminta sabuah kudi hanyar.",
        "confirmemail_send": "Surili sabua kudi payakinan",
        "confirmemail_body_changed": "Sasaurang, pinanya Pian, malan alamat IP $1,\nsudah mangganti alamat suril sabuah akun \"$2\" awan alamat suril ngini pada {{SITENAME}}.\n\nHagan mayakinakan bahwasa akun ngini bujur ampun Pian wan ma-aktip-akan pulang\npipitur suril pada {{SITENAME}}, ungkai tautan ngini ka panjalajah Pian;\n\n$3\n\nAmun si akun *kada* bujur ampun Pian, umpati tautan ngini\nhagan mawalangi payakinan alamat suril:\n\n$5\n\nKudi payakinan ngini akan kadaluarsa pada $4.",
        "confirmemail_body_set": "Sasaurang, pinanya Pian, malan alamat IP $1,\nsudah manyetel alamat suril sabuah akun \"$2\" awan alamat suril ngini pada {{SITENAME}}.\n\nHagan mayakinakan bahwasa akun ngini bujur ampun Pian wan ma-aktip-akan pulang\npipitur suril pada {{SITENAME}}, ungkai tautan ngini ka panjalajah Pian;\n\n$3\n\nAmun si akun *kada* bujur ampun Pian, umpati tautan ngini\nhagan mawalangi payakinan alamat suril:\n\n$5\n\nKudi payakinan ngini akan kadaluarsa pada $4.",
        "confirmemail_invalidated": "Payakinan alamat suril diwalangi",
-       "invalidateemail": "Walangi suril payakinan",
+       "invalidateemail": "Pasahakan kunfirmasi surél",
        "scarytranscludedisabled": "[Transklusi intarwiki dipajahakan]",
        "scarytranscludefailed": "[Pangambilan citakan $1 gagal]",
        "scarytranscludetoolong": "[URL kapanjangan]",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Buang tungkaran ini matan paitihan Pian?",
        "imgmultipageprev": "← tungkaran sabalumnya",
-       "imgmultipagenext": "tungkaran barikutnya →",
+       "imgmultipagenext": "tungkaran salanjutnya →",
        "imgmultigo": "Tulak!",
        "imgmultigoto": "Tulak ka tungkaran $1",
        "ascending_abbrev": "naik",
        "watchlistedit-raw-done": "Daptar itihan Pian sudah dipugai",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 judul|$1 jujudul}} ditambahi:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 judul|$1 jujudul}} dibuangi:",
+       "watchlisttools-clear": "Barasihi daptar itihan",
        "watchlisttools-view": "Tampaiakan paubahan tarait",
        "watchlisttools-edit": "Tiringi wan babak daptar itihan",
        "watchlisttools-raw": "Babak daptar itihan mantah",
        "version-software-version": "Virsi",
        "version-entrypoints-header-url": "URL",
        "redirect": "Paugahan badasarakan ID barakas, pamakai, tungkaran, ralatan, atawa log",
+       "redirect-summary": "Tungkaran istimiwa ngini baugah ka barakas (sasuai ngarannya), halaman (sasuai ID ralatan atawa ID tungkaran), tungkaran pamakai (sasuai ID pamakai), atawa buatan log (ID lognya). Pamakaian: [[{{#Special:Redirect}}/file/Cuntuh.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], or [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "Lanjut",
        "redirect-lookup": "Panggagaian:",
        "redirect-value": "Nilai:",
        "fileduplicatesearch-result-1": "Barakas ''$1'' kada baisi panggandaan parsis.",
        "fileduplicatesearch-result-n": "Barakas ''$1'' baisi {{PLURAL:$2|1 panggandaan parsis|$2 papanggandaan parsis}}.",
        "fileduplicatesearch-noresults": "Kadada barakas bangaran ''$1'' taugai.",
-       "specialpages": "Tungkaran istimiwa",
+       "specialpages": "Halaman istimiwa",
        "specialpages-note-restricted": "* Tutungkaran istimiwa normal\n* <span class=\"mw-specialpagerestricted\">Tutungkaran istimiwa tabatas.</span>\n* <span class=\"mw-specialpagecached\">Tutungkaran istimiwa timbuluk (pinanya bakulat).</span>",
        "specialpages-group-maintenance": "Lapuran pamaliharaan",
        "specialpages-group-other": "Tungkaran istimiwa lainnya",
        "specialpages-group-login": "Babuat log / mandaptar",
        "specialpages-group-changes": "Paubahan pahanyarnya wan log",
        "specialpages-group-media": "Lapuran wan pamuatan barakas",
-       "specialpages-group-users": "Pamuruk wan hak pamuruk",
+       "specialpages-group-users": "Pamakai wan hak pamakai",
        "specialpages-group-highuse": "Tungkaran pamakaian tinggi",
        "specialpages-group-pages": "Daptar tungkaran",
        "specialpages-group-pagetools": "Pakakas tungkaran",
        "tags-display-header": "Pancungulan pada daptar paubahan.",
        "tags-description-header": "Diskripsi hibak matan arti",
        "tags-hitcount-header": "Gantungan diganti",
+       "tags-active-yes": "Inggih",
+       "tags-active-no": "Kada",
        "tags-edit": "babak",
        "tags-hitcount": "$1 {{PLURAL:$1|paubahan}}",
        "comparepages": "Bandingakan tutungkaran",
        "htmlform-int-toohigh": "Nilai nang Pian ajuakan kapancauan pada maksimal $1",
        "htmlform-required": "Nilai ngini nang diparluakan",
        "htmlform-submit": "Kirim",
-       "htmlform-reset": "Walangi paubahan",
+       "htmlform-reset": "Bulikakan paubahan",
        "htmlform-selectorother-other": "Lain-lain",
        "logentry-delete-delete": "$1 {{GENDER:$2|mahapus}} tungkaran $3",
-       "logentry-delete-restore": "$1 dibulikakan tungkaran $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|mambulikakan}}tungkaran $3 ($4)",
        "logentry-delete-event": "$1 mangganti kakawaan dijanaki {{PLURAL:$5|sabuah log kajadian|$5 log kajadian}} pintangan $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|maubah}} tampaian {{PLURAL:$5|$5 ralatan}} di tungkaran $3: $4",
        "logentry-delete-event-legacy": "$1 mangganti kakawaan dijanaki log kajadian pintangan $3",
        "logentry-suppress-revision-legacy": "$1 mangganti kakawaan dijanaki ralatan pintangan tungkaran $3 lawan rahasia",
        "revdelete-content-hid": "Isi disungkupakan",
        "revdelete-summary-hid": "babak kasimpulan tasungkup",
-       "revdelete-uname-hid": "ngaran-pamuruk tasungkup",
+       "revdelete-uname-hid": "ngaran pamakai disungkupakan",
        "revdelete-content-unhid": "Isi kada disungkupakan",
        "revdelete-summary-unhid": "babak kasimpulan kada tasungkup",
-       "revdelete-uname-unhid": "ngaran-pamuruk kada tasungkup",
+       "revdelete-uname-unhid": "ngaran pamakai kada disungkupakan",
        "revdelete-restricted": "Talamar pambatasan hagan pambakal-pambakal",
        "revdelete-unrestricted": "Buang pambatasan gasan pambakal-pambakal",
        "logentry-move-move": "$1 {{GENDER:$2|mamindahakan}} tungkaran $3 ka $4",
        "logentry-newusers-create2": "$1 ma-ulah sabuting akun pamakai $3",
        "logentry-newusers-autocreate": "Akun $1 {{GENDER:$2|diulah}} sacara utumatis",
        "logentry-upload-upload": "$1 {{GENDER:$2|ma-unggah}} $3",
+       "logentry-upload-overwrite": "$1{{GENDER:$2|maunggah}} versi hanyar $3",
        "rightsnone": "(kadada)",
        "feedback-adding": "Manambahi kitihanbalik ka tungkaran...",
        "feedback-bugcheck": "Harat! hanyar dipariksa bahwasa ngini lainan salah asa [$1 bug nang dipinandui].",
        "feedback-bugnew": "Ulun mamariksa. Malapurakan sabuah bug hanyar",
-       "feedback-bugornote": "Pabila Pian siap manjalasakan sabuah masalah taknik rinci muhun [lapurakan sabuah bug $1].\nSalain ngitu, Pian kawa mamuruk prmulir nyaman di bawah ngini. Kumintar Pian akan ditambahi ka si tungkaran \"[$3 $2]\", baimbai awan ngaran-pamuruk Pian wan panjalajah nagn Pian puruk.",
-       "feedback-cancel": "Walangi",
+       "feedback-bugornote": "Lamun Pian sudah siap gasan mamaparakan masalah téknis sacara rinci silakan [$1 malapurakan bug].\nLamun kada, Pian kawa mamakai purmulir mudah di bawah ngini. Kumintar Pian akan ditambahakan ka tungkaran \"[$3 $2]\", baimbai lawan ngaran pamakai Pian wan apa paramban nang Pian pakai.",
+       "feedback-cancel": "Pasah",
        "feedback-close": "Sudah",
        "feedback-error1": "Kasalahan: kulihan matan API kada-dipinandui",
        "feedback-error2": "Kasalahan: Babakan gagal",
        "feedback-subject": "Parihal:",
        "feedback-submit": "Kirim",
        "feedback-thanks": "Tarimakasih! jitihanbalik Pian sudah dipusakan ka si tungkaran \"[$2 $1]\".",
-       "searchsuggest-search": "Gagai {{SITENAME}}",
+       "searchsuggest-search": "Kikih {{SITENAME}}",
        "searchsuggest-containing": "isian ...",
        "api-error-stashfailed": "Kasalahan intarnal: server gagal manyimban barakas samantara.",
        "api-error-unknown-warning": "Paringatan kada dipinandui: \"$1\".",
index 89d4eb6..ba9721d 100644 (file)
        "right-purge": "Vyčištění vyrovnávací paměti stránky",
        "right-autoconfirmed": "Imunita vůči rychlostním limitům založeným na IP adrese",
        "right-bot": "Být považován za automatický proces",
-       "right-nominornewtalk": "Nevypisování oznámení o nové zprávě po malých úpravách diskusní stránky",
+       "right-nominornewtalk": "Potlačení oznámení o nové zprávě po malých úpravách diskusní stránky",
        "right-apihighlimits": "Používání vyšších limitů v API dotazech",
        "right-writeapi": "Používání zapisovacího API",
        "right-delete": "Mazání stránek",
        "action-unblockself": "odblokovat sebe sama",
        "action-noratelimit": "nebýt omezeni rychlostními limity",
        "action-reupload-own": "přepisovat sebou nahrané soubory",
+       "action-nominornewtalk": "potlačit oznámení o nové zprávě při malých úpravách diskusní stránky",
        "action-markbotedits": "označovat reverty jako editace bota",
+       "action-patrolmarks": "prohlížet si záznamy o prověření v posledních změnách",
+       "action-override-export-depth": "exportovat stránky včetně odkazovaných stránek až do hloubky 5",
+       "action-suppressredirect": "nevyrábět při přesouvání stránek přesměrování z původního názvu",
        "nchanges": "$1 {{PLURAL:$1|změna|změny|změn}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|od poslední návštěvy}}",
        "enhancedrc-history": "historie",
        "blocklink": "zablokovat",
        "unblocklink": "odblokovat",
        "change-blocklink": "změnit blok",
+       "empty-username": "(uživatelské jméno není dostupné)",
        "contribslink": "příspěvky",
        "emaillink": "poslat e-mail",
        "autoblocker": "Automatické zablokování kvůli tomu, že vaši IP adresu nedávno používal uživatel „[[User:$1|$1]]“.\nDůvod zablokování uživatele $1: „$2“",
        "passwordpolicies-policyflag-forcechange": "nutné změnit při přihlášení",
        "passwordpolicies-policyflag-suggestchangeonlogin": "navrhnout změnu při přihlášení",
        "easydeflate-invaliddeflate": "Poskytnutý obsah nebyl správně zkomprimován",
-       "unprotected-js": "Z bezpečnostních důvodů nelze načítat JavaScript z nechráněných stran. Vyrábějte prosím JavaScriptové skripty jen ve jmenném prostoru MediaWiki: nebo jako uživatelskou podstránku"
+       "unprotected-js": "Z bezpečnostních důvodů nelze načítat JavaScript z nechráněných stran. Vyrábějte prosím JavaScriptové skripty jen ve jmenném prostoru MediaWiki: nebo jako uživatelskou podstránku",
+       "userlogout-continue": "Pokud se chcete odhlásit, [$1 pokračujte na odhlašovací stránku].",
+       "userlogout-sessionerror": "Kvůli chybě sezení se odhlášení nezdařilo. [$1 Zkuste to prosím znovu]."
 }
index 9d893d6..dea0255 100644 (file)
        "dberr-again": "Prøv at vente et par minutter og opdater så siden igen.",
        "dberr-info": "(Kan ikke tilgå databasen: $1)",
        "dberr-info-hidden": "(Kan ikke tilgå databasen)",
-       "htmlform-invalid-input": "Det er problemer med dine angivelser",
+       "htmlform-invalid-input": "Der er problemer med de angivne data.",
        "htmlform-select-badoption": "Den angivne værdi er ikke gyldigt valg.",
        "htmlform-int-invalid": "Den angivne værdi er ikke et heltal.",
        "htmlform-float-invalid": "Den angivne værdi er ikke et tal.",
index 0af51ee..622760e 100644 (file)
        "edithelp": "Peştdariya vurnayışi",
        "helppage-top-gethelp": "Peşti",
        "mainpage": "Perra Seri",
-       "mainpage-description": "Perra seri",
+       "mainpage-description": "Pela seri",
        "policy-url": "Project:Terzê hereketi",
        "portal": "Portalê cemati",
        "portal-url": "Project:Portalê cemati",
        "badaccess-groups": "No fealiyeto ke şıma waşt, tenya karberanê {{PLURAL:$2|grubi|gruban ra yewi}} rê akerdeyo: $1.",
        "versionrequired": "No $1 MediaWiki lazımo",
        "versionrequiredtext": "Gırweynayışê ena perre rê gani versiyonê $1ê MediaWiki bo. \n[[Special:Version|Versiyonê perre]] bıvêne.",
-       "ok": "Temam",
+       "ok": "TEMAM",
        "pagetitle": "$1 – {{SITENAME}}",
        "pagetitle-view-mainpage": "{{SITENAME}}",
        "backlinksubtitle": "← $1",
        "nstab-template": "Şablon",
        "nstab-help": "Perra pasti",
        "nstab-category": "Kategoriye",
-       "mainpage-nstab": "Perra seri",
+       "mainpage-nstab": "Pela seri",
        "nosuchaction": "Fealiyeto wınasi çıniyo",
        "nosuchactiontext": "URL ra kar qebul nêbı.\nŞıma belka URL şaş nuşt, ya zi gıreyi şaş ra ameyi.\nKeyepelê {{SITENAME}} eşkeno xeta eşkera bıkero.",
        "nosuchspecialpage": "Pela hısusiya wınasiyên çıniya.",
        "userlogin-loggedin": "Tı xora namey {{GENDER:$1|$1}} ra kewtê/kewtay cı.\nFormê cêrêni bıgureyne ke namey karberio bin ra cı kewê.",
        "userlogin-reauth": "Eger ke {{GENDER:$1|$1}} şımayê se xo araşt kerdışirê fına ronıştış akerê.",
        "userlogin-createanother": "Zewbi hesab vıraz",
-       "createacct-emailrequired": "Adresa e-postey",
+       "createacct-emailrequired": "Adresa e-posteyi",
        "createacct-emailoptional": "Adresa e-postey (mecburi niya)",
        "createacct-email-ph": "Adresa e-posteyê xo cıkewe",
        "createacct-another-email-ph": "Adresa e-posta de fi",
        "passwordreset-emaildisabled": "Na wikid hısusiyeté e-posta dewera vıcyayé",
        "passwordreset-username": "Namey karberi:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-email": "Adresa e-postey:",
+       "passwordreset-email": "Adresa e-posteyi:",
        "passwordreset-emailtitle": "Hesab timarê {{SITENAME}}",
        "passwordreset-emailtext-ip": "Jeweri, {{SITENAME}} ra (ma heta şımayê, $1 IP adresi ra) ($4) teferuatê hesabdê şıma  va wa biyaro xo viri. Karbero ke cêrdeyo {{PLURAL:$3|hesaba|eno hesaba}} ena e-posta adresiya aleqey cı esto:\n\n$2\n\n{{PLURAL:$3|ena parola idaretena|ena parola idareten}} {{PLURAL:$5|jew roc|$5  roca}}rêya.\nEna parolaya deqewe de u xorê ju parolaya newi bıweçine. Parolaya şıma emaya şıma viri se  yana  ena e-posta şıma nê weştase u şıma qayıl niye parolaya xo bıvurnese, ena mesacer peygoş bıkerê.",
        "passwordreset-emailtext-user": "$1 enê karberi, {{SITENAME}}  ra ($4) teferuatê hesab dê şıma  va wa biyaro xo viri. Karbero ke cêrdeyo {{PLURAL:$3|hesaba|eno hesaba}} ena e-posta adresiya aleqey cı esto:\n\n$2\n\n{{PLURAL:$3|ena parola idaretena|ena parola idareten}} {{PLURAL:$5|jew roc|$5  roca}}rêya.\nEna parolaya deqewe de u xorê ju parolaya newi bıweçine. Parolaya şıma emaya şıma viri se  yana  ena e-posta şıma nê weştase u şıma qayıl niye parolaya xo bıvurnese, ena mesacer peygoş bıkerê.",
        "prefs-common-config": "CSS/JSON/JavaScripto ke seba heme cildan rê vıla biyo:",
        "prefs-reset-intro": "ena pele de şıma tercihanê xo şenê bıçarnê be tercihanê keyepelê ke verê coy eyar biy.\nNa game tepeya nêerziyena.",
        "prefs-emailconfirm-label": "Tesdiqiya E-posta:",
-       "youremail": "E-posta:",
+       "youremail": "E-poste:",
        "username": "{{GENDER:$1|Namey karberi}}:",
        "prefs-memberingroups": "{{GENDER:$2|Ezayê}} {{PLURAL:$1|grube|gruban}}:",
        "prefs-memberingroups-type": "$1",
        "group-membership-link-with-expiry": "$1 (heta $2)",
        "prefs-registration": "Wextê qeydbiyayışi",
        "prefs-registration-date-time": "$1",
-       "yourrealname": "Nameyo raştay",
+       "yourrealname": "Nameyo raştıkên:",
        "yourlanguage": "Zıwan:",
        "yourvariant": "Varyante miyandê zuwani:",
        "prefs-help-variant": "Zerrey ena viki mocnayışi rê varyant yana ortografi re şıre tercihan dê xo.",
        "gender-male": "Oyo pelanê wikiyi vurneno",
        "gender-female": "Aya pelanê wikiyi vurnena",
        "prefs-help-gender": "No eyarê tercihi keyfiyo.\nNo nuşteker xıtabkerdış de ercê xo u ê binan rê şıma ra behskerdış de cınsiyetê grameriyê hewli gureneno.\nNo melumat her kesi rê aseno.",
-       "email": "E-posta",
+       "email": "E-poste",
        "prefs-help-realname": "Nameyo raşt waştena şıma rê mendo.\nEka tu wazene ke nameyo raşt xo bide, ma nameyo raşt ti iştirakanê ti de mocnenê.",
        "prefs-help-email": "Dayışê adresa e-postey keyfiyo, labelê seba eyarê parola lazıma, wexto ke şıma naye xo vira kerê.",
        "prefs-help-email-others": "Pera ğoya kerderi de zew link vırazése karberé bini şımaré şenê mesac bırşé. Lakin e-posta adresa şıma héç cayé de niasena.",
        "grant-group-page-interaction": "Peran na tesiri",
        "grant-group-file-interaction": "Medya na tesiri",
        "grant-group-watchlist-interaction": "Lista da xoya tesir",
-       "grant-group-email": "e-poste bırışe",
+       "grant-group-email": "E-poste bırışe",
        "grant-group-high-volume": "Performansa aktiviteya vengê berzi",
        "grant-group-customization": "Xısusikerdış û tercihi",
        "grant-group-administration": "Performans hereketa idarey",
        "action-userrights": "heqqa karberanê hemî bivurne",
        "action-userrights-interwiki": "heqqa karberanê ke wikiyê binî de hemî bivurne",
        "action-siteadmin": "Databasei kılit ke ya zi a ke",
-       "action-sendemail": "e-posta bırşe",
+       "action-sendemail": "e-poste bırışe",
        "action-editmyoptions": "Tercihanê xo bıvurne",
        "action-editmywatchlist": "Lista xoya ewniyayışi bıvırnê",
        "action-viewmywatchlist": "Listeyseyran de xo bıvin",
        "action-applychangetags": "Vurnayışana piya etiket kerdışi zi dezge fi",
        "action-deletechangetags": "etitikan danegeh ra bestere",
        "action-purge": "Ane perer newe ke",
+       "action-editinterface": "miyanriyê karberi bıvurne",
+       "action-editusercss": "dosyeyanê CSSyê karberanê binan bıvurne",
+       "action-edituserjson": "dosyeyanê JSONiyê karberanê binan bıvurne",
+       "action-edituserjs": "dosyeyanê JavaScriptiyê karberanê binan bıvurne",
+       "action-editsitecss": "pelehira CSSyi bıvurne",
+       "action-editsitejson": "pelehira JSONi bıvurne",
+       "action-editsitejs": "pelehira JavaScripti bıvurne",
+       "action-editmyusercss": "dosyeyanê CSSyê karberiya xo bıvurne",
+       "action-editmyuserjson": "dosyeyanê JSONiyê karberiya xo bıvurne",
+       "action-editmyuserjs": "dosyeyanê JavaScriptiyê karberiya xo bıvurne",
        "nchanges": "$1 {{PLURAL:$1|vurnayış|vurnayışi}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|ziyaretê peyêni ra nata}}",
        "enhancedrc-history": "tarix",
        "blocklist-addressblocks": "Tenya kılitkerdışanê IPy bınımne",
        "blocklist-type": "Babet:",
        "blocklist-type-opt-all": "Pêro",
+       "blocklist-type-opt-sitewide": "Pelehira",
        "blocklist-type-opt-partial": "Qısmi",
        "blocklist-rangeblocks": "Kılitkerdışanê rêzkiyan bınımne",
        "blocklist-timestamp": "İmzay demi",
        "tooltip-search": "{{SITENAME}} de cı geyre",
        "tooltip-search-go": "Ebe nê namey tami şo yew pela ke esta",
        "tooltip-search-fulltext": "Pelan miyan de nê metıni cı geyre",
-       "tooltip-p-logo": "Şo perra seri",
+       "tooltip-p-logo": "Şo pela seri",
        "tooltip-n-mainpage": "Şo pela seri",
-       "tooltip-n-mainpage-description": "Şo perra seri",
+       "tooltip-n-mainpage-description": "Şo pela seri",
        "tooltip-n-portal": "Heqa procey de, kes çı şeno bıkero, çı kamca vêniyeno",
        "tooltip-n-currentevents": "Vurnayışanê peyênan de melumatê pey bıvêne",
        "tooltip-n-recentchanges": "Wiki de yew lista vurnayışanê peyênan",
        "recreate": "Werzayne",
        "unit-pixel": "px",
        "confirm-purge-title": "Na pele pak ke",
-       "confirm_purge_button": "Temam",
+       "confirm_purge_button": "TEMAM",
        "confirm-purge-top": "Vervirê na pele bestere?",
        "confirm-purge-bottom": "Pakkerdışê yew perre virê verêni estereno u çımraviyarnayışê peyêni gêno ver.",
        "confirm-watch-button": "TEMAM",
        "table_pager_limit_label": "Her pele ra xacetan",
        "table_pager_limit_submit": "Şo",
        "table_pager_empty": "Netice çıniyo",
-       "autosumm-blank": "Pele de her çi wederna",
+       "autosumm-blank": "Pele kerde veng",
        "autosumm-replace": "Maqale pê '$1' vuriya",
        "autoredircomment": "heteneya [[$1]]",
+       "autosumm-removed-redirect": "[[$1]] ra serşıkıtış dariya we",
+       "autosumm-changed-redirect-target": "Hedefê serşıkıtışi heruna [[$1]] ra vurniya era [[$2]]",
        "autosumm-new": "Pela vıraziyê, '$1' bıvinê",
        "autosumm-newblank": "Pera veng vıraziyê",
        "size-bytes": "$1 {{PLURAL:$1|bayt|bayti}}",
        "tag-list-wrapper": "[[Special:Tags|{{PLURAL:$1|Etiket|Etiketi}}]]: $2",
        "tag-mw-contentmodelchange": "vurnayışê modelê zerreki",
        "tag-mw-new-redirect": "Serşıkıtışo newe",
-       "tag-mw-blank": "Vengkerdış",
+       "tag-mw-removed-redirect": "Serşıkıtış dariya we",
+       "tag-mw-changed-redirect-target": "Hedefê serşıkıtışi vurniya",
+       "tag-mw-blank": "Pel veng kerdış",
        "tag-mw-blank-description": "Vengiya na pele bıvurne",
-       "tag-mw-replace": "Zerrek vurriya",
+       "tag-mw-replace": "Vera cı vurniya",
+       "tag-mw-replace-description": "No vurnayış %90 ra zêde zerrekê yew pele dareno we",
        "tag-mw-rollback": "Peyserardış",
-       "tag-mw-undo": "Peyser bıgê",
+       "tag-mw-undo": "Peyser gırotış",
        "tags-title": "Etiketi",
        "tags-intro": "Ena pele etiketê ke be vurnayışê nuşiyayışi ra nişan biyê û maneyê inan lista kena.",
        "tags-tag": "Nameyê etiketi",
        "htmlform-datetime-placeholder": "SSSS-AA-RR SS:DD:SS",
        "logentry-delete-delete": "$1 perra $3 {{GENDER:$2|esterıte}}",
        "logentry-delete-restore": "$1 pela $3 ($4) {{GENDER:$2|peyser arde}}",
+       "restore-count-revisions": "{{PLURAL:$1|1 çımraviyarnayış|$1 çımraviyarnayışi}}",
        "restore-count-files": "{{PLURAL:$1|1 dosya|$1 dosyeyi}}",
        "logentry-delete-event": "$1 $3: $4 de asayışê {{PLURAL:$5|cıkerdışi|cıkerdışan}} {{GENDER:$2|vurna}}",
        "logentry-delete-revision": "$1 pela $3: $4 de asayışê {{PLURAL:$5|yew revizyoni|$5 revizyonan}} {{GENDER:$2|vurna}}",
        "revdelete-unrestricted": "vergırewtışê ke xızmekaran rê dariyê we",
        "logentry-partialblock-block-page": "{{PLURAL:$1|pele|peli}} $2",
        "logentry-partialblock-block-ns": "{{PLURAL:$1|cayê nameyi|cayê nameyan}} $2",
-       "logentry-move-move": "$1 perra $3 {{GENDER:$2|kırışt}} $4",
+       "logentry-move-move": "$1, pela $3 ra {{GENDER:$2|kırışt}} pela $4",
        "logentry-move-move-noredirect": "$1, pera $3'i bêhetenayış {{GENDER:$2|kırışt}} pera $4`i",
        "logentry-move-move_redir": "$1 {{GENDER:$2|kırışna}} riperr $3 be $4 weçarnayış sera.",
        "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|berd}} riperrê $3 be $4 weçarnayış sera, weçarnayış nêverda.",
        "expand_templates_output": "netice",
        "expand_templates_xml_output": "XML vıraştış",
        "expand_templates_html_output": "Xam vetey HTML",
-       "expand_templates_ok": "temam",
+       "expand_templates_ok": "TEMAM",
        "expand_templates_remove_comments": "Tefsiran wedare",
        "expand_templates_remove_nowiki": "neticeyan de etiketê <nowiki> yan çap bıker",
        "expand_templates_generate_xml": "Dara XML arêdayoği bımocne",
        "log-action-filter-delete-revision": "Esterıtışê çımraviyarnayışi",
        "log-action-filter-import-interwiki": "Zerrenayışê Transwikiyi",
        "log-action-filter-import-upload": "Ebe barkerdışê XMLi ra zerre ke",
+       "log-action-filter-protect-protect": "Şeveknayış",
+       "log-action-filter-protect-modify": "Vurnayışê şeveknayışi",
+       "log-action-filter-protect-unprotect": "Şeveknayışi wedare",
+       "log-action-filter-protect-move_prot": "Şeveknayışê berdışi",
+       "log-action-filter-rights-rights": "Vurnayışo manuel",
+       "log-action-filter-rights-autopromote": "Vurnayışo otomatik",
+       "log-action-filter-upload-upload": "Barkerdışo newe",
+       "log-action-filter-upload-overwrite": "Anciya bar kerê",
        "log-action-filter-upload-revert": "Wegeyrayış",
+       "authmanager-email-label": "E-poste",
+       "authmanager-email-help": "Adresa e-posteyi",
+       "authmanager-realname-label": "Nameyo raştıkên",
+       "authmanager-realname-help": "Nameyê karberiyo raştıkên",
        "authprovider-resetpass-skip-label": "Ravêre",
        "authprovider-resetpass-skip-help": "Peysereştışê parola ra bıvêre.",
        "authform-notoken": "Tokeno kemi",
        "changecredentials": "Malumatanê karberi bıvurnê",
        "removecredentials": "Kamiye wedarne",
        "removecredentials-submit": "Kamiyer wedarne",
+       "credentialsform-account": "Nameyê hesabi:",
+       "linkaccounts": "Hesabê gıreyi",
+       "linkaccounts-success-text": "Hesab gıre biyo.",
+       "linkaccounts-submit": "Hesabê gıreyi",
+       "unlinkaccounts": "Hesabo bêgıre",
+       "edit-error-short": "Xeta: $1",
+       "edit-error-long": "Xeteyi:\n\n$1",
        "revid": "Revizyonê $1",
        "pageid": "IDyê pela $1",
        "gotointerwiki": "{{SITENAME}} ra abırriyeno",
+       "pagedata-title": "Dayiyê pele",
+       "passwordpolicies": "Politikaya parola",
        "passwordpolicies-group": "Grube",
        "passwordpolicies-policies": "Politikeyi",
        "passwordpolicies-policy-minimalpasswordlength": "Parola gani tewr senık be {{PLURAL:$1|1 karakter|$1 karakteran}} derg bo"
index 99de6b9..74b255a 100644 (file)
@@ -5,7 +5,8 @@
                        "Natsubee",
                        "아라",
                        "Aguve",
-                       "Latercio2000"
+                       "Latercio2000",
+                       "Hello903hello"
                ]
        },
        "tog-underline": "Flitete ɖe kadodo te:",
        "logentry-move-move": "$1 {{ŊUTSU/NYƆNU:$2|moved}} axa $3 yi $4",
        "logentry-newusers-create": "Ezazãŋkɔ $1 la {{AMENYENYE:$2|wɔ vɔ}}",
        "logentry-upload-upload": "Nedze",
-       "searchsuggest-search": "Di {{SITEŊKƆ}}",
+       "searchsuggest-search": "Di {{SITENAME}}",
        "expand_templates_preview": "Kpɔe do ŋgɔ"
 }
index 83f1d72..bbaadf7 100644 (file)
        "tog-norollbackdiff": "Παράλειψη εμφάνισης διαφορών μετά την εκτέλεση επαναφοράς",
        "tog-useeditwarning": "Προειδοποίηση όταν εγκαταλείπω μία σελίδα επεξεργασίας χωρίς να έχω πρώτα αποθηκεύσει τις αλλαγές",
        "tog-prefershttps": "Να γίνεται πάντα χρήση ασφαλούς σύνδεσης ενώ είμαι σε σύνδεση",
+       "tog-showrollbackconfirmation": "Εμφάνιση μιας ερώτησης επιβεβαίωσης όταν πατάτε ένα σύνδεσμο αναστροφής",
        "underline-always": "Πάντα",
        "underline-never": "Ποτέ",
        "underline-default": "Προεπιλογή από θέμα εμφάνισης ή από περιηγητή",
        "returnto": "Επιστροφή στη σελίδα $1.",
        "tagline": "Από {{SITENAME}}",
        "help": "Βοήθεια",
+       "help-mediawiki": "Βοήθεια για το MediaWiki",
        "search": "Αναζήτηση",
        "search-ignored-headings": "#<!-- αφήστε αυτή τη γραμμή όπως είναι --> <pre>\n# Επικεφαλίδες που θα αγνοηθούν από την αναζήτηση.\n# Αλλαγές σε αυτό ισχύουν μόλις η σελίδα με τον τίτλο ευρετηριαστεί.\n# Μπορείτε να επιβάλετε επανευρετηρίαση της σελίδας κάνοντας μια κενή επεξεργασία.\n# Η σύνταξη είναι ως εξής:\n# * Όλα από ένα χαρακτήρα \"#\" μέχρι το τέλος της γραμμής είναι ένα σχόλιο.\n# * Κάθε μη κενή γραμμή είναι ο ακριβής τίτλος που θα αγνοήσει, κεφαλαία/πεζά και τα πάντα.\nΠαραπομπές\nΕξωτερικοί σύνδεσμοι\nΔείτε επίσης\n #</pre> <!-- leave this line exactly as it is -->",
        "searchbutton": "Αναζήτηση",
        "badarticleerror": "Η ενέργεια αυτή δεν μπορεί να εκτελεσθεί σε αυτήν τη σελίδα.",
        "cannotdelete": "Η σελίδα ή το αρχείο «$1» δεν μπόρεσε να διαγραφεί.\nΕνδεχομένως να έχει ήδη διαγραφεί από κάποιον άλλον.",
        "cannotdelete-title": "Δεν είναι δυνατή η διαγραφή της σελίδας «$1»",
+       "delete-scheduled": "Η σελίδας «$1» είναι προγραμματισμένη για διαγραφή.\nΠαρακαλούμε έχετε υπομονή.",
        "delete-hook-aborted": "Η επεξεργασία ματαιώθηκε από το άγκιστρο του συντακτικού αναλυτή.\nΔεν έδωσε εξήγηση.",
        "no-null-revision": "Δεν ήταν δυνατή η δημιουργία νέας μηδενικής αναθεώρησης για τη σελίδα «$1»",
        "badtitle": "Ακατάλληλος τίτλος",
        "customcssprotected": "Δεν έχετε δικαιώματα για να επεξεργαστείτε αυτή τη σελίδα CSS, επειδή περιέχει προσωπικές ρυθμίσεις άλλου χρήστη.",
        "customjsonprotected": "Δεν έχετε δικαιώματα για να επεξεργαστείτε αυτή τη σελίδα JSON, επειδή περιέχει προσωπικές ρυθμίσεις άλλου χρήστη.",
        "customjsprotected": "Δεν έχετε δικαιώματα για να επεξεργαστείτε αυτή τη σελίδα JavaScript, επειδή περιέχει προσωπικές ρυθμίσεις άλλου χρήστη.",
+       "sitecssprotected": "Δεν έχετε την άδεια να επεξεργαστείτε αυτήν τη σελίδα CSS επειδή μπορεί να επηρεάσει όλους τους επισκέπτες.",
+       "sitejsonprotected": "Δεν έχετε την άδεια να επεξεργαστείτε αυτήν τη σελίδα JSON επειδή μπορεί να επηρεάσει όλους τους επισκέπτες.",
        "sitejsprotected": "Δεν έχετε την άδεια να επεξεργαστείτε αυτήν τη σελίδα JavaScript επειδή μπορεί να επηρεάσει όλους τους επισκέπτες.",
        "mycustomcssprotected": "Δεν έχετε άδεια για να επεξεργαστείτε αυτήν τη σελίδα CSS.",
        "mycustomjsonprotected": "Δεν έχετε άδεια για να επεξεργαστείτε αυτήν τη σελίδα JSON.",
        "badretype": "Οι κωδικοί που έχετε δηλώσει δεν συμφωνούν μεταξύ τους.",
        "usernameinprogress": "Είναι ήδη σε εξέλιξη δημιουργία λογαριασμού για αυτό το όνομα χρήστη.\nΠαρακαλούμε περιμένετε.",
        "userexists": "Το όνομα χρήστη που εισαγάγατε βρίσκεται ήδη σε χρήση.\nΠαρακαλούμε, διαλέξτε ένα διαφορετικό.",
+       "createacct-normalization": "Το όνομα χρήστη σας θα προσαρμοστεί σε «$2» λόγω τεχνικών περιορισμών.",
        "loginerror": "Σφάλμα σύνδεσης",
        "createacct-error": "Σφάλμα δημιουργίας λογαριασμού",
        "createaccounterror": "Δεν ήταν δυνατή η δημιουργία λογαριασμού: $1",
        "botpasswords-existing": "Υπάρχοντα συνθηματικά ρομπότ",
        "botpasswords-createnew": "Δημιουργία νέου συνθηματικού ρομπότ",
        "botpasswords-editexisting": "Επεξεργασία υπάρχοντος συνθηματικού ρομπότ",
+       "botpasswords-label-needsreset": "(το συνθηματικό θέλει ανανέωση)",
        "botpasswords-label-appid": "Όνομα του ρομπότ:",
        "botpasswords-label-create": "Δημιουργία",
        "botpasswords-label-update": "Ενημέρωση",
        "botpasswords-restriction-failed": "Περιορισμοί κωδικών πρόσβασης bot εμποδίζουν τη συγκεκριμένη σύνδεση.",
        "botpasswords-invalid-name": "Το όνομα χρήστη που ορίζεται δεν περιέχει το διαχωριστικό συνθηματικού ρομπότ («$1»).",
        "botpasswords-not-exist": "Ο χρήστης «$1» δεν έχει συνθηματικό για ρομπότ με όνομα «$2».",
+       "botpasswords-needs-reset": "Το συνθηματικό για το ρομπότ με όνομα «$2» {{GENDER:$1|του χρήστη|της χρήστριας}} «$1» χρειάζεται ανανέωση.",
+       "botpasswords-locked": "Δεν μπορείτε να συνδεθείτε με συνθηματικό μποτ καθώς ο λογαριασμός σας είναι κλειδωμένος.",
        "resetpass_forbidden": "Οι κωδικοί πρόσβασης δεν μπορούν να αλλαχθούν",
        "resetpass_forbidden-reason": "Οι κωδικοί πρόσβασης δεν μπορούν να αλλαχθούν: $1",
        "resetpass-no-info": "Πρέπει να είστε συνδεδεμένος για να δείτε αυτήν την σελίδα απευθείας",
        "resetpass-submit-loggedin": "Αλλαγή κωδικού",
        "resetpass-submit-cancel": "Ακύρωση",
        "resetpass-wrong-oldpass": "Μη έγκυρο προσωρινό ή τρέχον συνθηματικό.\nΜπορεί να έχετε ήδη αλλάξει το συνθηματικό σας ή να έχετε αιτηθεί νέο προσωρινό συνθηματικό.",
-       "resetpass-recycled": "ΠαÏ\81ακαλοÏ\8dμε ÎµÏ\80αναÏ\86έÏ\81εÏ\84ε Ï\84ο Ï\83Ï\85νθημαÏ\84ικÏ\8c Ï\83αÏ\82 ÎµÏ\80ιλέγονÏ\84αÏ\82 κάτι διαφορετικό από το τρέχον συνθηματικό σας.",
+       "resetpass-recycled": "ΠαÏ\81ακαλοÏ\8dμε Î±Î»Î»Î¬Î¾Ï\84ε Ï\84ο Ï\83Ï\85νθημαÏ\84ικÏ\8c Ï\83αÏ\82 Ï\83ε κάτι διαφορετικό από το τρέχον συνθηματικό σας.",
        "resetpass-temp-emailed": "Έχετε συνδεθεί με έναν προσωρινό κωδικό μέσω ηλεκτρονικού ταχυδρομείου.\nΓια να ολοκληρώσετε τη σύνδεσή σας, πρέπει να ορίσετε νέο συνθηματικό εδώ:",
        "resetpass-temp-password": "Προσωρινό συνθηματικό:",
        "resetpass-abort-generic": "Η αλλαγή του κωδικού έχει απορριφθεί από μια προέκταση.",
        "resetpass-expired": "Το συνθηματικό σας έχει λήξει. Παρακαλούμε καθορίστε νέο συνθηματικό για να συνδεθείτε.",
-       "resetpass-expired-soft": "Το συνθηματικό σας έχει λήξει και πρέπει να γίνει επαναφορά του. Παρακαλούμε επιλέξτε νέο συνθηματικό τώρα, ή κάντε κλικ στο «{{int:authprovider-resetpass-skip-label}}» για το επαναφέρετε αργότερα.",
+       "resetpass-expired-soft": "Το συνθηματικό σας έχει λήξει και πρέπει να αλλάξει. Παρακαλούμε επιλέξτε νέο συνθηματικό τώρα, ή κάντε κλικ στο «{{int:authprovider-resetpass-skip-label}}» για το αλλάξετε αργότερα.",
+       "resetpass-validity": "Το συνθηματικό σας δεν ισχύει: $1 \n\nΠαρακαλούμε καθορίστε νέο συνθηματικό για να συνδεθείτε.",
        "resetpass-validity-soft": "Το συνθηματικό σας δεν είναι έγκυρο: $1\n\nΠαρακαλούμε επιλέξτε νέο συνθηματικό τώρα, ή πατήστε «{{int:authprovider-resetpass-skip-label}}» για να το αλλάξετε αργότερα.",
        "passwordreset": "Επαναφορά κωδικού",
        "passwordreset-text-one": "Συμπληρώστε αυτήν τη φόρμα για να λάβετε ένα προσωρινό συνθηματικό μέσω ηλεκτρονικού ταχυδρομείου.",
        "subject-preview": "Προεπισκόπηση θέματος:",
        "previewerrortext": "Παρουσιάστηκε σφάλμα κατά την προσπάθεια για να κάνετε προεπισκόπηση των αλλαγών σας.",
        "blockedtitle": "Ο χρήστης έχει υποστεί φραγή.",
+       "blocked-email-user": "<strong>Το όνομα χρήστη σας έχει φραγεί από το να στέλνει email. Μπορείτε ακόμη να επεξεργάζεστε άλλες σελίδες σε αυτό το wiki.</strong> Μπορείτε να δείτε πλήρεις λεπτομέρειες φραγής στις [[Special:MyContributions|συνεισφορές λογαριασμού]].\n\nΗ φραγή έγινε από τον $1.\n\nΗ αιτία που δόθηκε είναι <em>$2</em>.\n\n* Έναρξη φραγής: $8\n* Λήξη φραγής: $6\n* Επιδιωκόμενος αποκλεισμένος: $7\n* Block ID #$5",
+       "blockedtext-partial": "<strong>Το όνομα χρήστη ή η IP σας έχει φραγεί από το να κάνει αλλαγές σε αυτή τη σελίδα. Μπορείτε ακόμη να επεξεργάζεστε άλλες σελίδες σε αυτό το wiki.</strong> Μπορείτε να δείτε πλήρεις λεπτομέρειες φραγής στις [[Special:MyContributions|συνεισφορές λογαριασμού]].\n\nΗ φραγή έγινε από τον $1.\n\nΗ αιτία που δόθηκε είναι <em>$2</em>.\n\n* Έναρξη φραγής: $8\n* Λήξη φραγής: $6\n* Επιδιωκόμενος αποκλεισμένος: $7\n* Block ID #$5",
        "blockedtext": "<strong>Το όνομα χρήστη σας ή η διεύθυνση IP σας έχει υποστεί φραγή.</strong>\n\nΗ φραγή έγινε από τον/την $1.\nΗ αιτιολογία που δόθηκε είναι: <em>$2</em>.\n\n* Έναρξη φραγής: $8\n* Λήξη φραγής: $6\n* Η φραγή προορίζεται για το χρήστη: $7\n\nΜπορείτε να απευθυνθείτε στον/στην $1 ή σε κάποιον άλλον [[{{MediaWiki:Grouppage-sysop}}|διαχειριστή]] για να συζητήσετε τη φραγή.\nΔεν μπορείτε να χρησιμοποιήσετε την δυνατότητα \"{{int:emailuser}}\" εκτός αν μια έγκυρη ηλεκτρονική διεύθυνση έχει οριστεί στις [[Special:Preferences|προτιμήσεις χρήστη]] σας.\nΗ τρέχουσα διεύθυνση IP σας είναι $3, και ο αριθμός αναγνώρισης της φραγής είναι #$5.\nΠαρακαλούμε περιλαμβάνετε οποιοδήποτε ή και τα δύο από αυτά σε οποιαδήποτε ερωτήματα σας.",
-       "autoblockedtext": "Η διεύθυνση IP σας έχει υποστεί φραγή αυτόματα επειδή χρησιμοποιήθηκε από έναν άλλο χρήστη, ο οποίος και αποκλείστηκε από τον/την $1.\nΗ αιτιολόγηση που δόθηκε είναι η εξής:\n\n:<em>$2</em>\n\n* Έναρξη φραγής: $8\n* Λήξη φραγής: $6\n* Επιδιωκόμενος αποκλεισμένος: $7\n\nΜπορείτε να επικοινωνήσετε με τον/την $1 ή με κάποιον από τους άλλους [[{{MediaWiki:Grouppage-sysop}}|διαχειριστές]] για να συζητήσετε τη φραγή.\n\nΝα σημειωθεί ότι δεν μπορείτε να χρησιμοποιήσετε τη λειτουργία «αποστολή μηνύματος ηλεκτρονικού ταχυδρομείου σε αυτόν τον χρήστη» εκτός αν έχετε μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου καταχωρισμένη στις [[Special:Preferences|προτιμήσεις χρήστη]] σας.\n\nΗ τρέχουσα διεύθυνση IP σας είναι $3 και το αναγνωριστικό της φραγής σας είναι #$5. Παρακαλούμε συμπεριλάβετε τις παραπάνω λεπτομέρειες σε όποια ερωτήματα κάνετε.",
+       "autoblockedtext": "Η διεύθυνση IP σας έχει υποστεί φραγή αυτόματα επειδή χρησιμοποιήθηκε από έναν άλλο χρήστη, ο οποίος και αποκλείστηκε από τον/την $1.\nΗ αιτιολόγηση που δόθηκε είναι η εξής:\n\n:<em>$2</em>\n\n* Έναρξη φραγής: $8\n* Λήξη φραγής: $6\n* Επιδιωκόμενος αποκλεισμένος: $7\n\nΜπορείτε να επικοινωνήσετε με τον/την $1 ή με κάποιον από τους άλλους [[{{MediaWiki:Grouppage-sysop}}|διαχειριστές]] για να συζητήσετε τη φραγή.\n\nΝα σημειωθεί ότι δεν μπορείτε να χρησιμοποιήσετε τη λειτουργία «{{int:emailuser}}» εκτός αν έχετε μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου καταχωρισμένη στις [[Special:Preferences|προτιμήσεις χρήστη]] σας.\n\nΗ τρέχουσα διεύθυνση IP σας είναι $3 και το αναγνωριστικό της φραγής σας είναι #$5. Παρακαλούμε συμπεριλάβετε τις παραπάνω λεπτομέρειες σε όποια ερωτήματα κάνετε.",
        "systemblockedtext": "Το όνομα χρήστη σας ή η διεύθυνση IP έχει αποκλειστεί αυτόματα από το MediaWiki.\nΗ αιτία που δόθηκε είναι:\n\n:<em>$2</em>\n\n* Έναρξη φραγής: $8\n* Λήξη φραγής: $6\n* Στόχος φραγής: $7\n\nΗ τρέχουσα διεύθυνση IP σας είναι $3.\nΠαρακαλούμε να συμπεριλάβετε όλα τα παραπάνω στοιχεία σε τυχόν απορίες σας.",
        "blockednoreason": "δεν δόθηκε λόγος",
        "whitelistedittext": "Πρέπει να $1 για να επεξεργαστείτε σελίδες.",
        "userjsonpreview": "<strong>Σας υπενθυμίζουμε ότι κάνετε απλώς έλεγχο/προεπισκόπηση της ρύθμισης JSON σας. Δεν έχει αποθηκευθεί ακόμα!</strong>",
        "userjspreview": "'''Σας υπενθυμίζουμε ότι κάνετε απλώς έλεγχο/προεπισκόπηση του JavaScript του χρήστη -δεν το έχετε ακόμα αποθηκεύσει!'''",
        "sitecsspreview": "<strong>Θυμηθείτε ότι είναι απλώς μια προεπισκόπηση αυτού του CSS.\nΔεν έχει αποθηκευτεί ακόμα!</strong>",
+       "sitejsonpreview": "<strong>Θυμηθείτε ότι είναι απλώς μια προεπισκόπηση αυτής της ρύθμισης JSON.\nΔεν έχει αποθηκευτεί ακόμα!</strong>",
        "sitejspreview": "''' Θυμηθείτε ότι κάνετε μόνο προεπισκόπηση σ'αυτόν τον κώδικα JavaScript.'' '\n'' ' Δεν τον έχετε αποθηκεύσει ακόμη!'' '",
        "userinvalidconfigtitle": "<strong>Προσοχή:<strong> Δεν υπάρχει skin με τίτλο \"$1\". Θυμηθείτε οι προσαρμοσμένες σελίδες .css, .json, .js χρησιμοποιούν έναν τίτλο με μικρά γράμματα, π.χ. {{ns:user}}:Foo/vector.css σε αντίθεση με το {{ns:user}}:Foo/Vector.css.",
        "updated": "(Ενημερώθηκε)",
        "edit-conflict": "Σύγκρουση επεξεργασιών.",
        "edit-no-change": "Η επεξεργασία σας αγνοήθηκε, επειδή δεν έγινε καμία αλλαγή στο κείμενο.",
        "edit-slots-cannot-add": "Τα ακόλουθα σημεία στίξεως εφαρμόζονται εδώ {{PLURAL:$1|slot is|slots are}} : $2.",
+       "edit-slots-cannot-remove": "{{PLURAL:$1|Η ακόλουθη υποδοχή είναι απαραίτητη και δεν μπορεί να αφαιρεθεί|Οι ακόλουθες υποδοχές είναι απαραίτητες και δεν μπορούν να αφαιρεθούν}}: $2.",
        "edit-slots-missing": "Το επόμενο {{PLURAL:$1|κενό|slots are}} λείπει: $2.{{PLURAL:$1|}}",
        "postedit-confirmation-created": "Η σελίδα δημιουργήθηκε.",
        "postedit-confirmation-restored": "Η σελίδα έχει αποκατασταθεί.",
        "defaultmessagetext": "Προεπιλεγμένο κείμενο μηνύματος",
        "content-failed-to-parse": "Απέτυχε η ανάλυση  περιεχομένου του $2 για το μοντέλο $1:$3",
        "invalid-content-data": "Μη έγκυρα δεδομένα περιεχομένου",
-       "content-not-allowed-here": "Το περιεχόμενο «$1» δεν επιτρέπεται στη σελίδα [[:$2]]",
+       "content-not-allowed-here": "Το περιεχόμενο «$1» δεν επιτρέπεται στη σελίδα [[:$2]] στην υποδοχή «$3»",
        "editwarning-warning": "Αφήνοντας αυτή τη σελίδα μπορεί να έχει ως συνέπεια να χαθούν κάποιες αλλαγές που έχετε κάνει.\nΑν έχετε συνδεθεί, μπορείτε να απενεργοποιήσετε αυτή την προειδοποίηση στην  ενότητα \"{{int:prefs-editing}}\"  των προτιμήσεών σας.",
        "editpage-invalidcontentmodel-title": "Δεν υποστηρίχτηκε το μοντέλο περιεχομένου",
        "editpage-invalidcontentmodel-text": "Το μοντέλο ''$1'' δεν υποστηρίχτηκε.",
        "converter-manual-rule-error": "Εντοπίστηκε σφάλμα σε μη αυτόματο κανόνα μετατροπής γλώσσας",
        "undo-success": "Η επεξεργασία μπορεί να αναιρεθεί.\nΠαρακαλούμε ελέγξτε την σύγκριση παρακάτω για να επιβεβαιώσετε ότι είναι αυτό το οποίο θέλετε να κάνετε και έπειτα αποθηκεύστε τις αλλαγές παρακάτω για να ολοκληρώσετε την αναίρεση της επεξεργασίας.",
        "undo-failure": "Η επεξεργασία δεν μπορούσε να αναστραφεί λόγω αντικρουόμενων ενδιάμεσων επεξεργασιών.",
+       "undo-main-slot-only": "Η επεξεργασία δεν μπορεί να αναιρεθεί επειδή εμπλέκει περιεχόμενο έξω από τη κύρια υποδοχή.",
        "undo-norev": "Η ανάκληση αυτής της επεξεργασίας δεν ηταν δυνατό να πραγματοποιηθεί επειδή δεν υπάρχει ή επειδή έχει διαγραφεί.",
        "undo-nochange": "Η επεξεργασία φαίνεται να έχει ήδη αναιρεθεί.",
-       "undo-summary": "Αναίρεση αναθεώρησης $1 από {{GENDER:$2|τον|την}} [[Special:Contribs/$2|$2]] ([[User talk:$2|Συζήτηση]])",
+       "undo-summary": "Αναίρεση αναθεώρησης $1 από {{GENDER:$2|τον|την}} [[Special:Contributions/$2|$2]] ([[User talk:$2|Συζήτηση]])",
        "undo-summary-username-hidden": "Αναίρεση αναθεώρησης $1 από ένα κρυμμένο χρήστη",
        "cantcreateaccount-text": "Η δημιουργία λογαριασμού από αυτή τη διεύθυνση IP ('''$1''') έχει αποτραπεί από τον [[User:$3|$3]].\n\nΟ λόγος που δόθηκε από τον $3 είναι ''$2''",
        "cantcreateaccount-range-text": "Η δημιουργία λογαριασμού από διευθύνσεις IP στην περιοχή  <strong>$1</strong>, που περιλαμβάνει τη δική σας διεύθυνση IP (<strong>$4</strong>), έχει αποκλειστεί από τον [[User:$3|$3]].\n\nΗ αιτιολογία που δόθηκε από τον $3 είναι \"$2\"",
        "histfirst": "η πιο παλιά",
        "histlast": "η πιο πρόσφατη",
        "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
-       "historyempty": "(άδειο)",
+       "historyempty": "άδειο",
        "history-feed-title": "Ιστορικό εκδόσεων",
        "history-feed-description": "Ιστορικό αναθεωρήσεων για αυτή τη σελίδα στο wiki",
        "history-feed-item-nocomment": "$1 στις $2",
        "diff-paragraph-moved-toold": "Η παράγραφος αφαιρέθηκε. Πατήστε στο κουμπί για να πάτε σε προηγούμενη τοποθεσία.",
        "difference-missing-revision": "{{PLURAL:$2|Μία αναθεώρηση|$2 αναθεωρήσεις}} αυτής της διαφοράς ($1) δεν {{PLURAL:$2|μπόρεσε να βρεθεί|μπόρεσαν να βρεθούν}}.\n\nΑυτό συνήθως προκαλείται από παλιό σύνδεσμο διαφοράς προς σελίδα που έχει διαγραφεί.\nΛεπτομέρειες θα βρείτε στο [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} ημερολόγιο καταγραφής διαγραφών].",
        "searchresults": "Αποτελέσματα αναζήτησης",
+       "search-filter-title-prefix": "Αναζήτηση μόνο σελίδων που ο τίτλος τους ξεκινά με «$1»",
        "search-filter-title-prefix-reset": "Αναζήτηση όλων των σελίδων",
        "searchresults-title": "Αποτελέσματα αναζήτησης για \"$1\"",
        "titlematches": "Τίτλοι άρθρων που ανταποκρίνονται",
        "prefs-advancedwatchlist": "Προηγμένες επιλογές",
        "prefs-displayrc": "Εμφάνιση επιλογών",
        "prefs-displaywatchlist": "Επιλογές εμφάνισης",
+       "prefs-changesrc": "Αλλαγές που εμφανίζονται",
+       "prefs-changeswatchlist": "Αλλαγές που εμφανίζονται",
+       "prefs-pageswatchlist": "Παρακολουθούμενες σελίδες",
        "prefs-tokenwatchlist": "Κλειδί",
        "prefs-diffs": "Διαφορές",
        "prefs-help-prefershttps": "Αυτή η προτίμηση θα τεθεί σε ισχύ στην επόμενή σας σύνδεση.",
        "right-editusercss": "Μεταγραφή των αρχείων CSS άλλων χρηστών",
        "right-edituserjson": "Μεταγραφή των αρχείων JSON άλλων χρηστών",
        "right-edituserjs": "Μεταγραφή των αρχείων JS άλλων χρηστών",
+       "right-editsitecss": "Επεξεργασία CSS ιστότοπου",
+       "right-editsitejson": "Επεξεργασία JSON ιστότοπου",
+       "right-editsitejs": "Επεξεργασία JavaScript ιστότοπου",
        "right-editmyusercss": "Επεξεργασία των ιδιωτικών αρχείων CSS χρήστη",
        "right-editmyuserjson": "Επεξεργασία των ιδιωτικών αρχείων JSON χρήστη",
        "right-editmyuserjs": "Επεξεργασία των ιδιωτικών αρχείων JavaScript χρήστη",
        "grant-createaccount": "Δημιουργία λογαριασμών",
        "grant-createeditmovepage": "Δημιουργία, επεξεργασία και μετακίνηση σελίδων",
        "grant-delete": "Διαγραφή σελίδων, αναθεωρήσεων και καταχωρίσεων σε αρχεία καταγραφής",
-       "grant-editinterface": "Επεξεργασία του ονοματοχώρου Mediawiki και των CSS/JSON/JavaScript των χρηστών",
+       "grant-editinterface": "Επεξεργασία του ονοματοχώρου Mediawiki και JSON ιστότοπου/χρηστών",
        "grant-editmycssjs": "Επεξεργασία των CSS/JSON/JavaScript του χρήστη σας",
-       "grant-editmyoptions": "Επεξεργασία των προτιμήσεων χρήστη σας",
+       "grant-editmyoptions": "Επεξεργασία των προτιμήσεων χρήστη σας και ρυθμίσεων JSON",
        "grant-editmywatchlist": "Επεξεργασία της λίστας παρακολούθησής σας",
+       "grant-editsiteconfig": "Επεξεργασία CSS/JS ιστότoπου και χρηστών",
        "grant-editpage": "Επεξεργασία υπαρχουσών σελίδων",
        "grant-editprotected": "Επεξεργασία προστατευμένων σελίδων",
        "grant-highvolume": "Επεξεργασία υψηλού όγκου",
        "action-changetags": "πρόσθεση και αφαίρεση αυθαίρετων ετικετών σε μεμονωμένες εκδόσεις και καταχωρήσεις καταγραφών",
        "action-deletechangetags": "διαγράψετε ετικέτες από τη βάση δεδομένων",
        "action-purge": "εκκαθάριση αυτής της σελίδας",
+       "action-apihighlimits": "χρήση μεγαλύτερων ορίων για ερωτήματα API",
+       "action-editinterface": "επεξεργασία της διεπαφής χρήστη",
+       "action-editusercss": "επεξεργασία αρχείων CSS άλλων χρηστών",
+       "action-edituserjson": "επεξεργασία αρχείων JSON άλλων χρηστών",
+       "action-edituserjs": "επεξεργασία αρχείων JavaScript άλλων χρηστών",
+       "action-editsitecss": "επεξεργασία CSS ιστότοπου",
+       "action-editsitejson": "επεξεργασία JSON ιστότοπου",
+       "action-editsitejs": "επεξεργασία JavaScript ιστότοπου",
+       "action-editmyusercss": "επεξεργασία των ιδιωτικών αρχείων CSS χρήστη",
+       "action-editmyuserjson": "επεξεργασία των ιδιωτικών αρχείων JSON χρήστη",
+       "action-editmyuserjs": "επεξεργασία των ιδιωτικών αρχείων JavaScript χρήστη",
+       "action-viewsuppressed": "προβολή αναθεωρήσεων κρυμμένων από κάθε χρήστη",
+       "action-hideuser": "φραγή ενός ονόματος χρήστη, αποκρύπτοντάς το από το κοινό",
+       "action-ipblock-exempt": "παράκαμψη φραγών σε διευθύνσεις IP, αυτόματων φραγών και φραγών σε IP range",
+       "action-unblockself": "αναίρεση φραγής του εαυτού",
+       "action-reupload-own": "αντικατάσταση ενός ήδη υπάρχοντος αρχείου που έχει ανέβει από τον ίδιο",
+       "action-nominornewtalk": "μικρές αλλαγές σε σελίδες συζήτησης να μην ενεργοποιούν την ειδοποίηση νέου μηνύματος",
+       "action-markbotedits": "σήμανση αναιρέσεων επεξεργασιών ως επεξεργασιών μποτ",
+       "action-patrolmarks": "προβολή σημάνσεων ελέγχου πρόσφατων αλλαγών",
        "nchanges": "$1 {{PLURAL:$1|αλλαγή|αλλαγές}}",
        "ntimes": "$1×",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|από την τελευταία επίσκεψη}}",
        "rcfilters-savedqueries-already-saved": "Αυτά τα φίλτρα έχουν ήδη αποθηκευτεί. Αλλάξετε τις παραμέτρους για να δημιουργήσετε ένα νέο Αποθηκευμένο Φίλτρο.",
        "rcfilters-restore-default-filters": "Επαναφορά προεπιλεγμένων φίλτρων",
        "rcfilters-clear-all-filters": "Εκκαθάριση όλων των φίλτρων",
-       "rcfilters-show-new-changes": "Προβολή νεότερων αλλαγών",
+       "rcfilters-show-new-changes": "Προβολή νεότερων αλλαγών από $1",
        "rcfilters-search-placeholder": "Φιλτράρισμα πρόσφατων αλλαγών (περιηγηθείτε ή αρχίστε να πληκτρολογείτε)",
        "rcfilters-invalid-filter": "Μη έγκυρο φίλτρο",
        "rcfilters-empty-filter": "Χωρίς ενεργά φίλτρα. Εμφανίζονται όλες οι συνεισφορές.",
        "rcfilters-watchlist-markseen-button": "Σημειώστε όλες τις αλλαγές ως εξετασμένες",
        "rcfilters-watchlist-edit-watchlist-button": "Διορθώστε τη λίστα παρακολούθησης",
        "rcfilters-watchlist-showupdated": "Σελίδες που έχουν υποστεί αλλαγές από την τελευταία φορά που τις επισκεφθήκατε εμφανίζονται με '''έντονους χαρακτήρες'''.",
-       "rcfilters-preference-label": "Î\91Ï\80Ï\8cκÏ\81Ï\85Ï\88η Ï\84ηÏ\82 Î²ÎµÎ»Ï\84ιÏ\89μένηÏ\82 Î­ÎºÎ´Î¿Ï\83ηÏ\82 Ï\84Ï\89ν Î Ï\81Ï\8cÏ\83Ï\86αÏ\84Ï\89ν Î\91λλαγÏ\8eν",
-       "rcfilters-preference-help": "Î\91ναÏ\83Ï\84έλλει Ï\84ον ÎµÏ\80αναÏ\83Ï\87εδιαÏ\83μÏ\8c Î´Î¹ÎµÏ\80αÏ\86ήÏ\82 2017 ÎºÎ±Î¹ Ï\8cλα Ï\84α ÎµÏ\81γαλεία Ï\80οÏ\85 Ï\80Ï\81οÏ\83Ï\84έθηκαν Ï\83Ï\84η Ï\83Ï\85νέÏ\87εια ÎºÎ±Î¹ Î±Ï\80Ï\8c Ï\84Ï\8cÏ\84ε.",
+       "rcfilters-preference-label": "ΧÏ\81ήÏ\83η Î´Î¹ÎµÏ\80αÏ\86ήÏ\82 Ï\87Ï\89Ï\81ίÏ\82 JavaScript",
+       "rcfilters-preference-help": "ΦοÏ\81Ï\84Ï\8eνει Ï\84ιÏ\82 Î Ï\81Ï\8cÏ\83Ï\86αÏ\84εÏ\82 Î\91λλαγέÏ\82 Ï\87Ï\89Ï\81ίÏ\82 Ï\86ίλÏ\84Ï\81α Î±Î½Î±Î¶Î®Ï\84ηÏ\83ηÏ\82 Î® Î»ÎµÎ¹Ï\84οÏ\85Ï\81γία ÎµÏ\80ιÏ\83ήμανÏ\83ηÏ\82.",
        "rcfilters-watchlist-preference-label": "Χρήση πίνακα διεπαφής όχι-JavaScript",
-       "rcfilters-watchlist-preference-help": "Φορτώσεις Watchlist χωρίς φίλτρα ή τονισμό με χρώμα.",
+       "rcfilters-watchlist-preference-help": "Φορτώνει την Λίστα Παρακολούθησης χωρίς φίλτρα αναζήτησης ή λειτουργία επισήμανσης.",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>Σελίδες που συνδέονται από</strong> τη επιλεγμένη σελίδα",
        "rcfilters-filter-showlinkedto-label": "Εμφάνιση αλλαγών σε σελίδες που συνδέουν σε",
        "rcfilters-target-page-placeholder": "Εισαγάγετε όνομα σελίδας (ή κατηγορίας)",
        "prefixindex": "Όλες οι σελίδες με πρόθεμα",
        "prefixindex-namespace": "Όλες οι σελίδες με πρόθεμα (ονοματοχώρος $1)",
        "prefixindex-submit": "Προβολή",
-       "prefixindex-strip": "Î\91Ï\86αίÏ\81εÏ\83η Ï\84οÏ\85 Ï\80Ï\81οθέμαÏ\84οÏ\82 Ï\83Ï\84η Î»Î¯Ï\83τα",
+       "prefixindex-strip": "Î\91Ï\80Ï\8cκÏ\81Ï\85Ï\88η Ï\84οÏ\85 Ï\80Ï\81οθέμαÏ\84οÏ\82 Ï\83Ï\84α Î±Ï\80οÏ\84ελέÏ\83ματα",
        "shortpages": "Σύντομες σελίδες",
        "longpages": "Εκτενείς σελίδες",
        "deadendpages": "Αδιέξοδες σελίδες",
        "cachedspecial-refresh-now": "Προβολή τελευταίας.",
        "categories": "Κατηγορίες",
        "categories-submit": "Εμφάνιση",
-       "categoriespagetext": "Οι ακόλουθες {{PLURAL:$1|κατηγορία περιέχει|κατηγορίες περιέχουν}} σελίδες ή μέσα.\nΟι [[Special:UnusedCategories|αχρησιμοποίητες κατηγορίες]] δεν εμφανίζονται εδώ.\nΔείτε επίσης τις [[Special:WantedCategories|ζητούμενες κατηγορίες]].",
+       "categoriespagetext": "{{PLURAL:$1|Η ακόλουθη κατηγορία υπάρχει|Οι ακόλουθες κατηγορίες υπάρχουν}} σε αυτό το wiki, και μπορεί ή μπορεί να μην είναι {{PLURAL:$1|αχρησιμοποίητη|αχρησιμοποίητες}}.\nΔείτε επίσης τις [[Special:WantedCategories|ζητούμενες κατηγορίες]].",
        "categoriesfrom": "Εμφάνιση κατηγοριών που αρχίζουν από:",
        "deletedcontributions": "Διαγεγραμμένες συνεισφορές χρήστη",
        "deletedcontributions-title": "Διαγεγραμμένες συνεισφορές χρήστη",
        "delete-confirm": "Διαγραφή του \"$1\"",
        "delete-legend": "Διαγραφή",
        "historywarning": "<strong>Προσοχή:</strong> Η σελίδα που πρόκειται να διαγράψετε έχει ιστορικό με περίπου $1 {{PLURAL:$1|επεξεργασία|επεξεργασίες}}:",
-       "historyaction-submit": "Προβολή",
+       "historyaction-submit": "Προβολή αναθεωρήσεων",
        "confirmdeletetext": "Πρόκειται να διαγράψετε οριστικά από τη βάση δεδομένων μια σελίδα (ή μια εικόνα) μαζί με το ιστορικό της. Παρακαλούμε επιβεβαιώστε ότι θέλετε πραγματικά να το κάνετε, ότι αντιλαμβάνεσθε τις συνέπειες και ότι το κάνετε σύμφωνα με την [[{{MediaWiki:Policy-url}}|πολιτική]].",
        "actioncomplete": "Η ενέργεια ολοκληρώθηκε.",
        "actionfailed": "Η ενέργεια απέτυχε",
        "ipbreason": "Αιτία:",
        "ipbreason-dropdown": "*Συχνοί λόγοι φραγής\n** Εισαγωγή λανθασμένων πληροφοριών\n** Αφαίρεση περιεχομένου από σελίδες\n** Σύνδεσμοι τύπου spam σε εξωτερικούς ιστοτόπους\n** Εισαγωγή ασυναρτησιών σε σελίδες\n** Εκφοβιστική συμπεριφορά/παρενόχληση\n** Κατάχρηση πολλαπλών λογαριασμών\n** Απαράδεκτο όνομα χρήστη",
        "ipb-hardblock": "Αποτρέψετε σε συνδεδεμένους χρήστες την επεξεργασία από αυτήν τη διεύθυνση IP",
-       "ipbcreateaccount": "Î\91Ï\80οÏ\84Ï\81οÏ\80ή Î´Î·Î¼Î¹Î¿Ï\85Ï\81γίαÏ\82 λογαριασμού",
-       "ipbemailban": "Î\91Ï\80οÏ\84Ï\81οÏ\80ή Î±Ï\80οÏ\83Ï\84ολήÏ\82 e-mail Î±Ï\80Ï\8c Ï\84ον Ï\87Ï\81ήÏ\83Ï\84η",
+       "ipbcreateaccount": "Î\94ημιοÏ\85Ï\81γία λογαριασμού",
+       "ipbemailban": "Î\91Ï\80οÏ\83Ï\84ολή email",
        "ipbenableautoblock": "Φράξε αυτόματατα την τελευταία διεύθυνση IP που χρησιμοποιήθηκε από αυτό τον χρήστη, και όποιες ακόλουθες IP από τις οποίες δοκιμάζει να επεξεργαστεί",
        "ipbsubmit": "Φραγή αυτού του χρήστη",
        "ipbother": "Άλλη ώρα",
        "ipboptions": "2 ώρες:2 hours,1 ημέρα:1 day,3 ημέρες:3 days,1 εβδομάδα:1 week,2 εβδομάδες:2 weeks,1 μήνα:1 month,3 μήνες:3 months,6 μήνες:6 months,1 χρόνο:1 year,αόριστα:infinite",
        "ipbhidename": "Απόκρυψη ονόματος χρήστη από επεξεργασίες και καταλόγους",
        "ipbwatchuser": "Παρακολούθηση των σελίδων 'χρήστη' και 'συζήτησης χρήστη' αυτού του χρήστη",
-       "ipb-disableusertalk": "Î\91Ï\80οÏ\84Ï\81έÏ\88Ï\84ε Î±Ï\85Ï\84Ï\8c Ï\84ο Ï\87Ï\81ήÏ\83Ï\84η Î±Ï\80Ï\8c Ï\84ην ÎµÏ\80εξεÏ\81γαÏ\83ία Ï\84ηÏ\82 Î´Î¹ÎºÎ® Ï\84οÏ\85 Ï\83ελίδαÏ\82 Ï\83Ï\85ζήÏ\84ηÏ\83ηÏ\82, ÎµÎ½Ï\8e ÎµÎ¯Î½Î±Î¹ Î±Ï\80οκλειÏ\83μένος",
+       "ipb-disableusertalk": "Î\95Ï\80εξεÏ\81γαÏ\83ία Ï\84ηÏ\82 Î´Î¹ÎºÎ® Ï\84οÏ\85 Ï\83ελίδαÏ\82 Ï\83Ï\85ζήÏ\84ηÏ\83ης",
        "ipb-change-block": "Επαναφραγή του χρήστη με αυτές τις ρυθμίσεις",
        "ipb-confirm": "Επιβεβαίωση φραγής",
        "ipb-partial": "Μερική",
        "fix-double-redirects": "Ενημερώστε όποια ανακατεύθυνση σκοπεύει προς τον αρχικό τίτλο",
        "move-leave-redirect": "Αφήστε πίσω μια ανακατεύθυνση",
        "protectedpagemovewarning": "Προειδοποίηση'' ':''' Αυτή η σελίδα έχει κλειδωθεί ώστε μόνο χρήστες με δικαιώματα διαχειριστή μπορούν να την μετακινήσουν.\nΗ πιο πρόσφατη καταχώρηση του αρχείου καταγραφής παρέχεται παρακάτω για αναφορά:",
-       "semiprotectedpagemovewarning": "'''Σημείωση:''' Αυτή η σελίδα έχει κλειδωθεί έτσι ώστε μόνο οι εγγεγραμμένοι χρήστες να μπορούν να την μετακινήσουν.\nΗ πιο πρόσφατη καταχώρηση του αρχείου καταγραφής παρέχεται παρακάτω για αναφορά:",
+       "semiprotectedpagemovewarning": "<strong>Σημείωση:</strong> Αυτή η σελίδα έχει προστατευθεί έτσι ώστε μόνο αυτοεπιβεβαιωμένοι χρήστες να μπορούν να την μετακινήσουν.\nΗ πιο πρόσφατη καταχώρηση του αρχείου καταγραφής παρέχεται παρακάτω για αναφορά:",
        "move-over-sharedrepo": "== Το αρχείο υπάρχει ==\nΤο [[:$1]] υπάρχει σε ένα κοινό αποθετήριο. Η μετακίνηση ενός αρχείου προς αυτόν τον τίτλο θα παρακάμψει το κοινό αρχείο.",
        "file-exists-sharedrepo": "Το όνομα αρχείου που επιλέχθηκε είναι ήδη σε χρήση σε ένα κοινό χώρο αποθήκευσης.\nΠαρακαλούμε επιλέξτε ένα άλλο όνομα.",
        "export": "Εξαγωγή σελίδων",
        "previousdiff": "← Παλαιότερη επεξεργασία",
        "nextdiff": "Νεότερη επεξεργασία →",
        "mediawarning": "'''Προειδοποίηση''': Το αρχείο αυτό μπορεί να περιέχει κακοπροαίρετο κώδικα.\nΕκτελώντας το, μπορεί να βλάψει το σύστημα του υπολογιστή σας.",
-       "imagemaxsize": "Όριο μεγέθους εικόνων:<br />''(στις σελίδες περιγραφής εικόνων)''",
+       "imagemaxsize": "Όριο μεγέθους εικόνων στις σελίδες περιγραφής εικόνων:",
        "thumbsize": "Μέγεθος μικρογραφίας:",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|σελίδα|σελίδες}}",
        "file-info": "μέγεθος αρχείου: $1, τύπος MIME: $2",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|προωθήθηκε}} αυτόματα από το $4 στο $5",
        "logentry-upload-upload": "{{GENDER:$2|Ο|Η}} $1 ανέβασε το $3",
        "logentry-upload-overwrite": "{{GENDER:$2|Ο|Η}} $1 ανέβασε μια νέα έκδοση του $3",
-       "logentry-upload-revert": "{{GENDER:$2|Î\9f\97}} $1 Î±Î½Î­Î²Î±Ï\83ε Ï\84ο $3",
+       "logentry-upload-revert": "{{GENDER:$2|Î\9f\97}} $1 ÎµÏ\80ανέÏ\86εÏ\81ε Ï\84ο $3 Ï\83ε Î¼Î¹Î± Ï\80αλιά Î­ÎºÎ´Î¿Ï\83η",
        "log-name-managetags": "Αρχείο καταγραφών διαχείρισης ετικετών",
        "log-description-managetags": "Αυτή η σελίδα περιέχει εργασίες διαχείρισης που σχετίζονται με τις [[Special:Tags|ετικέτες]]. Το αρχείο καταγραφής περιέχει μόνο οι ενέργειες που πραγματοποιούνται με το χέρι  από κάποιον διαχειριστή· ετικέτες μπορούν να δημιουργηθούν ή να διαγραφούν από το λογισμικό wiki, χωρίς κάποια καταχώριση να καταχωρίζεται σε αυτό το αρχείο καταγραφής.",
        "logentry-managetags-create": "{{GENDER:$2|Ο|Η}} $1 δημιούργησε την ετικέτα «$4»",
        "special-characters-title-minus": "σύμβολο πλην",
        "mw-widgets-abandonedit": "Είστε βέβαιοι ότι θέλετε να αφήσετε την κατάσταση επεξεργασίας χωρίς να αποθηκεύσετε πρώτα;",
        "mw-widgets-abandonedit-discard": "Απόρριψη επεξεργασιών",
-       "mw-widgets-abandonedit-keep": "ΣÏ\85νεÏ\87ίÏ\83Ï\84ε Ï\84ην ÎµÏ\80εξεÏ\81γαÏ\83ία",
+       "mw-widgets-abandonedit-keep": "ΣÏ\85νέÏ\87εια ÎµÏ\80εξεÏ\81γαÏ\83ίαÏ\82",
        "mw-widgets-abandonedit-title": "Είσαι σίγουρος;",
        "mw-widgets-dateinput-no-date": "Καμία ημερομηνία δεν επιλέχθηκε",
        "mw-widgets-dateinput-placeholder-day": "ΕΕΕΕ-ΜΜ-ΗΗ",
index 1a6b65b..b454d5f 100644 (file)
        "uploadstash-refresh": "Aktualigi la dosierliston.",
        "uploadstash-thumbnail": "Vidi bildeton",
        "uploadstash-exception": "Ne eblas alŝuti en kaŝkonservejon ($1): \"$2\".",
+       "uploadstash-bad-path-unknown-type": "Nekonata tipo \"$1\".",
        "uploadstash-bad-path-unrecognized-thumb-name": "Nerekonita miniatura nomo.",
+       "uploadstash-no-extension": "Dosiersufikso estas nula.",
        "uploadstash-zero-length": "Longo de dosiero estas nul.",
        "invalid-chunk-offset": "Malvalida deŝovo de dosierpeco",
        "img-auth-accessdenied": "Atingo malpermisita",
        "http-timed-out": "HTTP-peto eltempiĝis.",
        "http-curl-error": "Eraro venigante URL-on: $1",
        "http-bad-status": "Estis problemo dum la HTTP-peto: $1 $2",
+       "http-internal-error": "Interna eraro de HTTP.",
        "upload-curl-error6": "URL-o ne estis atingebla",
        "upload-curl-error6-text": "La donata URL-o ne estis atingita. Bonvolu rekontroli ke la URL-o estas korekta kaj la retejo funkcias.",
        "upload-curl-error28": "Tempolimo de alŝuto atingita",
        "speciallogtitlelabel": "Celo (titolo aŭ  {{ns:user}}:salutnomo por uzanto):",
        "log": "Protokoloj",
        "logeventslist-submit": "Montri",
+       "logeventslist-patrol-log": "Patrolprotokolo",
        "logeventslist-tag-log": "Protokolo de etikedoj",
        "all-logs-page": "Ĉiuj publikaj protokoloj",
        "alllogstext": "Suma kompilaĵo de ĉiuj protokoloj de {{SITENAME}}.\nVi povas plistrikti la mendon per selektado de protokola speco, la salutnomo (inkluzivante uskladon) aŭ la efika paĝo (ankaŭ inkluzivas uskladon).",
        "enotif_lastdiff": "Por rigardi ĉi tiun ŝanĝon, vidu $1",
        "enotif_anon_editor": "anonima uzanto $1",
        "enotif_body": "Kara $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nRedaktinta resumo:\n$PAGESUMMARY $PAGEMINOREDIT\n\nResumo pri la ŝanĝo de la redaktinto: $PAGESUMMARY $PAGEMINOREDIT\n\nKontaktu la redaktinton:\nretpoŝte: $PAGEEDITOR_EMAIL\nvikie: $PAGEEDITOR_WIKI\n\nNe estos aliaj avertoj kaze de sekvaj agoj krom se vi vizitus ĉi tiun paĝon ensalutite. Vi povas ankaŭ malaktivigi la avertsignalon por ĉiuj priatentitaj paĝoj de via atentaro.\n\n            Sincere via, la avertsistemo de {{SITENAME}}\n\n--\nPor ŝanĝi vian retpoŝtan avertadajn preferojn, klaku\n{{canonicalurl:{{#special:Preferences}}}}\n\nPor ŝanĝi vian preferojn de la atentaro, klaku\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPor forigi ĉi tiun paĝon de via atentaro, klaku\n$UNWATCHURL\n\nKomentoj kaj plia helpo:\n$HELPPAGE",
+       "enotif_minoredit": "Ĉi tiu estas redakteto",
        "created": "kreita",
        "changed": "ŝanĝita",
        "deletepage": "Forigi paĝon",
        "delete-confirm": "Forigi \"$1\"",
        "delete-legend": "Forigi",
        "historywarning": "<strong>Averto:</strong> La forigota paĝo havas historion kun $1 {{PLURAL:$1|revizio|revizioj}}:",
-       "historyaction-submit": "Montri",
+       "historyaction-submit": "Montri reviziojn",
        "confirmdeletetext": "Vi forigos la artikolon aŭ dosieron kaj forviŝos ĝian tutan historion el la datumaro.<br /> Bonvolu konfirmi, ke vi vere intencas tion, kaj ke vi komprenas la sekvojn, kaj ke vi ja sekvas la [[{{MediaWiki:Policy-url}}|regulojn pri forigado]].",
        "actioncomplete": "Ago farita",
        "actionfailed": "Ago malsukcesis",
        "dellogpage": "Protokolo pri forigoj",
        "dellogpagetext": "Jen listo de la plej lastaj forigoj.",
        "deletionlog": "protokolo pri forigoj",
+       "log-name-create": "Protokolo de paĝo-kreado",
        "logentry-create-create": "$1 {{GENDER:$2|kreis}} paĝon $3",
        "reverted": "Malfaris al antaŭa revisio",
        "deletecomment": "Kialo:",
        "ipbreason": "Kialo:",
        "ipbreason-dropdown": "*Oftaj kialoj de forbaro\n** Enmetas malveraĵojn\n** Forviŝas entenon el paĝoj\n** Entrudas ligilojn al eksteraj paĝaroj\n** Enmetas sensencaĵojn\n** Terurigema sinteno\n** Misuzo de pluraj salutnomoj\n** Neakceptebla uzanto-nomo",
        "ipb-hardblock": "Malpermesi ensalutitajn uzantoj de redaktante ĉi tiun IP-adreson",
-       "ipbcreateaccount": "Preventi kreadon de konto",
-       "ipbemailban": "Malebligi al uzanto sendi retpoŝton.",
+       "ipbcreateaccount": "Kreado de konto",
+       "ipbemailban": "Sendado de retpoŝta mesaĝo",
        "ipbenableautoblock": "Aŭtomate forbaru la lastan IP-adreson uzitan de la uzanto, kaj ĉiajn subsekvantajn adresojn el kiuj tiu provos redakti",
        "ipbsubmit": "Bloki la uzanton",
        "ipbother": "Alia daŭro:",
        "block-expiry": "Blokdaŭro",
        "block-prevent-edit": "Redaktado",
        "block-reason": "Kialo:",
+       "block-target": "Uzantnomo aŭ IP-adreso:",
        "unblockip": "Malforbari IP-adreson/nomon",
        "unblockiptext": "Per la jena formulo vi povas repovigi al iu\nforbarita IP-adreso/nomo la povon enskribi en la vikio.",
        "ipusubmit": "Forigi ĉi tiun forbaron",
        "blocklist-tempblocks": "Kaŝi provizorajn forbarojn",
        "blocklist-addressblocks": "Kaŝi unuopajn IP-adresajn forbarojn",
        "blocklist-type": "Tipo:",
+       "blocklist-type-opt-all": "Ĉio",
+       "blocklist-type-opt-sitewide": "Tutreteje",
+       "blocklist-type-opt-partial": "Parte",
        "blocklist-rangeblocks": "Kaŝi blokojn de intervalo",
        "blocklist-timestamp": "Tempindiko",
        "blocklist-target": "Celo",
        "blocklist-nousertalk": "ne povas redakti sian propran diskuto-paĝon",
        "blocklist-editing": "redaktado",
        "blocklist-editing-sitewide": "redaktado (tutreteja)",
+       "blocklist-editing-page": "paĝoj",
+       "blocklist-editing-ns": "nomspacoj",
        "ipblocklist-empty": "La forbarlibro estas malplena.",
        "ipblocklist-no-results": "Ĉi tiu IP-adreso aŭ salutnomo ne estas forbarita.",
        "blocklink": "forbari",
        "unblocklink": "restarigi",
        "change-blocklink": "ŝanĝi forbaron",
+       "empty-username": "(neniu uzantnomo disponeblas)",
        "contribslink": "kontribuoj",
        "emaillink": "sendi retpoŝton",
        "autoblocker": "Aŭtomate forbarita, ĉar via IP-adreso estis lastatempe uzita de \"[[User:$1|$1]]\".\nLa kialo donita por la forbaro de $1 estis: \"$2\"",
        "redirect-file": "Dosiernomo",
        "redirect-logid": "Protokola identigilo",
        "redirect-not-exists": "Valoro ne trovita",
+       "redirect-not-numeric": "Valoro ne estas nombra",
        "fileduplicatesearch": "Serĉu duplikatajn dosierojn",
        "fileduplicatesearch-summary": "Serĉi duplikatajn dosierojn bazite de haketvaloro.",
        "fileduplicatesearch-filename": "Dosiernomo:",
        "tag-list-wrapper": "[[Special:Tags|{{PLURAL:$1|Etikedo|Etikedoj}}]]: $2",
        "tag-mw-contentmodelchange": "ŝanĝo de enhavomodelo",
        "tag-mw-contentmodelchange-description": "Redaktoj kiuj [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel ŝanĝas la enhavmodelon] de paĝo",
+       "tag-mw-replace": "Anstataŭiginta",
+       "tag-mw-rollback": "Amasmalfari",
        "tag-mw-undo": "Malfari",
        "tags-title": "Etikedoj",
        "tags-intro": "Ĉi tiu paĝo montras la etikedojn kun kiuj la programaro markus redakton, kaj iliaj signifoj.",
        "edit-error-long": "Eraroj:\n\n$1",
        "revid": "revizio $1",
        "pageid": "Identigilo de paĝo $1",
+       "gotointerwiki": "Elirante retejon {{SITENAME}}",
        "pagedata-title": "Paĝaj datumoj",
        "pagedata-bad-title": "Nevalida titolo: \"$1\".",
        "passwordpolicies": "Reguloj pri pasvortoj",
index d53895f..fad6f20 100644 (file)
        "exif-compression-6": "JPEG (antiguu)",
        "exif-copyrighted-true": "Con drechos d'autor",
        "exif-copyrighted-false": "Drechos d'autor ensin configurar",
+       "exif-photometricinterpretation-0": "Blancu y prietu (El prietu ye 0)",
        "exif-photometricinterpretation-1": "Blancu y prietu (El prietu ye 0)",
+       "exif-photometricinterpretation-3": "Paleta",
+       "exif-photometricinterpretation-4": "Mázcara de tresparencia",
+       "exif-photometricinterpretation-5": "Separaos (Probablemente CMYK)",
+       "exif-photometricinterpretation-8": "CIE L*a*b*",
+       "exif-photometricinterpretation-9": "CIE L*a*b* (codificación ICC)",
+       "exif-photometricinterpretation-10": "CIE L*a*b* (codificación ITU)",
        "exif-unknowndate": "Fecha desconocida",
        "exif-orientation-1": "Normal",
        "exif-orientation-2": "Voltiada horizontalmente",
index bbe1483..72b8e6c 100644 (file)
        "exif-imagedescription": "Judul gambar",
        "exif-make": "Pabrikan kudakan",
        "exif-model": "Mudil kudakan",
-       "exif-software": "Parangkat lunak dipuruk",
+       "exif-software": "Parangkat lunak",
        "exif-artist": "Pa-ulah",
        "exif-copyright": "Pamingkut hak-rekap",
-       "exif-exifversion": "Parsi Exif",
+       "exif-exifversion": "rsi Exif",
        "exif-flashpixversion": "Manyukung parsi Flashpix",
        "exif-colorspace": "Kamar kalir",
        "exif-componentsconfiguration": "Arti matan tiap kumpunin",
        "exif-compressedbitsperpixel": "Muda kumprasi gambar",
        "exif-pixelxdimension": "Lingai gambar",
        "exif-pixelydimension": "Pancau gambar",
-       "exif-usercomment": "Kumintar pamuruk",
+       "exif-usercomment": "Kumintar pamakai",
        "exif-relatedsoundfile": "Barkas suara bahubung",
        "exif-datetimeoriginal": "Tanggal wan wayah paulahan data",
        "exif-datetimedigitized": "Tanggal wan wayah digitalisasi",
index 09c1772..4fd895c 100644 (file)
@@ -8,7 +8,8 @@
                        "Robin van der Vliet",
                        "Tlustulimu",
                        "Yekrats",
-                       "YvesNevelsteen"
+                       "YvesNevelsteen",
+                       "Mirin"
                ]
        },
        "exif-imagewidth": "Larĝeco",
        "exif-compression-8": "Malŝveli (Adobe)",
        "exif-copyrighted-true": "Sub aŭtorrajto",
        "exif-copyrighted-false": "Sub publika domajno",
+       "exif-photometricinterpretation-0": "Nigra-blanka (blanko estas 0)",
        "exif-photometricinterpretation-1": "Nigra kaj blanka (nigra estas 0)",
+       "exif-photometricinterpretation-3": "Paletro",
+       "exif-photometricinterpretation-4": "Masko de travideblo",
+       "exif-photometricinterpretation-5": "Apartigita (Verŝajne Cejanblua-Fuksina-Flava-Nigra)",
+       "exif-photometricinterpretation-8": "CIE L*a*b*",
+       "exif-photometricinterpretation-9": "CIE L*a*b* (laŭ enkodigo de ICC)",
+       "exif-photometricinterpretation-10": "CIE L*a*b* (laŭ enkodigo de ITU)",
        "exif-unknowndate": "Nekonata dato",
        "exif-orientation-1": "Normala",
        "exif-orientation-2": "Spegulumita horizontale",
index cc10dd9..a00befb 100644 (file)
        "exif-gpsspeedref": "వేగపు కొలమానం",
        "exif-gpsspeed": "GPS రిసీవరు వేగం",
        "exif-gpstrackref": "కదలిక దిశ కోసం మూలం",
-       "exif-gpstrack": "à°\95దలిà°\95 à°¯à±\8aà°\95à±\8dà°\95 à°¦à°¿à°¶",
+       "exif-gpstrack": "కదలిక దిశ",
        "exif-gpsimgdirectionref": "బొమ్మ దిశ కోసం మూలం",
-       "exif-gpsimgdirection": "à°¬à±\8aà°®à±\8dà°® à°¯à±\8aà°\95à±\8dà°\95 à°¦à°¿à°¶",
+       "exif-gpsimgdirection": "బొమ్మ దిశ",
        "exif-gpsmapdatum": "వాడిన జియోడెటిక్ సర్వే డేటా",
        "exif-gpsdestlatituderef": "గమ్యస్థాన రేఖాంశం కోసం మూలం",
-       "exif-gpsdestlatitude": "à°\97à°®à±\8dయసà±\8dథానà°\82 à°¯à±\8aà°\95à±\8dà°\95 అక్షాంశం",
+       "exif-gpsdestlatitude": "à°\97à°®à±\8dయసà±\8dథానపà±\81 అక్షాంశం",
        "exif-gpsdestlongituderef": "గమ్యస్థాన అక్షాంశం కోసం మూలం",
-       "exif-gpsdestlongitude": "à°\97à°®à±\8dయసà±\8dథానà°\82 à°¯à±\8aà°\95à±\8dà°\95 రేఖాంశం",
+       "exif-gpsdestlongitude": "à°\97à°®à±\8dయసà±\8dథానపà±\81 రేఖాంశం",
        "exif-gpsdestbearingref": "గమ్యస్థాన బేరింగు కోసం మూలం",
        "exif-gpsdestbearing": "గమ్యస్థానం బేరింగు",
        "exif-gpsdestdistanceref": "గమ్యస్థానానీ ఉన్న దూరం కోసం మూలం",
        "exif-dc-relation": "సంబంధిత మీడియా",
        "exif-dc-rights": "హక్కులు",
        "exif-dc-source": "మీడియా మూలము",
-       "exif-dc-type": "à°®à±\80డియా à°¯à±\8aà°\95à±\8dà°\95 à°°à°\95à°®à±\81",
+       "exif-dc-type": "మాధà±\8dయమ à°°à°\95à°\82",
        "exif-rating-rejected": "తిరస్కరించబడింది",
        "exif-isospeedratings-overflow": "65535 కంటే ఎక్కువ",
        "exif-iimcategory-ace": "కళలు, సంస్కృతి, వినోదం",
index 983ae2d..6390f6f 100644 (file)
        "grant-uploadfile": "بارگذاری پرونده‌های جدید",
        "grant-basic": "دسترسی‌های اولیه",
        "grant-viewdeleted": "مشاهدهٔ پرونده و صفحات حذف شده",
-       "grant-viewmywatchlist": "مشاهدۀ فهرست پیگیری‌هایتان",
+       "grant-viewmywatchlist": "مشاهدهٔ فهرست پیگیری‌هایتان",
        "grant-viewrestrictedlogs": "دیدن سیاه‌های محدود شده",
        "newuserlogpage": "سیاههٔ ایجاد کاربر",
        "newuserlogpagetext": "این سیاهه‌ای از نام‌های کاربری تازه‌ساخته‌شده است.",
index b095f08..246c78a 100644 (file)
        "movethispage": "Renommer cette page",
        "unusedimagestext": "Les fichiers suivants existent, mais ne sont inclus dans aucune page.\nVeuillez noter que d’autres sites peuvent accéder à ces fichiers à l’aide de liens directs (URLs), et donc qu’un fichier peut être listé ici alors qu’il est utilisé par ces sites.",
        "unusedimagestext-categorizedimgisused": "Les fichiers suivants existent mais ne sont inclus dans aucune page. Les images catégorisées sont considérées comme utilisées malgré qu'elles ne soient pas incluses dans aucune page.\nVeuillez noter que les autres sites web peuvent créer un lien vers un fichier à l'aide d'une URL directe, et donc peuvent encore être listés ici malgré qu'ils soient encore utilisés.",
-       "unusedcategoriestext": "Les pages de catégories suivantes existent, mais aucune page ou catégorie ne les utilise.",
+       "unusedcategoriestext": "Les pages de catégories suivantes existent, mais ne sont utilisées par aucune autre page ni catégorie.",
        "notargettitle": "Pas de cible",
        "notargettext": "Vous n'avez pas indiqué une page ou un utilisateur sur lequel vous souhaitez effectuer cette action.",
        "nopagetitle": "Page cible inexistante",
        "cachedspecial-refresh-now": "Voir le plus récent.",
        "categories": "Liste des catégories",
        "categories-submit": "Lister",
-       "categoriespagetext": "Sur le wiki, {{PLURAL:$1|la catégorie suivante existe et peut ou non être inutilisée|Les catégories suivantes existent et peuvent ou non être inutilisées}}.\nVoir aussi [[Special:WantedCategories|Les catégories demandées]].",
+       "categoriespagetext": "{{PLURAL:$1|La catégorie suivante existe|Les catégories suivantes existent}} sur le wiki, et {{PLURAL:$1|peut être inutilisée|peuvent être inutilisées}} ou non.\nVoir aussi [[Special:WantedCategories|les catégories les plus demandées]].",
        "categoriesfrom": "Afficher les catégories à partir de :",
        "deletedcontributions": "Contributions supprimées",
        "deletedcontributions-title": "Contributions supprimées",
        "ip_range_toolarge": "Les plages de blocage plus grandes que /$1 ne sont pas autorisées.",
        "ip_range_exceeded": "L'intervalle des adresses IP est plus grand l'intervalle maximum. Intervalle autorisé : /$1 .",
        "ip_range_toolow": "Les intervalles d'adresses IP ne sont effectivement pas autorisés.",
-       "proxyblocker": "Bloqueur de mandataires",
-       "proxyblockreason": "Votre adresse IP a été bloquée car il s’agit d’un serveur mandataire ouvert.\nVeuillez contacter votre fournisseur d’accès à Internet ou votre service d’assistance technique et l’informer de ce sérieux problème de sécurité.",
+       "proxyblocker": "Bloqueur de serveurs mandataires",
+       "proxyblockreason": "Votre adresse IP a été bloquée car c'est celle d’un serveur mandataire ouvert.\nVeuillez contacter votre fournisseur d’accès à Internet ou votre service d’assistance technique et l’informer de ce sérieux problème de sécurité.",
        "sorbsreason": "Votre adresse IP est listée comme mandataire ouvert dans le DNSBL utilisé par {{SITENAME}}.",
        "sorbs_create_account_reason": "Votre adresse IP est listée comme mandataire ouvert dans le DNSBL utilisé par {{SITENAME}}.\nVous ne pouvez pas créer un compte.",
        "softblockrangesreason": "Les contributions anonymes ne sont pas autorisées à partir de votre adresse IP ($1). Veuillez vous connecter.",
index a691f6d..fce4071 100644 (file)
        "tog-hideminor": "Feroarings fan lytse betsjutting ferbergje yn Koartlyn feroare",
        "tog-hidepatrolled": "Markearre feroarings ferskûlje yn resinte feroarings",
        "tog-newpageshidepatrolled": "Markearre siden ferskûlje yn 'e list mei nije siden",
-       "tog-extendwatchlist": "Wreidzje folchlist út om alle wizigings sjen te litten, net allinnich de lêste wizigings",
-       "tog-usenewrc": "Utwreide ferzje fan 'Koartlyn feroare' brûke (JavaScript fereaske)",
+       "tog-hidecategorization": "Kategorisearjen fan siden ferbergje yn Koartlyn feroare",
+       "tog-extendwatchlist": "Folchlist útwreidzje om alle wizigings sjen te litten, net allinnich de lêste",
+       "tog-usenewrc": "Feroarings op side groepearje yn Koartlyn feroare en de folchlist",
        "tog-numberheadings": "Koppen fansels nûmerje",
        "tog-editondblclick": "Dûbelklik jout bewurkingsside (freget JavaScript)",
        "tog-editsectiononrightclick": "Rjochtsklik op sekjsetitels jout seksjebewurking (freget JavaScript)",
-       "tog-watchcreations": "Set siden dy't jo begjinne yn jo folchlist",
-       "tog-watchdefault": "Sides dy't jo feroare hawwe folgje",
-       "tog-watchmoves": "Siden dy't jo werneamd hawwe folgje",
+       "tog-watchcreations": "Siden dy't ik oanmeitsje en bestannen dy't ik oplaad, taheakje oan myn folchlist",
+       "tog-watchdefault": "Siden en bestannen dy't ik bewurkje, taheakje oan myn folchlist",
+       "tog-watchmoves": "Siden en bestannen dy't ik omneam, taheakje oan myn folchlist",
        "tog-watchdeletion": "Siden dy't jo wiske hawwe folgje",
+       "tog-watchuploads": "Nije bestannen dy't ik oplaad, taheakje oan myn folchlist",
        "tog-watchrollback": "Siden dêr't ik wizigings weromdraaid haw oan myn folchlist taheakje",
        "tog-minordefault": "Markearje alle feroarings standert as fan lytse betsjutting",
        "tog-previewontop": "By it neisjen, bewurkingsfjild ûnderoan sette",
        "tog-fancysig": "Sinjatuer as wikitekst behannelje (sûnder in automatyske keppeling)",
        "tog-uselivepreview": "\"Live proefbyld\" brûke",
        "tog-forceeditsummary": "Warskôgje at ik de gearfetting leech lit.",
-       "tog-watchlisthideown": "Eigen bewurkings op myn folchlist ferbergje",
-       "tog-watchlisthidebots": "Lit gjin bot wizigings sjen yn de folchlist",
-       "tog-watchlisthideminor": "Feroarings fan lytse betsjutting ferbergje yn de folchlist",
-       "tog-watchlisthideliu": "Bewurkings fan oanmelde meidoggers op myn folchlist ferbergje",
-       "tog-watchlisthideanons": "Bewurkings fa anonyme meidoggers op myn folchlist ferbergje",
+       "tog-watchlisthideown": "Myn bewurkings ferbergje yn 'e folchlist",
+       "tog-watchlisthidebots": "Botbewurkings ferbergje yn 'e folchlist",
+       "tog-watchlisthideminor": "Feroarings fan lytse betsjutting ferbergje yn 'e folchlist",
+       "tog-watchlisthideliu": "Bewurkings fan oanmelde meidoggers ferbergje yn 'e folchlist",
+       "tog-watchlistunwatchlinks": "Direkte folch-/ûntfolchmarkearders taheakje ({{int:Watchlist-unwatch-undo}}/{{int:Watchlist-unwatch}}) oan folchlistsiden mei wizigings (JavaScript fereaske foar omskeakelmooglikheid)",
+       "tog-watchlisthideanons": "Bewurkings fan anonime meidoggers ferbergje yn 'e folchlist",
        "tog-watchlisthidepatrolled": "Markearre feroarings op myn folchlist ferskûlje",
+       "tog-watchlisthidecategorization": "Kategorisearjen fan siden ferbergje yn 'e folchlist",
        "tog-ccmeonemails": "Stjoer my in kopy fan e-mails dy't ik nei oare meidoggers stjoer",
        "tog-diffonly": "Side-ynhâld dy't feroare wurdt net sjen litte",
        "tog-showhiddencats": "Ferburgen kategoryen werjaan",
        "variants": "Farianten",
        "navigation-heading": "Navigaasjemenu",
        "errorpagetitle": "Flater",
-       "returnto": "Werom nei \"$1\".",
+       "returnto": "Werom nei $1.",
        "tagline": "Ut {{SITENAME}}",
        "help": "Help",
        "search": "Sykje",
        "changeemail-none": "(gjin)",
        "changeemail-password": "Jo wachtwurd foar {{SITENAME}}:",
        "changeemail-submit": "E-mailadres wizigje",
-       "resettokens": "Kaaien ferfarskje",
+       "resettokens": "Kaaien fernije",
+       "resettokens-text": "Jo kinne de kaaien fernije dy't tagong jouwe ta beskate priveedata hearrend by jo akkount hjirre.\n\nJo moatte dat dwaan at jo dy by ûngelok mei immen dield hawwe, of at jo jo akkount net mear fertrouwe.",
+       "resettokens-no-tokens": "Der binne gjin kaaien om te fernijen.",
        "resettokens-tokens": "Kaaien:",
-       "resettokens-token-label": "$1 (hjoeddeistige wearde: $2)",
-       "resettokens-resetbutton": "Selektearre kaaien ferfarskje",
+       "resettokens-token-label": "$1 (hjoeddeiske wearde: $2)",
+       "resettokens-watchlist-token": "Kaai foar de webfied (Atom/RSS) fan [[Special:Watchlist|wizigings oan jo folchlistsiden]]",
+       "resettokens-done": "Kaaien fernijd.",
+       "resettokens-resetbutton": "Selektearre kaaien fernije",
        "bold_sample": "Fette tekst",
        "bold_tip": "Fette tekst",
        "italic_sample": "Skeane tekst",
        "prefs-personal": "Meidogger",
        "prefs-rc": "Koartlyn feroare",
        "prefs-watchlist": "Folchlist",
-       "prefs-editwatchlist": "Folchlist bewurkje",
+       "prefs-editwatchlist": "Folchlist bewurkjen",
+       "prefs-editwatchlist-label": "Yngongen op jo folchlist bewurkje:",
+       "prefs-editwatchlist-edit": "Titels op jo folchlist besjen en wiskje",
        "prefs-editwatchlist-raw": "Rûge folchlist bewurkje",
-       "prefs-watchlist-days": "Oantal dagen yn folchlist sjen litte:",
-       "prefs-watchlist-days-max": "Maksimaal $1 {{PLURAL:$1|dei|dagen}}",
-       "prefs-watchlist-edits": "Tal wizigings om sjen te litten yn de útwreide folchlist:",
-       "prefs-watchlist-edits-max": "Maksimum oantal: 1000",
+       "prefs-editwatchlist-clear": "Jo folchlist wiskje",
+       "prefs-watchlist-days": "Sichtber tal dagen yn 'e folchlist:",
+       "prefs-watchlist-days-max": "Maksimum $1 {{PLURAL:$1|dei|dagen}}",
+       "prefs-watchlist-edits": "Maksimaal sichtber tal wizigings yn 'e folchlist:",
+       "prefs-watchlist-edits-max": "Maksimumtal: 1000",
        "prefs-watchlist-token": "Folchlistkaai:",
+       "prefs-watchlist-managetokens": "Kaaien beheare",
        "prefs-misc": "Ferskaat",
        "prefs-resetpass": "Wachtwurd feroarje",
+       "prefs-setemail": "E-mailadres ynstelle",
        "prefs-email": "E-mail",
        "prefs-rendering": "Uterlik",
        "saveprefs": "Bewarje",
        "restoreprefs": "Alle standertynstellings weromsette (yn alle parten)",
-       "prefs-editing": "Siden bewurkje",
+       "prefs-editing": "Bewurkjen",
        "searchresultshead": "Sykje",
        "stub-threshold": "Drompel foar markearring <a href=\"#\" class=\"stub\">stobbe</a> (bytes):",
        "stub-threshold-disabled": "Utskeakele",
-       "recentchangesdays": "Dagen om sjen te litten yn Koartlyn feroare:",
-       "recentchangesdays-max": "(maksimaal $1 {{PLURAL:$1|dei|dagen}})",
-       "recentchangescount": "Tal titels op 'Koartlyn feroare'",
+       "recentchangesdays": "Sichtber tal dagen yn Koartlyn feroare:",
+       "recentchangesdays-max": "Maksimum $1 {{PLURAL:$1|dei|dagen}}",
+       "recentchangescount": "Standert sichtber tal bewurkings yn Koartlyn feroare, sideskiednis en lochs:",
+       "prefs-help-recentchangescount": "Maksimumtal: 1000",
+       "prefs-help-watchlist-token2": "Dit is de geheime tagongskoade ta de webfied fan jo folchlist.\nImmen dy't it wit, sil jo folchlist lêze kinne, dus diel it mei gjinien.\nBy need [[Special:ResetTokens|kinne jo it fernije]].",
+       "prefs-help-tokenmanagement": "Jo kinne de geheime koade foar jo akkount, dy't tagong jout ta de Webfied fan jo folchlist, besjen en fernije. Immen dy't de tagongskoade wit, sil jo folchlist lêze kinne, dus diel it mei gjinien.",
        "savedprefs": "Jo foarkarren binne fêstlein.",
        "timezonelegend": "Tiidsône:",
        "localtime": "Pleatslike tiid:",
        "prefs-advancedrendering": "Avansearre opsjes",
        "prefs-advancedsearchoptions": "Avansearre opsjes",
        "prefs-advancedwatchlist": "Avansearre opsjes",
-       "prefs-displayrc": "Werjefteopsjes",
-       "prefs-displaywatchlist": "Werjefteopsjes",
-       "prefs-tokenwatchlist": "Token",
+       "prefs-displayrc": "Werjefte-opsjes",
+       "prefs-displaywatchlist": "Werjefte-opsjes",
+       "prefs-changesrc": "Werjûne feroarings",
+       "prefs-changeswatchlist": "Werjûne feroarings",
+       "prefs-pageswatchlist": "Folchsiden",
+       "prefs-tokenwatchlist": "Kaai",
        "prefs-diffs": "Ferskillen",
        "userrights": "Behear fan meidoggerrjochten",
        "userrights-lookup-user": "Behear fan meidoggerrjochten",
        "recentchanges-legend-heading": "<strong>Leginda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}}<br />(sjoch ek de [[Special:NewPages|list mei nije siden]])",
        "recentchanges-submit": "Werjaan",
+       "rcfilters-tag-remove": "'$1' fuortsmite",
        "rcfilters-legend-heading": "<strong>List fan ôfkoartings:</strong>",
        "rcfilters-other-review-tools": "Oare oersjochmiddels",
        "rcfilters-group-results-by-page": "Resultaten op side groepearje",
        "rcfilters-watchlist-markseen-button": "Alle wizigings as sjoen markearje",
        "rcfilters-watchlist-edit-watchlist-button": "Jo list mei folchsiden bewurkje",
        "rcfilters-watchlist-showupdated": "Wizigings oan siden dy't jo dêrnei noch net besocht hawwe, wurde <strong>fet</strong>, mei opfolle rûntsjes markearre.",
+       "rcfilters-preference-label": "De JavaScript-leaze omjouwing brûke",
+       "rcfilters-preference-help": "Laadt Koartlyn feroare sûnder sykfilters of aksintuearmooglikheid.",
+       "rcfilters-watchlist-preference-label": "De JavaScript-leaze omjouwing brûke",
+       "rcfilters-watchlist-preference-help": "Laadt de Folchlist sûnder sykfilters of aksintuearmooglikheid.",
        "rcfilters-filter-showlinkedfrom-label": "Feroarings werjaan op siden ferwiisd fan",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>Siden ferwiisd fan</strong> de opjûne side",
        "rcfilters-filter-showlinkedto-label": "Feroarings werjaan op siden ferwizend nei",
        "pageinfo-authors": "Auteurs totaal",
        "pageinfo-magic-words": "{{PLURAL:$1|Magysk wurd|Magyske wurden}} ($1)",
        "pageinfo-toolboxlink": "Sidegegevens",
-       "pageinfo-redirectsto-info": "ynformaasje",
+       "pageinfo-redirectsto-info": "ynfo",
        "pageinfo-contentpage-yes": "Ja",
        "pageinfo-protect-cascading-yes": "Ja",
        "pageinfo-category-info": "Kategory-ynformaasje",
        "special-characters-group-thai": "Tai",
        "mw-widgets-dateinput-no-date": "Gjin datum keazen",
        "mw-widgets-dateinput-placeholder-day": "JJJJ-MM-DD",
+       "mw-widgets-usersmultiselect-placeholder": "Mear tafoegje...",
+       "mw-widgets-titlesmultiselect-placeholder": "Mear tafoegje...",
        "date-range-from": "Fan datum:",
        "date-range-to": "Oant datum:"
 }
index 274047f..b61d601 100644 (file)
        "page_first": "primeira",
        "page_last": "derradeira",
        "histlegend": "Selección de diferenzas: Marque as versións que queira comparar e prema no botón ao final.<br />\nLenda: '''({{int:cur}})''' = diferenza coa versión actual, '''({{int:last}})''' = diferenza coa versión precedente, '''{{int:minoreditletter}}''' = edición pequena.",
-       "history-fieldset-title": "Buscar revisións",
+       "history-fieldset-title": "Filtrar revisións",
        "history-show-deleted": "Só con borrados de revisións",
        "histfirst": "as máis antigas",
        "histlast": "as máis novas",
        "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
-       "historyempty": "(baleiro)",
+       "historyempty": "baleiro",
        "history-feed-title": "Historial de revisións",
        "history-feed-description": "Historial de revisións desta páxina no wiki",
        "history-feed-item-nocomment": "$1 o $2",
        "right-reupload-own": "Sobrescribir un ficheiro existente cargado polo mesmo usuario",
        "right-reupload-shared": "Sobrescribir localmente ficheiros do repositorio multimedia",
        "right-upload_by_url": "Cargar ficheiros desde un enderezo URL",
-       "right-purge": "Purgar a caché dunha páxina do wiki sen a páxina de confirmación",
+       "right-purge": "Purgar a caché do sitio para unha páxina",
        "right-autoconfirmed": "Non ser afectado polos límites de frecuencia ligados aos enderezos IP",
        "right-bot": "Ser tratado coma un proceso automatizado",
        "right-nominornewtalk": "As edicións pequenas nas páxinas de conversa non lanzan o aviso de mensaxes novas",
        "action-changetags": "engadir e quitar etiquetas arbitrarias a revisións individuais e entradas do rexistro",
        "action-deletechangetags": "borrar etiquetas da base de datos",
        "action-purge": "purgar esta páxina",
+       "action-apihighlimits": "usar límites máis altos nas peticións á API",
+       "action-autoconfirmed": "non estar afectado polos límites de frecuencia baseados en enderezos IP",
+       "action-bigdelete": "borrar páxinas con historiais extensos",
+       "action-blockemail": "bloquear un usuario fronte ao envío dun correo electrónico",
+       "action-bot": "ser tratado como un proceso automatizado",
+       "action-editprotected": "editar páxinas protexidas con \"{{int:protect-level-sysop}}\"",
+       "action-editsemiprotected": "editar páxinas protexidas con \"{{int:protect-level-autoconfirmed}}\"",
+       "action-editinterface": "editar a interface de usuario",
+       "action-editusercss": "editar ficheiros CSS doutros usuarios",
+       "action-edituserjson": "editar ficheiros JSON doutros usuarios",
+       "action-edituserjs": "editar ficheiros JavaScript doutros usuarios",
+       "action-editsitecss": "editar CSS global do sitio",
+       "action-editsitejson": "editar JSON global do sitio",
+       "action-editsitejs": "editar JavaScript global do sitio",
+       "action-editmyusercss": "editar os ficheiros CSS propios",
+       "action-editmyuserjson": "editar os ficheiros JSON propios",
+       "action-editmyuserjs": "editar os ficheiros JavaScript propios",
+       "action-viewsuppressed": "ver revisións agochadas de calquera usuario",
+       "action-hideuser": "bloquear un nome de usuario, agochándoo do público",
+       "action-ipblock-exempt": "evitar bloqueos de IPs, autobloqueos e bloqueos de rango",
+       "action-unblockself": "desbloquearse a si mesmo",
+       "action-noratelimit": "non estar afectado polos límites de frecuencia",
+       "action-reupload-own": "sobrescribir ficheiros existentes cargados por un mesmo",
        "nchanges": "$1 {{PLURAL:$1|modificación|modificacións}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|desde a última visita}}",
        "enhancedrc-history": "historial",
        "rcfilters-savedqueries-already-saved": "Estes filtros xa están gardados. Cambie a súa configuración para crear un filtro gardado novo.",
        "rcfilters-restore-default-filters": "Restaurar os filtros por defecto",
        "rcfilters-clear-all-filters": "Borrar todos os filtros",
-       "rcfilters-show-new-changes": "Amosar os cambios máis recentes",
+       "rcfilters-show-new-changes": "Amosar novos cambios dende $1",
        "rcfilters-search-placeholder": "Filtrar os cambios (use o menú ou procure o nome dun filtro)",
        "rcfilters-invalid-filter": "Filtro no válido",
        "rcfilters-empty-filter": "Non hai filtros activos. Móstranse tódalas contribucións.",
        "delete-confirm": "Borrar \"$1\"",
        "delete-legend": "Borrar",
        "historywarning": "<strong>Atención:</strong> A páxina que está a piques de borrar ten un historial con $1 {{PLURAL:$1|revisión|revisións}}:",
-       "historyaction-submit": "Amosar",
+       "historyaction-submit": "Amosar revisións",
        "confirmdeletetext": "Está a piques de borrar de xeito permanente unha páxina con todo o seu historial.\nPor favor, confirme que é realmente a súa intención, que comprende as consecuencias e que está obrando de acordo coas [[{{MediaWiki:Policy-url}}|políticas]].",
        "actioncomplete": "Completouse a acción",
        "actionfailed": "Fallou a acción",
        "blocklist-userblocks": "Agochar os bloqueos de contas",
        "blocklist-tempblocks": "Agochar os bloqueos temporais",
        "blocklist-addressblocks": "Agochar os bloqueos a enderezos IP únicos",
+       "blocklist-type": "Tipo:",
+       "blocklist-type-opt-all": "Todos",
+       "blocklist-type-opt-sitewide": "En todo o sitio",
+       "blocklist-type-opt-partial": "Parciais",
        "blocklist-rangeblocks": "Agochar os bloqueos de rango",
        "blocklist-timestamp": "Data e hora",
        "blocklist-target": "Destino",
index 78d65d4..8eee415 100644 (file)
        "logeventslist-patrol-log": "יומן שינויים בדוקים",
        "logeventslist-tag-log": "יומן תגיות",
        "all-logs-page": "כל היומנים הציבוריים",
-       "alllogstext": "זוהי תצוגה משולבת של כל סוגי היומנים הזמינים ב{{grammar:תחילית|{{SITENAME}}}}.\nניתן לצמצם את התצוגה על־ידי בחירת סוג היומן, שם המשתמש (תלוי־רישיות) או הדף המושפע (גם כן תלוי־רישיות).",
+       "alllogstext": "זוהי תצוגה משולבת של כל סוגי היומנים הזמינים ב{{GRAMMAR:תחילית|{{SITENAME}}}}.\nניתן לצמצם את התצוגה על־ידי בחירת סוג היומן, שם המשתמש (תלוי־רישיות) או הדף המושפע (גם כן תלוי־רישיות).",
        "logempty": "אין פריטים תואמים ביומן.",
        "log-title-wildcard": "חיפוש כותרות המתחילות באותיות אלה",
        "showhideselectedlogentries": "שינוי מצב התצוגה של פעולות היומן שנבחרו",
index 4200f17..18485cd 100644 (file)
        "blocklink": "blokkolás",
        "unblocklink": "blokk feloldása",
        "change-blocklink": "blokkolás módosítása",
+       "empty-username": "(felhasználónév nem elérhető)",
        "contribslink": "szerkesztései",
        "emaillink": "e-mail küldése",
        "autoblocker": "Az általad használt IP-cím autoblokkolva van, mivel korábban a kitiltott „[[User:$1|$1]]” használta. ($1 blokkolásának indoklása: „'''$2'''”) Ha nem te vagy $1, lépj kapcsolatba valamelyik adminisztrátorral, és kérd az autoblokk feloldását. Ne felejtsd el megírni neki, hogy kinek szóló blokkba ütköztél bele!",
index bcd76e8..f60988b 100644 (file)
        "december-date": "$1 Դեկտեմբեր",
        "period-am": "Նախ Կէսօր",
        "period-pm": "Կէսօրէն Յետոյ",
-       "pagecategories": "{{PLURAL:$1|Ստորոգութիւն|Ստորոգութիւններ}}",
+       "pagecategories": "{{PLURAL:$1|Կատեգորիա|Կատեգորիաներ}}",
        "category_header": "«$1» ստորոգութեան մէջ էջեր",
-       "subcategories": "ÔµÕ¶Õ©Õ¡Õ½Õ¿Õ¸Ö\80Õ¸Õ£Õ¸Ö\82Õ©Õ«Ö\82Õ¶ներ",
+       "subcategories": "ÔµÕ¶Õ©Õ¡Õ¯Õ¡Õ¿Õ¥Õ£Õ¸Ö\80Õ«Õ¡ներ",
        "category-media-header": "\"$1\" ստորոգութեան հաղորդամիջոց",
        "category-empty": "<em>Այս ստորոգութիւնը ներկայիս դատարկ է։<em>",
-       "hidden-categories": "{{PLURAL:$1|Թաքուն ստորոգութիւն|Թաքուն ստորոգութիւններ}}",
-       "hidden-category-category": "Ô¹Õ¡Ö\84Ö\81Õ¸Ö\82Õ¡Õ® Õ½Õ¿Õ¸Ö\80Õ¸Õ£Õ¸Ö\82Õ©Õ«Ö\82Õ¶ներ",
+       "hidden-categories": "{{PLURAL:$1|Թաքցուած կատեգորիա|Թաքցուած կատեգորիաներ}}",
+       "hidden-category-category": "Ô¹Õ¡Ö\84Ö\81Õ¸Ö\82Õ¡Õ® Õ¯Õ¡Õ¿Õ¥Õ£Õ¸Ö\80Õ«Õ¡ներ",
        "category-subcat-count": "{{PLURAL:$2|Այս ստորոգութիւնը ունի միայն հետեւեալ ենթաստորոգութիւնը։|Այս ստորոգութիւնը ունի հետեւեալ {{PLURAL:$1|ենթաստորոգութիւն|ենթաստորոգութիւններ}}ը՝ ընդհանուր $2էն։}}",
        "category-subcat-count-limited": "Այս ստորոգութիւնը ունի հետեւեալ {{PLURAL:$1|ենթաստորոգութիւն|$1 ենթաստորոգութիւններ}}։",
        "category-article-count": "{{PLURAL:$2|Այս ստորոգութիւնը կը պարունակէ միայն հետեւեալ էջը։|Ստորեւ այս ստորոգութեան ընդհանուր $2էն {{PLURAL:$1|էջը|$1 էջերը}}։}}",
        "badaccess-group0": "Արտունութիւն չունիք այս գործողութիւնը կատարել:",
        "badaccess-groups": "Տուեալ գործողութիւնը միայն $1 {{PLURAL:$2|խումբի|խումբերի}} մասնակիցները կ՛րնան կատարել։",
        "ok": "Լաւ",
-       "pagetitle": "",
+       "pagetitle": "$1 - {{SITENAME}}",
        "retrievedfrom": "Վերցուած է «$1» էջէն",
        "youhavenewmessages": "{{PLURAL:$3|Դուք ունիք}} $1 ($2)։",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|Դուք ունիք}} $1 {{PLURAL:$3|այլ մասնակից|$3 մասնակիցէն}} ($2):",
        "passwordreset": "Վերականգնել անցաբառը",
        "passwordreset-username": "Մասնակիցի անուն՝",
        "passwordreset-domain": "Համակարգիչի պետութիւն.",
-       "passwordreset-email": "Ô·Õ¬-Õ¶Õ¡Õ´Õ¡Õ¯Õ¡Õ« Õ°Õ¡Õ½Ö\81Õ§Õ¶.",
+       "passwordreset-email": "ÔµÕ¬Õ¥Õ¯Õ¿Ö\80Õ¸Õ¶Õ¡ÕµÕ«Õ¶ Õ°Õ¡Õ½Ö\81Õ§â\80¤",
        "passwordreset-emailtitle": "{{SITENAME}} հաշիւի մանրամասները",
        "passwordreset-invalidemail": "Անվաւեր ելեկտրոնային հասցէ",
        "changeemail": "Փոխել կամ հանել ելեկտրոնային հասցէն",
        "showdiff": "Ցուցնել փոփոխութիւնները",
        "anoneditwarning": "<strong>Զգուշացում։</strong> Մուտք գործած չէք համակարգ։ Որեւէ խմբագրումի պարագային ձեր IP հասցէն տեսանելի կը դառնայ բոլորին։ Եթէ <strong>[$1 մուտք գործէք]</strong> կամ <strong>[$2 ստեղծէք մասնակիցի հաշիւ]</strong>, ձեր կատարած խմբագրումները կը կապուին ձեր մասնակիցի անունին հետ, ինչպէս նաեւ կ՚ունենաք այլ առաւելութիւններ։",
        "blockedtitle": "Մասնակիցը արգելափակուած է",
-       "blockedtext": "<strong>Ձեր մասնակցային անոիւնը կամ IP հասցէն արգելակուած է։</strong>\n\nԱրգելակումը կատարուած է $1ի կողմէ.\nՊարտճառը՝ <em>$2</em>.\n\n* Արգելակման սկիբժ՝ $8\n* Արգելակման աւարտ՝ $6\n* արգելակուած առարկայ՝ $7\n\nԿրնաք կապուիլ $1ի կամ այլ անդատներու հետ [[{{MediaWiki:Grouppage-sysop}}|վարիչ]] արգելակման մասին զրուցելու համար.\nՉէք կրնար օգտագործել \"{{int:emailuser}}\" հնարաւորութիւնը բացի եթէ նշած էք իմակի վաւերական հասցէ մը ձեր [[Special:Preferences|account preferences]] եւ արգելակուած չէ վեր անոր օգտագործումը.\nՁեր ընթացիկ IP հասցէն է $3, եւ արգելակման ինքնութեան համարն է #$5.\nԿը շնդրենք որ այս մանրամասնութիւնները նշէք ձեր բոլոր թղթակցութիւններուն մէջ։",
+       "blockedtext": "<strong>Ձեր մասնակցային անունը կամ IP հասցէն արգելակուած է։</strong>\n\nԱրգելակումը կատարուած է $1ի կողմէ.\nՊարտճառը՝ <em>$2</em>.\n\n* Արգելակման սկիբժ՝ $8\n* Արգելակման աւարտ՝ $6\n* արգելակուած առարկայ՝ $7\n\nԿրնաք կապուիլ $1ի կամ այլ անդատներու հետ [[{{MediaWiki:Grouppage-sysop}}|վարիչ]] արգելակման մասին զրուցելու համար.\nՉէք կրնար օգտագործել \"{{int:emailuser}}\" հնարաւորութիւնը բացի եթէ նշած էք իմակի վաւերական հասցէ մը ձեր [[Special:Preferences|account preferences]] եւ արգելակուած չէ վեր անոր օգտագործումը.\nՁեր ընթացիկ IP հասցէն է $3, եւ արգելակման ինքնութեան համարն է #$5.\nԿը շնդրենք որ այս մանրամասնութիւնները նշէք ձեր բոլոր թղթակցութիւններուն մէջ։",
        "loginreqtitle": "Կը խնդրուի մուտք գործել համակարգ",
        "loginreqlink": "Մուտք գործել",
        "newarticle": "(Նոր)",
        "timezoneregion-indian": "Հնդկական Ովկիանոս",
        "timezoneregion-pacific": "Խաղաղ Ովկիանոս",
        "prefs-searchoptions": "Որոնել",
-       "youremail": "Էլեկտրական Նամակ",
+       "prefs-namespaces": "Անուանատարածքներ",
+       "default": "լռելեան",
+       "youremail": "Ելեկտրոնային նամակ․",
        "yourlanguage": "Լեզու.",
        "email": "Ելեկտրոնային նամակ",
        "prefs-info": "Հիմնական տուեալներ",
        "activeusers": "Աշխոյժ մասնակիցներու ցանկ",
        "activeusers-submit": "Ցոյց տալ աշխոյժ մասնակիցները",
        "listgrouprights-members": "(անդամներու ցանկ)",
-       "emailuser": "էլ-նամակ ուղարկել այս մասնակիցին",
+       "emailuser": "Ե-նամակ ուղարկել այս մասնակիցին",
        "usermessage-editor": "Համակարգային սուրհանդակի անուն",
        "watchlist": "Հսկողութեան ցանկ",
        "mywatchlist": "Հսկողութեան ցանկ",
        "logentry-delete-delete": "$1 {{GENDER:$2|ջնջեց}} $3 էջը",
        "logentry-delete-restore": "$1 {{GENDER:$2|վերականգնեց}} $3 ($4) էջը",
        "logentry-delete-revision": "$1 {{GENDER:$2|փոխեց}} {{PLURAL:$5|1 խմբագրման|$5 խմբագրումներու}} տեսանելիութիւնը $3 էջին վրայ՝ $4",
-       "revdelete-content-hid": "բովանդակութիւնը թաքնուած",
+       "revdelete-content-hid": "Թաքուն բովանդակութիւն",
        "logentry-move-move": "$1 տեղափոխեց էջը «$3»-էն «$4»",
        "logentry-move-move-noredirect": "$1ը {{GENDER:$2|տեղափոխեց}} էջ $3էն էջ $4 առանց վերայղում ձգելու",
        "logentry-move-move_redir": "$1 {{GENDER:$2|տեղափոխեց}} էջ $3ը վերայղելով դէպի էջ $4",
index 9e36b9f..a2f2d0d 100644 (file)
        "right-deletedtext": "Vider texto delite e differentias inter versiones delite",
        "right-browsearchive": "Cercar paginas delite",
        "right-undelete": "Restaurar un pagina",
-       "right-suppressrevision": "Vider, celar e revelar versiones specific de paginas de qualcunque usator",
-       "right-viewsuppressed": "Vider versiones celate de qualcunque usator",
+       "right-suppressrevision": "Vider, celar e revelar versiones specific de paginas pro qualcunque usator",
+       "right-viewsuppressed": "Vider versiones celate pro tote le usatores",
        "right-suppressionlog": "Vider registros private",
        "right-block": "Blocar altere usatores de facer modificationes",
        "right-blockemail": "Blocar un usator de inviar e-mail",
        "action-changetags": "adder e remover qualcunque etiquettas sur individual versiones e entratas de registro",
        "action-deletechangetags": "deler etiquettas del base de datos",
        "action-purge": "purgar iste pagina",
+       "action-apihighlimits": "usar limites plus alte in consultas via API",
+       "action-autoconfirmed": "non esser subjecte al limites de frequentia a base de adresse IP",
+       "action-bigdelete": "deler paginas con historias longe",
+       "action-blockemail": "blocar un usator de inviar e-mail",
+       "action-bot": "esser tractate como processo automatic",
+       "action-editprotected": "modificar paginas protegite con \"{{int:protect-level-sysop}}\"",
+       "action-editsemiprotected": "modificar paginas protegite como \"{{int:protect-level-autoconfirmed}}\"",
+       "action-editinterface": "modificar le interfacie de usator",
+       "action-editusercss": "modificar le files CSS de altere usatores",
+       "action-edituserjson": "modificar le files JSON de altere usatores",
+       "action-edituserjs": "modificar le files JavaScript de altere usatores",
+       "action-editsitecss": "modificar le CSS global del sito",
+       "action-editsitejson": "modificar le JSON global del sito",
+       "action-editsitejs": "modificar le JavaScript global del sito",
+       "action-editmyusercss": "modificar le files CSS del proprie usator",
+       "action-editmyuserjson": "modificar le files JSON del proprie usator",
+       "action-editmyuserjs": "modificar le files JavaScript del proprie usator",
+       "action-viewsuppressed": "vider versiones celate pro tote le usatores",
+       "action-hideuser": "blocar un nomine de usator, celante lo del publico",
+       "action-ipblock-exempt": "contornar le blocadas de adresses IP, blocadas automatic e blocadas de intervallos IP",
+       "action-unblockself": "disblocar te mesme",
+       "action-noratelimit": "non esser subjecte al limites de frequentia de actiones",
+       "action-reupload-own": "superscriber un file anteriormente incargate per te mesme",
+       "action-nominornewtalk": "non reciper notification de nove messages quando tu face modificationes minor in le pagina de discussion",
+       "action-markbotedits": "marcar modificationes de reversion como facite per un bot",
+       "action-patrolmarks": "vider marcas de patrulia in le modificationes recente",
+       "action-override-export-depth": "exportar paginas includente paginas ligate usque a un profunditate de 5",
+       "action-suppressredirect": "non rediriger le ancian nomine verso le nove quando se renomina un pagina",
        "nchanges": "$1 {{PLURAL:$1|modification|modificationes}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|desde le ultime visita}}",
        "enhancedrc-history": "historia",
        "blocklist-userblocks": "Celar blocadas de conto",
        "blocklist-tempblocks": "Celar blocadas temporari",
        "blocklist-addressblocks": "Celar blocadas de singule adresse IP",
+       "blocklist-type": "Typo:",
+       "blocklist-type-opt-all": "Totes",
+       "blocklist-type-opt-sitewide": "Tote le sito",
+       "blocklist-type-opt-partial": "Partial",
        "blocklist-rangeblocks": "Celar blocadas de gruppos de adresses IP",
        "blocklist-timestamp": "Data e hora",
        "blocklist-target": "Objectivo",
        "blocklink": "blocar",
        "unblocklink": "disblocar",
        "change-blocklink": "cambiar blocada",
+       "empty-username": "(nulle nomine de usator disponibile)",
        "contribslink": "contributiones",
        "emaillink": "inviar e-mail",
        "autoblocker": "Automaticamente blocate perque tu adresse IP ha recentemente essite usate per \"[[User:$1|$1]]\".\nLe motivo specificate pro blocar $1 es \"''$2''\"",
        "passwordpolicies-policyflag-forcechange": "debe cambiar al apertura de session",
        "passwordpolicies-policyflag-suggestchangeonlogin": "suggerer cambio al apertura de session",
        "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."
+       "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": "Si tu vole clauder le session, [$1 continua al pagina pro clauder session].",
+       "userlogout-sessionerror": "Le clausura del session ha fallite a causa de un error de session. Per favor [$1 reproba]."
 }
index 301ba80..77a3e08 100644 (file)
@@ -81,7 +81,7 @@
        "march": "Мутт-хьал",
        "april": "Тушол",
        "may_long": "села",
-       "june": "Этинга ''(июнь)''",
+       "june": "Этинга",
        "july": "Баьцамеа",
        "august": "Мяцхали",
        "september": "Михий",
@@ -93,7 +93,7 @@
        "march-gen": "Мутт-хьал",
        "april-gen": "Тушол",
        "may-gen": "Села",
-       "june-gen": "Этинга ''(июнь)'' бетта",
+       "june-gen": "Этинга",
        "july-gen": "Баьцамеа",
        "august-gen": "Мяцхали",
        "september-gen": "Михий",
        "mar": "мутт-хьал",
        "apr": "Tушоли",
        "may": "села",
-       "jun": "Этинга ''(июн)''",
+       "jun": "этинга",
        "jul": "Баьцамеа",
        "aug": "Мяцхали",
        "sep": "Михий",
        "march-date": "Мутт-хьал $1",
        "april-date": "Тушол $1",
        "may-date": "Села $1",
-       "june-date": "Этинга ''(июнь)'' $1",
+       "june-date": "Этинга $1",
        "july-date": "Баьцамеа $1",
        "august-date": "Мяцхали $1",
        "september-date": "Михий $1",
        "watchthis": "Зем бе укх оагӀонна",
        "savearticle": "ОагӀув дIаязъе",
        "savechanges": "ДIаязъе оагӀув",
+       "publishpage": "Хьакхолла оагIув",
        "publishchanges": "ДIаязъе оагӀув",
        "publishchanges-start": "ДIаязъе оагӀув…",
        "preview": "Хьалххе бIаргтохар",
index c2471ef..b4909da 100644 (file)
        "mailnologintext": "Vu mustas [[Special:UserLogin|enirir]] e havar valida e-adreso en vua [[Special:Preferences|preferaji]] por sendar e-posto ad altra uzanti.",
        "emailuser": "Sendar e-posto a ca uzero",
        "emailuser-title-notarget": "Sendar e-posto al uzero",
+       "emailpagetext": "Vu povas uzar la sequanta pagino por sendar e-posto al {{GENDER:$1|uzero}}.\nL'adreso di e-posto quon vu mencionis en [[Special:Preferences|vua preferaji]] aparos en la \"De\" adreso de la mesajo, do la recevero de vua mesajo povos respondar direte a vu.",
        "defemailsubject": "{{SITENAME}} e-mesaji de uzero \"$1\"",
        "usermaildisabledtext": "Vu ne povas sendar e-posto ad altra uzeri en ca Wiki",
        "noemailtitle": "Ne esas e-adreso",
        "confirm": "Konfirmez",
        "excontent": "La kontenajo esis: \"$1\"",
        "excontentauthor": "la kontenajo esis: \"$1\", e l'unika redaktero esis \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|talk]])",
-       "exbeforeblank": "La kontenajo ante efaco esis: '$1'",
+       "exbeforeblank": "La kontenajo ante l'efaco esis: '$1'",
        "delete-confirm": "Efacar \"$1\"",
        "delete-legend": "Efacar",
        "historywarning": "<strong>Averto:</strong> La pagino quan vu efaceskas havas historio kun $1 {{PLURAL:$1|revizo|revizi}}:",
index 91d3f59..cb76c7b 100644 (file)
        "rcfilters-savedqueries-already-saved": "Dës Filtere si scho gespäichert. Ännert Är Astellunge fir en neie Gespäicherte Filter unzeleeën.",
        "rcfilters-restore-default-filters": "Standardfiltere restauréieren",
        "rcfilters-clear-all-filters": "All Filteren eidelmaachen",
-       "rcfilters-show-new-changes": "Nei Ännerunge zanter $1 weisen",
+       "rcfilters-show-new-changes": "Nei Ännerungen zanter $1 weisen",
        "rcfilters-search-placeholder": "Ännerunge filteren (benotzt de Menü oder sicht nom Numm vum Filter)",
        "rcfilters-invalid-filter": "Net valabele Filter",
        "rcfilters-empty-filter": "Keen aktive Filter. All Kontributioune gi gewisen.",
index daedbed..83c5c40 100644 (file)
        "copyrightpage": "{{ns:project}}:کوپی رایت",
        "currentevents": "روخ ڤٱنؽا ایسنی",
        "currentevents-url": "Project:روخ ڤٱنؽا ایسنی",
-       "disclaimers": "تیٱپۊشکاریٛا",
+       "disclaimers": "تیٱپۊشکاریا",
        "disclaimerpage": "پروژٱ: تیٱپۊشی کردن همٱگیر",
        "edithelp": "هومياری سی ڤیرایش",
        "helppage-top-gethelp": "هومياری",
        "newmessageslinkplural": "{{PLURAL:$1|یاٛ پاٛغوم تازٱ|999=پاٛغومؽا تازٱ}}",
        "newmessagesdifflinkplural": "آخر {{PLURAL:$1|آلشت|آلشتؽا}}",
        "youhavenewmessagesmulti": "شما یاٛ پاٛغوم تازٱ د $1 دارؽت",
-       "editsection": "Ø¢Ù\84شدکاری",
+       "editsection": "Ø¢Ù\84شتکاری",
        "editold": "ڤیرایش",
        "viewsourceold": "ساٛلٛ سرچشمٱ بٱکؽت",
        "editlink": "ڤیرایش",
        "cannotdelete-title": "نمۊئٱ بٱلگٱ $1 پاکسا با",
        "delete-hook-aborted": "پاکسا کاری ڤا قولاڤ نوئاگیری بیٱ.\nهیچ تۉزیهی سیش نؽ.",
        "no-null-revision": "سی بٱلگٱ $1 ڤانیٱری خونسا ناْ دۏرس بٱکؽت",
-       "badtitle": "داسوݩ گٱن",
-       "badtitletext": "داسوݩ بٱلگٱ هاستنی نادؽارٱ، یٱ یاٛ داسوݩ مؽنجا زڤونی یا مؽنجا ڤیکی اْشتبائٱ.\nگاسؽ یٱ د ڤٱر گرتٱ یاٛ کاراکتر یا چٱن تا کاراکتر با کاْ نمۊئٱ د داسونؽا ڤ کارشو گرت.",
-       "title-invalid-empty": "داسوݩ بٱلگٱ هاستنی هالٛیٱ یا فقٱت مؽنونٱ دار یاٛ نوم یا نوم جا ئٱ.",
-       "title-invalid-utf8": "داسÙ\88Ù\99Ù\86 Ø¨Ø£Ù\84Ú¯Û\95 Ù\87استئÙ\86Û\8c Ù\85Û\8cÙ\86Ù\88Ù\99Ù\86Û\95 Ø¯Ø§Ø± Û\8cئ Ú¯Ø¦Ù\84 Ù\86ئÙ\85اجا UTF-8 Ù\86ادÛ\8cارÛ\95.",
-       "title-invalid-interwiki": "داسÙ\88Ù\99Ù\86 Ø¨Ø£Ù\84Ú¯Û\95 Ù\87استئÙ\86Û\8c Ù\85Û\8cÙ\86Ù\88Ù\99Ù\86Û\95 Ø¯Ø§Ø± Û\8cئ Ú¯Ø¦Ù\84 Ù\87Ù\88Ù\85 Ù¾Ø¦Û\8cڤأÙ\86دÛ\95 Ú©Ø¦ Ù\86أبÙ\88Ù\99Û\95 Ø¯ Ø¯Ø§Ø³Ù\88Ù\99Ù\86Û\8cا Ú¤Ø¦ Ú©Ø§Ø± Ú¯Ø¦Ø±Ø¦ØªÛ\95 Ø¨Ù\88Ù\99Û\95.",
-       "title-invalid-talk-namespace": "داسÙ\88Ù\99Ù\86 Ø¨Ø£Ù\84Ú¯Û\95 Ù\87استئÙ\86Û\8c Ú¤Ø¦ Û\8cئ Ú¯Ø¦Ù\84 Ø¨Ø£Ù\84Ú¯Û\95 Ú\86Ø£Ú© Ú\86ئÙ\86Û\95 Ú©Ø¦ Ù\86Û\8cÛ\8cئش Ø¦Ø´Ø§Ø±Û\95 Ù\85Û\8cÚ©Û\95.",
-       "title-invalid-characters": "داسÙ\88Ù\99Ù\86 Ø¨Ø£Ù\84Ú¯Û\95 Ù\87استئÙ\86Û\8c Ù\85Û\8cÙ\86Ù\88Ù\99Ù\86Û\95 Ø¯Ø§Ø± Û\8cئ Ú¯Ø¦Ù\84 Ú©Ø§Ø±Ø§Ú©ØªØ±Ù\87:$1 Ù\86ادÛ\8cارÛ\95.",
-       "title-invalid-relative": "داسÙ\88Ù\99Ù\86 Û\8cئ Ú¯Ø¦Ù\84 Ù\84ا Ù\87Ù\88Ù\85 Ø¯Ø£Ù\86Ú¯ Ø¯Ø§Ø±Û\95.داسÙ\88Ù\99Ù\86 Ø¨Ø£Ù\84Ú¯Û\95 Ù\87Ù\88Ù\85 Ø¯Ø£Ù\86Ú¯(./, ../) Ù\86ادÛ\8cارÛ\95Ø\8c Ø³Û\8c Û\8cÛ\95 Ú©Ø¦ Ú¤Ø¦Ù\86Ù\88Ù\99 Ø£Ú©Ø«Ø£Ø±Ø£Ù\86 Ø¯ Ú¯Ø§ØªÛ\8c Ú©Ø¦ Ø¯Ù\88ڤارتÛ\95 Ù\86Û\8cأر Ú¤Ø¦ Ø¯Ø£Ø³ Ú©Ø§Ø±Û\8cار Ø¯Ø£Ø³Û\8c Ø³Ø§Ø²Û\8c Ø¨Ù\88Ù\99Û\95 Ø¯Û\8cارÛ\8c Ù\86ئÙ\85Û\8cÚ©Ø£ن.",
-       "title-invalid-magic-tilde": "داسÙ\88Ù\99Ù\86 Ø¨Ø£Ù\84Ú¯Û\95 Ø­Ø§Ø³ØªØ¦Ù\86Û\8c Ù\85Û\8cÙ\86Ù\88Ù\99Ù\86Û\95 Ø¯Ø§Ø± Û\8cئ Ú¯Ø¦Ù\84 Ù\86ئÙ\85اجا Ø¬Ø§Ø¯Ù\88Ù\99Û\8cÛ\8c Ù\86ادÛ\8cارÛ\95(<nowiki>~~~</nowiki>).",
+       "badtitle": "داسون گٱن",
+       "badtitletext": "داسون بٱلگٱ هاستنی نادؽارٱ، یٱ یاٛ داسوݩ مؽنجا زڤونی یا مؽنجا ڤیکی اْشتبائٱ.\nگاسؽ یٱ د ڤٱر گرتٱ یاٛ کاراکتر یا چٱن تا کاراکتر با کاْ نمۊئٱ د داسونؽا ڤ کارشو گرت.",
+       "title-invalid-empty": "داسون بٱلگٱ هاستنی هالٛیٱ یا فقٱت مؽنونٱ دار یاٛ نوم یا نوم جا ئٱ.",
+       "title-invalid-utf8": "داسÙ\88Ù\86 Ø¨Ù±Ù\84Ú¯Ù± Ù\87استÙ\86Û\8c Ù\85ؽÙ\86Ù\88Ù\86Ù± Ø¯Ø§Ø± Û\8cاÙ\9b Ù\86Ù\85اجا UTF-8 Ù\86ادؽارٱ.",
+       "title-invalid-interwiki": "داسÙ\88Ù\86 Ø¨Ù±Ù\84Ú¯Ù± Ù\87استÙ\86Û\8c Ù\85ؽÙ\86Ù\88Ù\86Ù± Ø¯Ø§Ø± Û\8cاÙ\9b Ù\87Ù\88Ù\85 Ù¾Ø§Ù\9bÚ¤Ù±Ù\86 Ø¦Ù± Ú©Ø§Ù\92 Ù\86Ù\85Û\8aئٱ Ø¯ Ø¯Ø§Ø³Ù\88Ù\86ؽا Ú¤ Ú©Ø§Ø± Ú¯Ø±ØªÙ± Ø¨Û\8aئٱ.",
+       "title-invalid-talk-namespace": "داسÙ\88Ù\86 Ø¨Ù±Ù\84Ú¯Ù± Ù\87استÙ\86Û\8c Ú¤ Û\8cاÙ\9b Ø¨Ù±Ù\84Ú¯Ù± Ú\86Ù±Ú© Ú\86Ù\86Ù± Ú©Ø§Ù\92 Ù\86ؽسش Ø§Ù\92شارٱ Ù\85ؽکٱ.",
+       "title-invalid-characters": "داسÙ\88Ù\86 Ø¨Ù±Ù\84Ú¯Ù± Ù\87استÙ\86Û\8c Ù\85ؽÙ\86Ù\88Ù\86Ù± Ø¯Ø§Ø± Û\8cاÙ\9b Ú©Ø§Ø±Ø§Ú©ØªØ±Ù±:$1 Ù\86ادؽارٱ.",
+       "title-invalid-relative": "داسÙ\88Ù\86 Û\8cاÙ\9b Ù\84Ù\9bا Ù\87Ù\88Ù\85 Ø¯Ù±Ù\86Ú³ Ø¯Ø§Ø±Ù±.داسÙ\88Ù\86 Ø¨Ù±Ù\84Ú¯Ù± Ù\87Ù\88Ù\85 Ø¯Ù±Ù\86Ú³(./, ../) Ù\86ادؽارٱØ\8c Ø³Û\8c Û\8cÙ± Ú©Ø§Ù\92 Ú¤Ù\86Ù\88 Ø¨Ø½Ø´ØªØ±Ø´Ù\88 Ø¯ Ú¯Ø§ØªØ½ Ú©Ø§Ù\92 Ø¯Ù\88ئارتٱ Ù\86Û\8cٱر Ú¤ Ø¯Ù±Ø³ Ú©Ø§Ø±Û\8cار Ø¯Ù±Ø³Û\8c Ø³Ø§Ø²Û\8c Ø¨Û\8aئٱ Ø¯Ø½Ø§Ø±Û\8c Ù\86Ù\85ؽکٱن.",
+       "title-invalid-magic-tilde": "داسÙ\88Ù\86 Ø¨Ù±Ù\84Ú¯Ù± Ù\87استÙ\86Û\8c Ù\85Û\8cÙ\86Ù\88Ù\86Ù± Ø¯Ø§Ø± Û\8cاÙ\9b Ù\86Ù\85اجا Ø¬Ø§Ø¯Û\8aÛ\8cÛ\8c Ù\86ادؽارٱ(<nowiki>~~~</nowiki>).",
        "title-invalid-too-long": "داسوٙن بألگە حاستئنی فئرە گأپە. د حال و بار رازینە کاری UTF-8 أنازە ڤئ نأباس د $1 بایت گأپتأر بوٙە.",
-       "title-invalid-leading-colon": "داسÙ\88Ù\99Ù\86 Ø¨Ø£Ù\84Ú¯Û\95 Ø­Ø§Ø³ØªØ¦Ù\86Û\8c Ù\85Û\8cÙ\86Ù\88Ù\99Ù\86Û\95 Ø¯Ø§Ø± Û\8cئ Ú¯Ø¦Ù\84 Ú©Ù\88Ù\84Ù\88Ù\99Ù\86 Ù\86ادÛ\8cار Ø¯ Ø£Ú¤Ø£Ù\84 Ú©Ø§Ø±Ø¦Ø´Û\95.",
+       "title-invalid-leading-colon": "داسÙ\88Ù\86 Ø¨Ù±Ù\84Ú¯Ù± Ù\87استÙ\86Û\8c Ù\85ؽÙ\86Ù\88Ù\86Ù± Ø¯Ø§Ø± Û\8cاÙ\9b Ú©Ù\88Ù\84Ù\88Ù\86 Ù\86ادؽار Ø¯ Ù±Ú¤Ù±Ù\84 Ú©Ø§Ø±Ø´Ù±.",
        "perfcached": "رئسینە یا نئهایی د ڤیرگە قام بییە موٙکیس بینە و گاسی هأنی ڤئ هئنگوم سازی نأبینە.بیشتئروٙنە {{PLURAL:$4|یئ گئل نأتیجە|$4 یئ گئل نأتیجە}} د ڤیرگە قام بییە هان د دأسرئس.",
-       "perfcachedts": "رئسÛ\8cÙ\86Û\95 Û\8cا Ù\86ئÙ\87اÛ\8cÛ\8c Ø¯ Ú¤Û\8cرگÛ\95 Ù\82اÙ\85 Ø¨Û\8cÛ\8cÛ\95 Ù\85Ù\88Ù\99Ú©Û\8cس Ø¨Û\8cÙ\86Û\95 Ù\88 Ú¯Ø§Ø³Û\8c Ù\87Ø£Ù\86Û\8c Ú¤Ø¦ Ù\87ئÙ\86Ú¯Ù\88Ù\85 Ø³Ø§Ø²Û\8c Ù\86أبÛ\8cÙ\86Û\95.بÛ\8cشتئرÙ\88Ù\99Ù\86Û\95 {{PLURAL:$4|Û\8cئ Ú¯Ø¦Ù\84 Ù\86أتÛ\8cجÛ\95|$4 Û\8cئ Ú¯Ø¦Ù\84 Ù\86أتÛ\8cجÛ\95}} Ø¯ Ú¤Û\8cرگÛ\95 Ù\82اÙ\85 Ø¨Û\8cÛ\8cÛ\95 Ù\87اÙ\86 Ø¯ Ø¯Ø£Ø³Ø±Ø¦س.",
-       "querypage-no-updates": "نأبوٙە ئی بألگە ڤئ هئنگوم سازی با.\nرئسینە یا ئیچئ تازە کاری نأبینە.",
-       "viewsource": "ساÙ\9bÙ\84Ù\9b Ø¯ Ø³Ø±Ú\86Ø´Ù\85Ù± Ø¨Ù±Ú©Ø½Øª",
-       "viewsource-title": "ساÙ\9bÙ\84Ù\9b Ø¯ Ø³Ø±Ú\86Ø´Ù\85Ù± $1 Ø¨Ù±Ú©Ø½Øª",
-       "actionthrottled": "Ú©Ù\88Ù\86ئشتکارÛ\8c Ù\86ئÙ\87اگئرÛ\8c Ø¨Û\8cÛ\8cÛ\95",
+       "perfcachedts": "رسÛ\8cÙ\86Ù±Û\8cا Ù\86Ù\87اÛ\8cÛ\8c Ø¯ Ú¤Û\8cرگٱ Ù\82اÛ\8cÙ\85 Ø¨Û\8cÙ± Ù\85Û\8aÚ©Û\8cس Ø¨Û\8cÙ\86Ù± Û\89 Ú¯Ø§Ø³Ø½ Ù\87Ù\86Û\8c Ú¤ Ù\87Ù\86Ú¯Ù\88Ù\85 Ø³Ø§Ø²Û\8c Ù\86اÙ\9bÛ\8cÙ±.بؽشترÙ\88Ù\86Ù± {{PLURAL:$4|Û\8cاÙ\9b Ù\86ٱتÛ\8cجٱ|$4 Û\8cاÙ\9b Ù\86ٱتÛ\8cجٱ}} Ø¯ Ú¤Û\8cرگٱ Ù\82اÛ\8cÙ\85 Ø¨Û\8cÙ± Ù\87اÙ\86 Ø¯ Ø¯Ù±Ø³Ø±س.",
+       "querypage-no-updates": "نمۊئٱ اؽ بٱلگٱ ڤ هنگوم سازی با.\nرسینٱیا ایچاْ تازٱ کاری ناٛیٱ.",
+       "viewsource": "ساٛلٛ سرچشمٱ بٱکؽت",
+       "viewsource-title": "ساٛلٛ سرچشمٱ $1 بٱکؽت",
+       "actionthrottled": "Ú©Ù\88Ù\86شکارÛ\8c Ù\86Ù\87اگÛ\8cرÛ\8c Ø¨Û\8cÙ±",
        "actionthrottledtext": "سی نئهاگئری د دأرتیچ بییئن ئسپأم نأبوٙە کئ شوما چئنی کاری نە د یئ گاتی کوٙتا چأن گئل أنجوم بئییت.\nلوطف بأکیت د چأن دئیقە هأنی د نۊ تئلاش بأکیت.",
-       "protectedpagetext": "نأبوٙە د ئی بألگە ڤیرایئشت کاریا کاریاریا هأنی نە سئیل بأکیت.",
+       "protectedpagetext": "نمۊئٱ د اؽ بٱلگٱ ڤیرایش کاریا کاریارؽا هنی ناْ ساٛلٛ بٱکؽت.",
        "viewsourcetext": "شما مؽ تونؽت سرچشمٱ اؽ بٱلگٱ ناْ ساٛلٛ بٱکؽت ۉ دش ڤردارؽت:",
        "viewyourtext": "شوما می توٙنیت سأرچئشمە ڤیرایئشتیا توٙنە د ئی بألگە سئیل بأکیت و دئشوٙ ڤئرداریت:",
-       "protectedinterface": "ئÛ\8c Ø¨Ø£Ù\84Ú¯Û\95 Ø³Û\8c Ù\86أرÙ\85 Ø£Ù\81زار Ú©Ø¦ Ù\87ا Ø¯ Ø¦Û\8c Ú¤Û\8cÚ©Û\8c Ù\86Û\8cسئسÛ\95 Ø¢Ù\85ادÛ\95 Ù\85Û\8cÚ©Û\95Ø\8cÙ\88 Ú¤Ø¦ Ø¯ Ù\85Ù\88زاحئÙ\85Û\95 Øª Ú©Ø§Ø±Û\8c Ù¾Ø£Ø± Ù\88 Ù¾Û\8cÙ\85 Ú©Ø§Ø±Û\8c Ø¨Û\8cÛ\95\nسÛ\8c Ø¦Ø¶Ø§Ù\81 Ú©Ø¦Ø±Ø¯Ø¦Ù\86 Û\8cا Ø¢Ù\84ئشت Ø¯Ø£Ø¦Ù\86 Ø¯ Ù\87Ø£Ù\85Û\95 Ú¤Û\8cÚ©Û\8c Û\8cا Ù\84Ù\88Ø·Ù\81 Ø¨Ø£Ú©Û\8cت [https://translatewiki.net/ translatewiki.net] Ù\86Û\95 Ú¤Ø¦ Ú©Ø§Ø± Ø¨Ø¦Û\8cرÛ\8cتØ\8c Ù¾Ù\88رÙ\88جÛ\95 Ú¤Ù\88Ù\84ات Ù\86ئشÛ\8cÙ\86 Ø³Ø§Ø²Û\8c Ú¤Û\8cÚ©Û\8cÙ\85ئدیا.",
-       "editinginterface": "<strong>ڤارئسکاری کئردئن:</strong> شوما داریت یئ گئل بألگە نە کئ سی یئ گئل نیسئسە یا نأرم أفزار پئیڤأندکار ڤئ کار گئرئتە بیە ڤیرایئشت میکیت.\nآلئشت دأئن ئی بألگە ری رئخت و بارت پئیڤأندکاری کئ کاریاری هأنی ڤئ نە ڤئ کار مئیرئن کارگئرایی دارە.",
-       "translateinterface": "سÛ\8c Ø¦Ø¶Ø§Ù\81 Ú©Ø¦Ø±Ø¯Ø¦Ù\86 Û\8cا Ø¢Ù\84ئشت Ø¯Ø£Ø¦Ù\86 Ú¤Ø§Ù\84ئرئسÛ\95 Û\8cا Ø¯ ØªØ£Ù\85Ù\88Ù\99Ù\85 Ú¤Û\8cÚ©Û\8c Û\8cاØ\8cÙ\84Ù\88Ø·Ù\81 Ø¨Ø£Ú©Û\8cت [https://translatewiki.net/ translatewiki.net] Ù\86Û\95 Ú¤Ø¦ Ú©Ø§Ø± Ø¨Ø¦Û\8cرÛ\8cتØ\8c Ù¾Ù\88رÙ\88جÛ\95 Ú¤Ù\88Ù\84ات Ù\86ئشÛ\8cÙ\86 Ø³Ø§Ø²Û\8c Ú¤Û\8cÚ©Û\8c Ù\85ئدیا.",
+       "protectedinterface": "اؽ Ø¨Ù±Ù\84Ú¯Ù± Ø³Û\8c Ù\86ٱرÙ\85 Ù±Ù\81زار Ú©Ø§Ù\92 Ù\87ا Ø¯ Ø§Ø½ Ú¤Û\8cÚ©Û\8c Ù\86Û\8cسسٱ Ø¢Ù\85ادٱ Ù\85ؽکٱ Û\89 Ú¤ Ø¯ Ù\85Ù\88زاÙ\87Ù\85ٱت Ú©Ø§Ø±Û\8c Ù¾Ø± Û\89 Ù¾Û\8cÙ\85 Ú©Ø§Ø±Û\8c Ø¨Û\8cÙ±\nسÛ\8c Ø§Ù\92زاÙ\81 Ú©Ø±Ø§Ù\9bÙ\86 Û\8cا Ø¢Ù\84شت Ø¯Ø§Ù\9bئÙ\86 Ø¯ Ù\87Ù±Ù\85Ù± Ú¤Û\8cÚ©Û\8c Û\8cا Ù\84Ù\88تÙ\81 Ø¨Ù±Ú©Ø½Øª [https://translatewiki.net/ translatewiki.net] Ù\86اÙ\92 Ú¤ Ú©Ø§Ø± Ø¨Ø§Ù\9bÛ\8cرؽتØ\8c Ù¾Ø±Û\89Ú\98Ù± Ú¤Ù\84ات Ù\86Ø´Û\8cÙ\86 Ø³Ø§Ø²Û\8c Ú¤Û\8cÚ©Û\8c Ù\85دیا.",
+       "editinginterface": "<strong>ڤارٱسکاری کردن:</strong> شما ها یاٛ بٱلگٱ ناْ کاْ سی یاٛ نیسسٱیا نٱرم ٱفزار پاٛڤٱنکار ڤ کار گرتٱ بیٱ ڤیرایش مؽکؽت.\nآلشت داٛئن اؽ بٱلگٱ ری دهۊل پاٛڤٱنکاری کاْ کاریارؽ هنی ڤٱ ناْ ڤ کار ماٛیرٱن کارگرایی دارٱ.",
+       "translateinterface": "سÛ\8c Ø§Ù\92زاÙ\81 Ú©Ø±Ø¯Ù\86 Û\8cا Ø¢Ù\84شت Ø¯Ø§Ù\9bئÙ\86 Ú¤Ù\84Ù\9bرسٱÛ\8cا Ø¯ ØªÙ\85Ù\88Ù\99Ù\85 Ú¤Û\8cÚ©Û\8c Û\8cا Ù\84Ù\88تÙ\81 Ø¨Ù±Ú©Ø½Øª [https://translatewiki.net/ translatewiki.net] Ù\86اÙ\92 Ú¤ Ú©Ø§Ø± Ø¨Ø§Ù\9bÛ\8cرؽتØ\8c Ù¾Ø±Û\89Ú\98Ù± Ú¤Ù\84ات Ù\86Ø´Û\8cÙ\86 Ø³Ø§Ø²Û\8c Ú¤Û\8cÚ©Û\8c Ù\85دیا.",
        "cascadeprotected": "ئی بألگە د ڤیرایئشت پأر و پیم کاری بییە سی یە کئ د ڤأر گئرئتە بألگە {{PLURAL:$1|ڤئ بألگە یە|ڤئنوٙ بألگە ن}} ە کئ ڤئ خوش ڤا نئماجا تاف نئمایی پأر و پیم کاری بیە و چیا هأنی د ئیچئ رأڤاندیاری بینە:\n$2",
-       "namespaceprotected": "Ø´Ù\88Ù\85ا ØµØ¦Ù\84ا Ú¤Û\8cراÛ\8cئشت Ø¨Ø£Ù\84Ú¯Û\95 Û\8cاÛ\8cÛ\8c Ú©Ø¦ Ù\87اÙ\86 Ø¯ Ù\86Ù\88Ù\85جا <strong>$1</strong> Ù\86ارÛ\8cت.",
-       "customcssprotected": "Ø´Ù\88Ù\85ا ØµØ¦Ù\84ا Ú¤Û\8cراÛ\8cئشت Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Ø³Û\8c Ø¦Ø³ Ø¦Ø³ Ù\86Û\95 Ù\86ارÛ\8cت Ø³Û\8c Û\8cÛ\95 Ú©Ø¦ Ù\85Û\8cزÙ\88Ù\99Ù\86کارÛ\8c Ø¯Ù\88Ù\99Ù\86ئسÙ\85Ø£Ù\86Û\8cا Ø´Ø£ØµÙ\82Û\8c Û\8cئ Ú¯Ø¦Ù\84 Ú©Ø§Ø±Û\8cار Ù\87Ø£Ù\86Û\8c Ù\87ا Ø¯Ø¦ش.",
-       "customjsprotected": "Ø´Ù\88Ù\85ا ØµØ¦Ù\84ا Ú¤Û\8cراÛ\8cئشت Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Ø¬Ø§Ú¤Ø§ Ø¦Ø³Ú©Ø±Û\8cپت Ù\86Û\95 Ù\86ارÛ\8cت Ø³Û\8c Û\8cÛ\95 Ú©Ø¦ Ù\85Û\8cزÙ\88Ù\99Ù\86کارÛ\8c Ø¯Ù\88Ù\99Ù\86ئسÙ\85Ø£Ù\86Û\8cا Ø´Ø£ØµÙ\82Û\8c Û\8cئ Ú¯Ø¦Ù\84 Ú©Ø§Ø±Û\8cار Ù\87Ø£Ù\86Û\8c Ù\87ا Ø¯Ø¦ش.",
-       "mycustomcssprotected": "Ø´Ù\88Ù\85ا ØµØ¦Ù\84ا Ú¤Û\8cراÛ\8cئشت Ú©Ø¦Ø±Ø¯Ø¦Ù\86 Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Ø³Û\8c Ø¦Ø³ Ø¦Ø³ Ù\86Û\95 Ù\86ارÛ\8cت.",
-       "mycustomjsprotected": "Ø´Ù\88Ù\85ا ØµØ¦Ù\84ا Ú¤Û\8cراÛ\8cئشت Ú©Ø¦Ø±Ø¯Ø¦Ù\86 Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Ø¬Ø§Ú¤Ø§ Ø¦Ø³Ú©Ø¦Ø±Û\8cپت Ù\86Û\95 Ù\86ارÛ\8cت.",
-       "myprivateinfoprotected": "Ø´Ù\88Ù\85ا ØµØ¦Ù\84ا Ú¤Û\8cراÛ\8cئشت Ú©Ø§Ø±Û\8c Ø¯Ù\88Ù\86ئسÙ\85Ø£Ù\86Û\8cا Ø´Ø£ØµÙ\82Û\8c Ø®Ù\88تÙ\88Ù\99Ù\86Û\95 Ù\86ارÛ\8cت.",
-       "mypreferencesprotected": "Ø´Ù\88Ù\85ا ØµØ¦Ù\84ا Ú¤Û\8cراÛ\8cئشت Ú©Ø§Ø±Û\8c Ú¤Û\8cجÛ\95 Û\8cÛ\8c Û\8cا Ù\87Ø£Ù\86Û\8c Ø®Ù\88تÙ\88Ù\99Ù\86Û\95 Ù\86ارÛ\8cت.",
-       "ns-specialprotected": "نبوٙە بألگە یا ڤئجە نع ڤیرایئشت کئرد.",
-       "titleprotected": "ئÛ\8c Ø¯Ø§Ø³Ù\88Ù\99Ù\86 Ø¯ Ø±Ø£Ú¤Ø£Ù\86دÛ\8cارÛ\8c Ú¤Ø¦ Ø¯Ø£Ø³ [[User:$1|$1]] Ù\86ئÙ\87اگئرÛ\8c Ø¨Û\8cÛ\8cÛ\95.\nدأÙ\84Û\8cÙ\84ئش Ú¤Ø¦ Ù\86Û\95<em>$2</em>.",
+       "namespaceprotected": "Ø´Ù\85ا Ø³Ù\84ا Ú¤Û\8cراÛ\8cØ´ Ø¨Ù±Ù\84Ú¯Ù±Û\8cاÛ\8cؽ Ú©Ø§Ù\92 Ù\87اÙ\86 Ø¯ Ù\86Ù\88Ù\85جا <strong>$1</strong> Ù\86ارؽت.",
+       "customcssprotected": "Ø´Ù\85ا Ø³Ù\84ا Ú¤Û\8cراÛ\8cØ´ Ø§Ø½ Ø¨Ù±Ù\84Ú¯Ù± Ø³Û\8c Ø§Ù\92س Ø§Ù\92س Ù\86اÙ\92 Ù\86ارؽت Ø³Û\8c Û\8cÙ± Ú©Ø§Ù\92 Ù\85Û\8cزÙ\88کارÛ\8c Ø¯Ù\88Ù\86سÙ\85Ù±Ù\86Û\8cا Ø´Ù±Ø®Ø³Û\8c Û\8cاÙ\9b Ú©Ø§Ø±Û\8cار Ù\87Ù\86Û\8c Ù\87ا Ø¯ش.",
+       "customjsprotected": "Ø´Ù\85ا Ø³Ù\84ا Ú¤Û\8cراÛ\8cØ´ Ø§Ø½ Ø¨Ù±Ù\84Ú¯Ù± Ø¬Ø§Ú¤Ø§ Ø§Ù\92سکرÛ\8cپت Ù\86اÙ\92 Ù\86ارؽت Ø³Û\8c Û\8cÙ± Ú© Ù\85Û\8cزÙ\88کارÛ\8c Ø¯Ù\88Ù\86سÙ\85Ù±Ù\86Û\8cا Ø´Ù±Ø®Ø³Û\8c Û\8cاÙ\9b Ú©Ø§Ø±Û\8cار Ù\87Ù\86Û\8c Ù\87ا Ø¯ش.",
+       "mycustomcssprotected": "Ø´Ù\85ا Ø³Ù\84ا Ú¤Û\8cراÛ\8cØ´ Ú©Ø±Ø¯Ù\86 Ø§Ø½ Ø¨Ù±Ù\84Ú¯Ù± Ø³Û\8c Ø§Ù\92س Ø§Ù\92س Ù\86اÙ\92 Ù\86ارؽت.",
+       "mycustomjsprotected": "Ø´Ù\85ا Ø³Ù\84ا Ú¤Û\8cراÛ\8cØ´ Ú©Ø±Ø¯Ù\86 Ø§Û\8c Ø¨Ù±Ù\84Ú¯Ù± Ø¬Ø§Ú¤Ø§ Ø§Ù\92سکرÛ\8cپت Ù\86اÙ\92 Ù\86ارؽت.",
+       "myprivateinfoprotected": "Ø´Ù\85ا Ø³Ù\84ا Ú¤Û\8cراÛ\8cØ´ Ú©Ø§Ø±Û\8c Ø¯Ù\88Ù\86سÙ\85Ù±Ù\86Û\8cا Ø´Ù±Ø®Ø³Û\8c Ø®Ù\88تÙ\88Ù\86اÙ\92 Ù\86ارؽت.",
+       "mypreferencesprotected": "Ø´Ù\85ا Ø³Ù\84ا Ú¤Û\8cراÛ\8cØ´ Ú©Ø§Ø±Û\8c Ú¤Û\8cÚ\98اÙ\9bÛ\8cÛ\8c Û\8cا Ø®Ù\88تÙ\88Ù\86اÙ\92 Ù\86ارؽت.",
+       "ns-specialprotected": "نمۊئٱ بٱلگٱیا ڤیژٱ ناْ ڤیرایش کرد.",
+       "titleprotected": "اؽ Ø¯Ø§Ø³Ù\88Ù\86 Ø¯ Ø±Ù±Ú¤Ù±Ù\86دؽارÛ\8c Ú¤ Ø¯Ù±Ø³ [[User:$1|$1]] Ù\86Ù\87اگÛ\8cرÛ\8c Ø¨Û\8cÙ±.\nدÙ\84Ù\9bÛ\8cÙ\84Ù\9bØ´ Ú¤ Ù\86Ù±<em>$2</em>.",
        "filereadonlyerror": "نأبوٙە جانیا \"$1\" نە آلئشت کاری بأکیت سی یە کئ ئمایە جا \"$2\" ئیسئ ها د حال و بال حأنئن.\n\nدیڤوٙنداری کئ ڤئ نە قولف کئردە ها د حال و بال گوتە دیاری \"$3\" .",
-       "invalidtitle-knownnamespace": "داسÙ\88Ù\99Ù\86 Ù\86ادÛ\8cار Ø³Û\8c Ù\86Ù\88Ù\85 Ø¬Ø§ \"$2\" Ù\88 Ù\86Û\8cسئسÛ\95 \"$3\"",
+       "invalidtitle-knownnamespace": "داسÙ\88Ù\86 Ù\86ادؽار Ø³Û\8c Ù\86Ù\88Ù\85 Ø¬Ø§ \"$2\" Û\89 Ù\86Û\8cسسٱ \"$3\"",
        "invalidtitle-unknownnamespace": "داسوٙن نادیار سی شومارە نادیار نوم جا \"$2\" و نیسئسە \"$3\"",
        "exception-nologin": "هنی نۏمایتٱ ڤامیٛن",
-       "exception-nologin-text": "Ù\84Ù\88Ø·Ù\81 Ø¨Ø£Ú©Û\8cت Ø¨Û\8cاÛ\8cت Ú¤Ø§Ù\85Û\8cÙ\86 Ø³Û\8c Û\8cÛ\95 Ú©Ø¦ Ø¯ Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Û\8cا Ú©Ù\88Ù\86ئشتکارÛ\8c Ø¯Ø£Ø³Ø±Ø¦Ø³Û\8c Ø¯Ø§Ø´ØªÙ\88Ù\99Û\8cÛ\8cت.",
-       "exception-nologin-text-manual": "Ù\84Ù\88Ø·Ù\81 Ø¨Ø£Ú©Û\8cت Ú¤Ø¦ $1 ØµØ¦Ù\84ا Ø¨Ø¦Û\8cتÙ\88Ù\99 Ú©Ø¦ Ø¯ Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Û\8cا Ú©Ù\88Ù\86ئشتکارÛ\8c Ø¯Ø£Ø³Ø±Ø¦Ø³Û\8c Ø¯Ø§Ø´ØªÙ\88Ù\99Û\95.",
-       "virus-badscanner": "سازڤارە گأن:ڤیروٙس نادیار:<em>$1</em>",
-       "virus-scanfailed": "زول بییئن شئکأس حأرد(رازینە $1)",
-       "virus-unknownscanner": "ڤیروٙس کوش نادیار",
-       "logouttext": "<strong>Ø´Ù\88Ù\85ا Ù\87Ø£Ù\86Û\8c Ù\86أرÛ\8cتÛ\95 Ú¤Ø¦ Ø¯Ø£Ø±.</strong>\n\nد Ú¤Û\8cرئتÙ\88Ù\99 Ø¨Ø§ Ú©Ø¦ Ú¤Û\8cرگÛ\95 Ù\86ئÙ\87Ù\88Ù\99 Ø£Ù\86جÙ\88Ù\85Û\8cارئتÙ\88Ù\99 Ù\86Û\95 Ù¾Ø§Ú©Ø³Ø§ Ù\86Ø£Ú©Û\8cتØ\8c Ø³Û\8c Û\8cÛ\95 Ú©Ø¦ Ú¯Ø§Ø³Û\8c Ù¾Ø§Ø±Ø¦ Û\8cÛ\8c Ø¯ Ø¨Ø£Ù\84Ú¯Û\95 Û\8cا Ø¬Ù\88Ù\99رÛ\8c Ø¯Û\8cارÛ\8c Ù\85Û\8c Ú©Ø£Ù\86 Ú\86Û\8c Û\8cÛ\95 Ú©Ø¦ Ù\85Ø£Ù\86Û\8cستÛ\8c Ø´Ù\88Ù\85ا Ù\87Ø£Ù\86Û\8c Ù\87اÛ\8cÛ\8cت Ú¤Ø£Ù\85Û\8cن.",
-       "welcomeuser": "Ø®Ù\88Ø´ Ø¦Ù\88Ù\99Ù\85اÛ\8cÛ\8cت،$1!",
-       "welcomecreation-msg": "حئساڤتوٙ دوروس بییە.\nد ڤیرئتوٙ نأروە کئ {{نوم دیارگە}} [[Special:Preferences|preferences]]  خوتوٙنە آلئشت بأکیت.",
+       "exception-nologin-text": "Ù\84Ù\88تÙ\81 Ø¨Ù±Ú©Ø½Øª Ø¨Ø½Ø§Û\8cؽت Ú¤Ø§Ù\85ؽÙ\86 Ø³Û\8c Û\8cÙ± Ú©Ø§Ù\92 Ø¯ Ø§Ø½ Ø¨Ù±Ù\84Ú¯Ù±Û\8cا Ú©Ù\88Ù\86شکارÛ\8c Ø¯Ù±Ø³Ø±Ø³Û\8c Ø¯Ø§Ø´ØªÛ\8aÛ\8cؽت.",
+       "exception-nologin-text-manual": "Ù\84Ù\88تÙ\81 Ø¨Ù±Ú©Ø½Øª Ú¤ $1 Ø³Ù\84ا Ø¨Ø§Ù\9bÛ\8cتÙ\88 Ú©Ø§Ù\92 Ø¯ Ø§Ø½ Ø¨Ù±Ù\84Ú¯Ù±Û\8cا Ú©Ù\88Ù\86شکارÛ\8c Ø¯Ù±Ø³Ø±Ø³Û\8c Ø¯Ø§Ø´ØªÛ\8aئٱ.",
+       "virus-badscanner": "سازڤارٱ گٱن:ڤیرۊس نادؽار:<em>$1</em>",
+       "virus-scanfailed": "زول بیئن شکٱس هٱرد(رازینٱ $1)",
+       "virus-unknownscanner": "ڤیرۊس کوش نادؽار:",
+       "logouttext": "<strong>Ø´Ù\85ا Ù\87Ù\86Û\8c Ù\86ٱرٱتؽتٱ Ú¤ Ø¯Ù±Ø±.</strong>\n\nÚ¤ Ú¤Û\8cرتÙ\88 Ø¨Ø§ Ú©Ø§Ù\92 Ú¤Û\8cرگٱ Ù\86Ù\87Ù\88Ý© Ù±Ù\86جÙ\88Ù\85Û\8cارÛ\8cتÙ\88 Ù\86اÙ\92 Ù¾Ø§Ú©Ø³Ø§ Ù\86ٱکؽتØ\8c Ø³Û\8c Û\8cÙ± Ú©Ø§Ù\92 Ú¯Ø§Ø³Ø½ Ù¾Ø§Ø±Ø§Ù\9bÛ\8cؽ Ø¯ Ø¨Ù±Ù\84Ú¯Ù±Û\8cا Ø¬Û\8aرؽ Ø¯Ø½Ø§Ø±Û\8c Ù\85ؽکٱÙ\86 Ú\86Û\8c Û\8cÙ± Ú©Ø§Ù\92 Ù\85Ù±Ù\86Û\8cستÛ\8c Ø´Ù\85ا Ù\87Ù\86Û\8c Ù\87اÛ\8cؽت Ú¤Ø§Ù\85ؽن.",
+       "welcomeuser": "خٱش Ø§Ù\88Ù\85اÛ\8cؽت،$1!",
+       "welcomecreation-msg": "هساو تو دۏرس بیٱ.\nد ڤیرتو نٱرۉئٱ کاْ {{نوم دؽارگٱ}} [[Special:Preferences|preferences]]  خوتو ناْ آلشت بٱکؽت.",
        "yourname": "نوم کاریاری:",
        "userlogin-yourname": "نوم کاریاری",
        "userlogin-yourname-ph": "نوم کاریاری توناْ بٱزنؽت",
-       "createacct-another-username-ph": "نوم کاریاری توٙنە بأزئنیت",
-       "yourpassword": "رازینە گوڤاردئن:",
-       "userlogin-yourpassword": "رازینٱ گوڤاردن",
+       "createacct-another-username-ph": "نوم کاریاری تو ناْ بٱزنؽت",
+       "yourpassword": "پٱسڤورد:",
+       "userlogin-yourpassword": "پٱسڤورد",
        "userlogin-yourpassword-ph": "رازینٱ گوئارسناْ بٱزاْ",
        "createacct-yourpassword-ph": "رازینٱ گوئاردن ناْ بٱزاْ",
-       "yourpasswordagain": "Û\8cئ Ú¯Ø¦Ù\84 Ù\87Ø£Ù\86Û\8c Ø±Ø§Ø²Û\8cÙ\86Û\95 Ú¯Ù\88ڤاردئÙ\86 Ù\86Û\95 Ø¨Ø£Ø²Û\95",
-       "createacct-yourpasswordagain": "رازینٱ گوئاردن ناْ پوشت دۏرس کو",
+       "yourpasswordagain": "Û\8cاÙ\9b Ù\87Ù\86Û\8c Ø±Ø§Ø²Û\8cÙ\86Ù± Ú¯Ù\88ئاردÙ\86 Ù\86اÙ\92 Ø¨Ù±Ø²Ø§Ù\92",
+       "createacct-yourpasswordagain": "پٱسڤورد تازٱ ناْ تٱیید كو",
        "createacct-yourpasswordagain-ph": "یاٛ گلٛ هنی رازینٱ گوئاردن بٱزٱ",
        "userlogin-remembermypassword": "مناْ د سامونٱ ڤادار",
-       "userlogin-signwithsecure": "ڤأصل بییئن أمن نە ڤئ کار بئیر",
-       "yourdomainname": "Ù¾Ù\88شگئر Ø´Ù\88ما:",
+       "userlogin-signwithsecure": "ڤٱسل بیئن ٱمن ناْ ڤ کار باٛیر",
+       "yourdomainname": "Ù¾Ù\88شگر Ø´ما:",
        "password-change-forbidden": "شوما نئمی توٙنیت رازینە گوڤاردئن خوتوٙنە د ئی ڤیکی آلئشت بأکیت.",
-       "externaldberror": "ئشتئڤاÛ\8cÛ\8c Ø¯ Ø¦Ø±ØªØ¦Ú¤Ø§Ø· Ú¤Ø§ Ø±Ø¦Ø³Û\8cÙ\86Û\95 Ú¯Ø§ Ù¾Û\8cØ´ Ø¦Ù\88Ù\99Ù\85اÛ\95 Û\8cا Ø´Ù\88Ù\85ا ØµØ¦Ù\84ا Û\8cØ£Ù\86Û\95 Ú©Ø¦ Û\8cئ Ú¯Ø¦Ù\84 Ø­Ø¦Ø³Ø§Ú¤ Ø®Ø§Ø±Ø¬Û\8c Ø®Ù\88تÙ\88Ù\99Ù\86Û\95 Ú¤Ø¦ Ù\87ئÙ\86Ú¯Ù\88Ù\85 Ø³Ø§Ø²Û\8c Ø¨Ø£Ú©Û\8cت Ù\86ارÛ\8cت.",
+       "externaldberror": "اÙ\92شتباÛ\8cؽ Ø¯ Ø§Ù\92رتبات Ú¤Ø§ Ø±Ø³Û\8cÙ\86ٱگا Ù¾Û\8cØ´ Ø§Ù\88Ù\85اÛ\8cÙ± Û\8cا Ø´Ù\85ا Ø³Ù\84ا Û\8cÙ± Ù\86اÙ\92 Ú©Ø§Ù\92 Û\8cاÙ\9b Ù\87ساÙ\88 Ø®Ø§Ø±Ø¬Û\8c Ø®Ù\88تÙ\88 Ù\86اÙ\92 Ú¤ Ù\87Ù\86Ú¯Ù\88Ù\85 Ø³Ø§Ø²Û\8c Ø¨Ù±Ú©Ø½Øª Ù\86ارؽت.",
        "login": "ڤامؽن اوماین",
-       "nav-login-createaccount": " ڤامین ئوٙمائن/راس کئردئن حئساڤ",
-       "logout": "د Ø³Ø§Ù\85Ù\88Ù\99Ù\86Û\95 Ø¯Ø¦Ø±Ø¦Ù\88Ù\99Ù\85ائن",
-       "userlogout": "د Ø³Ø§Ù\85Ù\88Ù\99Ù\86Û\95 Ø¯Ø¦Ø±Ø¦Ù\88Ù\99Ù\85ائن",
+       "nav-login-createaccount": " ڤامؽن اوماین/دۏرس کردن هساو",
+       "logout": "د Ø³Ø§Ù\85Ù\88Ù\86Ù± Ø¯Ø±Ø§Ù\88Ù\85اÛ\8cن",
+       "userlogout": "د Ø³Ø§Ù\85Ù\88Ù\86Ù± Ø¯Ø±Ø§Ù\88Ù\85اÛ\8cن",
        "notloggedin": "هنی نۏمایتٱ ڤامیٛن",
        "userlogin-noaccount": "یاٛ هساو نارؽت؟",
        "userlogin-joinproject": "ٱندوم دؽارگٱ {{SITENAME}} بۊئؽت",
        "createaccount": "هساو دۏرس بٱکؽت",
        "userlogin-resetpassword-link": "رازینٱ گوئارسن تو د ڤیرتو رٱتٱ؟",
        "userlogin-helplink2": "هومیاری کردن د تٱریق ڤامؽن اوماین",
-       "userlogin-loggedin": "Ø´Ù\88Ù\85ا Ø¦Û\8cسئ Ú\86Û\8c Û\8cئ Ú¯Ø¦Ù\84 {{GENDER:$1|$1}} Ø¦Ù\88Ù\99Ù\85اÛ\8cتÛ\95 Ú¤Ø§Ù\85Û\8cÙ\86\86Ù\88Ù\85 Ø¨Ø£Ù\84Ú¯Û\95 Ù\87ارÛ\8c Ù\86Û\95 Ø³Û\8c Ú¤Ø§Ù\85Û\8cÙ\86 Ø¦Ù\88Ù\99Ù\85ائÙ\86 Ú\86Û\8c Û\8cئ Ú¯Ø¦Ù\84 Ú©Ø§Ø±Û\8cار Ù\87Ø£Ù\86Û\8c Ø¨Ù\84Ú¯Ù\87 Ù\87ارÛ\8c Ø³Û\8c Ù\88ا Ù\85Û\8cÙ\86 Ø§Ù\88Ù\85ائÙ\86 Ú\86Û\8c Û\8cÙ\87 Ú¯Ù\84 Ú©Ø§Ø±Û\8cار Ù\87Ù\86Û\8c Ú¤Ø¦ Ú©Ø§Ø± Ø¨Ø¦Û\8cرÛ\8cت.",
-       "userlogin-createanother": "Û\8cئ Ú¯Ø¦Ù\84 Ø­Ø¦Ø³Ø§Ú¤ Ù\87Ø£Ù\86Û\8c Ø±Ø§Ø³ Ø¨Ø£Ú©Û\8cت",
-       "createacct-emailrequired": "تÛ\8cرÙ\86ئشÙ\88Ù\99Ù\86 Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95",
+       "userlogin-loggedin": "Ø´Ù\85ا Ø§Û\8cساÙ\92 Ú\86Û\8c Û\8cاÙ\9b {{GENDER:$1|$1}} Ø§Ù\88Ù\85اÛ\8cتٱ Ú¤Ø§Ù\85ؽÙ\86\86Ù\88Ù\85 Ø¨Ù±Ù\84Ú¯Ù± Ù\87ارÛ\8c Ù\86اÙ\92 Ø³Û\8c Ú¤Ø§Ù\85ؽÙ\86 Ø§Ù\88Ù\85اÛ\8cÙ\86 Ú\86Û\8c Û\8cاÙ\9b Ú©Ø§Ø±Û\8cار Ù\87Ù\86Û\8c Ø¨Ù±Ù\84Ú¯Ù± Ù\87ارÛ\8c Ø³Û\8c Ú¤Ø§ Ù\85ؽÙ\86 Ø§Ù\88Ù\85ابÙ\86 Ú\86Û\8c Û\8cاÙ\9b Ú©Ø§Ø±Û\8cار Ù\87Ù\86Û\8c Ú¤ Ú©Ø§Ø± Ø¨Ø§Ù\9bÛ\8cرؽت.",
+       "userlogin-createanother": "Û\8cاÙ\9b Ù\87ساÙ\88 Ù\87Ù\86Û\8c Ø¯Û\8fرس Ø¨Ù±Ú©Ø½ت",
+       "createacct-emailrequired": "تÛ\8cرÙ\86Ø´Ù\88Ý© Ù±Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù±",
        "createacct-emailoptional": "تیرنشوݩ ٱنجومانامٱ",
        "createacct-email-ph": "تیرنشوݩ ٱنجومانامٱ توناْ ڤارد بٱكؽت",
-       "createacct-another-email-ph": "تÛ\8cرÙ\86ئشÙ\88Ù\99Ù\86 Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 ØªÙ\88Ù\99Ù\86Û\95 Ø¨Ø£Ø²Ø£Ù\86Û\8cت",
-       "createaccountmail": "Û\8cئ Ú¯Ø¦Ù\84 Ø±Ø§Ø²Û\8cÙ\86Û\95 Ú¯Ù\88ڤاردئÙ\86 Ù\85Ù\88ڤأÙ\82أتÛ\8cÙ\86Û\95 Ú¤Ø¦ Ú©Ø§Ø± Ø¨Ø¦Û\8cرÛ\8cت Ù\88 Ú¤Ø¦ Ù\86Û\95سÛ\8c Û\8cئ Ú¯Ø¦Ù\84 ØªÛ\8cرÙ\86ئشÙ\88Ù\99Ù\86 Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 ØªÛ\8cار Ø¨Û\8cÛ\8cÛ\95 Ú©Ø¦Ù\84 Ø¨Ø£Ú©Û\8cت.",
-       "createacct-realname": "نوم راستأکی(مأژبوٙری نی)",
-       "createacct-reason": "دألیل",
-       "createacct-reason-ph": "سی چی شوما داریت یئ گئل حئساڤ هأنی راس میکید",
+       "createacct-another-email-ph": "تÛ\8cرÙ\86Ø´Ù\88Ý© Ù±Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù± ØªÙ\88Ù\86اÙ\92 Ø¨Ù±Ø²Ù\86ؽت",
+       "createaccountmail": "Û\8cاÙ\9b Ø±Ø§Ø²Û\8cÙ\86Ù± Ú¯Ù\88ئارسÙ\86 Ù\85Ù\88Ú¤Ù±Ù\82ٱتÛ\8cÙ\86اÙ\92 Ú¤ Ú©Ø§Ø± Ø¨Ø§Ù\9bرؽت Û\89 Ú¤Ù± Ù\86اÙ\92 Ø³Û\8c Û\8cاÙ\9b ØªÛ\8cرÙ\86Ø´Ù\88Ý© Ù±Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù± ØªÛ\8cار Ø¨Û\8cÙ± Ú©Ù\84Ù\9b Ø¨Ù±Ú©Ø½ت.",
+       "createacct-realname": "نوم راسٱکی(مٱژبۊری نؽ)",
+       "createacct-reason": "دلٛیلٛ",
+       "createacct-reason-ph": "سی چؽ شما دارؽت یاٛ هساو هنی دۏرس مؽکؽت",
        "createacct-submit": "هساو خوتوناْ دۏرس بٱکؽت",
        "createacct-another-submit": "یئ گئل حئساڤ هأنی راس بأکیت",
        "createacct-benefit-heading": "{{SITENAME}}  ڤ دٱس کٱسؽایؽ چی شما رٱڤٱندؽاری بیٱ.",
        "createacct-benefit-body1": "{{PLURAL:$1|ڤیرایش|ڤیرایشؽا}}",
        "createacct-benefit-body2": "{{PLURAL:$1|بٱلگٱ|بٱلگٱیا}}",
        "createacct-benefit-body3": "تازٱ{{PLURAL:$1|هومیار|ھومیاریا}}",
-       "badretype": "رازینە گوڤاردئنی کئ شمأ دأییتە هومدأنگی نارە.",
-       "usernameinprogress": "رأرڤأندیاری یئ گئل حئساڤ سی ئی نوم کاریاری ھا د پیشکئرد. یئ گوری آھئرە داری بأکیت.",
-       "userexists": "نوم کاریاری دە بییە ئیسئنی ڤئ کار گئرئتە بییە.\nلوطف بأکیت یئ گئل نوم هأنی نە ڤئرداریت.",
-       "loginerror": "خأطا ڤامین ئوٙمائن",
-       "createacct-error": "خأطا راس کئردئن حئساڤ",
-       "createaccounterror": "نأبوٙە حئساڤ کاریاری راس بأکیت:$1",
-       "nocookiesnew": "حئساڤ کاریاری راست بی، ڤألی شوما نیوٙمایتە ڤامین.کاریاری راس بی،اما شما وامئن نیامایئته.{{SITENAME}} کوٙکیا نە سی ئوٙمائن د ساموٙنە کاریاریاڤئ کار مئیرە.\nکوٙکیا شوما ناکوٙنئشتگأر بینە.\nلوطف بأکیت ڤئنوٙنە کونئشتگأر بأکیت، ئوٙسئ ڤا یئ گئل نوم کاریاری و رازینە گوڤاردئن هأنی بیاییت ڤامین.",
-       "nocookieslogin": "{{SITENAME}} کوٙکیا نە سی ئوٙمائن د ساموٙنە کاریاریاڤئ کار مئیرە.\nکوٙکیا شوما ناکوٙنئشتگأر بینە.\nلوطف بأکیت ڤئنوٙنە کونئشتگأر بأکیت و د نۊ تئلاش بأکیت.",
-       "nocookiesfornew": "حئساڤ کاریاری راس نأبیە، سی یە نە کئ ئیما نئمی توٙنیم سأرچئشمە ڤئنە پوشت راس کاری بأکیم.\nموطمأئن بوٙییت کئ کوٙکیا کونئشتگأر بینە، ئی بألگە نە د نوٙ سوٙڤار بأکیت و هأنی تئلاش بأکیت.",
+       "badretype": "رازینٱ گوئارسنؽ کاْ شما داٛیتٱ هومدٱنڳی نارٱ.",
+       "usernameinprogress": "رٱرڤٱندیاری یاٛ هساو سی اؽ نوم کاریاری ھا د پیشکرد. یاٛ گرؽ آھرٱ داری بٱکؽت.",
+       "userexists": "نوم کاریاری د بیٱ ایسنی ڤ کار گرتٱ بیٱ.\nلوتف بٱکؽت یاٛ نوم هنی ناْ ڤردارؽت.",
+       "loginerror": "خٱتا ڤا مؽن اوماین",
+       "createacct-error": "خٱتا دۏرس کردن هساو",
+       "createaccounterror": "نمۊئٱ هساو کاریاری دۏرس بٱکؽت:$1",
+       "nocookiesnew": "هساو کاریاری دۏرس بی، ڤلی شما نۏمایؽتٱ ڤامؽن.کاریاری دۏرس بی، ڤلی شما ڤامؽن نۏمایؽتٱ.{{SITENAME}} کۊکیا ناْ سی اوماین ڤ سامونٱ کاریاریا ڤ کار ماٛیرٱ.\nکۊکیا شما ناکونشگٱر بینٱ.\nلوتف بٱکؽت ڤنوناْ کونشگٱر بٱکؽت، اۊساْ ڤا یاٛ نوم کاریاری ۉ رازینٱ گوئارسن هنی بؽایؽت ڤامؽن.",
+       "nocookieslogin": "{{SITENAME}} کۊکیا ناْ سی اوماین ڤ سامونٱ کاریارؽا ڤ کار ماٛیرٱ.\nکۊکیا شما ناکونگٱر بینٱ.\nلوتف بٱکؽت ڤنوناْ کونشگٱر بٱکؽت ۉ د نۊ تٱفرٱ بٱکؽت.",
+       "nocookiesfornew": "هساو کاریاری دۏرس ناٛییٱ سی ینٱ کاْ اؽما نمؽ تونؽم سرچشمٱ ڤٱناْ پوشت راس کاری بٱکؽم.\nموتمٱعن بۊیؽت کاْ کۊکیا کونشگٱر بینٱ، اؽ بٱلگٱ ناْ د نۊ سڤار بٱکؽت ۉ هنی تٱفرٱ بٱکؽت.",
        "nocookiesforlogin": "{{int:nocookieslogin}}",
-       "noname": "Ø´Ù\88Ù\99Ù\85ا Û\8cئ Ú¯Ø¦Ù\84 Ù\86Ù\88Ù\85 Ú©Ø§Ø±Û\8cارÛ\8c Ø®Ù\88Ù\99 ØªÛ\8cار Ù\86أکئردÛ\8cتÛ\95.",
+       "noname": "Ø´Ù\85ا Û\8cاÙ\9b Ù\86Ù\88Ù\85 Ú©Ø§Ø±Û\8cارÛ\8c Ø®Û\8a ØªÛ\8cار Ù\86ٱکردؽتٱ.",
        "loginsuccesstitle": "ئوٙمائن ڤامین خوٙ بی",
-       "loginsuccess": "Ø´Ù\88Ù\99Ù\85ا Ø¦Û\8cسئ Ø¦Ù\88Ù\99Ù\85اÛ\8cتÛ\95 Ú¤Ø§Ù\85Û\8cن {{SITENAME}} د چی\"$1\".'",
+       "loginsuccess": "Ø´Ù\85ا Ø§Û\8cساÙ\92 Ø§Ù\88Ù\85اÛ\8cتٱ Ú¤Ø§Ù\85ؽن {{SITENAME}} د چی\"$1\".'",
        "nosuchuser": "چئنی کاریاری ڤا نوم\"$1\" نیئش.\nنوم کاریاری ڤئ حأرفیا حأساسە.\nرأڤئشت نیسأنئن توٙنە ڤارئسی بأکست،یا [[Special:ڤامین ئوٙمائن کاریار/ثأڤت نام کئردئن|یئ گئل حئساڤ تازه راس بأکیت]].",
-       "nosuchusershort": "چئنی کاریاری ڤا نوم $1 نی.\nنیسأنئن خوتوٙنە ڤارئسی بأکیت.",
-       "nouserspecified": "Ø´Ù\88Ù\85ا Ú¤Ø§Ø³ Û\8cئ Ú¯Ø¦Ù\84 Ù\86Ù\88Ù\85 Ú©Ø§Ø±Û\8cارÛ\8c ØªÛ\8cار Ø¨Ø£Ú©Û\8cت.",
-       "login-userblocked": "کاریا قولف بییە . شوما صئلا ڤامین ئوٙمائن ناریت.",
+       "nosuchusershort": "چنی کاریاری ڤا نوم $1 نی.\nنیسٱنن خوتوناْ ڤارسی بٱکؽت.",
+       "nouserspecified": "Ø´Ù\85ا Ø¨Ø§Û\8cٱد Û\8cاÙ\9b Ù\86Ù\88Ù\85 Ú©Ø§Ø±Û\8cارÛ\8c ØªÛ\8cار Ø¨Ù±Ú©Ø½ت.",
+       "login-userblocked": "کاریار قولف بیٱ. شما سلا ڤامؽن اوماین نارؽت.",
        "wrongpassword": "رازینە گوڤاردئنئتوٙ نە ئشتئڤا دأییتە.\nد نۊ تئلاش بأکیت.",
-       "wrongpasswordempty": "رازینە گوڤاردئنئتوٙ نە حالی دأییتە.\nد نۊ تئلاش بأکیت.",
-       "passwordtooshort": "رازینە گوڤاردئنئتوٙ با کأمتروٙنە {{PLURAL:$1|1 کاراکتئر|$1 کاراکتئریا}} با",
-       "passwordtoolong": "رازینە گوڤاردئنئتوٙ نە ڤاس بیشتئر د {{PLURAL:$1|1 کاراکتئر|$1 کاراکتئریا}} با",
-       "password-name-match": "رازینە گوڤاردئنئتوٙ بایأد ڤا نوم کاریاریتوٙ فأرخ داشتوٙە.",
-       "password-login-forbidden": "ڤئ کارگئرئتئن ئی نوم کاریاری و رازینە گوڤاردئن قأدئقأن بییە.",
-       "mailmypassword": "د Ù\86Û\8a Ø¯Ø£Ø¦Ù\86 Ø±Ø§Ø²Û\8cÙ\86Û\95 Ú¯Ù\88ڤاردئن",
-       "passwordremindertitle": "رازینە گوڤاردئن موڤأتی تازه سی {{SITENAME}}",
+       "wrongpasswordempty": "رازینٱ گوئارسن تو ناْ هالٛی داٛیؽتٱ.\nد نۊ تٱفرٱ بٱکؽت.",
+       "passwordtooshort": "رازینٱ گوئارسن تو بایٱد کٱمترونٱ {{PLURAL:$1|1 کاراکتر|$1 کاراکترؽا}} با",
+       "passwordtoolong": "رازینٱ گوئارسن تو بایٱد بؽشتر د {{PLURAL:$1|1 کاراکتر|$1 کاراکترؽا}} با",
+       "password-name-match": "رازینٱ گوئارسن تو بایٱد ڤا نوم کاریاری تو فٱرخ داشتۊئٱ.",
+       "password-login-forbidden": "ڤ کارگرتن اؽ نوم کاریاری ۉ رازینٱ گوئارسن مٱمنۊع بیٱ.",
+       "mailmypassword": "د Ù\86Û\8a Ø¯Ø§Ù\9bÛ\8cÙ\86 Ø±Ø§Ø²Û\8cÙ\86Ù± Ú¯Ù\88ئارسن",
+       "passwordremindertitle": "رازینٱ گوئارسن موڤٱقٱتی تازٱ سی {{SITENAME}}",
        "passwordremindertext": "یئ نأفأر (گاسی خوتوٙ،د تیرنئشوٙن آی پی $1) یئ گئل رازینە گوڤاردئن هأنی سی {{SITENAME}}($4) حاستە.یئ گئل رازینە گوڤاردئن موڤأقأتی سی کاریاری\"$2\" رأڤأندیاری بیە و د \"$3\" جاگئر بییە. أر یە نە حاستیتە،شما بایأد ئیسئ روٙییت ڤامین و یئ گئل رازینە گوڤاردئن هأنی نە ئنتئخاڤ بأکیت.\nرازینە گوڤاردئن موڤأقأتی د {{PLURAL:$5|یئ روٙ|$5 روٙزیا}}  تأموٙم بوٙە.\n\nأر یئ نأفأر هأنی ئی حاست نە داشتوٙە، یا أر رازینە گوڤاردئن توٙنە د ڤیرتوٙ ئوٙما، و أر حاستیت ڤئنە آلئشت کاری بأکیت، گاسی شوما د ئی پئیغوم تیە پوٙشی بأکیت و بئحایت ڤئ کار گئرئتئن رازینە گوڤاردئن دئماتریتوٙ نە دئماداری بأکیت.",
-       "noemail": "Ù\87Û\8cÚ\86 ØªÛ\8cرÙ\86ئشÙ\88Ù\99Ù\86 Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Û\8cÛ\8c Ø³Û\8c Ú©Ø§Ø±Û\8cار $1 Ø¶Ø£Ù\81Ø· Ù\86أبÛ\8cÛ\95.",
-       "noemailcreate": "Ø´Ù\88Ù\85ا Ø¨Ø§Û\8cأد Û\8cئ Ú¯Ø¦Ù\84 ØªÛ\8cرÙ\86ئشÙ\88Ù\99Ù\86 Ø£Ù\86جÙ\88Ù\85اÙ\86Û\95 Ø¬Ø§Ø¯Û\8cار Ø³Û\8c Ø®Ù\88تÙ\88Ù\99 Ø¯Ø§Ø´ØªÙ\88Ù\99Û\8cÛ\8cت.",
-       "passwordsent": "Û\8cئ Ú¯Ø¦Ù\84 Ø±Ø§Ø²Û\8cÙ\86Û\95 Ú¯Ù\88ڤاردئÙ\86 Ù\87Ø£Ù\86Û\8c Ú©Ø¦Ù\84 Ø¨Û\8cÛ\8cÛ\95 Ø³Û\8c ØªÛ\8cرÙ\86ئشÙ\88Ù\99Ù\86 Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Û\8cÛ\8c Ú©Ø¦ \"$1\" Ú¤Ø§Ø´ Ø«Ø£Ú¤Øª Ù\86اÙ\85 Ú©Ø¦Ø±Ø¯Û\95.\nخاÙ\87ئشت Ù\85Û\8c Ú©Û\8cÙ\85 Ù\87Ø£Ù\86Û\8c Ø±Ù\88Ù\99Û\8cÛ\8cت Ú¤Ø§Ù\85Û\8cÙ\86 Ù\88 Ø¦Ù\88Ù\99سئ Ø¨Ø¦Ø±Û\8cتئش.",
+       "noemail": "Ù\87Û\8cÚ\98 ØªÛ\8cرÙ\86Ø´Ù\88Ý© Ù±Ù\86جÙ\88Ù\85اÙ\86اÙ\85اÙ\9bÛ\8cÛ\8c Ø³Û\8c Ú©Ø§Ø±Û\8cار $1 Ø²Ù±Ù\81ت Ù\86اÙ\9bÛ\8cÛ\8cÙ±.",
+       "noemailcreate": "Ø´Ù\85ا Ø¨Ø§Û\8cٱد Û\8cاÙ\9b ØªÛ\8cرÙ\86Ø´Ù\88Ý© Ù±Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù± Ø¬Ø§Ø¯Û\8cار Ø³Û\8c Ø®Ù\88تÙ\88 Ø¯Ø§Ø´ØªÛ\8aÛ\8cؽت.",
+       "passwordsent": "Û\8cاÙ\9b Ø±Ø§Ø²Û\8cÙ\86Ù± Ú¯Ù\88ئارسÙ\86 Ù\87Ù\86Û\8c Ú©Ù\84Ù\9b Ø¨Û\8cÙ± Ø³Û\8c ØªÛ\8cرÙ\86Ø´Ù\88Ý© Ù±Ù\86جÙ\88Ù\85اÙ\86اÙ\85اÙ\9bÛ\8cÛ\8c Ú©Ø§Ù\92 \"$1\" Ú¤Ø§Ø´ Ø³Ù±Ø¨Øª Ù\86Ù\88Ù\85 Ú©Ø±Ø¯Ù±.\nخاÙ\87Ø´ Ù\85ؽکÙ\85 Ù\87Ù\86Û\8c Ø±Û\89Û\8cؽت Ú¤Ø§Ù\85ؽÙ\86 Û\89 Ø§Û\8aساÙ\92 Ø¨Ø§Ù\9bÛ\8cرتش.",
        "blocked-mailpassword": "نئها آی پی شوما سی ڤیرایئشت کاری گئرئتە بییە، هأنی صئلا یە نە نارە کئ د رازینە گوڤاردئن د نۊ کئل بییە سی نئهاگئری د گأن کاری نارە.",
-       "eauthentsent": "Û\8cئ Ú¯Ø¦Ù\84 Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Ù¾Ù\88شت Ø±Ø§Ø³Øª Ú©Ø¦Ø±Ø¯Ø¦Ù\86Û\8c Ø¯ Û\8cئ Ú¯Ø¦Ù\84Ù\9b ØªÛ\8cرÙ\86ئشÙ\88Ù\99Ù\86 Ú¤Û\8cجÛ\95 Ú©Ø¦Ù\84 Ø¨Û\8cÛ\8cÛ\95.\nدئÙ\85ا Û\8cÛ\95 Ú©Ø¦ Û\8cئ Ú¯Ø¦Ù\84 Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Ù\87Ø£Ù\86Û\8c Ø¯ Ø­Ø¦Ø³Ø§Ú¤ Ú©Ø¦Ù\84 Ø¨Ù\88Ù\99Ø£Ø\8c Ø´Ù\88Ù\85ا Ú¤Ø§Ø³ Ø¯Ø¦Ù\85ا Ø±Ø£Ø¯Û\8cارکÙ\88Ù\86Û\8c Ù\86Û\95 Ø¯ Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Ø¨Ø¦Û\8cرÛ\8cتØ\8c Ø³Û\8c Û\8cÛ\95 Ú©Ø¦ Ø­Ø¦Ø³Ø§Ú¤ Ø´Ù\88Ù\85ا Ø±Ø§Ø³ØªØ£Ú©Û\8c Ù¾Ù\88شت Ø±Ø§Ø³Øª Ø¨Ù\88Ù\99Ø£.",
-       "throttled-mailpassword": "Û\8cئ Ú¯Ø¦Ù\84 Ø±Ø§Ø²Û\8cÙ\86Û\95 Ú¯Ù\88ڤاردئÙ\86 Ø¯ Ù\86Û\8a Ø²Ø¦Ù\86Û\95 Ø¨Û\8cÛ\8cÛ\95 Ù\88 Ø¦Û\8cسئ Ú©Ø¦Ù\84 Ø¨Û\8cÛ\8cÛ\95Ø\8c Ø¯ Ø¢Ø®Ø¦Ø±Û\8c {{PLURAL:$1|ساعأت|$1 Ø³Ø§Ø¹Ø£ØªÛ\8cا}}.\nسÛ\8c Ù\86ئÙ\87اگئرÛ\8c Ø¯ Ø£Ø°Û\8cأت Ø¨Û\8cÛ\8cئÙ\86Ø\8c Ù\81Ø£Ù\82أط Û\8cئ Ú¯Ø¦Ù\84 Ø±Ø§Ø²Û\8cÙ\86Û\95 Ú¯Ù\88ڤاردئÙ\86 Ø¯ Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Ø¯ Ù\86Û\8a Ø²Ø¦Ù\86Û\95 Ø¨Û\8cÛ\8cÛ\95 Ø¯ Ù\87أر {{PLURAL:$1|ساعأت|$1 Ø³Ø§Ø¹Ø£ØªÛ\8cا}} Ú©Ø¦Ù\84 Ø¨Û\8cÛ\8cÛ\95.",
-       "mailerror": "خأطا د کئل بییئن أنجومانامە:$1",
+       "eauthentsent": "Û\8cاÙ\9b Ù±Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù± Ù¾Ù\88شت Ø¯Û\8fرس Ú©Ø±Ø¯Ù\86Û\8c Ø¯ Û\8cاÙ\9b ØªÛ\8cرÙ\86Ø´Ù\88Ý© Ú¤Û\8cÚ\98Ù± Ú©Ù\84Ù\9b Ø¨Û\8cÙ±.\nدÙ\85ا Û\8cÙ± Ú©Ø§Ù\92 Û\8cاÙ\9b Ù±Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù± Ù\87Ù\86Û\8c Ø¯ Ù\87ساÙ\88 Ú©Ù\84Ù\9b Ø¨Û\8aئٱØ\8c Ø´Ù\85ا Ø¨Ø§Û\8cٱد Ø¯Ù\85ا Ø±Ù±Ø¯Ø½Ø§Ø±Ú©Ù\88Ù\86Û\8c Ù\86اÙ\92 Ø¯ Ù±Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù± Ø¨Ø§Ù\9bÛ\8cرؽتØ\8c Ø³Û\8c Û\8cÙ± Ú©Ø§Ù\92 Ù\87ساÙ\88 Ø´Ù\85ا Ø±Ø§Ø³Ù±Ú©Û\8c Ù¾Ù\88شت Ø¯Û\8fرش Ø¨Û\8aئٱ.",
+       "throttled-mailpassword": "Û\8cاÙ\9b Ø±Ø§Ø²Û\8cÙ\86Ù± Ú¯Ù\88ئارسÙ\86 Ø¯ Ù\86Û\8a Ø²Ù\86Ù± Ø¨Û\8cÙ± Û\89 Ø§Û\8cساÙ\92 Ú©Ù\84Ù\9b Ø¨Û\8cÙ±Ø\8c Ø¯ Ø¢Ø®Ø±Û\8c {{PLURAL:$1|ساعٱت|$1 Ø³Ø§Ø¹Ù±ØªØ½Ø§}}.\nسÛ\8c Ù\86Ù\87اگÛ\8cرÛ\8c Ø¯ Ù±Ø²Û\8cٱت Ø¨Û\8cئÙ\86Ø\8c Ù\81Ù\82ٱت Û\8cاÙ\9b Ø±Ø§Ø²Û\8cÙ\86Ù± Ú¯Ù\88ئارسÙ\86 Ø¯ Ù±Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù± Ø¯ Ù\86Û\8a Ø²Ù\86Ù± Ø¨Û\8cÙ± Ø¯ Ù\87ٱر {{PLURAL:$1|ساعٱت|$1 Ø³Ø§Ø¹Ù±ØªØ½Ø§}} Ú©Ù\84Ù\9b Ø¨Û\8cÙ±.",
+       "mailerror": "خٱتا کلٛ بیئن ٱنجومانامٱ:$1",
        "acct_creation_throttle_hit": "سئل کاریا ئی ڤیکی تیرنئشوٙن آی پی شوما نە ڤئ کار گئرئتئنە د روٙز دئمایی {{PLURAL:$1|1 حئساڤ|$1 حئساڤیا}} نە رأڤأندیاری کئردئنە، و ڤئ د بیشتأروٙنە صئلا دأئنە د ئی دورە گاتی أنجوم بییە.\nد نأتیجە، سئل کاریایی کئ د ئی تیرنئشوٙن آی پی ڤئ کار گئرئتئنە نئمی توٙنئن حئساڤیا بیشتأری نە د ئی گات دوروس بأکأن.",
        "emailauthenticated": "تیرنئشوٙن أنجومانامە توٙ د $2 سی 3$ پوشت راسکاری بییە.",
-       "emailnotauthenticated": "تÛ\8cرÙ\86ئشÙ\88Ù\99Ù\86 Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Ø´Ù\88Ù\85ا ØªØ§ Ø¦Û\8cسئ Ù¾Ù\88شت Ø±Ø§Ø³ Ú©Ø§Ø±Û\8c Ù\86أبÛ\8cÛ\8cÛ\95.\nÙ\87Ø£Ù\86Û\8c Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Û\8cÛ\8c Ø³Û\8c Ø¦Û\8c Ú\86Û\8cا Ú©Ø¦ Ù\87اÙ\86 Ø±Û\8c Ù\86ئÙ\87ا Ú©Ø¦Ù\84 Ù\86أبÛ\8cÛ\8cÛ\95.",
-       "noemailprefs": "Û\8cئ Ú¯Ø¦Ù\84 ØªÛ\8cرÙ\86ئشÙ\88Ù\99Ù\86 Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Ø¯ Ú\86Û\8cا Ù\86ازار Ø´Ù\88Ù\85ا Ø³Û\8c Û\8cÛ\95 Ú©Ø¦ Ø¦Û\8c Ø®Ù\88صÙ\88Ù\99صÛ\8cأتÛ\8cا Ú©Ø§Ø± Ø¨Ø£Ú©Ø£Ù\86 Ø¦Ù\86تئخاڤ Ø¨Ø£Ú©Û\8cت.",
-       "emailconfirmlink": "تÛ\8cرÙ\86ئشÙ\88Ù\99Ù\86 Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 ØªÙ\88Ù\99Ù\86Û\95 Ù¾Ù\88شت Ø±Ø§Ø³Ú©Ø§Ø±Û\8c Ø¨Ø£Ú©Û\8cت",
-       "invalidemailaddress": "تیرنشۊن ٱنجومانامٱ قٱڤۊل بیئنی سی یٱ کاٛ چی د ڤیر و باڤٱر میا ڤ شیڤٱ خۊیی نی.\nلوتف بٱکیت یاٛ گئل تیرنشۊن چۊٱ دار نٱ بٱزنیت یا ای جاگٱ نٱ هالی بٱنیت.",
-       "cannotchangeemail": "تÛ\8cرÙ\86ئشÙ\88Ù\99Ù\86 Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Ø­Ø¦Ø³Ø§Ú¤ Ø¯ Ø¦Û\8c Ú¤Û\8cÚ©Û\8c Ø¢Ù\84ئشت Ú©Ø§Ø±Û\8c Ù\86أبÙ\88Ù\99Ø£.",
-       "emaildisabled": "ئÛ\8c Ø¯Û\8cارگÛ\95 Ù\86ئÙ\85Û\8c ØªÙ\88Ù\99Ù\86Û\95 Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 Ú©Ø¦Ù\84 Ø¨Ø£Ú©Û\95.",
-       "accountcreated": "حئساڤ راس بی",
+       "emailnotauthenticated": "تÛ\8cرÙ\86Ø´Ù\88Ý© Ù±Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù± Ø´Ù\85ا ØªØ§ Ø§Û\8cساÙ\92 Ù¾Ù\88شت Ø¯Û\8fرس Ú©Ø§Ø±Û\8c Ù\86اÙ\9bÛ\8cÛ\8cÙ±.\nÙ\87Ù\86Û\8c Ù±Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù± Û\8cÛ\8c Ø³Û\8c Ø§Û\8c Ú\86Û\8cا Ú©Ø§Ù\92 Ù\87اÙ\86 Ø±Û\8c Ù\86Ù\87ا Ú©Ù\84Ù\9b Ù\86اÙ\9bÛ\8cÛ\8cÙ±.",
+       "noemailprefs": "Û\8cاÙ\9b ØªÛ\8cرÙ\86Ø´Ù\88Ý© Ù±Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù± Ø¯ Ú\86Û\8cا Ù\86ازار Ø´Ù\85ا Ø³Û\8c Û\8cÙ± Ú©Ø§Ù\92 Ø§Ø½ Ø®Ù\88سÛ\8aسÛ\8cٱتؽا Ú©Ø§Ø± Ø¨Ù±Ú©Ù±Ù\86 Ø§Ù\92Ù\86تخاب Ø¨Ù±Ú©Ø½ت.",
+       "emailconfirmlink": "تÛ\8cرÙ\86Ø´Ù\88Ý© Ù±Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù± ØªÙ\88Ù\86اÙ\92 Ù¾Ù\88شت Ø±Ø§Ø³Ú©Ø§Ø±Û\8c Ø¨Ù±Ú©Ø½ت",
+       "invalidemailaddress": "تیرنشوݩ ٱنجومانامٱ قبۊل بیئنی نؽ سی یٱ کاْ چی د ڤیر ۉ باڤٱر مؽا ڤٱ شیڤٱ خۊیی نؽ.\nلوتف بٱکؽت یاٛ تیرنشوݩ چۊئٱ دار ناْ بٱزنؽت یا اؽ جاگٱ ناْ هالٛی باٛلٛؽت.",
+       "cannotchangeemail": "تÛ\8cرÙ\86Ø´Ù\88Ý© Ù±Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù± Ù\87ساÙ\88 Ø¯ Ø§Ø½ Ú¤Û\8cÚ©Û\8c Ø¢Ù\84شت Ú©Ø§Ø±Û\8c Ù\86Ù\85Û\8aئٱ.",
+       "emaildisabled": "اؽ Ø¯Ø½Ø§Ø±Ú¯Ù± Ù\86Ù\85ؽ ØªÙ\88Ù\86Ù± Ù±Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù± Ú©Ù\84Ù\9b Ø¨Ù±Ú©Ù±.",
+       "accountcreated": "هساو دۏرس بی",
        "accountcreatedtext": "حئساڤ کاریاری سی [[{{ns:کاریار}}:$1|$1]] ([[{{ns:کاریار چأک چئنە}}:$1|چأک چئنە]]) دوروس بییە.",
-       "createaccount-title": "حئساڤ سی {{SITENAME}} راس بی",
-       "createaccount-text": "Û\8cئ Ù\86Ø£Ù\81أر Ú¤Ø§ ØªÛ\8cرÙ\86ئشÙ\88Ù\99Ù\86 Ø£Ù\86جÙ\88Ù\85اÙ\86اÙ\85Û\95 ØªÙ\88Ù\99 Û\8cئ Ú¯Ø¦Ù\84 Ø­Ø³Ø§Ú¤ Ø±Ø§Ø³ Ú©Ø¦Ø±Ø¯Û\95 {{SITENAME}} ($4) Ù\88 Ø¦Ù\88سئ Ù\86Ù\88Ù\85ئشÛ\95 Ù\86Û\8cاÛ\95 \"$2\"Ø\8c Ú¤Ø§ Ø±Ø§Ø²Û\8cÙ\86Û\95 Ú¯Ù\88ڤاردئÙ\86 \"$3\".\nØ´Ù\88Ù\85ا Ù\87Ø£Ù\85Û\8c Ø¦Û\8cسئ Ø¨Ø§Û\8cأد Ø±Ù\88Û\8cÛ\8cت Ú¤Ø§Ù\85Û\8cÙ\86 Ù\88 Ø± Ø§Ø²Û\8cÙ\86Û\95 Ú¯Ù\88ڤاردئÙ\86 Ø®Ù\88تÙ\88Ù\99Ù\86Û\95 Ø¢Ù\84ئش Ú©Ø§Ø±Û\8c Ø¨Ø£Ú©Û\8cت.\n\nأر Ø´Ù\88Ù\85ا Ø¯ Ø¦Û\8c Ù¾Ø¦Û\8cغÙ\88Ù\85 Ø¦Ù\84تئÙ\81ات Ù\86Ø£Ú©Û\8cتØ\8c Ø¯ Ú¯Ø§Øª Ø±Ø£Ú¤Ø£Ù\86دÛ\8cارÛ\8c Ø¦Û\8c Ø­Ø¦Ø³Ø§Ú¤ Ø®Ø£Ø·Ø§ Ù¾Û\8cØ´ Ù\85Û\8cا.",
-       "login-throttled": "Ø´Ù\88Ù\85ا ØªØ§ Ø¦Û\8cسئ Ø³Û\8c Ú¤Ø§Ù\85Û\8cÙ\86 Ø¦Ù\88Ù\99Ù\85ائÙ\86 Ù\81ئرÛ\95 ØªØ¦Ù\84اش Ú©Ø¦Ø±Ø¯Û\8cتÛ\95.\n$1 Ù\84Ù\88Ø·Ù\81 Ø¨Ø£Ú©Û\8cت Ø³Û\8c ØªØ¦Ù\84اش Ù\87Ø£Ù\86Û\8c Ú¯Ù\88رÛ\8c Ø¨Ø¦Ø³Û\8cت.",
+       "createaccount-title": "هساو سی {{SITENAME}} دۏرس بی",
+       "createaccount-text": "Û\8cاÙ\9b Ù\86Ù±Ù\81ٱر Ú¤Ø§ ØªÛ\8cرÙ\86Ø´Ù\88Ý© Ù±Ù\86جÙ\88Ù\85اÙ\86اÙ\85Ù± ØªÙ\88 Û\8cاÙ\9b Ù\87ساÙ\88 Ø¯Û\8fرس Ú©Ø±Ø¯Ù± {{SITENAME}} ($4) Û\89 Ø§Û\8aساÙ\92 Ù\86Ù\88Ù\85شاÙ\92 Ù\86ؽاÛ\8cÙ± \"$2\"Ø\8c Ú¤Ø§ Ø±Ø§Ø²Û\8cÙ\86Ù± Ú¯Ù\88ئارسÙ\86 \"$3\".\nØ´Ù\85ا Ù\87اÙ\9b Ø§Û\8cساÙ\92 Ø¨Ø§Û\8cٱد Ø±Û\89Û\8cؽت Ú¤Ø§Ù\85ؽÙ\86 Û\89 Ø±Ø§Ø²Û\8cÙ\86Ù± Ú¯Ù\88ئارسÙ\86 Ø®Ù\88تÙ\88 Ù\86اÙ\92 Ø¢Ù\84شت Ú©Ø§Ø±Û\8c Ø¨Ù±Ú©Ø½Øª.\n\nٱر Ø´Ù\85ا Ú¤ Ø§Ø½ Ù¾Ø§Ù\9bغÙ\88Ù\85 Ø§Ù\92Ù\84تÙ\81ات Ù\86ٱکؽتØ\8c Ø¯ Ú¯Ø§Øª Ø±Ù±Ú¤Ù±Ù\86دؽارÛ\8c Ø§Ø½ Ù\87ساÙ\88 Ø®Ù±ØªØ§ Ù¾Û\8cØ´ Ù\85ؽا.",
+       "login-throttled": "Ø´Ù\85ا ØªØ§ Ø§Û\8cساÙ\92 Ø³Û\8c Ú¤Ø§Ù\85ؽÙ\86 Ø§Ù\88Ù\85اÛ\8cÙ\86 Ù\81رٱ ØªÙ±Ù\81رٱ Ú©Ø±Ø¯Ø½ØªÙ±.\n$1 Ù\84Ù\88تÙ\81 Ø¨Ù±Ú©Ø½Øª Ø³Û\8c ØªÙ±Ù\81رٱ Ù\87Ù\86Û\8c Ú¯Ø±Ø½ Ø¨Ø§Ù\9bسؽت.",
        "login-abort-generic": "ڤامین ئوٙمائن توٙ ناخوش سأرنجوم بی- گأن بی",
-       "login-migrated-generic": "حئساڤ کاریاری شوما جا ڤئ جا بییە، و نوم کاریاری شوما دە د ئی ڤیکی نیئش.",
-       "loginlanguagelabel": "زڤون:$1",
-       "suspicious-userlogout": "د حاست ڤئ دأر رأتئن شوما تیە پوشی بییە سی یە کئ ڤئ نأظأر یما کئ ڤئ سی یئ گئل دوڤارتە نیأر گأن یا یئ گئل پوروکسی کئ ها د ڤیرگە کأش کئل بییە.",
-       "createacct-another-realname-tip": "نوم راستأکی دئل ڤئ حاییە.\nأر شوما ڤئنە نئها ئمایە بأکیت، یە سی هوم نئسبأت دأئن کاریاری سی کاریاش ڤئ کار گئرئتئ بوٙە.",
+       "login-migrated-generic": "هساو کاریاری شما جا ڤ جا بیٱ، ۉ نوم کاریاری شما داٛ د اؽ ڤیکی نؽسش.",
+       "loginlanguagelabel": "زڤوݩ:$1",
+       "suspicious-userlogout": "د هاست ڤ دٱر رٱتن شما تیٱ پۊشی بیٱ سی یٱ کاْ ڤ نٱزٱر اؽما کاْ ڤٱ سی یاٛ دوئارتٱ نیٱر گٱن یا یاٛ پوروکسی کاْ ها د ڤیرگٱ کٱش کلٛ بیٱ.",
+       "createacct-another-realname-tip": "نوم راسٱکی دل بهایی ئٱ.\nٱر شما ڤٱ ناْ آمایٱ بٱکؽت، یٱ سی هوم نسبٱت داٛئن کاریاری سی کارؽاش ڤ کار گرتٱ مۊئٱ.",
        "pt-login": "ڤا مؽن اوماین",
-       "pt-login-button": "ڤامؽن اوماین",
+       "pt-login-button": "ڤا مؽن اوماین",
        "pt-createaccount": "هساو دۏرس بٱکؽت",
        "pt-userlogout": "د سامونٱ دروماین",
-       "php-mail-error-unknown": "خأطا نادیار د آلئشتگئر PHP's mail()",
-       "user-mail-no-addy": "سی کئل کئردئن أنجومانامە د یئ گئل أنجومانامە بی تیرنئشوٙن أنجومانامه تئلاش بییە.",
+       "php-mail-error-unknown": "خٱتا نادؽار د آلشتگٱر PHP's mail()",
+       "user-mail-no-addy": "سی کلٛ کردن ٱنجومانامٱ ڤ یاٛ ٱنجومانامٱ بؽ تیرنشوݩ ٱنجومانامٱ تلاش بیٱ.",
        "user-mail-no-body": "سی کئل کئردئن أنجومانامە ڤا مینوٙنە حالی یا کوچئک بییئن سی دألیل یا غئر مأنطئقی بییئن ڤئ تئلاش بأکیت.",
        "changepassword": "رارینە گوڤاردئن نە آلئشت بأکیت",
        "resetpass_announce": "سی تأموم کئردئن ڤامین ئوٙمائن، شوما بایأد یئ گئل رازینە گوڤاردئن هأنی نە بأزئنیت.",
        "preview": "پيش ساٛلٛ",
        "showpreview": "نشوݩ داٛئن پیش ساٛلٛ",
        "showdiff": "نشوݩ داٛئن آلشتکاریا",
-       "blankarticle": "<strong>زÙ\86ئار:</strong> Ø¨Ù\84Ú¯Ù\87 Ø§Û\8c Ú©Ù\87 Ø´Ù\85ا Ø¯Ø±Ù\88س Ú©Ø±Ø¯Û\8cتÙ\87 Ø­Ø§Ù\84Û\8cÙ\87.\nار Ø´Ù\85ا Ø¯ Ù\86Ù\88 Ø±Û\8c \"$1\" Ø¨Ù¾Ù\88رÙ\86Û\8cت, Ø¨Ù\84Ú¯Ù\87 Ù\88Ù\87 Ø´Ú©Ù\84 Ú©Ù\87 Ù\87Û\8cÚ\86 Ù\85Û\8cÙ\86Ù\88Ù\86Ù\87 Ø§Û\8c Ø¯Ø´ Ù\86با Ø¯Ø±Ù\88س Ø¨Ù\88ئÙ\87.",
-       "anoneditwarning": "<strong>زٱÙ\86Ú³Û\8cار:</strong> Ø´Ù\85ا Ù\87Ù\86Û\8c Ù\86Û\8fÙ\85اÛ\8cتٱ Ú¤Ø§Ù\85ؽÙ\86. ØªÛ\8cرÙ\86Ø´Ù\88Ý© Ø¢Û\8c Ù¾Û\8c Ø´Ù\85ا Ø³Û\8c Ù\87ٱر Ú¯Ø§ØªØ½ Ú©Ø§Ù\92 Ø¢Ù\84شتکارÛ\8c Ø¨Ù±Ú©Ø½Øª Ø³Û\8c Ú©Ù\88Ù\84Ù\9b Ø®Ù±Ù\84Ú© Ø¯Ø½Ø§Ø±Û\8c Ù\85ؽکٱ. Ù±Ø± <strong>[$1 Ø±Û\89ؽت Ú¤Ø§Ù\85ؽÙ\86]</strong> Û\8cا <strong>[$2 Û\8cاÙ\9b Ù\87ساÙ\88 Ú©Ø§Ø±Û\8cارÛ\8c Ø¯Û\8fرس Ø¨Ù±Ú©Ø½Øª]</strong>Ø\8c Ú¤Û\8cراÛ\8cشتؽا Ø´Ù\85ا Ú¤ Ù\86Ù\88Ù\85 Ú©Ø§Ø±Û\8cارÛ\8c Ø®Ù\88تÙ\88 Ø¯Ø½Ø§Ø±Û\8c Ù\85ؽکٱ Û\89 Ø³Û\8c Ø´Ù\85ا Ø¨Ø½ØªØ±Ù±.",
+       "blankarticle": "<strong>زÙ\86ئار:</strong> Ø¨Ù±Ù\84گاÙ\9bÛ\8cؽ Ø§Ù\92 Ø´Ù\85ا Ø¯Û\8fرس Ú©Ø±Ø¯Ø½ØªÙ± Ù\87اÙ\84Ù\9bÛ\8cÙ±.ٱر Ø´Ù\85ا Ø¯ Ù\86Û\8a Ø±Û\8c \"$1\" Ø¨Ù±Ù¾Û\8aرÙ\86ؽت, Ø¨Ù±Ù\84Ú¯Ù± Ú¤ Ø´Ú©Ù\84ؽ Ú©Ø§Ù\92 Ù\87Û\8cÚ\86 Ù\85Û\8cÙ\86Ù\88Ù\86اÙ\9bÛ\8cؽ Ø¯Ø´ Ù\86Û\8aئٱ Ø¯Û\8fرس Ù\85Û\8aئٱ.",
+       "anoneditwarning": "<strong>زٱنڳیار:</strong> شما هنی نۏمایتٱ ڤامؽن. تیرنشوݩ آی پی شما سی هٱر گاتؽ کاْ آلشتکاری بٱکؽت سی کولٛ خٱلک دؽاری مؽکٱ. ٱر <strong>[$1 رۉؽت ڤامؽن]</strong> یا <strong>[$2 یاٛ هساو کاریاری دۏرس بٱکؽت]</strong>، ڤیرایشؽا شما ڤ نوم کاریاری خوتو دؽاری مؽکٱ ۉ سی شما بؽترٱ.",
        "anonpreviewwarning": "<em>شوما نیوٙمایتە ڤامین. تیرنئشوٙن آی پی شوما د ڤیرگار ڤیرایئشت ئی بألگە ئمایە بوٙە.</em>",
        "missingsummary": "<strong>ڤیر دیارکو:</strong> شوما هأنی یئ گئل چئکئسە ڤیرایئشتی نە نئها ئمایە کاری نأکئردیتە.\nأر شوما د نۊ د ری \"$1\" بأپوٙرنیت، ڤیرایئشت کاری شوما حالی ئمایە بوٙە.",
-       "selfredirect": "<strong>Ù\87Ù\88شدار:</strong> Ø´Ù\88Ù\85ا Ø¯ Ø­Ø§Ù\84 Ù\88 Ø¨Ø§Ù\84 Ú¤Ø§Ú¯Ø£Ø±Ø¯Ù\88Ù\99Ù\86Û\8c Ø¦Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Ø¯ Ø®Ù\88Ø´ Ù\87Û\8cÛ\8cÙ\86.\nگاسÛ\8c Ø¯Ø§Ù\84 Ø¦Ø´ØªØ¦Ú¤Ø§Û\8cÛ\8c Ø³Û\8c Ú¤Ø§Ú¯Ø£Ø±Ø¯Ù\88Ù\99Ù\86Û\8c Ø¦Ù\86تئخاڤ Ú©Ø¦Ø±Ø¯Û\8cتÛ\95Ø\8c Û\8cا Ú¯Ø§Ø³Û\8c Ø¨Ø£Ù\84Ú¯Û\95 Ù\86Û\95 Ø¦Ø´ØªØ¦Ú¤Ø§Û\8cÛ\8c Ú¤Û\8cراÛ\8cئشت Ú©Ø§Ø±Û\8c Ù\85Û\8c Ú©Û\8cت.\nأر Ø±Û\8c \"$1\" Ø¯Û\8a Ú¯Ø¦Ù\84 Ø¨Ø£Ù¾Ù\88Ù\99رÙ\86Û\8cتØ\8c Ú¤Ø§Ú¯Ø£Ø±Ø¯Ù\88Ù\99Ù\86Û\8c Ø±Ø§Ø³ Ù\85Ù\88Ù\99Û\95.",
+       "selfredirect": "<strong>Ù\87Ù\88شدار:</strong> Ø´Ù\85ا Ø¯ Ù\87اÙ\84 Û\89 Ø¨Ø§Ù\84 Ú¤Ø§Ú¯Ù±Ø±Ø¯Ù\88Ù\86Û\8c Ø§Ø½ Ø¨Ù±Ù\84Ú¯Ù± Ø¯ Ø®Ù\88Ø´ Ù\87ؽسؽت.\nگاسؽ Ø¯Ø§Ù\84 Ø§Ù\92شتباÛ\8cÛ\8c Ø³Û\8c Ú¤Ø§Ú¯Ù±Ø±Ø¯Ù\88Ù\86Û\8c Ø§Ù\92Ù\86تخاب Ú©Ø±Ø¯Ø½ØªÙ±Ø\8c Û\8cا Ú¯Ø§Ø³Ø½ Ø¨Ù±Ù\84Ú¯Ù± Ù\86اÙ\92 Ø§Ù\92شتباÛ\8cÛ\8c Ú¤Û\8cراÛ\8cØ´ Ù\85ؽکؽت.\nٱر Ø±Û\8c \"$1\" Ø¯Û\8f Ú¯Ù\84Ù\9b Ø¨Ù±Ù¾Û\8aرÙ\86ؽتØ\8c Ú¤Ø§Ú¯Ù±Ø±Ø¯Ù\88Ù\86Û\8c Ø¯Û\8fرس Ù\85Û\8aئٱ.",
        "missingcommenttext": "لوطف بأکیت ئیچئ ڤیر و باڤأرئ خوتوٙنە بأنیست.",
        "missingcommentheader": "<strong>د ڤیر ڤونا:</strong> شوما هأنی یئ گئل داسوٙن/سأرڤأن سی ئی ڤیر و باڤأر نئها ئمایە نأکئردیتە.\nأر شوما یئ گئل هأنی ری \"$1\" بأپوٙرنیت، ڤیرایئشت کاری شوما حالی ئمایە بوٙە.",
        "summary-preview": "چئکئسە پیش سئیل:",
index 72d86c1..a1c9f17 100644 (file)
@@ -40,7 +40,8 @@
                        "Manvydasz",
                        "Fitoschido",
                        "Matěj Suchánek",
-                       "Vlad5250"
+                       "Vlad5250",
+                       "Naktis"
                ]
        },
        "tog-underline": "Nuorodos pabraukimas:",
        "accmailtext": "Atsitiktinai sukurtas naudotojo [[User talk:$1|$1]] slaptažodis nusiųstas į $2.\n\nŠios naujos paskyros slaptažodis gali būti pakeistas <em>[[Special:ChangePassword|keisti slaptažodį]]</em> puslapyje beprisijungiant.",
        "newarticle": "(Naujas)",
        "newarticletext": "Jūs patekote į dar neegzistuojantį puslapį.\nNorėdami sukurti puslapį, pradėkite rašyti žemiau esančiame įvedimo lauke\n(plačiau [$1 pagalbos puslapyje]).\nJei patekote čia per klaidą, paprasčiausiai spustelkite  naršyklės mygtuką '''atgal'''.",
-       "anontalkpagetext": "----\n<em>Tai yra anoniminio naudotojo, nesusikūrusio arba nenaudojančio paskyros, aptarimų puslapis.</em>\nDėl to naudojamas IP adresas jo identifikavimui.\nŠis IP adresas gali priklausyti keliems naudotojams.\nJeigu Jūs esate anoniminis naudotojas ir atrodo, kad komentarai nėra skirti Jums, [[Special:CreateAccount|sukurkite paskyrą]] arba [[Special:UserLogin|prisijunkite]], ir nebūsite tapatinamas su kitais anoniminiais naudotojais.",
+       "anontalkpagetext": "----\n<em>Tai yra anoniminio naudotojo, nesusikūrusio arba nenaudojančio paskyros, aptarimų puslapis.</em>\nTodėl, norėdami juos identifikuoti, turime naudoti skaitinį IP adresą.\nŠis IP adresas gali priklausyti keliems naudotojams.\nJei esate anoniminis vartotojas ir manote, kad jums buvo nukreipti nesusiję komentarai, prašome [[Special:CreateAccount|sukurkite paskyrą]] arba [[Special:UserLogin|prisijunkite]], išvengti ateities painiavos su kitais anoniminiais naudotojais.",
        "noarticletext": "Šiuo metu šiame puslapyje nėra jokio teksto.\nJūs galite [[Special:Search/{{PAGENAME}}|ieškoti šio puslapio pavadinimo]] kituose puslapiuose,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ieškoti susijusių įrašų] arba [{{fullurl:{{FULLPAGENAME}}|action=edit}} sukurti šį puslapį]</span>.",
        "noarticletext-nopermission": "Šiuo metu šiame puslapyje nėra jokio teksto.\nJūs galite [[Special:Search/{{PAGENAME}}|ieškoti šio puslapio pavadinimo]] kituose puslapiuose,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ieškoti susijusių įrašų]</span>, tačiau jūs neturite teisės sukurti šio puslapio.",
        "missing-revision": "Puslapio peržiūra #$1 pavadinto „{{FULLPAGENAME}}“ neegzistuoja.\n\nTai paprastai atsitinka kai pasenusi nuoroda veda į puslapį, kuris buvo ištrintas.\nInformaciją galima rasti [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
index 0fd0851..823e9d7 100644 (file)
        "rcfilters-savedqueries-already-saved": "Šie filtri jau ir saglabāti. Izmaini savus iestatījumus, lai izveidotu jaunu saglabāto filtru.",
        "rcfilters-restore-default-filters": "Atjaunot noklusētos filtrus",
        "rcfilters-clear-all-filters": "Noņemt visus filtrus",
-       "rcfilters-show-new-changes": "Skatīt jaunās izmaiņas",
+       "rcfilters-show-new-changes": "Skatīt jaunās izmaiņas kopš $1",
        "rcfilters-search-placeholder": "Filtrēt pēdējās izmaiņas (pārlūko vai sāc rakstīt)",
        "rcfilters-invalid-filter": "Nederīgs filtrs",
        "rcfilters-empty-filter": "Nav aktīvu filtru. Tiek rādītas visas izmaiņas.",
index e6e991b..da6e734 100644 (file)
        "viewpagelogs": "ഈ താളുമായി ബന്ധപ്പെട്ട രേഖകൾ കാണുക",
        "nohistory": "ഈ താളിന് നാൾവഴി ഇല്ല.",
        "currentrev": "ഇപ്പോഴുള്ള രൂപം",
-       "currentrev-asof": "$1 -ൽ നിലവിലുള്ള രൂപം",
+       "currentrev-asof": "$1-നു നിലവിലുള്ള രൂപം",
        "revisionasof": "$1-നു നിലവിലുണ്ടായിരുന്ന രൂപം",
        "revision-info": "$1-നു ഉണ്ടായിരുന്ന രൂപം സൃഷ്ടിച്ചത്:- {{GENDER:$6|$2}}$7",
        "previousrevision": "←പഴയ രൂപം",
        "passwordpolicies-policy-passwordnotinlargeblacklist": "രഹസ്യവാക്ക്, പരക്കെ ഉപയോഗിക്കപ്പെടുന്ന 1,00,000 രഹസ്യവാക്കുകളുടെ പട്ടികയിൽ ഉള്ളതാവരുത്.",
        "passwordpolicies-policyflag-forcechange": "ലോഗിൻ മാറ്റിയിരിക്കണം",
        "passwordpolicies-policyflag-suggestchangeonlogin": "ലോഗിൻ മാറ്റാൻ നിർദ്ദേശിക്കുന്നു",
-       "unprotected-js": "സുരക്ഷാകാരണങ്ങളാൽ സംരക്ഷണമില്ലാത്ത താളുകളിൽ നിന്നും ജാവാസ്ക്രിപ്റ്റ് എടുത്തുപയോഗിക്കാൻ കഴിയില്ല. ജാവാസ്ക്രിപ്റ്റ് താളുകൾ മീഡിയവിക്കി: നാമമേഖലയിലോ ഉപയോക്തൃ ഉപതാളായോ മാത്രം സൃഷ്ടിക്കുക"
+       "unprotected-js": "സുരക്ഷാകാരണങ്ങളാൽ സംരക്ഷണമില്ലാത്ത താളുകളിൽ നിന്നും ജാവാസ്ക്രിപ്റ്റ് എടുത്തുപയോഗിക്കാൻ കഴിയില്ല. ജാവാസ്ക്രിപ്റ്റ് താളുകൾ മീഡിയവിക്കി: നാമമേഖലയിലോ ഉപയോക്തൃ ഉപതാളായോ മാത്രം സൃഷ്ടിക്കുക",
+       "userlogout-continue": "താങ്കൾ പുറത്ത് കടക്കാൻ ആഗ്രഹിക്കുന്നുവെങ്കിൽ [$1 ലോഗ് ഔട്ട് താളിലേക്ക് തുടരുക].",
+       "userlogout-sessionerror": "സെഷൻ പിഴവ് ഉണ്ടായതിനാൽ ലോഗ് ഔട്ട് പരാജയപ്പെട്ടു. ദയവായി [$1 വീണ്ടും ശ്രമിക്കുക]."
 }
index 22ae6fc..bad97fa 100644 (file)
        "october-date": "ߞߏ߲ߓߌߕߌ߮$1",
        "november-date": "ߣߍߣߍߓߊ$1",
        "december-date": "ߞߏߟߌ߲ߞߏߟߌ߲$1",
-       "pagecategories": "{{PLURAL:$1|ߦߌߟߡߊ |ߦߌߟߡߊ ߟߎ߬ }}",
-       "category_header": "ߦߌߟߡߊ ߞߐߜߍ ߟߎ߬$1",
+       "pagecategories": "{{PLURAL:$1|ߦߌߟߡߊ|ߦߌߟߡߊ ߟߎ߬}}",
+       "category_header": "ߦߌߟߡߊ ߞߐߜߍ ߟߎ߬ $1",
        "subcategories": "ߝߊ߬ߓߏ߲߬ ߘߋ߬ߣߍ߲ ߠߎ߬",
-       "category-media-header": "ߟߊߛߋߢߊ ߦߌߟߡߊ ߣߌ߲߬ ߘߐ߫\"$1\"",
-       "hidden-categories": "{{PLURAL:$1|ߦߌߟߡߊ߫ ߘߏ߲߰ߣߍ߲ |ߦߌߟߡߊ߫ ߘߏ߲߰ߣߍ߲ ߠߎ߬}}",
+       "category-media-header": "ߟߊߛߋߢߊ ߦߌߟߡߊ ߣߌ߲߬ ߘߐ߫ \"$1\"",
+       "category-empty": "<em>ߞߐߜߍ߫ ߥߟߊ߫ ߟߊߛߋߢߊ߫ ߝߏߌ߫ ߕߍ߫ ߦߌߟߡߊ ߣߌ߲߬ ߞߣߐ߫ ߕߋ߲߬ߕߋ߲߬.</em>",
+       "hidden-categories": "{{PLURAL:$1|ߦߌߟߡߊ߫ ߘߏ߲߰ߣߍ߲|ߦߌߟߡߊ߫ ߘߏ߲߰ߣߍ߲ ߠߎ߬}}",
        "category-subcat-count": "{{PLURAL:$2|ߦߟߊߡߊߙߋ߲ ߣߌ߲߬ ߠߎ߫ ߜߊ߲߰ߛߊ߲ ߠߋ߫ ߦߋ߫ ߦߌߟߡߊ ߣߌ߲߬ ߘߐ߫.|ߦߌߟߡߊ ߣߊ߬ߕߐ ߟߎ߬ ߘߐ߫߸ {{PLURAL:$1|ߦߌߟߡߊߙߋ߲|$1 ߦߌߟߡߊߙߋ߲ ߠߎ߬}} ߟߋ߬ ߦߴߊ߬ ߘߐ߫߸ ߞߙߎߞߙߍ ߟߎ߬ ߞߐߞߊ߲߬ $2}}",
        "category-article-count": "{{PLURAL:$2|ߞߐߜߍ ߣߌ߲߬ ߘߐߙߐ߲߫ ߠߋ߬ ߦߋ߫ ߦߌߟߡߊ ߣߌ߲߬ ߘߐ߫.|ߖߡߊ߬ߦߊ߫ ߕߐ߮ ߣߊ߬ߕߊ {{PLURAL:$1|ߞߐߜߍ ߦߋ߫|$1 ߞߐߜߍ ߦߋ߫}} ߟߋ߬ ߦߋ߫ ߦߌߟߡߊ߫ ߘߌ߫߸ ߞߙߎߞߙߍ $2 ߞߐߞߊ߲߬}}",
        "category-file-count": "{{PLURAL:$2||ߞߐߕߐ߮ ߣߌ߲߬ ߜߊ߲߰ߛߊ߲ ߠߋ߫ ߦߋ߫ ߦߌߟߡߊ ߣߌ߲߬ ߘߐ߫.ߡߍ߲ ߠߎ߬ ߦߋ߫ ߣߌ߲߬ |{{PLURAL:$1||ߞߐߕߐ߮ ߦߋ߫|$1 ߞߐߕߐ߮ ߟߎ߬ ߦߋ߫}} ߦߌߟߡߊ ߣߌ߲߬ ߘߐ߫߸ ߞߙߎߞߙߍ ߣߌ߲߬ ߕߴߊ߬ ߘߐ߫2$.}}",
        "listingcontinuesabbrev": "ߖߊ߬ߕߋ߬ߘߊ",
        "index-category": "ߞߐߜߍ߫ ߓߊߕߐ߲ߛߐ߲ ߠߎ߬",
        "noindex-category": "ߞߐߜߍ߫ ߘߐߕߐ߲ߛߐ߲ߦߊߓߊߟߌ ߟߎ߬",
+       "broken-file-category": "ߞߐߕߐ߯ ߕߌߢߍߣߍ߲߫ ߛߘߌ߬ߜߋ߲߬ ߞߐߜߍ ߟߎ߬",
        "about": "ߡߊ߬ߘߎ߮",
        "newwindow": "(ߊ߬ ߟߊߞߊ߬ ߝߢߐߘߊ߫ ߞߎߘߊ߫ ߟߊ߫)",
        "cancel": "ߊ߬ ߘߐߛߊ߬",
        "mytalk": "ߞߎߡߊ",
        "anontalk": "ߢߊߝߐߞߣߍ",
        "navigation": "ߛߏ߲߯ߓߊߟߌ",
-       "and": "ߊ߬ ߣߌ߫",
+       "and": "&#32;ߊ߬ ߣߌ߫",
        "actions": "ߞߍߟߌ ߟߎ߬",
        "namespaces": "ߕߐ߮ ߞߣߍ",
        "variants": "ߞߊ߲ߓߏߟߏ߲ ߠߎ߬",
        "navigation-heading": "ߛߏ߲߯ߓߊߟߌ߫ ߓߏߟߏ߲ߘߊ",
        "errorpagetitle": "ߝߎ߬ߕߎ߲߬ߕߌ",
-       "returnto": "ߌ ߞߐߛߊ߬ߦߌ߲߬ ߦߊ߲߬ ߡߊ߬$1",
-       "tagline": "ߞߊ߬ ߝߘߊ߫{{SITENAMEP}}",
+       "returnto": "ߌ ߞߐߛߊ߬ߦߌ߲߬ ߦߊ߲߬ ߡߊ߬ $1.",
+       "tagline": "ߞߊ߬ ߝߘߊ߫ {{SITENAMEP}}",
        "help": "ߘߍ߬ߡߍ߲߬ߠߌ",
        "help-mediawiki": "ߘߍ߬ߡߍ߲߬ߠߌ߲ ߞߊ߬ ߓߍ߲߬ ߥߞߌ-ߟߊߛߋߢߊߥߙߍ ߡߊ߬",
        "search": "ߢߌߣߌ߲ߠߌ",
        "viewtalkpage": "ߢߊߝߐߞߣߍ ߞߐߜߍ ߘߐߜߍ߫",
        "otherlanguages": "ߞߊ߲ ߜߘߍ߫ ߟߎ߫ ߘߐ߫",
        "redirectedfrom": "(ߌ ߟߊߞߎ߲߬ߛߌ߲߬ߣߍ߲߫ ߞߊ߬ ߓߐ߫ $1)",
+       "redirectpagesub": "ߞߐߜߍ߫ ߟߊߞߎ߲߬ߛߌ߲߬ߣߍ߲",
        "redirectto": "ߌ ߓߘߊ߫ ߟߊߞߎ߲߬ߛߌ߲߫ ߦߊ߲߬ ߠߊ߫:",
        "lastmodifiedat": "ߞߐߜߍ ߣߌ߲߬ ߡߊߦߟߍ߬ߡߊ߲߬ ߟߊߓߊ߲ ߞߍ߫ ߘߊ߫ $1߸ $2",
        "protectedpage": "ߞߐߜߍ߫ ߡߊߞߊ߲ߞߊ߲ߣߍ߲",
        "pool-errorunknown": "ߝߌ߬ߟߌ߬ ߛߎ߲߫ ߟߐ߲ߓߊߟߌ",
        "poolcounter-usage-error": "ߟߊߓߊ߯ߙߊߟߌ߫ ߝߟߌ $1",
        "aboutsite": "ߞߊ߬ ߓߍ߲߬ {{SITENAME}}",
-       "aboutpage": "Project:About",
-       "copyrightpage": "{{ns:project}}: ߛߓߍߦߟߊ ߤߊߞߍ",
+       "aboutpage": "Project:ߞߊ߬ ߓߍ߲߬",
+       "copyrightpage": "{{ns:project}}:ߛߓߍߦߟߊ ߤߊߞߍ",
        "currentevents": "ߞߍߞߎߘߊ ߡߍ߲ ߠߎ߫ ߛߋ߲߬ߠߊ߫",
        "currentevents-url": "Project:ߞߍߞߎߘߊ ߡߍ߲ ߠߎ߫ ߛߋ߲߬ߠߊ߫",
        "disclaimers": "ߖߊ߲߬ߘߐ߬ߓߌ߬ߟߊ߬ߟߌ ߟߎ߬",
-       "disclaimerpage": "Project: ߖߊ߲߬ߘߐ߬ߓߌ߬ߟߊ߬ߟߌ ߡߎ߰ߡߍ",
+       "disclaimerpage": "Project:ߖߊ߲߬ߘߐ߬ߓߌ߬ߟߊ߬ߟߌ ߡߎ߰ߡߍ",
        "edithelp": "ߡߊ߬ߦߟߍ߬ߢߊ߲߬ߠߌ߲ ߘߍ߬ߡߍ߲߬ߠߌ߲",
        "helppage-top-gethelp": "ߘߍ߬ߡߍ߲߬ߠߌ",
        "mainpage": "ߓߏ߬ߟߏ߲߬ߘߊ",
        "privacy": "ߘߎ߲߬ߘߎ߬ߡߊ߬ ߤߊߞߍ",
        "privacypage": "Project:ߞߊ߬ ߓߍ߲߬ ߘߎ߲߬ߘߎ߬ߡߊ߬ ߤߊߞߍ ߡߊ߬",
        "ok": "ߏ߬ߞߍ߫",
-       "retrievedfrom": "ß\8a߬ ß¡ß\8aß\9dß\8dߣß\8d߲߫ ß¦ß\8a߲߬ ß\93ß\8aß«$1",
+       "retrievedfrom": "ß\8a߬ ß\9fß\8aß\9bß\90߬ß\98ß\90߲߬ ß¦ß\8a߲߬ \"$1\"",
        "youhavenewmessages": "{{PLURAL:$3|ߌ ߓߘߊ߫ ߗߋߛߓߍ߫ ߞߎߘߊ ߛߐ߬ߘߐ߲߬$1  $2 }}",
+       "newmessageslinkplural": "{{PLURAL:$1|ߗߋߛߓߍ߫ ߞߎߘߊ߫|999=ߗߋߛߓߍ߫ ߞߎߘߊ߫ ߟߎ߫}}",
+       "newmessagesdifflinkplural": "{{PLURAL:$1|ߡߝߊ߬ߟߋ߲߬ߠߌ߲|999=ߡߝߊ߬ߟߋ߲߬ߠߌ߲ ߠߎ߬}} ߞߐ߯ߟߕߊ.",
        "youhavenewmessagesmulti": "ߌ ߓߘߊ߫ ߗߋߛߓߍ߫ ߞߎߘߊ ߛߐ߬ߘߐ߲߬ $1 ߞߣߐ߫",
        "editsection": "ߊ߬ ߡߊߦߟߍ߬ߡߊ߲߫",
        "editold": "ߡߊߦߟߍ߬ߡߊ߲߬",
        "userlogin-remembermypassword": "ߒ ߜߊ߲߬ߞߎ߲߬ߣߍ߲ ߕߏ߫ ߞߘߊߎ߫",
        "login": "ߌ ߜߊ߲߬ߞߎ߲߬",
        "userlogin-noaccount": "ߖߊ߬ߕߋ߬ߘߊ߬ ߕߴߌ ߓߟߏ߫ ߓߊ߬؟",
-       "userlogin-joinproject": "ߘߏ߫ ߟߊߞߊ߬",
+       "userlogin-joinproject": "ߘߏ߫ ߟߊߞߊ߬ {{SITENAME}}",
        "createaccount": "ߖߊ߬ߕߋ߬ߘߊ ߘߏ߫ ߟߊߞߊ߬",
        "userlogin-resetpassword-link": "ߌ ߟߊ߫ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߓߘߊ߫ ߓߐ߫ ߌ ߞߣߐ߫؟",
        "userlogin-helplink2": "ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߘߍ߬ߡߍ߲߬ߠߌ߲",
        "createacct-emailoptional": "ߢߎߡߍߙߋ߲߫ ߞߏ߲ߘߏ",
        "createacct-email-ph": "ߌ ߟߊ߫ ߢߎߡߍߙߋ߲߫ ߞߏ߲ߘߏ ߟߊߘߏ߲߬",
        "createacct-submit": "ߖߊ߬ߕߋ߬ߘߊ ߘߏ߫ ߘߊߦߟߍ߬",
-       "createacct-benefit-heading": "ߛߌ߲ߘߌߣߍ߲߫ ߦߴߌ ߢߐ߲߭ ߡߐ߱ ߟߎ߬ ߟߋ߬ ߓߟߏ߫",
+       "createacct-benefit-heading": "{{SITENAME}} ߛߌ߲ߘߌߣߍ߲߫ ߦߴߌ ߢߐ߲߭ ߡߐ߱ ߟߎ߬ ߟߋ߬ ߓߟߏ߫",
        "createacct-benefit-body1": "{{PLURAL:$1|ߊ߬ ߡߊߦߟߍ߬ߡߊ߲߬|ߊ߬ߟߎ߬ ߡߊߦߟߍ߬ߡߊ߲߬}}",
        "createacct-benefit-body2": "$1 {{PLURAL:$1|ߘߐߜߍ|ߞߐߜߍ ߟߎ߬}}",
        "createacct-benefit-body3": "ߕߊ߬ߡߌ߲߬ߣߍ߲߬ ߞߎߘߊ {{PLURAL:$1|ߓߟߏߓߌߟߊߢߐ߲߮ߞߊ߲ߠߊ|ߓߟߏߓߌߟߊߢߐ߲߮ߞߊ߲ߠߊ ߟߎ߬}}",
        "preview": "ߊ߬ ߘߐߜߍ߫ ߡߎߣߎ߲߬",
        "showpreview": "ߢߍߦߋߟߌ ߘߐߜߍ߫",
        "showdiff": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ ߠߎ߫ ߦߌ߬ߘߊ߬",
-       "anoneditwarning": "<strong>Warning:</strong> ߌ ߜߊ߲߬ߞߎ߲߬ߣߍ߲߬ ߕߍ߫.ߌ ߓߊ߯ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߛߎ߯-ߎ߯-ߛߎ߫ ߞߍ߫߸ ߌ ߟߊ߫ IP ߛߊ߲߬ߓߊ߬ߕߐ߮ ߘߌ߫ ߞߍ߫ ߦߋߕߊ ߘߌ߫.ߣߴߌ ߞߊ߬ ߜߊ߲߬ߞߎ߲߬ߠߌ߲߬ ߖߐ߲ߖߐ߲ ߞߍ߫ <strong>[$1 log in]</strong> or <strong>[$2 create an account]</strong> ߌ ߟߊ߫ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߣߍ߲ ߠߎ߬ ߘߌ߫ ߓߌ߬ߟߊ߬ ߌ ߜߊ߲߬ߞߎ߲߬ ߕߐ߮ ߟߊ߫߸ ߊ߬ ߣߌ߫ ߣߝߊ߬ ߜߘߍ߫ ߟߎ߫.",
+       "anoneditwarning": "<strong>Warning:</strong> ߌ ߜߊ߲߬ߞߎ߲߬ߣߍ߲߬ ߕߍ߫.ߌ ߓߊ߯ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߛߎ߯-ߎ߯-ߛߎ߫ ߞߍ߫߸ ߌ ߟߊ߫ IP ߛߊ߲߬ߓߊ߬ߕߐ߮ ߘߌ߫ ߞߍ߫ ߦߋߕߊ ߘߌ߫.ߣߴߌ ߞߊ߬ ߜߊ߲߬ߞߎ߲߬ߠߌ߲߬ ߖߐ߲ߖߐ߲ ߞߍ߫ ߕߎ߬ߡߊ ߡߍ߲ <strong>[$1 log in]</strong> or <strong>[$2 create an account]</strong> ߌ ߟߊ߫ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߣߍ߲ ߠߎ߬ ߘߌ߫ ߓߌ߬ߟߊ߬ ߌ ߜߊ߲߬ߞߎ߲߬ ߕߐ߮ ߟߊ߫߸ ߊ߬ ߣߌ߫ ߣߝߊ߬ ߜߘߍ߫ ߟߎ߫.",
        "loginreqlink": "ߌ ߜߊ߲߬ߞߎ߲߬",
-       "newarticletext": "ߌ ߓߘߊ߫ ߛߘߌ߬ߜߋ߲ ߘߏ߫ ߟߊߓߊ߬ߕߏ߬ ߞߐߜߍ ߘߏ߫ ߘߐ߫߸ ߡߍ߲ ߕߴߦߋ߲߬ ߡߎߣߎ߲߬.\nߣߵߌ ߦߴߊ߬ ߝߍ߫ ߞߊ߬ ߞߐߜߍ ߘߏ߫ ߟߊߘߊ߲߫߸ ߛߓߍߟߌ ߘߊߡߌ߬ߣߊ߬ ߘߎ߰ߟߊ ߘߐ߫ (ߞߊ߬ [$1 ߘߍ߬ߡߍ߲߬ߠߌ߲ ߞߐߜߍ] ߦߋ߫߸ ߖߐ߲߬ߛߊ߬ ߌ ߘߌ߫ ߞߌ߬ߓߊ߬ߙߏ߬ ߖߐ߲ߖߐ߲ ߛߐ߬ߘߐ߲߬). ߣߵߌ ߘߏ߲߬ ߞߍ߫ ߘߊ߫ ߦߊ߲߬ ߝߎ߬ߕߎ߲߬ߕߌ߬ ߓߟߏߡߊ߬߸ ߌ ߟߊ߫ ߛߏ߲߯ߓߊߟߊ߲ <strong>back</strong> ߛߐ߲߬ߞߌ߲߫.",
-       "noarticletext": "ߛߓߍߟߌ߫ ߛߌ߫ ߕߍ߫ ߞߐߜߍ ߣߌ߲߭ ߞߊ߲߬ ߕߋ߲߫. ߌ ߘߌ߫ ߛߋ߫ ߞߐߜߍ ߣߌ߲߬ [[Special:Search/{{PAGENAME}}|search for this page title]] ߕߐ߮ ߢߌߣߌ߲߫ ߠߊ߫ ߞߐߜߍ ߕߐ߭ ߟߎ߬ ߘߐ߫߸ <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs]߸ ߥߟߊ߫ [{{fullurl:{{FULLPAGENAME}}|action=edit}} create this page]</span>.",
+       "newarticletext": "ߌ ߓߘߊ߫ ߛߘߌ߬ߜߋ߲ ߘߏ߫ ߟߊߓߊ߬ߕߏ߬ ߞߐߜߍ ߘߏ߫ ߘߐ߫߸ ߡߍ߲ ߕߴߦߋ߲߬ ߡߎߣߎ߲߬.\nߣߵߌ ߦߴߊ߬ ߝߍ߫ ߞߊ߬ ߞߐߜߍ ߘߏ߫ ߟߊߘߊ߲߫߸ ߛߓߍߟߌ ߘߊߡߌ߬ߣߊ߬ ߘߎ߰ߟߊ߬ߘߐ߫ ߞߏ߲ߘߏ ߘߐ߫ (ߞߊ߬ [$1 ߘߍ߬ߡߍ߲߬ߠߌ߲ ߞߐߜߍ] ߦߋ߫߸ ߖߐ߲߬ߛߊ߬ ߌ ߘߌ߫ ߞߌ߬ߓߊ߬ߙߏ߬ ߖߐ߲ߖߐ߲ ߛߐ߬ߘߐ߲߬). ߣߵߌ ߘߏ߲߬ ߞߍ߫ ߘߊ߫ ߦߊ߲߬ ߝߎ߬ߕߎ߲߬ߕߌ߬ ߓߟߏߡߊ߬߸ ߌ ߟߊ߫ ߛߏ߲߯ߓߊߟߊ߲ <strong>back</strong> ߛߐ߲߬ߞߌ߲߫.",
+       "noarticletext": "ߛߓߍߟߌ߫ ߛߌ߫ ߕߍ߫ ߞߐߜߍ ߣߌ߲߭ ߞߊ߲߬ ߕߋ߲߫. ߌ ߘߌ߫ ߛߋ߫ ߞߐߜߍ ߣߌ߲߬ \n [[Special:Search/{{PAGENAME}}|search for this page title]] ߕߐ߮ ߢߌߣߌ߲߫ ߠߊ߫ ߞߐߜߍ ߕߐ߭ ߟߎ߬ ߘߐ߫߸  \n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} create this page]</span>.",
        "noarticletext-nopermission": "ߛߓߍߟߌ߫ ߛߌ߫ ߕߍ߫ ߞߐߜߍ ߣߌ߲߭ ߞߊ߲߬ ߕߋ߲߫.\nߌ ߘߌ߫ ߛߋ߫ [[Special:Search/{{PAGENAME}}|search for this page title]] ߢߌߣߌ߲߫ ߠߊ߫ ߞߐߜߍ ߕߐ߭ ߟߎ߬ ߘߐ߫߸ ߥߟߊ߫ <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs]</span> ߞߏ߬ߣߌ߲߬ ߘߌ߬ߢߍ߬ ߞߍߣߍ߲߫ ߕߴߌ ߡߊ߬ ߞߐߜߍ߫ ߣߌ߲߬ ߠߊߞߊ߭ ߘߐ߫.",
-       "userpage-userdoesnotexist-view": "ߟߊ߬ߓߊ߰ߙߊ߬ ߖߊߕߋߘߊ \"$1\"ߟߊߞߎ߲߬ߘߎ߬ߣߍ߲߫ ߕߍ߫.",
-       "previewnote": "<strong>ߌ ߖߊ߲߬ߓߌ߬ߟߊ߬ ߞߏ߫ ߣߌ߲߬ ߦߋ߫ ߢߍߝߟߍߟߌ ߘߐߙߐ߲߫ ߠߋ߬ ߘߌ߫. </strong> ߌ ߟߊ߫ ߡߝߊ߬ߟߋ߲߬ߠߌ ߟߎ߫ ߡߊ߫ ߟߊߞߎ߲߬ߘߎ߬ ߝߟߐ߫ ߘߋ߬ ߹",
+       "userpage-userdoesnotexist-view": "ߟߊ߬ߓߊ߰ߙߊ߬ ߖߊߕߋߘߊ \"$1\" ߟߊߞߎ߲߬ߘߎ߬ߣߍ߲߫ ߕߍ߫.",
+       "previewnote": "<strong>ߌ ߖߊ߲߬ߓߌ߬ߟߊ߬ ߞߏ߫ ߣߌ߲߬ ߦߋ߫ ߢߍߝߟߍߟߌ ߘߐߙߐ߲߫ ߠߋ߬ ߘߌ߫.</strong>\nߌ ߟߊ߫ ߡߝߊ߬ߟߋ߲߬ߠߌ ߟߎ߫ ߡߊ߫ ߟߊߞߎ߲߬ߘߎ߬ ߝߟߐ߫ ߘߋ߬߹",
        "continue-editing": "ߥߊ߫ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߬ ߞߣߍ ߞߊ߲߬",
        "editing": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߦߋ߫ ߛߋ߲߬ߠߊ߫ $1",
        "creating": "$1 ߛߌ߲ߘߟߌ ߦߋ߫ ߛߋ߲߬ߠߊ߫",
-       "editingsection": "(ߛߌ߰ߘߊ߬)$1 ߡߊߦߟߍ߬ߡߊ߲ ߦߋ߫ ߛߋ߲߬ߠߊ߫",
+       "editingsection": "(ߛߌ߰ߘߊ߬) $1 ߡߊߦߟߍ߬ߡߊ߲ ߦߋ߫ ߛߋ߲߬ߠߊ߫",
        "templatesused": "{{PLURAL:$1|ߞߙߊߞߏ|ߞߙߊߞߏ ߟߎ߫}} ߟߎ߫ ߟߊߓߊ߯ߙߊ߫ ߘߊ߫ ߞߐߜߍ ߣߌ߲߬ ߘߐ߫",
        "template-protected": "(ߊ߬ ߟߊߞߊ߲ߘߊߣߍ߲ ߠߋ߬)",
        "template-semiprotected": "(ߟߊ߬ߞߊ߲߬ߘߊ߬ߟߌ-ߝߊ߲߬ߞߋ߬ߟߋ߲߬ߡߊ)",
        "hiddencategories": "ߞߐߜߍ ߣߌ߲߬ ߦߋ߫ ߢߌ߲߬ ߠߎ߫ ߛߌ߲߬ߝߏ߲ ߠߋ߬ ߘߌ߫{{PLURAL:$1|}}",
        "permissionserrors": "ߝߌ߬ߟߌ߫ ߘߌ߬ߢߍ߬ߒߧߋ",
        "permissionserrorstext-withaction": "ߟߊ߬ߘߌ߬ߢߍ߬ߟߌ߬ ߛߌ߫ ߕߴߌ ߦߋ߫ ߞߊ߬ $2߸ {{PLURAL:$1|ߞߏߛߐ߲߬|ߟߎ߬ ߞߏߛߐ߲߬}}",
+       "recreate-moveddeleted-warn": "<strong>ߌ ߖߊ߲߬ߕߏ߫: ߌ ߦߋ߫ ߞߐߜߍ ߘߏ߫ ߟߋ߬ ߟߊߘߊ߲߫ ߞߏ ߘߐ߫ ߣߌ߲߬߸ ߡߍ߲ ߖߏ߬ߛߌ߬ߣߍ߲߬ ߡߎߣߎ߲߬.</strong> \nߌ ߓߛߌ߬ߞߌ߬ ߕߐ߫ ߟߋ߬ ߛߍ߲߸ ߣߴߌ ߘߌ߫ ߛߋ߫ ߞߐߜߍ ߣߌ߲߬ ߡߊߦߟߍ߬ߡߊ߲ ߘߊߓߊ߲߫ ߠߊ߫. \nߞߐߜߍ ߣߌ߲߬ ߦߟߌߣߐ ߖߏ߬ߛߌ߬ߣߍ߲ ߣߴߊ߬ ߛߋ߲߬ߓߐ߬ߣߍ߲ ߠߎ߬ ߡߊߘߊ߲ߣߍ߲߫ ߦߊ߲߬ ߠߋ ߟߊ߬ߣߐ߰ߦߊ߬ߟߌ ߘߌ߫:",
+       "moveddeleted-notice": "ߞߐߜߍ ߣߌ߲߬ ߓߘߊ߫ ߖߏ߬ߛߌ߬.\nߖߏ߬ߛߌ߬ߟߌ߸ ߟߊ߬ߞߊ߲߬ߘߊ߬ߟߌ߸ ߊ߬ ߣߌ߫ ߞߐߜߍ ߛߓߍߟߌ ߟߎ߬ ߛߋ߲߬ߓߐ߸ ߏ߬ ߟߎ߫ ߓߍ߯ ߡߊߛߐߣߍ߲߫ ߦߋ߫ ߘߎ߰ߟߊ ߘߐ߫.",
        "content-model-wikitext": "ߥߞߌ߫ ߞߟߏߜߍ",
        "viewpagelogs": "ߞߐߜߍ ߣߌ߲߬ ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߠߎ߬ ߦߋ߫",
        "currentrev-asof": "$1 ߟߊ߫ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߕߊ߬ߡߌ߲߬ߣߍ߲",
        "revisionasof": "ߊ߬ ߡߊߛߊ߬ߦߌ߲ ߦߊ߲߬ ߓߊ߫ 1$",
        "revision-info": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߣߍ߲߫ $1 ߟߋ߬ ߓߟߏ߫ {{GENDER:$6|$2}}$7",
        "previousrevision": "→ ߡߊ߬ߛߊ߬ߦߌ߲߬ߠߌ߲ ߞߘߐ߬ߡߊ߲",
-       "nextrevision": "ß¡ß\8a߬ß\9bß\8b߬ߦß\8c߲߬ߣß\8d߲߬ ß\9eß\8eß\98ß\8a â\86\92",
+       "nextrevision": "ß¡ß\8a߬ß\9bß\8b߬ߦß\8c߲߬ߣß\8d߲߬ ß\9eß\8eß\98ß\8a â\86\90",
        "currentrevisionlink": "ߡߊ߬ߛߊ߬ߦߌ߲߬ߠߌ߲ ߕߊ߬ߡߌ߲߬ߣߍ߲",
        "cur": "ߞߍߞߎߘߊ",
        "last": "ߢߍߕߊ",
        "history-feed-title": "ߡߊ߬ߛߊ߬ߦߌ߲߬ߠߌ߲ ߘߐ߬ߝߐ",
        "history-feed-description": "ߞߐߜߍ ߣߌ߲߬ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߘߐ߬ߝߐ߸ ߥߞߌ ߘߐ߫",
        "rev-delundel": "ߊ߬ ߦߋߢߊ ߡߊߦߟߍ߬ߡߊ߲߫",
+       "mergelog": "ߥߴߌ ߜߊ߲߬ߞߎ߲߬",
        "history-title": "$1 ߡߛߊ߬ߦߌ߲߬ߠߌ߲ ߘߐ߬ߝߐ",
        "difference-title": "ߘߊ߲߬ߝߘߊ߬ߓߐ ߡߍ߲ ߦߋ߫ ߡߛߊ߬ߦߌ߲߬ߠߌ߲ $1 ߕߍ߫",
-       "lineno": "$1 ߛߌ߬ߕߊߙߌ",
+       "lineno": "$1 ߛߌ߬ߕߊߙߌ:",
        "compareselectedversions": "ߘߟߊߡߌߘߊ߫ ߛߎߥߊ߲ߘߌߣߍ߲ ߠߎ߬ ߟߊߢߐ߲߯ߡߊ߫",
        "editundo": "ߊ߬ ߘߐߛߊ߬߸ ߊ߬ ߓߟߏߞߊ߬߸ ߊ߬ ߓߙߐߕߐ߫",
-       "diff-empty": "ߝߊߙߊ߲ߝߊ߯ߛߌ߫ ߕߴߊ߬ߟߎ߬ ߕߍ߫",
+       "diff-empty": "(ߝߊߙߊ߲ߝߊ߯ߛߌ߫ ߕߴߊ߬ߟߎ߬ ߕߍ߫)",
        "diff-multi-sameuser": "({{PLURAL:$1|One intermediate revision|$1 intermediate revisions}} ߟߊ߬ߓߊ߰ߙߊ߬ ߞߋߟߋ߲ ߓߟߏ߫߸ ߏ߬ ߡߊ߫ ߦߌ߬ߘߊ߬)",
        "searchresults": "ߢߌߣߌ߲ߠߌ߲ ߞߐߝߟߌ ߟߎ߬",
-       "searchresults-title": "ߢß\8cߣß\8c߲ߠß\8cß² ß\9eß\90ß\9dß\9fß\8c$1",
+       "searchresults-title": "ߢß\8cߣß\8c߲ߠß\8cß² ß\9eß\90ß\96ß\8bß\93ß\8c \"$1\"",
        "prevn": "ߕߊ߬ߡߌ߲߬ߣߍ߲ ߠߎ߬ {{PLURAL:$1|$1}}",
        "nextn": "$1{{PLURAL:$1|ߟߊߕߎ߲߰ߠߊ}}",
        "prevn-title": "ߢߝߍߕߊ $1 {{PLURAL:$1|result|results}}",
-       "nextn-title": "ߢߍߕߊ$1{{PLURAL:$1|ߞߐߖߋߓߌ}}",
+       "nextn-title": "ߢߍߕߊ $1 {{PLURAL:$1|ߞߐߖߋߓߌ}}",
        "shown-title": "ߦߌߘߊߞߊ߬ $1{{PLURAL:$1|ߞߐߝߟߌ |ߞߐߝߟߌ ߟߎ߬ }} ߞߐߜߍ߫ ߞߋ߬ߟߋ߲߬ߞߋ߬ߟߋ߲߬ߠߊ",
        "viewprevnext": "($1 {{int:pipe-separator}} $2) ($3) ߦߋ߫",
        "searchmenu-exists": "</strong> ߞߐߜߍ ߘߏ߫ ߕߐ߯ ߦߋ߫ ߞߏ߫  \"[[:$1]]\" ߥߞߌ ߣߌ߲߬ ߘߐ߫.</strong> {{PLURAL:$2|0=|See also the other search results found.}}",
        "searchprofile-everything-tooltip": "ߊ߬ ߞߣߐߘߐ ߓߍ߯ ߢߌߣߌ߲߫ (ߤߊߟߌ߬ ߞߎߡߊߢߐ߲߯ߦߊ߫ ߞߐߜߍ ߟߎ߬)",
        "searchprofile-advanced-tooltip": "ߊ߬ ߢߌߣߌ߲߫ ߛߊ߲߬ߠߌ߲߬ߢߐ߲߮ ߠߎ߬ ߕߐ߮ ߞߣߍ ߘߐ߫",
        "search-result-size": "$1 ({{PLURAL:$2|1 ߞߎߡߊߘߋ߲|$2 ߞߎߡߊߘߋ߲ ߠߎ߬}})",
+       "search-result-category-size": "{{PLURAL:$1|1 ߛߌ߲߬ߝߏ߲|$1 ߛߌ߲߬ߝߏ߲ ߠߎ߬}} ({{PLURAL:$2|1 ߦߌߟߡߊߙߋ߲|$2 ߦߌߟߡߊߙߋ߲ ߠߎ߬}}, {{PLURAL:$3|1 ߞߐߕߐ߮|$3 ߞߐߕߐ߮ ߟߎ߬}})",
        "search-redirect": "(ߌ ߟߊߞߎ߲߬ߛߌ߲߬ߣߍ߲߫ ߞߊ߬ ߓߐ߫ $1)",
        "search-section": "(ߕߍߕߍ߮ $1)",
        "search-file-match": "(ߞߐߕߐ߮ ߞߣߐߘߐ ߓߘߊ߫ ߟߊߞߊ߬ߝߏ߬)",
        "grouppage-bot": "{{ns:project}}:ߓߏߕ",
        "right-writeapi": "ߛߓߍߟߌ API ߟߊߓߊ߯ߙߊ߫",
        "newuserlogpage": "ߖߊ߬ߕߋ߬ߘߊ߬ ߓߘߊ߫ ߟߊߞߊ߬ ߌ ߜߊ߲߬ߞߎ߲߬",
+       "rightslog": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߜߊ߲߬ߞߎ߲߬ ߢߊ߬ ߓߘߍ",
        "action-edit": "ߞߐߜߍ ߣߌ߲߬ ߡߊߦߟߍ߬ߡߊ߲߬",
        "action-createaccount": "ߖߊ߬ߕߋ߬ߘߊ߬ ߟߊߓߊ߯ߙߕߊ ߣߌ߲߬ ߠߊߘߊ߲߫",
        "enhancedrc-history": "ߕߊ߬ߡߌ߲߬ߣߍ߲",
        "recentchanges-label-plusminus": "ߞߐߜߍ ߢߊ߲ߞߊ߲ ߓߘߊ߫ ߡߊߦߟߍ߬ߡߊ߲߫ ߞߵߊ߬ ߝߌ߬ߘߊ߲ ߦߙߌߞߊ ߣߌ߲߬ ߘߌ߫",
        "recentchanges-legend-heading": "<strong>ߡߊ߬ߛߙߋ:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ߣߌ߲߬ ߝߣߊ߫ ߦߋ߫ \n[[Special:NewPages|list of new pages]])",
+       "rcnotefrom": "ߘߎ߰ߟߊ ߘߐ߫ {{PLURAL:$5|is the change|are the changes}} ߞߊ߬ߦߌ߯ <strong>$3, $4</strong> (up to <strong>$1</strong> shown).",
        "rclistfrom": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ ߞߎߘߊ ߟߎ߫ ߦߌ߬ߘߊ ߘߊߡߌ߬ߣߊ߬ ߣߌ߲߭ ߡߊ߬ $2, $3",
-       "rcshowhideminor": "$1ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ ߘߋ߬ߣߍ߲",
+       "rcshowhideminor": "$1 ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ ߘߋ߬ߣߍ߲",
        "rcshowhideminor-show": "ߊ߬ ߦߌ߬ߘߊ߬",
        "rcshowhideminor-hide": "ߊ߬ ߢߡߊߘߏ߲߰",
        "rcshowhidebots": "$1 ߡߐ߰ߡߐ߮",
        "newpageletter": "ߞ",
        "boteditletter": "ߡ",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}}  ߡߊ߬ߝߊ߬ߟߋ߲߬ߠߌ߲ ߞߐ߫",
+       "rc-old-title": "ߊ߬ ߓߊߞߘߐ ߟߊߘߊ߲߫ ߣߍ߲߫ ߦߋ߫ ߕߊ߲߬ ߠߋ߫ \"$1\"",
        "recentchangeslinked": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߜߋ߲߬ߞߘߎ߬ߢߐ߲߰ߡߊ ߟߎ߬",
        "recentchangeslinked-toolbox": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߫ ߓߌ߬ߟߊ߬ߢߐ߲߰ߡߊ",
-       "recentchangeslinked-title": "ߊ߬ ߟߌ߬ߤߟߊ ߡߊߦߟߍ߬ߡߊ߲߫ ߦߊ߲߬$1",
+       "recentchangeslinked-title": "ߊ߬ ߟߌ߬ߤߟߊ ߡߊߦߟߍ߬ߡߊ߲߫ ߦߊ߲߬ \"$1\"",
        "recentchangeslinked-summary": "ߞߐߜߍ ߕߐ߮ ߟߊߘߏ߲߬߸ ߞߊ߬ ߞߐߜߍ ߛߘߌ߬ߜߋ߲ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߦߋ߫߸ ߥߟߊ߫ \nߞߊ߬ ߝߘߊ߫ ߞߐߜߍ ߣߌ߲߬ ߠߊ߫. (ߖߐ߲߬ߛߊ߬ ߌ ߘߌ߫ ߦߌߟߡߊ ߛߌ߲߬ߝߏ߲ ߠߎ߬ ߦߋ߫߸ ߣߌ߲߬ ߠߊߘߏ߲߬ {{ns:category}}: ߦߌߟߡߊ ߕߐ߮). ߦߟߍ߬ߡߊ߲߬ ߡߍ߲ ߦߋ߫ ߞߐߜߍ ߣߌ߲߬ [[Special:Watchlist|your Watchlist]] ߘߐ߫߸ ߏ߬ ߦߋ߫ <strong>ߛߓߍߘߋ߲߫ ߞߎ߲ߓߊ</strong> ߟߋ߬ ߘߐ߫.",
        "recentchangeslinked-page": "ߘߐߜߍ ߕߐ߮:",
        "recentchangeslinked-to": "ߞߐߜߍ ߛߘߌ߬ߜߋ߲ ߠߎ߬ ߦߌ߬ߘߊ߬߸ ߞߊ߬ ߞߐߜߍ ߣߌ߬ ߞߋߟߋ߲ߘߌ߫",
        "upload": "ߞߐߕߐ߮ ߟߊߦߟߍ߬",
        "uploadlogpage": "ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߘߏ߫ ߟߊߦߟߍ߬",
        "filedesc": "ߟߊߘߛߏߣߍ߲",
-       "license": "ߟߊ߬ߘߌ߬ߢߍ߬ߟߌ ߦߴߌ ߘߐ߫",
+       "license": "ߟߊ߬ߘߌ߬ߢߍ߬ߟߌ ߦߴߌ ߘߐ߫:",
        "license-header": "ߟߊ߬ߘߌ߬ߢߍ߬ߟߌ ߦߴߌ ߘߐ߫",
        "imgfile": "ߞߐߕߐ߮",
        "listfiles": "ߞߐߕߐ߮ ߛߙߍߘߍ",
        "filehist-datetime": "ߕߎ߬ߡߊ߬ߘߊ/ߕߎ߬ߡߊ߬ߟߊ߲",
        "filehist-thumb": "ߞߝߊ߬ߟߋ߲ߛߋ߲",
        "filehist-thumbtext": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߠߊߘߐ߯ߦߊߣߍ߲ ߡߍ߲ ߦߋ߫ $1",
+       "filehist-nothumb": "ߖߌ߬ߦߊ߬ ߘߐ߯ߡߊ߲߫ ߕߴߦߋ߲߬",
        "filehist-user": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ",
        "filehist-dimensions": "ߛߎߡߊ߲ߘߐ",
        "filehist-comment": "ߞߊ߲߬ߝߐߟߌ",
        "imagelinks": "ߞߐߕߐ߮ ߟߊߓߊ߯ߙߊ",
        "linkstoimage": "ߞߐߕߐ߮ ߣߌ߲߬ {{PLURAL:$1|ߞߐߜߍ ߟߎ߬|$1 ߞߐߜߍ ߟߎ߬}}:",
+       "linkstoimage-more": "ߞߐߕߐ߮ ߣߌ߲߬ $1 {{PLURAL:$1|page uses|pages use}} ߠߊߓߊ߯ߙߊߓߊ߮ ߞߊߛߌߦߊ߫.\nߛߙߍߘߍ ߢߌ߲߬ ߠߎ߬ ߦߋ߫ {{PLURAL:$1|first page|first $1 pages}} ߞߐߕߐ߮ ߣߌ߲߬ ߞߋߟߋ߲߫ ߠߊߓߊ߯ߙߊߓߊ߮ ߟߎ߬ ߛߙߍߘߍ ߟߋ߬ ߦߌ߬ߘߊ߬ ߟߊ߫.\nߛߘߌ߬ߜߋ߲߬ [[Special:WhatLinksHere/$2|full list]] ߓߟߏߡߊߞߊ߬ߣߍ߲ ߦߋ߫ ߦߋ߲߬.",
        "nolinkstoimage": " ߞߐߜߍ߫ ߛߌ߫ ߡߊ߫ ߞߐߕߐ߮ ߣߌ߲߬ ߠߊߓߊ߯ߙߊ߫ ߡߎߣߎ߲߬",
-       "sharedupload-desc-here": "ߘߐ߬ߛߙߋ ߣߌ߲߬ ߦߋ߫ ߦߊ߲߬ ߠߋ߫ $1 ߖߊ߬ߕߋ߬ߘߐ߬ߛߌ߮ ߕߐ߭ ߟߎ߬ ߞߏ߬ߣߌ߲ ߘߌ߫ ߛߴߊ߬ ߟߊߓߊ߯ߙߊ߫ ߟߊ߫. ߊ߬ ߕߐ߯ ߛߓߍߟߌ ߦߙߐ $2 ߟߋ߬ ߦߋ߫ ߘߎ߰ߟߊ ߘߐ߫ ߣߌ߲߬.",
+       "linkstoimage-redirect": "$1 (ߞߐߕߐ߯ ߟߊߞߎ߲߬ߛߌ߲߬ߣߍ߲߬) $2",
+       "sharedupload-desc-here": "ߘߐ߬ߛߙߋ ߣߌ߲߬ ߦߋ߫ ߦߊ߲߬ ߠߋ߫ $1 ߖߊ߬ߕߋ߬ߘߐ߬ߛߌ߮ ߕߐ߭ ߟߎ߬ ߞߏ߬ߣߌ߲ ߘߌ߫ ߛߴߊ߬ ߟߊߓߊ߯ߙߊ߫ ߟߊ߫. ߊ߬ ߕߐ߯ ߛߓߍߟߌ ߦߙߐ [$2 ߞߐߕߐ߮ ߞߊ߲߬ߛߓߍߟߌ ߞߐߜߍ] ߟߋ߬ ߦߋ߫ ߘߎ߰ߟߊ ߘߐ߫ ߣߌ߲߬.",
        "filepage-nofile": "ߕߐ߮ ߣߌ߲߬ ߞߐߕߐ߯ ߛߎ߯ ߕߍ߫ ߦߋ߲߬",
        "upload-disallowed-here": "ߌ ߕߍߣߊ߬ ߞߐߜߍ ߣߌ߲߬ ߞߊ߲߬ߛߓߍ߫ ߟߊ߫.",
        "randompage": "ߓߍ߲߬ߛߋ߲߬ߡߊ߬ ߞߐߜߍ",
        "statistics": "ߖߊ߬ߕߋ߬ߛߎ߬ߓߐ ߟߎ߬",
+       "double-redirect-fixer": "ߟߊ߬ߞߎ߲߬ߛߌ߲߬ߠߌ߲ ߘߐߓߍ߲߬ߟߊ߲",
        "nbytes": "$1 {{PLURAL:$1|byte|bytes}}",
-       "nmembers": "$1 {{PLURAL:$1|ߛߌ߲߬ߝߏ߲ |members}}",
+       "nmembers": "$1 {{PLURAL:$1|ߛߌ߲߬ߝߏ߲ |ߛߌ߲߬ߝߏ߲ ߠߎ߬}}",
        "prefixindex": "ߞߐߜߍ ߡߍ߲ ߠߎ߬ ߓߍ߯ ߟߊߝߟߐߣߍ߲߫",
        "listusers": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߛߙߍߘߍ",
        "newpages": "ߘߐߜߍ߫ ߞߎߘߊ",
        "booksources-search-legend": "ߞߊ߬ߝߊ ߛߎ߲ ߕߌߙߌ߲߫",
        "booksources-search": "ߢߌߣߌ߲ߠߌ߲",
        "specialloguserlabel": "ߞߍߓߊ߮ :",
+       "speciallogtitlelabel": "ߞߏ߲߭ (ߞߎ߲߬ߕߐ߮ ߥߟߊ߫  {{ns:user}}: ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߟߊ߫ ߟߊ߬ߓߊ߰ߙߊ߬ ߕߐ߮):",
        "log": "ߘߏ߲߬",
        "all-logs-page": "ߝߘߏ߬ߓߊ߬ ߜߊ߲ߞߎ߲ߠߌ߲ ߠߎ߬ ߓߍ߯",
        "logempty": "ߦߙߍߞߍߟߌ߫ ߛߌ߫ ߓߍ߲߬ߢߐ߲߰ߦߊ߬ߣߍ߲߬ ߕߍ߫ ߝߐ߰ߓߍ ߟߎ߬ ߘߐ߫",
        "allpagessubmit": "ߥߊ߫",
        "allpages-hide-redirects": "ߟߊ߬ߞߎ߲߬ߛߌ߲߬ߠߌ߲ ߢߡߊߘߏ߲߰",
        "categories": "ߦߌߟߡߊ ߟߎ߬",
-       "listgrouprights-members": "ߛߌ߲߬ߝߏ߲ ߠߎ߫ ߛߙߍߘߍ",
+       "listgrouprights-members": "(ߛߌ߲߬ߝߏ߲ ߠߎ߫ ߛߙߍߘߍ)",
        "emailuser": "ߗߋߛߓߍ ߗߋ߫ ߣߌ߲߬ ߕߌ߭ ߡߊ߬",
        "usermessage-editor": "ߞߊ߲ߞߋ߫ ߗߋߛߓߍ ߡߊߦߟߍ߬ߡߊ߲߬ߓߊ߮",
+       "watchlist": "ߣߐ߬ߝߍ߬ߜߍ߲߬ߛߙߍߘߍ",
        "mywatchlist": "ߘߐߜߍ߫ ߘ߲ߜߍߕߊ",
+       "watchlistfor2": "ߞߏߛߐ߲߬ $1 $2",
        "watch": "ߊ߬ ߘߐߜߍ߫",
        "unwatch": "ߊ߬ ߞߍ߫ ߦߋߓߊߟߌ ߘߌ߫",
+       "watchlist-details": "ߌ ߟߊ߫ ߞߣߐ߬ߜߍ߲߬ ߛߙߍߘߍ ߟߎ߬ ߘߐ߫ {{PLURAL:$1|ߞߐߜߍ $1|ߞߐߜߍ ߟߎ߬ $1}}( ߊ߬ ߣߌ߫ ߢߊߝߐߟߌ߫ ߞߐߜߍ ߟߎ߬) ߓߍ߯ ߟߴߊ߬ ߞߣߐ߫.",
+       "wlheader-showupdated": "ߞߐߜߍ ߡߍ߲ ߠߎ߬ ߡߊߦߟߍ߬ߡߊ߲߬ߣߍ߲߬ ߌ ߟߊ߫ ߡߊ߬ߝߍ߬ߣߍ߲߬ߠߌ߲ ߞߐ߫߸ ߏ߬ ߟߎ߫ ߟߋ߬ ߦߌ߬ߘߊ߬ߣߍ߲߫ <strong>ߛߓߍߘߋ߲߫ ߞߎ߲ߓߊ</strong> ߘߐ߫.",
        "wlnote": "ߘߎ߰ߟߊ ߘߐ߫ {{PLURAL:$1|is the last change|are the last <strong>$1</strong> changes}} ߞߐ߯ߟߕߊ ߘߐ߫ {{PLURAL:$2|hour|<strong>$2</strong> hours}}, as of $3, $4.",
        "wlshowlast": "ߕߎ߬ߡߊ߬ߙߋ߲ $1 ߞߐߟߕߊ $2 ߕߋ߬ߟߋ ߟߎ߬ ߦߌ߬ߘߊ߬",
+       "watchlist-options": "ߞߣߐ߬ߜߍ߲߬ ߛߙߍߘߍ ߢߣߊߕߐߡߐ߲ ߠߎ߬",
        "enotif_reset": "ߞߐߜߍ߫ ߞߎ߲ߝߊ߲ߓߐߣߍ߲ ߠߎ߬ ߓߍ߯ ߕߐ߰ߡߊ߬ߛߙߋ߫",
        "dellogpage": "ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߖߏ߬ߛߌ߬ߣߍ߲",
-       "rollbacklink": "ߘߐߛߵߊ߬ ߡߊ߬",
+       "rollbacklink": "ߌ ߞߐߛߊ߬ߦߌ߲߬ ߌ ߣߐ߭ߡߊ߬",
+       "rollbacklinkcount": "ߛߋ߬ߦߌ߲߬ ߌ ߣߐ߭ߡߊ߬ $1 {{PLURAL:$1|ߡߊߦߟߍ߬ߡߊ߲߫|ߟߎ߬ ߡߊߦߟߍ߬ߡߊ߲߫}}",
        "protectlogpage": "ߜߊ߲߬ߞߎ߲߬ߠߌ߲߬ ߠߊߞߊ߲ߘߊߣߍ߲",
        "protectedarticle": "ߟߊ߬ߞߊ߲߬ߘߊ߬ߣߍ߲ \"[[$1]]\"",
        "modifiedarticleprotection": "ߟߊ߬ߞߊ߲߬ߘߊ߬ߟߌ ߞߊߓߋ ߡߊߦߟߍ߬ߡߊ߲߬ \"[[$1]]\"",
        "protect-default": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߟߎ߬ ߓߍ߯ ߟߊߘߌ߬ߢߍ߬",
        "restriction-edit": "ߊ߬ ߡߊߦߟߍ߬ߡߊ߲߬",
        "restriction-move": "ߕߐ߯ߦߊ߫",
-       "namespace": "ߕߐ߯ ߛߓߍ ߞߣߍ",
+       "namespace": "ߕߐ߯ ߛߓߍ ߞߣߍ:",
        "invert": "ߓߊߕߐ߬ߡߐ߲߬ߣߍ߲ ߞߕߐߡߊߛߊ߬ߦߌ߲߬",
        "tooltip-invert": "ߞߏ߲߬ߘߏ ߣߌ߲߬ ߘߐߜߍ߫߸ ߞߊ߬ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߠߎ߬ ߢߡߊߘߏ߲߰ ߞߐߜߍ ߟߎ߬ ߕߐ߯ ߞߣߍ߫ ߓߊߓߌ߬ߟߊ߬ߣߍ߲ ߘߐ߫ (ߊ߬ ߣߌ߫ ߕߐ߯ ߞߣߍ߫ ߓߟߏߘߏ߲߬ߣߍ߲ ߘߐߜߍߣߍ߲ ߠߎ߬)",
        "namespace_association": "ߕߐ߯ ߓߟߏߘߏ߲߬ߣߍ߲߫ ߢߐ߲߰ߓߟߏ",
        "tooltip-namespace_association": "ߞߏ߲߬ߘߏ ߣߌ߲߬ ߡߊߝߍߣߍ߲߫ ߓߊ߫ ߞߊ߬ ߓߊ߬ߘߏ߬ߓߊ߬ߘߌߦߊ ߥߟߊ߫ ߝߐߡߊ ߕߐ߮ ߞߣߍ ߡߍ߲ ߓߟߏߘߏ߲߬ߣߍ߲߫ ߦߋ߫ ߞߐߜߍ߫ ߓߊߕߐ߬ߡߐ߲߬ߣߍ߲ ߣߌ߲߬ ߘߐ߫߸ ߞߵߏ߬ ߟߊߘߏ߲߬.",
-       "blanknamespace": "ߓߊߖߎ",
+       "blanknamespace": "(ߓߊߖߎ)",
        "contributions": "ߓߟߏߡߊߜߍ߲ ߠߎ߬ {{GENDER:$1|ߟߊߓߊ߯ߙߟߊ}}",
        "contributions-title": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߟߊ߫ ߓߟߏߓߌߟߊߢߐ߲߯ߞߊ߲ ߡߍ߲ ߦߋ߫$1",
        "mycontris": "ߓߟߏߓߌߟߊߢߐ߲߯ߞߊ߲",
        "anoncontribs": "ߓߟߏߓߌߟߊߢߐ߲߯ߞߊ߲ ߠߎ߬",
        "contribsub2": "{{GENDER:$3|$1}} ߕߊ ($2)",
-       "month": "ߞߵߊ߬ ߕߊ߬ ߞߊߙߏ ߡߊ߬ (ߊ߬ ߣߌ߫ ߞߊߙߏ ߞߎ߲߬ߝߟߐ ߘߐ߫)",
-       "year": "ߞߵߊ߬ ߕߊ߬ ߞߊߙߏ ߡߊ߬ (ߊ߬ ߣߌ߫ ߞߊߙߏ ߞߎ߲߬ߝߟߐ ߡߊ߬)",
+       "uctop": "ߞߍߛߊ߲ߞߏ",
+       "month": "ߞߵߊ߬ ߕߊ߬ ߞߊߙߏ ߡߊ߬ (ߊ߬ ߣߌ߫ ߞߊߙߏ ߞߎ߲߬ߝߟߐ ߘߐ߫):",
+       "year": "ߞߵߊ߬ ߕߊ߬ ߞߊߙߏ ߡߊ߬ (ߊ߬ ߣߌ߫ ߞߊߙߏ ߞߎ߲߬ߝߟߐ ߡߊ߬):",
        "sp-contributions-newbies": "ߖߊ߬ߕߋ߬ߘߊ߬ ߞߎߘߊ ߟߎ߫ ߘߐߙߐ߲߫ ߠߊ߫ ߓߟߏߓߌߟߊߢߐ߲߯ߞߊ߲ ߦߌ߬ߘߊ߫ ߕߋ߲߬",
+       "sp-contributions-blocklog": "ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߓߊ߬ߟߊ߲߬",
        "sp-contributions-uploads": "ߟߊ߬ߦߟߍ߬ߟߌ ߟߎ߬",
+       "sp-contributions-logs": "ߘߏ߲߬ߠߌ߲ ߠߎ߬",
        "sp-contributions-talk": "ߞߎߡߊߢߐ߲߯ߦߊ",
        "sp-contributions-search": "ߓߟߏߓߌߟߊߢߐ߲߯ߞߊ߲ ߘߏ߫ ߢߌߣߌ߲߫",
        "sp-contributions-username": "IP ߛߊ߲߬ߓߊ߬ߕߐ߮ ߥߟߊ߫ ߟߊ߬ߓߊ߰ߙߊ߬ߕߐ߮:",
+       "sp-contributions-toponly": "ߡߛߊ߬ߦߌ߲߬ߠߌ߲߬ ߠߊ߬ߓߊ߲ ߠߎ߬ ߘߐߙߐ߲߫ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߦߌ߬ߘߊ߬",
        "sp-contributions-newonly": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߡߍ߲ ߣߊ߬ ߞߐߜߍ߫ ߟߊߘߊ߲ ߘߌ߫߸ ߏ߬ ߟߎ߫ ߘߐߙߐ߲߫ ߦߌ߬ߘߊ߬",
        "sp-contributions-submit": "ߢߌߣߌ߲ߠߌ߲",
        "whatlinkshere": "ߛߘߌ߬ߜߋ߲ ߢߎ߬ߡߊ߲߬ ߦߋ߫ ߦߊ߲߬",
        "infiniteblock": "ߘߊ߲߬ߓߊߟߌ",
        "blocklink": "ߟߊ߬ߢߊ߬ߙߊ߲߬ߠߌ",
        "contribslink": "ߡߊߛߐ߯ߟߌ",
+       "blocklogpage": "ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߓߊ߬ߟߊ߲߬ߠߌ",
+       "blocklogentry": "ߊ߬ ߓߊ߬ߟߊ߲߬ߣߍ߲߬ ߦߋ߫ [[$1]] ߊ߬ ߕߎ߬ߡߊ ߕߊ߬ߡߌ߲ ߠߋ߬ ߞߏߛߐ߲߬ $2 $3",
        "block-log-flags-nocreate": "ߖߊ߬ߕߋ߬ߘߊ ߛߌ߲ߘߟߌ ߟߊߕߐ߲",
+       "proxyblocker": "ߟߐ߲߬ߞߋ߬ߟߊ ߓߊ߬ߟߊ߲߬ߟߊ߲",
        "movelogpage": "ߜߊ߲߬ߞߎ߲ ߓߐ߫ ߊ߬ ߡߊ߬",
        "export": "ߞߐߜߍ ߟߎ߬ ߟߊߝߏ߬ߦߌ߬",
        "thumbnail-more": "ߊ߬ ߟߊߞߎ߲߬ߓߦߊ߬",
+       "importlogpage": "ߟߊ߬ߛߣߍ߬ߟߌ ߞߣߍ",
        "tooltip-pt-userpage": "{{GENDER:|ߌ ߟߊ߫ ߟߊ߬ߓߊ߰ߙߊ߬ߟߌ߬}} ߞߐߜߍ",
-       "tooltip-pt-mytalk": "ߢߊߝߐ߫ ߞߐߜߍ{{GENDER:|ߌ ߟߊ߫}}",
-       "tooltip-pt-preferences": "ߤߣߍߕߊ ߟߎ߬{{GENDER:|ߌ}}",
+       "tooltip-pt-mytalk": "{{GENDER:|ߌ ߟߊ߫}} ߞߎߡߊ߫ ߞߐߜߍ߫",
+       "tooltip-pt-preferences": "{{GENDER:|ߌ ߟߊ߫}} ߤߣߍߕߊ ߟߎ߬",
        "tooltip-pt-watchlist": "ߌ ߟߊ߫ ߞߐߜߍ߫ ߡߊߦߟߍ߬ߡߊ߲߬ߕߊ ߜߋ߬ߟߎ߲߬ߣߍ߲ ߠߎ߬ ߛߙߍߘߍ",
-       "tooltip-pt-mycontris": "ߓߟߏߡߊߜߍ߲߫ ߛߙߍߘߍ ߟߎ߬ {{GENDER:|ߌ ߟߊ߫}}",
+       "tooltip-pt-mycontris": "{{GENDER:|ߌ ߟߊ߫}} ߓߟߏߡߊߜߍ߲߫ ߛߙߍߘߍ ߟߎ߬",
        "tooltip-pt-login": "ߌ ߡߊߘߌߦߊߣߍ߲߫ ߦߴߌ ߜߊ߲߬ߞߎ߲߫ ߸ ߘߌߦߊߜߏߦߊ߫ ߞߏ߬ߣߌ߲߬ ߕߍ߫",
        "tooltip-pt-logout": "ߌ ߜߊ߲߬ߞߎ߲߬ ߓߐ߫",
        "tooltip-pt-createaccount": "ߌ ߡߊߘߌߦߊߣߍ߲߫ ߦߋ߫ ߖߊ߬ߕߋ߬ߘߊ߫ ߟߊߞߊ߬ ߞߵߌ ߜߊ߲߬ߞߎ߲߫ ߸ ߓߊ߬ߙߌ߬ ߌ ߘߌߦߊߜߏߦߊߣߍ߲߫ ߕߍ߫",
        "tooltip-ca-delete": "ߞߐߜߍ ߣߌ߲߬ ߖߏ߰ߛߌ߫",
        "tooltip-ca-move": "ߘߐߜߍ ߣߌ߲߬ ߛߋ߲߬ߓߐ߫",
        "tooltip-ca-watch": "ߞߐߜߍ ߣߌ߲߬ ߝߙߊ߬ ߌ ߟߊ߫ ߟߊߞߙߐ߬ߛߌ߬ߕߊ߬ ߛߙߍߘߍ ߟߎ߫ ߞߊ߲߬",
+       "tooltip-ca-unwatch": "ߞߐߜߍ ߣߌ߲߬ ߛߋ߲߬ߓߐ߫ ߌ ߟߊ߫ ߟߊߞߙߐ߬ߛߌ߬ߕߊ߬ ߛߙߍߘߍ ߘߐ߫",
        "tooltip-search": "ߊ߬ ߢߌߣߌ߲߫ {{SITENAME}} ߘߐ߫",
        "tooltip-search-go": "ߕߐ߮ ߣߌ߲߬ ߢߌߣߌ߲߫ ߞߐߜߍ߫ ߞߣߐ߫ ߣߴߊ߬ ߞߍ߫ ߘߊ߫ ߦߋ߲߬",
-       "tooltip-search-fulltext": "ߞߎߡߊߘߋ߲߫  ߣߌ߲߬ ߞߐߜߍ߫ ߟߎ߫ ߢߌߣߌ߲߫",
+       "tooltip-search-fulltext": "ߞߎߡߊߘߋ߲߫ ߣߌ߲߬ ߞߐߜߍ߫ ߟߎ߫ ߢߌߣߌ߲߫",
        "tooltip-p-logo": "ߞߐߜߍ߫ ߓߏߟߏ߲ߘߊ ߡߊߝߍߣߍ߲߫",
        "tooltip-n-mainpage": "ߞߐߜߍ߫ ߓߏߟߏ߲ߘߊ ߡߊߝߍߣߍ߲߫",
        "tooltip-n-mainpage-description": "ߞߐߜߍ߫ ߓߏߟߏ߲ߘߊ ߡߊߝߍߣߍ߲߫",
        "tooltip-t-recentchangeslinked": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߬ ߞߎߘߊ ߟߎ߬ ߞߐߜߍ߫ ߘߐ߫ ߡߍ߲ ߣߌ߫ ߞߐߜߍ ߣߌ߲߬ ߕߎ߲߰ߣߍ߲߫",
        "tooltip-feed-atom": "ߞߐߜߍ ߣߌ߲߬ ߝߕߌ߫ ߓߊߟߏ",
        "tooltip-t-contributions": "{{GENDER:$1|ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ}} ߟߊ߫ ߓߟߏߓߌߟߊߢߐ߲߮ߞߊ߲ ߛߙߍߘߍ",
-       "tooltip-t-emailuser": " ߢߎߡߍߙߋ߲ߞߏ߲ߘߏ ߟߊߕߊ߯ ߟߊߓߊ߯ߙߟߊ ߣߌ߲߬ ߡߊ߬{{GENDER:$1|ߟߊߓߊ߯ߙߟߊ(ߡߏ߬ߛߏ) }}",
+       "tooltip-t-emailuser": "ߢߎߡߍߙߋ߲ߞߏ߲ߘߏ ߟߊߕߊ߯ ߟߊߓߊ߯ߙߟߊ ߣߌ߲߬ ߡߊ߬{{GENDER:$1|ߟߊߓߊ߯ߙߟߊ}}",
        "tooltip-t-upload": "ߞߐߕߐ߮ ߟߎ߫ ߟߊߦߟߍ߬",
        "tooltip-t-specialpages": "ߘߎ߲߬ߘߎ߬ߡߊ߬ ߞߐߜߍ߫ ߟߎ߫ ߛߙߍߘߍ",
        "tooltip-t-print": " ߞߐߜߍ ߣߌ߲߬  ߜߌ߬ߙߌ߲߬ߘߌ߬ߕߊ߬ߡߊ ߛߎ߮",
        "tooltip-save": "ߌ ߟߊ߫ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߣߍ߲ ߠߊߞߎ߲߬ߘߎ߬",
        "tooltip-preview": "ߌ ߟߊ߫ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߣߍ߲ ߘߐߜߍ߫ ߡߎߣߎ߲߬. ߏ߬ ߞߴߊ߬ ߟߊߞߎ߲߬ߘߎ ߢߍ߫ ߖߊ߰ߣߌ߲߫.",
        "tooltip-diff": "ߌ ߟߊ߫ ߛߓߍߟߌ߫ ߡߊߦߟߍ߬ߣߍ߲ ߦߌ߬ߘߊ߬",
+       "tooltip-compareselectedversions": "ߘߊ߲߬ߝߘߊ߬ߓߐ ߡߍ߲ ߦߋ߫ ߡߊ߬ߛߊ߬ߦߌ߲߬ߠߌ߲ ߓߊߕߐ߬ߡߐ߲߬ߣߍ߲ ߝߌ߬ߟߊ ߟߎ߬ ߕߍ߫ ߞߐߜߍ ߣߌ߲߬ ߘߐ߫߸ ߏ߬ ߦߋ߫",
        "tooltip-watch": "ߞߐߜߍ ߣߌ߲߬ ߓߌ߬ߟߊ߬ ߌ ߟߊ߫ ߜߋ߬ߟߎ߬ߠߌ߲߬ ߛߙߍߘߍ ߘߐ߫",
-       "tooltip-rollback": "\"Rollback\" ߓߟߏߓߌߟߊߢߐ߲߯ߞߊ߲ߠߊ ߟߊߓߊ߲ ߠߊ߫ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߡߊߛߊ߬ߦߌ߬ ߞߐߜߍ ߣߌ߲߬ ߘߐ߫ ߛߐ߲߬ߞߌ߲߬ߠߌ߲߬ ߞߋߟߋ߲߫ ߘߐ߫",
-       "tooltip-undo": "\"ߊ߬ ߘߐߛߊ߬\" ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߣߌ߲߬ ߞߐߛߊ߬ߦߌ߬ ߞߊ߬ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߝߊ߬ߘߌ ߟߊߞߊ߬ ߢߍߦߋߟߌ ߝߊ߬ߘߌ ߘߐ߫.\nߖߡߊ߬ߙߌ߬ߦߊ ߘߌ߫ ߟߊ߬ߘߛߏ߬ߟߌ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߡߊ߬.",
+       "tooltip-rollback": "\"ߘߐߛߵߊ߬ ߡߊ߬\" ߓߟߏߓߌߟߊߢߐ߲߯ߞߊ߲ߠߊ ߟߊߓߊ߲ ߠߊ߫ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߡߊߛߊ߬ߦߌ߬ ߞߐߜߍ ߣߌ߲߬ ߘߐ߫ ߛߐ߲߬ߞߌ߲߬ߠߌ߲߬ ߞߋߟߋ߲߫ ߘߐ߫",
+       "tooltip-undo": "\"ߊ߬ ߘߐߛߊ߬\" ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߣߌ߲߬ ߞߐߛߊ߬ߦߌ߬ ߞߊ߬ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߝߊ߬ߘߌ ߟߊߞߊ߬ ߢߍߦߋߟߌ ߝߊ߬ߘߌ ߘߐ߫. ߊ߬ ߘߌ߫ ߖߡߊ߬ߙߌ߬ߦߊ ߘߌ߫ ߟߊ߬ߘߛߏ߬ߟߌ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߡߊ߬.",
        "tooltip-summary": "ߟߊ߬ߘߛߏ߬ߣߍ߲߬ ߛߎ߬ߘߎ߲߬ߣߍ߲ ߘߏ߫ ߟߊߘߏ߲߬",
        "simpleantispam-label": "ߛߑߔߊߡ ߛߌ߬ߣߊ ߡߊ߬ߝߍ߬ߣߍ߲߬ߠߌ߲.\nߊ߬ ߞߍ߫ <strong>not</strong> ߣߌ߲߬ ߠߝߊ߫߹",
+       "pageinfo-title": "ߞߟߊ߬ߟߐ߲ ߞߊ߲߬ \"$1\"",
        "pageinfo-header-basic": "ߞߎ߲߬ߠߊ߬ߝߎ߬ߟߋ߲߬ ߓߊߖߎ ߟߎ߬",
        "pageinfo-header-edits": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ ߘߐ߬ߝߐ",
        "pageinfo-header-restrictions": "ߞߐߜߍ ߟߊ߬ߞߊ߲߬ߘߊ߬ߟߌ",
+       "pageinfo-header-properties": "ߞߐߜߍ ߘߎ߲߬ߘߎ߬ߡߊ ߟߎ߬",
        "pageinfo-display-title": "ߞߎ߲߬ߕߐ߰ ߦߋߕߊ",
+       "pageinfo-default-sort": "ߊ߬ ߘߊ߲ߢߊ ߓߐ߫ ߛߓߍߘߋ߲",
+       "pageinfo-length": "ߞߐߜߍ ߥߊ߲߬ߥߊ߲ (bytes ߘߐ߫)",
        "pageinfo-article-id": "ߞߐߜߍ ID",
        "pageinfo-language": "ߞߐߜߍ ߣߌ߲߬ ߞߣߐߘߐ ߞߊ߲",
+       "pageinfo-content-model": "ߞߐߜߍ ߞߣߐߘߐ߫ ߞߙߊߞߏ",
        "pageinfo-robot-policy": "ߡߐ߰ߡߐ߮ ߕߐ߰ߡߊ߬ߛߙߋ߬ߟߌ߬ ߣߐ ߟߋ߬",
        "pageinfo-robot-index": "ߟߊߘߌ߬ߢߍ߬ߣߍ߲",
        "pageinfo-robot-noindex": "ߟߊߘߌ߬ߢߍ߬ߓߊߟߌ",
-       "pageinfo-few-watchers": "ߘߐ߯ߡߊ߲߫ $1{{PLURAL:$1|ߜߋ߬ߟߎ߲߬ߓߊ߮ |ߜߋ߬ߟߎ߲߬ߓߊ߮ ߟߎ߬ }}",
+       "pageinfo-watchers": "ߞߐߜߍ߫ ߞߣߐ߬ߜߍ߲߬ߓߊ߮ ߟߎ߬ ߦߙߌߞߊ",
+       "pageinfo-few-watchers": "ߘߐ߯ߡߊ߲߫ $1{{PLURAL:$1|ߜߋ߬ߟߎ߲߬ߓߊ߮ |ߜߋ߬ߟߎ߲߬ߓߊ߮ ߟߎ߬}}",
+       "pageinfo-redirects-name": "ߓߌ߬ߟߊ߬ߣߍ߲ ߠߎ߬ ߦߙߌߞߊ ߞߐߜߍ ߣߌ߲߬ ߡߊ߬",
        "pageinfo-subpages-name": "ߞߐߜߍߙߋ߲ ߦߙߌߞߊ ߡߍ߲ ߠߎ߬ ߦߋ߫ ߞߐߜߍ ߣߌ߲߬ ߘߐ߫",
        "pageinfo-firstuser": "ߞߐߜߍ ߟߊߘߊ߲ߓߊ߮",
        "pageinfo-firsttime": "ߞߐߜߍ ߟߊߘߊ߲߫ ߕߎߡߘߊ",
        "pageinfo-edits": "ߡߊߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߠߎ߫ ߖߊ߬ߕߋ ߡߎ߰ߡߍ",
        "pageinfo-authors": "ߛߓߍߦߟߊ߫ ߦߙߌߞߊ߫ ߖߊ߬ߕߋ߫ ߡߎ߰ߡߍ",
        "pageinfo-recent-edits": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ ߟߊߓߊ߲ ߠߎ߬ ߖߊ߬ߕߋ (ߕߊ߬ߡߌ߲߬ߣߍ߲ ߞߘߐ߫ $1)",
+       "pageinfo-recent-authors": "ߞߐߛߊ߲߫ ߛߓߍߦߟߊ߫ ߓߐߣߍ߲ߢߐ߲߰ߡߊ ߟߎ߫ ߖߊ߬ߕߋ",
+       "pageinfo-magic-words": "ߛߎߓߊ߯ߦߊ߫ {{PLURAL:$1|ߞߎߡߊߘߋ߲|ߞߎߡߊߘߋ߲ ߠߎ߬ }}($1)",
        "pageinfo-hidden-categories": "ߢߡߊߘߏ߲߰ߠߌ߲ {{PLURAL:$1|ߦߌߟߡߊ|ߦߌߟߡߊ ߟߎ߬(1$)}}",
        "pageinfo-toolboxlink": "ߞߐߜߍ ߞߌ߬ߓߊ߬ߙߏ߬ߦߊ",
+       "pageinfo-contentpage": "ߊ߬ ߖߊ߬ߕߋ߬ ߞߣߐߘߐ߫ ߞߐߜߍ ߘߏ߫ ߘߌ߫",
        "pageinfo-contentpage-yes": "ߐ߲߬ߤߐ߲߫",
-       "previousdiff": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ ߞߘߐ",
-       "nextdiff": "ߊ߬ ߡߊ߫ ߡߊߦߟߍ߬ߡߊ߲߬",
+       "patrol-log-page": "ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߓߍ߬ߙߍ߲߬ߓߍ߬ߙߍ߲߬",
+       "previousdiff": "→ ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߬ ߞߘߐ",
+       "nextdiff": "ߊ߬ ߡߊ߫ ߡߊߦߟߍ߬ߡߊ߲߬ ←",
        "widthheightpage": "$1 × $2,$3 {{PLURAL:$3|page|pages}}",
        "file-info-size": "$1 × $2 ߖߌ߬ߦߊ߬ߘߊ߲ߕߊ߸ ߞߐߕߐ߮ ߢߊ߲ߞߊ߲: $3߸ MIME ߛߎ߮ߦߊ:$4",
        "file-nohires": "ߢߊߓߐߣߍ߲ ߛߊ߲ߘߐߕߊ߫ ߜߘߍ߫ ߕߍ߫ ߦߋ߲߬",
-       "svg-long-desc": "SVG ߞߐߕߐ߮,ߕߐ߯ߦߊߟߌ $1 × $2 ߖߌ߬ߦߊ߬ߘߊ߲ߕߊ, ߞߐߕߐ߮ ߢߊ߲ߞߊ߲:$3",
+       "svg-long-desc": "SVG ߞߐߕߐ߮, ߕߐ߯ߦߊߟߌ $1 × $2 ߖߌ߬ߦߊ߬ߘߊ߲ߕߊ, ߞߐߕߐ߮ ߢߊ߲ߞߊ߲: $3",
        "show-big-image": "ߞߐߕߐ߮ ߓߊߛߎ߲",
-       "show-big-image-preview": "ߊ߬ ߢߍߦߋߟߌ ߢߊ߲ߞߊ߲$1",
+       "show-big-image-preview": "ߊ߬ ߢߍߦߋߟߌ ߢߊ߲ߞߊ߲: $1.",
        "show-big-image-other": "{{PLURAL:$2|ߢߊߓߐߟߌ|ߢߊߓߐߟߌ ߟߎ߬}} ߕߐ߬ߡߊ $1.",
        "show-big-image-size": "$1 × $2 ߖߌ߬ߦߊ߬ߘߊ߲ߕߊ",
        "metadata": "ߡߋߕߊߘߊ߯ߕߊ߫",
        "metadata-help": "ߞߌ߬ߓߊ߬ߙߏ߬ߦߊ߬ߟߌ߬ ߜߘߍ߫ ߟߎ߫ ߦߋ߫ ߞߐߕߐ߮ ߣߌ߲߬ ߘߐ߫߸ ߊ߬ ߟߊߘߏ߲߬ߣߍ߲߬ ߦߋ߫ ߞߍ߫ ߟߊ߫ ߞߍߟߊ߲߫ ߡߍ߲ߛߍ߲ߡߊ ߟߋ߫ ߟߊ߫ ߥߟߊ߫ ߖߌ߬ߦߊ߬ߕߍ߬ߟߊ߲߸ ߞߵߊ߬ ߟߊߓߊ߯ߙߊ߫ ߥߟߊ߫ ߞߵߊ߬ ߡߍ߲ߛߍ߲ߡߊ.\nߣߴߊ߬ ߡߊߦߟߍ߬ߡߊ߲߬ ߣߍ߲߬ ߞߍ߫ ߘߊ߫ ߞߊ߬ ߓߴߊ߬ ߛߎ߲ߞߎ߲ ߡߊ߬߸ ߞߌ߬ߓߊ߬ߙߏ߬ߦߊ ߘߏ߫ ߟߎ߫ ߕߍ߫ ߣߊ߬ ߟߊߞߊ߲߬ߘߏ߬ ߟߊ߫ ߞߐߕߐ߯ ߡߊߦߟߍ߬ߡߊ߲߬ߣߍ߲ ߘߐ߫.",
-       "metadata-fields": "Image metadata fields listed in this message will be included on image page display when the metadata table is collapsed.\nOthers will be hidden by default.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "namespacesall": "ߊ߬ ߓߍ߯",
        "monthsall": "ߡߎ߰ߡߍ",
-       "imgmultipagenext": "ߞߐߜߍ ߢߍߕߊ",
-       "imgmultigo": "ߥߊ߫",
-       "imgmultigoto": "ߥߊ߫ ߞߐߜߍ ߣߌ߲߬ ߞߊ߲߬$1",
+       "imgmultipagenext": "ߞߐߜߍ ߢߍߕߊ ←",
+       "imgmultigo": "ߥߊ߫߹",
+       "imgmultigoto": "ߥߊ߫ ߞߐߜߍ ߣߌ߲߬ ߞߊ߲߬ $1",
        "watchlisttools-view": "ߡߊ߬ߦߟߍ߬ߡߊ߲߬ߠߌ߲߫ ߕߣߐ߬ߡߊ ߟߎ߫ ߦߌ߬ߘߊ߬ߟߌ",
-       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|talk]])",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ߓߊ߬ߘߏ߬ߟߌ]])",
+       "redirect": "ߟߊߞߎ߲߬ߛߌ߲߬ߣߍ߲߬ ߦߋ߫ ߞߐߕߐ߮ ߓߟߏ߫߸ ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ߸ ߞߐߜߍ߸ ߡߛߊ߬ߦߌ߲߬ߠߌ߲߸ ߥߟߊ߫ ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ID",
        "redirect-summary": "ߞߐߜߍ߫ ߓߟߏߡߊߞߊ߬ߣߍ߲ ߟߊߞߎ߲߬ߛߌ߲߬ߣߍ߲߬ ߦߋ߫ ߞߐߕߐ߮ (ߞߐߕߐ߮ ߕߐ߮ ߘߌ߫),ߞߐߜߍ (ߦߋ߫ ߡߛߊ߬ߦߌ߲߬ߠߌ߲ ID ߥߟߊ߫ ߞߐߜߍ ID ߘߌ ߞߊ߲߬), ߞߐߜߍ߫ ߟߊߓߊ߯ߙߕߊ ߦߋ߫ (ߟߊ߬ߓߊ߰ߙߟߊ߬ ߦߙߌߞߊ ID ߘߌ ߞߊ߲߬), ߥߟߊ߫ ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߘߏ߲߬ߕߐ߬ߟߊ ߦߋ߫ (ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ID ߘߌ ߞߊ߲߬). ߟߊ߬ߓߊ߰ߙߊ߬ߟߌ:\n[[{{#Special:Redirect}}/file/Example.jpg]], \n[[{{#Special:Redirect}}/page/64308]],\n[[{{#Special:Redirect}}/revision/328429]], \n[[{{#Special:Redirect}}/user/101]], ߥߟߊ߫ \n[[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "ߕߊ߯",
        "redirect-lookup": "ߊ߬ ߘߐߜߍ߫",
        "tags-active-no": "ߍ߲߬ߍ߲ߍ߲߬",
        "tags-hitcount": "{{PLURAL:$1|ߦߟߍ߬ߡߊ߲߬ߠߌ|$1 ߦߟߍ߬ߡߊ߲߬ߠߌ ߠߎ߬}}",
        "logentry-delete-delete": "$1 {{GENDER:$2|deleted}} ߞߐߜߍ $3",
+       "logentry-delete-restore": "$1 $3($4) ߞߐߜߍ {{GENDER:$2|ߓߘߊ߫ ߟߊߛߊ߬ߦߌ߬ ߞߐ߫}}",
+       "logentry-delete-revision": "$1  {{GENDER:$2|ߓߘߊ߫ ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߞߍ߫}} ߣߌ߲߬ ߦߋߗߏ߮ ߟߊ߫ {{PLURAL:$5|a revision|$5 revisions}} ߞߐߜߍ ߣߌ߲߬ $3: $4 ߘߐ߫",
        "revdelete-content-hid": "ߞߣߐߘߐ ߘߐ߲߰ߣߍ߲߫ ߠߋ߬",
        "logentry-move-move": "$1 {{GENDER:$2|ߓߘߊ߫ ߞߐߜߍ}} ߓߐ߫ ߦߊ߲߬ $3 ߞߴߊ߬ ߟߊߕߊ߯ $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$1|ߓߘߴߊ߬ ߓߐ߫ ߦߋ߲߬}} ߞߐߜߍ ߣߌ߲߬ $3 ߞߊ߬ ߥߴߊ߬ ߘߌ߫ $4 ߞߵߊ߬ ߕߘߍ߬ ߊ߬ ߡߴߊ߬ ߟߊߞߎ߲߬ߛߌ߲߫",
+       "logentry-move-move_redir": "$1 {{GENDER:$2|moved}} ߞߐߜߍ $3 ߞߵߊ߬ ߛߌ߰ $4 ߟߊ߬ߞߎ߲߬ߛߌ߲߬ߠߌ߲ ߓߟߏߡߊ߬",
+       "logentry-patrol-patrol-auto": "{{GENDER:$2|marked}} ߟߊ߫ ߞߍߒߖߘߍߦߋ߫ $1 ߞߐߜߍ ߣߌ߲߬ $3 ߓߍ߬ߙߍ߲߬ߓߍ߬ߙߍ߲߬ߠߌ߲ ߡߊ߬ߛߊ߬ߦߌ߲߬ߠߌ߲ $4",
        "logentry-newusers-create": "ߖߊ߬ߕߋ߬ߘߊ߬ ߟߊߓߊ߯ߙߕߊ $1 ߕߘߍ߬ ߦߋ߫ {{ߞߊ߬ߘߌ߬ߛߊ߬:$2|ߟߞߊ߬ߟߌ߬ߣߐ ߟߋ߬ ߘߌ߫}}",
        "logentry-newusers-autocreate": "ߟߊߓߊ߯ߙߊߟߊ ߟߊ߫ ߖߊ߬ߕߋ߬ߘߊ $1{{GENDER:$2|ߟߊߘߊ߲߫ ߘߊ߫ }} ߞߍߒߖߘߍߦߋ߫ ߓߟߏߡߊ߬",
        "logentry-upload-upload": "$1 {{GENDER:$2|ߟߊ߬ߦߟߍ߬ߟߌ߬ߣߐ ߟߋ߬}} $3",
        "searchsuggest-search": "{{SITENAME}} ߊ߬ ߢߌߣߌ߲߫",
-       "duration-days": "$1 {{PLURAL:$1|ߟߏ߲|ߟߏ߲ ߠߎ߬}}"
+       "duration-days": "$1 {{PLURAL:$1|ߟߏ߲|ߟߏ߲ ߠߎ߬}}",
+       "randomrootpage": "ߓߍ߲߬ߛߋ߲߬ߡߊ߬ ߞߐߜߍ ߓߏ߬ߞߊߘߌ"
 }
index d59f154..25187a2 100644 (file)
        "blocklink": "zablokuj",
        "unblocklink": "odblokuj",
        "change-blocklink": "zmień blokadę",
+       "empty-username": "(nazwa użytkownika niedostępna)",
        "contribslink": "edycje",
        "emaillink": "wyślij e‐mail",
        "autoblocker": "Zablokowano Cię automatycznie, ponieważ twój adres IP był ostatnio używany przez „[[User:$1|$1]]”.\nPrzyczyna blokady $1 to: „$2”",
index 9dfa861..972e37a 100644 (file)
        "category-article-count-limited": "This message is displayed at the top of a category page showing the number of pages in the category when not all pages in a category are counted.\n\nParameters:\n* $1 - number of pages shown",
        "category-file-count": "This message is displayed at the top of a category page showing the number of pages in the category.\n\nParameters:\n* $1 – number of files shown\n* $2 – total number of files in category",
        "category-file-count-limited": "This message is displayed at the top of a category page showing the number of pages in the category when not all pages in a category are counted.\n\nParameters:\n* $1 - number of files shown",
-       "listingcontinuesabbrev": "Shown in continuation of each first letter group. This message follows the first letter.\n\nSee http://test.wikipedia.org/wiki/Category:Test_ko?uselang={{SUBPAGENAME}}, for example.",
+       "listingcontinuesabbrev": "Shown in continuation of each first letter group. This message follows the first letter.\n\nThis is an abbreviation of the English word \"continued\". If the word is short in your language, the full stop in the end is not necessary.\n\nSee http://test.wikipedia.org/wiki/Category:Test_ko?uselang={{SUBPAGENAME}}, for example.",
        "index-category": "Name of the [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages with the <nowiki>__INDEX__</nowiki> behavior switch are listed.\n\nFor description of this behavior switch see [[mw:Special:MyLanguage/Help:Magic_words#Behavior_switches|MediaWiki]].\n\nSee also:\n* {{msg-mw|Index-category-desc}}",
        "noindex-category": "Name of the [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages with the <nowiki>__NOINDEX__</nowiki> behavior switch are listed.\n\nFor description of this behavior switch see [[mw:Special:MyLanguage/Help:Magic_words#Behavior_switches|MediaWiki]].\n\nSee also:\n* {{msg-mw|Noindex-category-desc}}",
        "broken-file-category": "Name of [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages that embed files that do not exist (\"broken images\") are listed.\n\nSee also:\n* {{msg-mw|Broken-file-category-desc}}",
        "pool-servererror": "Error message. Parameters:\n* $1 - list of server addresses\n\nSee e.g. {{msg-mw|Poolcounter-desc}} (and the Pool Counter extension in general) for translation hints for “pool counter service”.",
        "poolcounter-usage-error": "Used as error message. Parameters:\n* $1 - non-localized string describing usage mistake.",
        "aboutsite": "Used as the label of the link that appears at the footer of every page on the wiki (in most of  the skins) and leads to the page that contains the site description. The link target is {{msg-mw|aboutpage}}.\n\n[[mw:Manual:Interface/Aboutsite|MediaWiki manual]].\n\n{{doc-important|Do not change <nowiki>{{SITENAME}}</nowiki>.}}\n\n{{Identical|About}}",
-       "aboutpage": "{{doc-important|Do not translate \"Project:\" part, for this is the namespace prefix.}}\n\nUsed as the target of the link that appears at the footer of every page on the wiki (in most of  the skins) and leads to the page that contains the site description. Therefore the content should be the same with the page name of the site description page. Only the message in the [[mw:Manual:$wgLanguageCode|site language]]  ([[MediaWiki:Aboutpage]]) is used. The link label is {{msg-mw|aboutsite}}.",
+       "aboutpage": "{{doc-important|Do not translate \"Project:\" part, for this is the namespace prefix.}}\n\nDo translate \"About\", however.\n\nUsed as the target of the link that appears at the footer of every page on the wiki (in most of  the skins) and leads to the page that contains the site description. Therefore the content should be the same with the page name of the site description page. Only the message in the [[mw:Manual:$wgLanguageCode|site language]]  ([[MediaWiki:Aboutpage]]) is used. The link label is {{msg-mw|aboutsite}}.",
        "copyright": "Parameters:\n* $1 - license name\n'''See also'''\n* {{msg-mw|Mobile-frontend-copyright}}",
        "copyrightpage": "{{doc-important|Do not change <nowiki>{{ns:project}}</nowiki>}}\n\n{{Identical|Copyright}}",
        "currentevents": "Standard link in the sidebar, for news.\n\nSee also {{msg-mw|Currentevents-url}} for the link URL.\n\nSee also:\n* {{msg-mw|Currentevents}}\n* {{msg-mw|Accesskey-n-currentevents}}\n* {{msg-mw|Tooltip-n-currentevents}}",
        "hist": "Short form of \"history\". Used on [[Special:RecentChanges]], [[Special:Watchlist]], ...",
        "hide": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]], and in [[Special:WhatLinksHere]].\n\nSee also:\n* {{msg-mw|Show}}\n{{Identical|Hide}}",
        "show": "{{doc-actionlink}}\nOption text in [[Special:RecentChanges]], and in [[Special:WhatLinksHere]].\n\nSee also:\n* {{msg-mw|Hide}}\n{{Identical|Show}}",
-       "minoreditletter": "Very short form of \"'''minor edit'''\". Used in [[Special:RecentChanges]], [[Special:Watchlist]], [[Special:Contributions]] and history pages. This should be a single letter.",
-       "newpageletter": "Very short form of \"'''new page'''\". Used in [[Special:RecentChanges]], [[Special:Watchlist]] and [[Special:Contributions]]. This should be a single letter.",
-       "boteditletter": "Abbreviation of \"'''bot'''\". Appears in [[Special:RecentChanges]] and [[Special:Watchlist]]. This should be a single letter.",
-       "unpatrolledletter": "{{optional}}\n\nUsed in {{msg-mw|Recentchanges-label-legend}}, meaning \"unpatrolled\".",
+       "minoreditletter": "Very short form of \"'''minor edit'''\". Used in [[Special:RecentChanges]], [[Special:Watchlist]], [[Special:Contributions]] and history pages.\n\n{{Rc single letters}}",
+       "newpageletter": "Very short form of \"'''new page'''\". Used in [[Special:RecentChanges]], [[Special:Watchlist]] and [[Special:Contributions]].\n\n{{Rc single letters}}",
+       "boteditletter": "Abbreviation of \"'''bot'''\". Appears in [[Special:RecentChanges]] and [[Special:Watchlist]].\n\n{{Rc single letters}}",
+       "unpatrolledletter": "{{optional}}\n\nUsed in {{msg-mw|Recentchanges-label-legend}}, meaning \"unpatrolled\".\n\n{{Rc single letters}}",
        "number_of_watching_users_RCview": "{{notranslate}}\nParameters:\n* $1 - number of users who are watching",
        "number_of_watching_users_pageview": "Used if <code>$wgPageShowWatchingUsers</code> is true.\n* $1 - number of watching user(s)",
        "rc-change-size": "{{optional}}\nDoes not work under $wgMiserMode ([[mwr:48986|r48986]]).\n\nParameters:\n* $1 - size of diff",
        "rollback-confirmation-yes": "Button text to confirm that a rollback should be executed.",
        "rollback-confirmation-no": "Button text to cancel a rollback instead of executing it.\n{{Identical|Cancel}}",
        "rollbacklink": "{{Doc-actionlink}}\nThis link text appears on the recent changes page to users who have the \"rollback\" right.\nThis message has a tooltip {{msg-mw|tooltip-rollback}}\n{{Identical|Rollback}}",
-       "rollbacklinkcount": "{{doc-actionlink}}\nText of the rollback link showing the number of edits to be rolled back. See also {{msg-mw|rollbacklink}}.\n\nParameters:\n* $1 - the number of edits that will be rolled back. If $1 is over the value of <code>$wgShowRollbackEditCount</code> (default: 10) {{msg-mw|rollbacklinkcount-morethan}} is used.\n\nThe rollback link is displayed with a tooltip {{msg-mw|Tooltip-rollback}}",
+       "rollbacklinkcount": "{{doc-actionlink}}\nText of the rollback link showing the number of edits to be rolled back. The word \"rollback\" is supposed to be the same as in {{msg-mw|rollbacklink}}.\n\nParameters:\n* $1 - the number of edits that will be rolled back. If $1 is over the value of <code>$wgShowRollbackEditCount</code> (default: 10) {{msg-mw|rollbacklinkcount-morethan}} is used.\n\nThe rollback link is displayed with a tooltip {{msg-mw|Tooltip-rollback}}",
        "rollbacklinkcount-morethan": "{{doc-actionlink}}\nText of the rollback link when a greater number of edits is to be rolled back. See also {{msg-mw|rollbacklink}}.\n\nWhen the number of edits rolled back is smaller than [[mw:Special:MyLanguage/Manual:$wgShowRollbackEditCount|$wgShowRollbackEditCount]], {{msg-mw|rollbacklinkcount}} is used instead.\n\nParameters:\n* $1 - number of edits",
        "rollbackfailed": "{{Identical|Rollback}}",
        "rollback-missingparam": "Used as error message that rollback is accessed without the required parameters\n\nSee also:\n* {{msg-mw|Rollbackfailed}}",
        "tooltip-watchlistedit-raw-submit": "Tooltip for {{msg-mw|watchlistedit-raw-submit}} (used as button on [[Special:EditWatchlist/raw]]).\n\nSee also:\n* {{msg-mw|Watchlistedit-raw-submit}}\n* {{msg-mw|Accesskey-watchlistedit-raw-submit}}\n* {{msg-mw|Tooltip-watchlistedit-raw-submit}}",
        "tooltip-recreate": "Used as tooltip for Recreate link.\n\nSee also:\n* {{msg-mw|Recreate}}\n* {{msg-mw|Tooltip-recreate}}",
        "tooltip-upload": "Used as tooltip for Upload button.\n\nSee also:\n* {{msg-mw|Uploadbtn}}\n* {{msg-mw|Accesskey-upload}}\n* {{msg-mw|Tooltip-upload}}",
-       "tooltip-rollback": "Tooltip of the rollback link on the history page and the diff view {{msg-mw|rollbacklinkcount}}\n{{Identical|Rollback}}\n{{Identical|Revert}}",
+       "tooltip-rollback": "Tooltip of the rollback link on the history page and the diff view {{msg-mw|rollbacklinkcount}}\n\nThe word \"Rollback\" must be the same as in the message {{msg-mw|rollbacklink}}.\n\n{{Identical|Rollback}}\n{{Identical|Revert}}",
        "tooltip-undo": "Tooltip of the undo link on the history page and the diff view {{msg-mw|editundo}}\n{{Identical|Undo}}{{Identical|Revert}}",
        "tooltip-preferences-save": "Used as tooltip for Save button.\n\nSee also:\n* {{msg-mw|Saveprefs}}\n* {{msg-mw|Accesskey-preferences-save}}\n* {{msg-mw|Tooltip-preferences-save}}",
        "tooltip-summary": "Used as tooltip for Summary input box in Editor page.\n\nSee also:\n* {{msg-mw|Summary}}\n* {{msg-mw|Accesskey-summary}}\n* {{msg-mw|Tooltip-summary}}",
        "hebrew-calendar-m10-gen": "{{optional}}\nName of month in Hebrew calendar.",
        "hebrew-calendar-m11-gen": "{{optional}}\nName of month in Hebrew calendar.",
        "hebrew-calendar-m12-gen": "{{optional}}\nName of month in Hebrew calendar.",
-       "signature": "This will be substituted in the signature (~<nowiki></nowiki>~~ or ~~<nowiki></nowiki>~~ excluding timestamp).\n\nParameters:\n* $1 - the username that is currently login\n* $2 - the customized signature which is specified in [[Special:Preferences|user's preferences]] as non-raw\nUse your language default parentheses ({{msg-mw|parentheses}}), but not use the message direct.\n\nSee also:\n* {{msg-mw|Signature-anon}} - signature for anonymous user",
+       "signature": "This will be substituted in the signature (~<nowiki></nowiki>~~ or ~~<nowiki></nowiki>~~ excluding timestamp).\n\nTranslate the word \"talk\" towards the end.\n\nParameters:\n* $1 - the username that is currently login\n* $2 - the customized signature which is specified in [[Special:Preferences|user's preferences]] as non-raw\n\nUse your language default parentheses ({{msg-mw|parentheses}}), but not use the message direct.\n\nSee also:\n* {{msg-mw|Signature-anon}} - signature for anonymous user",
        "signature-anon": "{{notranslate}}\nUsed as signature for anonymous user. Parameters:\n* $1 - username (IP address?)\n* $2 - nickname (IP address?)\nSee also:\n* {{msg-mw|Signature}} - signature for registered user",
        "timezone-utc": "{{optional}}",
        "timezone-local": "Label to indicate that a time is in the user's local timezone.\n{{Identical|Local}}",
index 70c4e5a..0965ade 100644 (file)
@@ -85,6 +85,7 @@
        "tog-norollbackdiff": "Nu arăta diferența după efectuarea unei reveniri",
        "tog-useeditwarning": "Avertizează-mă când părăsesc o pagină fără a salva modificările",
        "tog-prefershttps": "Utilizează întotdeauna o conexiune securizată când sunt autentificat(ă)",
+       "tog-showrollbackconfirmation": "Cere confirmarea când se face click pe o legătură de revenire",
        "underline-always": "Întotdeauna",
        "underline-never": "Niciodată",
        "underline-default": "Standardul temei sau al navigatorului",
        "badretype": "Parolele pe care le-ați introdus diferă.",
        "usernameinprogress": "Crearea unui cont pentru acest nume de utilizator este deja în derulare. Vă rugăm să așteptați.",
        "userexists": "Numele de utilizator pe care l-ați introdus este deja folosit.\nVă rugăm să alegeți un alt nume.",
+       "createacct-normalization": "Numele dumneavoastră de utilizator va fi modificat în „$2” din cauza unor limitări tehnice.",
        "loginerror": "Eroare de autentificare",
        "createacct-error": "Eroare la crearea contului",
        "createaccounterror": "Nu pot crea contul: $1",
        "page_first": "prima",
        "page_last": "ultima",
        "histlegend": "Legendă: (actuală) = diferențe față de versiunea curentă,\n(prec) = diferențe față de versiunea precedentă, M = modificare minoră",
-       "history-fieldset-title": "Caută versiuni anterioare",
+       "history-fieldset-title": "Filtrează versiuni",
        "history-show-deleted": "Doar versiuni șterse",
        "histfirst": "cele mai vechi",
        "histlast": "cele mai noi",
        "historysize": "({{PLURAL:$1|1 octet|$1 octeți|$1 de octeți}})",
-       "historyempty": "(gol)",
+       "historyempty": "gol",
        "history-feed-title": "Revizia istoricului",
        "history-feed-description": "Istoricul versiunilor pentru această pagină din wiki",
        "history-feed-item-nocomment": "$1 la $2",
        "right-reupload-own": "Suprascrie un fișier existent propriu",
        "right-reupload-shared": "Rescrie fișierele disponibile în depozitul partajat",
        "right-upload_by_url": "Încarcă un fișier de la o adresă URL",
-       "right-purge": "Curăță memoria cache pentru o pagină fără confirmare",
+       "right-purge": "Curăță cache-ul serverului pentru o pagină",
        "right-autoconfirmed": "Neafectat de limitele pe bază de IP ale raportului",
        "right-bot": "Tratare ca proces automat",
        "right-nominornewtalk": "Nu declanșează mesajul „Aveți un mesaj nou” atunci când efectuează o modificare minoră pe pagina de discuții a utilizatorului",
        "action-changetags": "adăugați și să înlăturați etichete arbitrare din versiuni și intrări de jurnal individuale",
        "action-deletechangetags": "ștergeți etichete din baza de date",
        "action-purge": "curățați cache-ul acestei pagini",
+       "action-apihighlimits": "folosiți limite mai mari în interogările API",
+       "action-autoconfirmed": "nu fiți afectați de limitări de viteză pe bază de IP",
+       "action-bigdelete": "ștergeți pagini cu istoricuri mari",
+       "action-blockemail": "blocați un utilizator de la a trimite e-mailuri",
+       "action-bot": "fiți tratat ca proces automat",
+       "action-editprotected": "editați pagini protejate ca „{{int:protect-level-sysop}}”",
+       "action-editsemiprotected": "editați pagini protejate ca „{{int:protect-level-autoconfirmed}}”",
+       "action-editinterface": "editați interfața utilizator",
+       "action-editusercss": "editați fișierele CSS ale altor utilizatori",
+       "action-edituserjson": "editați fișierele JSON ale altor utilizatori",
+       "action-edituserjs": "editați fișierele JavaScript ale altor utilizatori",
+       "action-editsitecss": "editați CSS la nivelul site-ului",
+       "action-editsitejson": "editați JSON la nivelul site-ului",
+       "action-editsitejs": "editați JavaScript la nivelul site-ului",
+       "action-editmyusercss": "vă editați propriile fișiere CSS de utilizator",
+       "action-editmyuserjson": "vă editați propriile fișiere JSON",
+       "action-editmyuserjs": "vă editați propriile fișiere JavaScript",
+       "action-viewsuppressed": "vedeți versiuni ascunse oricărui utilizator",
+       "action-hideuser": "blocați un nume de utilizator, ascunzându-l publicului",
+       "action-ipblock-exempt": "treceți peste blocările de IP, autoblocări sau blocări de game de IP-uri",
+       "action-unblockself": "vă deblocați",
+       "action-noratelimit": "nu fiți afectat de limitări de viteză",
+       "action-reupload-own": "suprascrieți un fișiere existent propriu",
        "nchanges": "$1 {{PLURAL:$1|modificare|modificări|de modificări}}",
        "ntimes": "$1×",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|de la ultima vizită}}",
        "rcfilters-savedqueries-already-saved": "Aceste filtre sunt deja salvate. Schimbați setările pentru a salva un nou filtru de căutare.",
        "rcfilters-restore-default-filters": "Restaurați filtrele prestabilite",
        "rcfilters-clear-all-filters": "Ștergeți toate filtrele",
-       "rcfilters-show-new-changes": "Arată schimbările mai noi",
+       "rcfilters-show-new-changes": "Arată schimbările mai noi de la $1",
        "rcfilters-search-placeholder": "Filtrați modificările recente (folosiți meniul sau căutați numele filtrului)",
        "rcfilters-invalid-filter": "Filtru invalid",
        "rcfilters-empty-filter": "Nu există filtre active. Toate contribuțiile sunt afișate.",
        "delete-confirm": "Șterge \"$1\"",
        "delete-legend": "Şterge",
        "historywarning": "<strong>Atenție:</strong> istoricul paginii pe care o ștergeți conține $1 {{PLURAL:$1|versiune|versiuni|de versiuni}}:",
-       "historyaction-submit": "Afișează",
+       "historyaction-submit": "Afișează versiuni",
        "confirmdeletetext": "Sunteți pe cale să ștergeți permanent o pagină sau imagine din baza de date, împreună cu istoria asociată acesteia. Vă rugăm să confirmați alegerea făcută de dvs., faptul că înțelegeți consecințele acestei acțiuni și faptul că o faceți în conformitate cu [[{{MediaWiki:Policy-url}}|Politica oficială]].",
        "actioncomplete": "Acțiune completă",
        "actionfailed": "Acțiunea a eșuat",
        "deleting-backlinks-warning": "<strong>Atenție:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|Alte pagini]] se leagă sau transclud pagina pe care doriți să o ștergeți.",
        "deleting-subpages-warning": "<strong>Atenție:</strong> Pagina pe care urmează s-o ștergeți are [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|o subpagină|$1 subpagini|$1 de subpagini|51=peste 50 de subpagini}}]].",
        "rollback": "Editări de revenire",
+       "rollback-confirmation-confirm": "Confirmați:",
+       "rollback-confirmation-yes": "Revenire",
+       "rollback-confirmation-no": "Anulare",
        "rollbacklink": "revenire",
        "rollbacklinkcount": "revenire asupra {{PLURAL:$1|unei modificări|a $1 modificări|a $1 de modificări}}",
        "rollbacklinkcount-morethan": "revenire asupra a mai mult de {{PLURAL:$1|o modificare|$1 modificări|$1 de modificări}}",
        "mycontris": "Contribuții",
        "anoncontribs": "Contribuții",
        "contribsub2": "Pentru {{GENDER:$3|$1}} ($2)",
+       "contributions-subtitle": "Pentru {{GENDER:$3|$1}}",
        "contributions-userdoesnotexist": "Contul de utilizator „$1” nu este înregistrat.",
        "nocontribs": "Nu a fost găsită nici o modificare care să satisfacă acest criteriu.",
        "uctop": "actuală",
        "ipb-confirm": "Confirmare blocare",
        "ipb-sitewide": "Pe site",
        "ipb-partial": "Parțial",
+       "ipb-sitewide-help": "Toate paginile de pe wiki și toate celelalte acțiuni contributive.",
+       "ipb-partial-help": "Anumite pagini sau spații de nume.",
        "ipb-pages-label": "Pagini",
        "ipb-namespaces-label": "Spații de nume",
        "badipaddress": "Adresa IP este invalidă.",
        "blocklist-userblocks": "Ascunde conturile blocate",
        "blocklist-tempblocks": "Ascunde blocările temporare",
        "blocklist-addressblocks": "Ascunde adresele IP blocate",
+       "blocklist-type": "Tip:",
+       "blocklist-type-opt-all": "Toate",
+       "blocklist-type-opt-sitewide": "La nivel de site",
+       "blocklist-type-opt-partial": "Parțial",
        "blocklist-rangeblocks": "Ascunde blocările de gamă",
        "blocklist-timestamp": "Data și ora",
        "blocklist-target": "Utilizator/adresă IP",
        "blocklist-editing-page": "pagini",
        "blocklist-editing-ns": "spații de nume",
        "ipblocklist-empty": "Lista blocărilor este goală.",
-       "ipblocklist-no-results": "Nu există blocare pentru adresa IP sau numele de utilizator.",
+       "ipblocklist-no-results": "Nu există blocări pentru adresa IP sau numele de utilizator cerute.",
        "blocklink": "blochează",
        "unblocklink": "deblochează",
        "change-blocklink": "modifică blocarea",
+       "empty-username": "(nume de utilizator indisponibil)",
        "contribslink": "contribuții",
        "emaillink": "trimite e-mail",
        "autoblocker": "Blocat automat, deoarece adresa dumneavoastră IP a fost utilizată recent de „[[User:$1|$1]]”.\nMotivul blocării utilizatorului $1 este: „$2”",
        "ipb_expiry_old": "Timpul de expirare este din trecut.",
        "ipb_expiry_temp": "Blocarea numelor de utilizator ascunse trebuie să fie permanentă.",
        "ipb_hide_invalid": "Imposibil de suprimat acest cont; acesta are mai mult de {{PLURAL:$1|o modificare|$1 modificări|$1 de modificări}}.",
+       "ipb_hide_partial": "Blocările cu nume de utilizator ascuns trebuie să fie blocări la nivel de site.",
        "ipb_already_blocked": "„$1” este deja blocat",
        "ipb-needreblock": "$1 este deja blocat. Doriți să modificați parametrii?",
        "ipb-otherblocks-header": "{{PLURAL:$1|Altă blocare|Alte blocări}}",
        "confirm-unwatch-top": "Eliminați această pagină din lista de pagini urmărite?",
        "confirm-rollback-button": "OK",
        "confirm-rollback-top": "Anulați editările asupra acestei pagini?",
+       "confirm-rollback-bottom": "Această acțiune va efectua o revenire automată asupra schimbărilor selectate operate în această pagină.",
        "confirm-mcrrestore-title": "Restaurează o versiune",
        "confirm-mcrundo-title": "Anulează o modificare",
        "mcrundofailed": "Anularea nu a reușit",
        "logentry-rights-autopromote": "$1 {{GENDER:$2|a fost promovat|a fost promovată}} în mod automat de la $4 la $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|a încărcat}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|a încărcat}} o versiune nouă pentru $3",
-       "logentry-upload-revert": "$1 {{GENDER:$2|a încărcat}} $3",
+       "logentry-upload-revert": "$1 {{GENDER:$2|a readus}} $3 la o versiune mai veche",
        "log-name-managetags": "Jurnal gestionare etichete",
        "log-description-managetags": "Această pagină listează activitățile de gestionare în ceea ce privește [[Special:Tags|etichetele]]. Jurnalul conține numai acțiunile efectuate manual de către un administrator; etichetele pot fi create sau șterse de software-ul wiki fără ca vreo intrare să fie înregistrată în acest jurnal.",
        "logentry-managetags-create": "$1 {{GENDER:$2|a creat}} eticheta „$4”",
        "log-action-filter-suppress-reblock": "Supresiunea utilizatorului după blocare",
        "log-action-filter-upload-upload": "Încărcare nouă",
        "log-action-filter-upload-overwrite": "Reîncărcare",
+       "log-action-filter-upload-revert": "Anulare",
        "authmanager-authn-not-in-progress": "Autentificarea nu este în progres sau sesiune așa că au fost pierdute date. Vă rugăm să începeți din nou de la început.",
        "authmanager-authn-no-primary": "Credențialele furnizate nu au putut fi autentificate.",
        "authmanager-authn-no-local-user": "Credențialele trimise nu sunt asociate cu orice utilizator de pe acest wiki.",
index 4f5202d..c441942 100644 (file)
        "blocklink": "blockera",
        "unblocklink": "ta bort blockering",
        "change-blocklink": "ändra blockering",
+       "empty-username": "(inget tillgängligt användarnamn)",
        "contribslink": "bidrag",
        "emaillink": "skicka e-post",
        "autoblocker": "Automatisk blockerad eftersom din IP-adress nyligen använts av \"[[User:$1|$1]]\".\nMotiveringen som angavs för blockeringen av $1 var: \"$2\".",
index ba0e21f..d60e6f2 100644 (file)
        "mytalk": "చర్చ",
        "anontalk": "చర్చ",
        "navigation": "మార్గసూచీ",
-       "and": "&#32;మరియు",
+       "and": ",&#32;",
        "faq": "తరచూ అడిగే ప్రశ్నలు",
        "actions": "పనులు",
        "namespaces": "పేరుబరులు",
        "permissionserrors": "అనుమతి లోపం",
        "permissionserrorstext": "కింద పేర్కొన్న {{PLURAL:$1|కారణం|కారణాల}} మూలంగా, ఆ పని చెయ్యడానికి మీకు అనుమతిలేదు:",
        "permissionserrorstext-withaction": "ఈ క్రింది {{PLURAL:$1|కారణం|కారణాల}} వల్ల, $2 అనుమతి మీకు లేదు:",
-       "recreate-moveddeleted-warn": "<strong>à°¹à±\86à°\9aà±\8dà°\9aà°°à°¿à°\95: à°\87à°\82à°¤à°\95à±\81 à°®à±\81à°¨à±\81à°ªà±\81 à°\92à°\95సారి à°¤à±\8aà°²à°\97à°¿à°\82à°\9aà°¿à°¨ à°ªà±\87à°\9cà±\80ని à°®à°³à±\8dà°²à±\80 à°¸à±\83à°·à±\8dà°\9fà°¿à°¦à±\8dదామని à°®à±\80à°°à±\81 à°ªà±\8dరయతà±\8dనిసà±\8dà°¤à±\81à°¨à±\8dనారà±\81.</strong>\n\nà°\88 à°ªà±\87à°\9cà±\80à°ªà±\88 à°®à°¾à°°à±\8dà°ªà±\81à°²à±\81 à°\9aà±\87à°¸à±\87à°®à±\81à°\82à°¦à±\81, à°\85వి à°\87à°\95à±\8dà°\95à°¡ à°\89à°\82à°¡à°¤à°\97ినవà±\87నా à°\95ాదా à°\85ని à°\92à°\95సారి à°\86à°²à±\8bà°\9aà°¿à°\82à°\9aà°\82à°¡à°¿.\nà°®à±\80 à°¸à±\8cలభà±\8dà°¯à°\82 à°\95à±\8aà°°à°\95à±\81 à°\88 à°ªà±\87à°\9cà±\80 à°¯à±\8aà°\95à±\8dà°\95 à°¤à±\8aà°²à°\97à°¿à°\82à°ªà±\81, à°¤à°°à°²à°¿à°\82à°ªà±\81 à°\9aà°¿à°\9fà±\8dà°\9fాలనà±\81 à°\87à°\95à±\8dà°\95à°¡ à°\87à°\9aà±\8dà°\9aà°¾à°\82:",
-       "moveddeleted-notice": "à°\88 à°ªà±\87à°\9cà±\80ని à°¤à±\8aà°²à°\97à°¿à°\82à°\9aారà±\81.\nà°\88 à°ªà±\87à°\9cà±\80 à°¯à±\8aà°\95à±\8dà°\95 à°¤à±\8aà°²à°\97à°¿à°\82à°ªà±\81, à°¸à°\82à°°à°\95à±\8dà°·à°£, à°¤à°°à°²à°¿à°\82à°ªà±\81 చిట్టాను క్రింద ఇచ్చాం.",
+       "recreate-moveddeleted-warn": "<strong>హెచ్చరిక: ఇంతకు మునుపు ఒకసారి తొలగించిన పేజీని మళ్లీ సృష్టిద్దామని మీరు ప్రయత్నిస్తున్నారు.</strong>\n\nఈ పేజీపై మార్పులు చేసేముందు, అవి ఇక్కడ ఉండతగినవేనా కాదా అని ఒకసారి ఆలోచించండి.\nమీ సౌలభ్యం కొరకు ఈ పేజీ తొలగింపు, తరలింపు చిట్టాలను ఇక్కడ ఇచ్చాం:",
+       "moveddeleted-notice": "à°\88 à°ªà±\87à°\9cà±\80ని à°¤à±\8aà°²à°\97à°¿à°\82à°\9aారà±\81.\nసమాà°\9aారానిà°\95à±\88 à°\88 à°ªà±\87à°\9cà±\80 à°¤à±\8aà°²à°\97à°¿à°\82à°ªà±\81, à°¸à°\82à°°à°\95à±\8dà°·à°£, à°¤à°°à°²à°¿à°\82à°ªà±\81à°² చిట్టాను క్రింద ఇచ్చాం.",
        "moveddeleted-notice-recent": "సారీ, ఈ పేజీని ఈమధ్యే తొలగించారు (గత 24 గంటల్లో).\nఈ పేజీకి సంబంధించిన తొలగింపు, సంరక్షణ, తరలింపు లాగ్‌లను కింద ఇచ్చాం.",
        "log-fulllog": "పూర్తి చిట్టాని చూడండి",
        "edit-hook-aborted": "కొక్కెం ఈ మార్పుని విచ్ఛిన్నం చేసింది.\nఅది ఎటువంటి వివరణా ఇవ్వలేదు.",
        "page_first": "మొదటి",
        "page_last": "చివరి",
        "histlegend": "తేడా ఎంపిక: సంచికల యొక్క రేడియో బాక్సులను ఎంచుకొని ఎంటర్‌ నొక్కండి, లేదా పైన/ కింద ఉన్న మీటను నొక్కండి.<br />\nసూచిక: <strong>({{int:cur}})</strong> = ప్రస్తుత సంచికతో కల తేడాలు, <strong>({{int:last}})</strong> = ఇంతకు ముందరి సంచికతో గల తేడాలు, <strong>{{int:minoreditletter}}</strong> = చిన్న మార్పు",
-       "history-fieldset-title": "à°\95à±\82à°°à±\8dà°ªà±\81à°² à°\95à±\8bà°¸à°\82 à°µà±\86à°¤à°\95à°\82à°¡à°¿",
+       "history-fieldset-title": "à°\95à±\82à°°à±\8dà°ªà±\81à°² à°µà°¡à°ªà±\8bà°¤",
        "history-show-deleted": "తొలగించినవి మాత్రమే",
        "histfirst": "అతి పాతవి",
        "histlast": "సరికొత్త",
        "historysize": "({{PLURAL:$1|ఒక బైటు|$1 బైట్లు}})",
-       "historyempty": "(ఖాళీ)",
+       "historyempty": "ఖాళీ",
        "history-feed-title": "కూర్పుల చరిత్ర",
        "history-feed-description": "ఈ పేజీకి వికీలో కూర్పుల చరిత్ర",
        "history-feed-item-nocomment": "$2 న $1",
        "mergelog": "విలీనాల చిట్టా",
        "revertmerge": "విలీనాన్ని రద్దుచెయ్యి",
        "mergelogpagetext": "ఒక పేజీ చరితాన్ని మరో పేజీ చరితం లోకి ఇటీవల చేసిన విలీనాల జాబితా ఇది.",
-       "history-title": "\"$1\" à°¯à±\8aà°\95à±\8dà°\95 à°\95à±\82à°°à±\8dà°ªà±\81à°² à°\9aà°°à°¿à°¤à±\8dà°°",
-       "difference-title": "\"$1\" à°¯à±\8aà°\95à±\8dà°\95 à°\95à±\82à°°à±\8dà°ªà±\81à°² à°®à°§à±\8dà°¯ à°¤à±\87డాలà±\81",
+       "history-title": "\"$1\" కూర్పుల చరిత్ర",
+       "difference-title": "\"$1\" కూర్పుల మధ్య తేడాలు",
        "difference-title-multipage": "\"$1\", \"$2\" పేజీల మధ్య తేడా",
        "difference-multipage": "(పేజీల మధ్య తేడా)",
        "lineno": "పంక్తి $1:",
        "showhideselectedversions": "ఎంచుకున్న కూర్పులను చూపించు/దాచు",
        "editundo": "రద్దుచెయ్యి",
        "diff-empty": "(తేడా లేదు)",
-       "diff-multi-sameuser": "(ఇదే వాడుకరి యొక్క {{PLURAL:$1|ఒక మధ్యంతర కూర్పును|$1 మధ్యంతర కూర్పులను}} చూపించలేదు)",
+       "diff-multi-sameuser": "(ఇదే వాడుకరి {{PLURAL:$1|మధ్యంతర కూర్పును|$1 మధ్యంతర కూర్పులను}} చూపించడంలేదు)",
        "diff-multi-otherusers": "({{PLURAL:$2|మరో వాడుకరి|$2 వాడుకరుల}} యొక్క {{PLURAL:$1|ఒక మధ్యంతర కూర్పును|$1 మధ్యంతర కూర్పులను}} చూపించలేదు)",
        "diff-multi-manyusers": "$2 కంటే ఎక్కువ ({{PLURAL:$2|ఒక వాడుకరి|వాడుకరుల}} యొక్క {{PLURAL:$1|ఒక మధ్యంతర కూర్పును|$1 మధ్యంతర కూర్పులను}} చూపించట్లేదు)",
        "diff-paragraph-moved-tonew": "పేరాగ్రాఫును తరలించాం. కొత్త స్థానానికి వెళ్ళేందుకు నొక్కండి.",
        "group": "గుంపు:",
        "group-user": "వాడుకరులు",
        "group-autoconfirmed": "ఆటోమాటిగ్గా నిర్ధారించబడిన వాడుకరులు",
-       "group-bot": "బాట్లు",
+       "group-bot": "బాట్లు",
        "group-sysop": "నిర్వాహకులు",
        "group-interface-admin": "ఇంటర్‌ఫేసు నిర్వాహకులు",
        "group-bureaucrat": "అధికారులు",
        "action-purge": "ఈ పేజీని పర్జ్ చేసే",
        "nchanges": "{{PLURAL:$1|ఒక మార్పు|$1 మార్పులు}}",
        "enhancedrc-since-last-visit": "{{PLURAL:$1|చివరి సందర్శన తరువాత}}, $1",
-       "enhancedrc-history": "à°\9aà°°à°¿à°¤à°\82",
+       "enhancedrc-history": "à°\9aà°°à°¿à°¤à±\8dà°°",
        "recentchanges": "ఇటీవలి మార్పులు",
        "recentchanges-legend": "ఇటీవలి మార్పుల ఎంపికలు",
        "recentchanges-summary": "వికీలో ఇటీవలే జరిగిన మార్పులను ఈ పేజీలో గమనించవచ్చు.",
        "rcfilters-watchlist-markseen-button": "మార్పులన్నీ చూసినట్లుగా గుర్తించు",
        "rcfilters-watchlist-edit-watchlist-button": "మీ వీక్షణ జాబితాను సవరించండి",
        "rcfilters-watchlist-showupdated": "మీ గత సందర్శన తరువాత మారిన పేజీలు '''బొద్దుగా'''ను, నింపిన గుండ్రని చుక్కల ద్వారానూ చూపించాం.",
-       "rcfilters-preference-label": "à°\87à°\9fà±\80వలి à°®à°¾à°°à±\8dà°ªà±\81à°² à°¯à±\8aà°\95à±\8dà°\95 à°®à±\86à°°à±\81à°\97à±\88à°¨ à°\95à±\82à°°à±\8dà°ªà±\81à°¨à±\81 à°¦à°¾à°\9aు",
+       "rcfilters-preference-label": "à°\9cావాసà±\8dà°\95à±\8dà°°à°¿à°ªà±\8dà°\9fà±\81 à°\85వసరà°\82à°²à±\87ని à°\85à°\82తరవరà±\8dతిని à°µà°¾à°¡ు",
        "rcfilters-filter-showlinkedfrom-option-label": "ఎంచుకున్న పేజీ నుండి <strong>లింకైన పేజీలు</strong>",
        "rcfilters-filter-showlinkedto-option-label": "ఎంచుకున్న పేజీకి <strong>లింకైన పేజీలు</strong>",
        "rcfilters-target-page-placeholder": "పేజీ (లేదా వర్గం) పేరు ఇవ్వండి",
        "filehist-current": "ప్రస్తుత",
        "filehist-datetime": "తేదీ/సమయం",
        "filehist-thumb": "నఖచిత్రం",
-       "filehist-thumbtext": "$1 à°¨à°¾à°\9fà°¿ à°\95à±\82à°°à±\8dà°ªà±\81 à°¯à±\8aà°\95à±\8dà°\95 à°¨à°\96à°\9aà°¿à°¤à±\8dà°°à°\82",
+       "filehist-thumbtext": "$1 నాటి కూర్పు నఖచిత్రం",
        "filehist-nothumb": "నఖచిత్రం లేదు",
        "filehist-user": "వాడుకరి",
        "filehist-dimensions": "కొలతలు",
        "newpages-submit": "చూపించు",
        "newpages-username": "వాడుకరి పేరు:",
        "ancientpages": "పాత పేజీలు",
-       "move": "తరలిà°\82à°\9aు",
+       "move": "తరలిà°\82à°ªు",
        "movethispage": "ఈ పేజీని తరలించు",
        "unusedimagestext": "ఈ క్రింది ఫైళ్ళు ఉన్నాయి కానీ వాటిని ఏ పేజీలోనూ ఉపయోగించట్లేదు.\nఇతర వెబ్ సైట్లు సూటి URL ద్వారా ఇక్కడి ఫైళ్ళకు లింకు ఇవ్వవచ్చు. ఆ విధంగా క్రియాశీలంగా వాడుకలో ఉన్నప్పటికీ, అటువంటివి ఈ జాబితాలో చేరి ఉండవచ్చునని గమనించండి.",
        "unusedcategoriestext": "కింది వర్గాలకు పేజీలైతే ఉన్నాయి గానీ, వీటిని వ్యాసాలు గానీ, ఇతర వర్గాలు గానీ ఉపయోగించడం లేదు.",
        "booksources-text": "కొత్త, పాత పుస్తకాలు అమ్మే ఇతర సైట్లకు లింకులు కింద ఇచ్చాం. మీరు వెతికే పుస్తకాలకు సంబంధించిన మరింత సమాచారం కూడా అక్కడ దొరకొచ్చు:",
        "booksources-invalid-isbn": "మీరిచ్చిన ISBN సరైనదిగా అనిపించుటలేదు; అసలు మూలాన్నుండి కాపీ చేయడంలో పొరపాట్లున్నాయేమో చూసుకోండి.",
        "specialloguserlabel": "కర్త:",
-       "speciallogtitlelabel": "లక్ష్యం (శీర్షిక లేదా వాడుకరి యొక్క {{ns:user}}:వాడుకరిపేరు):",
+       "speciallogtitlelabel": "లక్ష్యం (శీర్షిక లేదా {{ns:user}}:వాడుకరిపేరు):",
        "log": "చిట్టాలు",
        "logeventslist-submit": "చూపించు",
        "all-logs-page": "అన్ని బహిరంగ చిట్టాలు",
        "delete-confirm": "\"$1\"ని తొలగించు",
        "delete-legend": "తొలగించు",
        "historywarning": "<strong>హెచ్చరిక:</strong> మీరు తొలగించబోయే పేజీకి $1 {{PLURAL:$1|కూర్పు|కూర్పుల}} చరిత్ర ఉంది:",
-       "historyaction-submit": "చూపించు",
+       "historyaction-submit": "à°\95à±\82à°°à±\8dà°ªà±\81లనà±\81 à°\9aà±\82పిà°\82à°\9aà±\81",
        "confirmdeletetext": "మీరో పేజీనో, బొమ్మనో దాని చరిత్రతోపాటుగా శాశ్వతంగా డేటాబేసు నుండి తీసెయ్యబోతున్నారు. మీరు చెయ్యదలచింది ఇదేననీ, దీని పర్యవసానాలు మీకు తెలుసనీ, దీన్ని [[{{MediaWiki:Policy-url}}|నిభందనల]] ప్రకారమే చేస్తున్నారనీ నిర్ధారించుకోండి.",
        "actioncomplete": "పని పూర్తయింది",
        "actionfailed": "చర్య విఫలమైంది",
        "deleting-backlinks-warning": "<strong>హెచ్చరిక:</strong> మీరు తొలగించబోతున్న పేజీకి [[Special:WhatLinksHere/{{FULLPAGENAME}}|ఇతర పేజీల]] నుండి లింకులు ఉన్నాయి. లేదా ఇతర పేజీల్లో అది ట్రాన్స్‍క్లూడు అవుతోంది.",
        "deleting-subpages-warning": "<strong>హెచ్చరిక:</strong> మీరు తొలగించబోతున్న పేజీకి [[Special:PrefixIndex/{{FULLPAGENAME}}/|{{PLURAL:$1|ఒక ఉపపేజీ ఉంది|$1 ఉపపేజీలున్నాయి|51=50 కి పైగా ఉపపేజీలున్నాయి}}]].",
        "rollback": "దిద్దుబాట్లను రద్దుచేయి",
+       "rollback-confirmation-no": "రద్దుచేయి",
        "rollbacklink": "రద్దుచేయి",
        "rollbacklinkcount": "$1 {{PLURAL:$1|మార్పును|మార్పులను}} రద్దుచేయి",
        "rollbacklinkcount-morethan": "$1 కంటే ఎక్కువ {{PLURAL:$1|మార్పును|మార్పులను}} రద్దుచేయి",
        "protectlogtext": "ఈ క్రింద ఉన్నది పేజీల సంరక్షణలకు జరిగిన మార్పుల జాబితా.\nప్రస్తుతం అమలులో ఉన్న సంరక్షణలకై [[Special:ProtectedPages|సంరక్షిత పేజీల జాబితా]]ను చూడండి.",
        "protectedarticle": "\"[[$1]]\" సంరక్షించబడింది.",
        "modifiedarticleprotection": "\"[[$1]]\" సంరక్షణ స్థాయిని మార్చారు",
-       "unprotectedarticle": "\"[[$1]]\" à°¯à±\8aà°\95à±\8dà°\95 సంరక్షణను తొలగించారు",
+       "unprotectedarticle": "\"[[$1]]\" à°¨à±\81à°\82à°¡à°¿ సంరక్షణను తొలగించారు",
        "movedarticleprotection": "సంరక్షణా అమరికని \"[[$2]]\" నుండి \"[[$1]]\"కి మార్చారు",
        "protectedarticle-comment": "\"[[$1]]\" ను {{GENDER:$2|సంరక్షించారు}}",
        "modifiedarticleprotection-comment": "\"[[$1]]\" యొక్క {{GENDER:$2|సంరక్షణ స్థాయిని మార్చారు}}",
        "unprotectedarticle-comment": "\"[[$1]]\" ను {{GENDER:$2|సంరక్షణ నుండి తీసివేసారు}}",
        "protect-title": "\"$1\" యొక్క సంరక్షణ స్థాయి మార్పు",
-       "protect-title-notallowed": "\"$1\" à°¯à±\8aà°\95à±\8dà°\95 à°¸à°\82à°°à°\95à±\8dà°·à°£ à°¸à±\8dథాయి",
+       "protect-title-notallowed": "\"$1\" సంరక్షణ స్థాయి",
        "prot_1movedto2": "$1, $2కు తరలించబడింది",
        "protect-badnamespace-title": "సంరక్షించజాలని పేరుబరి",
        "protect-badnamespace-text": "ఈ పేరుబరిలో ఉన్న పేజీలను సంరక్షించలేరు.",
        "whatlinkshere-links": "← లంకెలు",
        "whatlinkshere-hideredirs": "$1 దారిమార్పులు",
        "whatlinkshere-hidetrans": "$1 ట్రాన్స్‌క్లూజన్లు",
-       "whatlinkshere-hidelinks": "$1 లింకులు",
+       "whatlinkshere-hidelinks": "లంకెలు $1",
        "whatlinkshere-hideimages": "$1 దస్త్రపు లంకెలు",
        "whatlinkshere-filters": "వడపోతలు",
        "whatlinkshere-submit": "వెళ్ళు",
        "ipbreason": "కారణం:",
        "ipbreason-dropdown": "*సాధారణ నిరోధ కారణాలు\n** తప్పు సమాచారాన్ని చొప్పించడం\n** పేజీల్లోని సమాచారాన్ని తీసెయ్యడం\n** బయటి సైట్లకు లంకెలతో స్పాము చెయ్యడం\n** పేజీల్లోకి చెత్తను ఎక్కించడం\n** బెదిరింపు ప్రవర్తన/వేధింపులు\n** అనేక ఖాతాలను సృష్టించి దుశ్చర్యకు పాల్పడడం\n** అనుచితమైన వాడుకరి పేరు",
        "ipb-hardblock": "లాగినై ఉన్న వాడుకరులు ఈ ఐపీ అడ్రసు నుంచి మార్పుచేర్పులు చెయ్యకుండా నిరోధించండి",
-       "ipbcreateaccount": "à°\96ాతా à°¸à±\83à°·à±\8dà°\9fిని à°¨à°¿à°µà°¾à°°à°¿à°\82à°\9aు",
-       "ipbemailban": "వాడà±\81à°\95రిని à°\88-à°®à±\86యిలà±\8d à°\9aà±\86à°¯à±\8dà°¯à°\95à±\81à°\82à°¡à°¾ à°¨à°¿à°µà°¾à°°à°¿à°\82à°\9aà±\81",
+       "ipbcreateaccount": "à°\96ాతా à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°ªు",
+       "ipbemailban": "à°\88à°®à±\86యిలà±\81 à°ªà°\82పిà°\82à°\9aà°¡à°\82",
        "ipbenableautoblock": "ఈ వాడుకరి వాడిన చివరి ఐపీ అడ్రసును, అలాగే ఆ తరువాత వాడే అడ్రసులను కూడా ఆటోమాటిగ్గా నిరోధించు",
        "ipbsubmit": "ఈ వాడుకరిని నిరోధించు",
        "ipbother": "వేరే గడువు",
        "ipboptions": "2 గంటలు:2 hours,ఒక రోజు:1 day,3 రోజులు:3 days,ఒక వారం:1 week,2 వారాలు:2 weeks,ఒక నెల:1 month,3 నెలలు:3 months,6 నెలలు:6 months,ఒక సంవత్సరం:1 year,ఎప్పటికీ:infinite",
        "ipbhidename": "మార్పులు, జాబితాల నుండి ఈ వాడుకరిపేరుని దాచు",
        "ipbwatchuser": "ఈ వాడుకరి వాడుకరి పేజీ, చర్చాపేజీలను వీక్షణలో ఉంచు",
-       "ipb-disableusertalk": "నిరà±\8bà°§à°\82à°²à±\8b à°\89à°\82à°¡à°\97à°¾ à°\88 à°µà°¾à°¡à±\81à°\95à°°à°¿ à°¤à°¨ à°¸à±\8dà°µà°\82à°¤ à°\9aà°°à±\8dà°\9a à°ªà±\87à°\9cà±\80à°²à±\8b à°®à°¾à°°à±\8dà°ªà±\81à°\9aà±\87à°°à±\8dà°ªà±\81à°²à±\81 à°\9aà±\86à°¯à±\8dà°¯à°\95à±\81à°\82à°¡à°¾ à°¨à°¿à°°à±\8bధిà°\82à°\9aà±\81",
+       "ipb-disableusertalk": "తన à°¸à±\8dà°µà°\82à°¤ à°\9aà°°à±\8dà°\9a à°ªà±\87à°\9cà±\80à°²à±\8b à°®à°¾à°°à±\8dà°ªà±\81à°²à±\81 à°\9aà±\86à°¯à±\8dయడà°\82",
        "ipb-change-block": "ఈ అమరికలతో వాడుకరిని పునర్నిరోధించు",
        "ipb-confirm": "నిరోధాన్ని ధృవపరచండి",
        "ipb-sitewide": "సైట్ వ్యాప్తంగా",
        "ipb-blocklist-contribs": "{{GENDER:$1|$1}} మార్పులు-చేర్పులు",
        "ipb-blocklist-duration-left": "ఇంకా $1 మిగిలి ఉంది.",
        "block-expiry": "అంతమయ్యే గడువు",
+       "block-reason": "కారణం:",
+       "block-target": "వాడుకరి పేరు లేదా ఐపీ చిరునామా:",
        "unblockip": "వాడుకరిపై నిరోధాన్ని తొలగించు",
        "unblockiptext": "కింది ఫారం ఉపయోగించి, నిరోధించబడిన ఐ.పీ. చిరునామా లేదా వాడుకరికి తిరిగి రచనలు చేసే అధికారం ఇవ్వవచ్చు.",
        "ipusubmit": "ఈ నిరోధాన్ని తొలగించు",
        "blocklist-userblocks": "ఖాతా నిరోధాలను దాచు",
        "blocklist-tempblocks": "తాత్కాలిక నిరోధాలను దాచు",
        "blocklist-addressblocks": "ఏకైక ఐపీ నిరోధాలను దాచు",
+       "blocklist-type": "రకం:",
+       "blocklist-type-opt-all": "అన్నీ",
+       "blocklist-type-opt-sitewide": "సైటు వ్యాప్తంగా",
+       "blocklist-type-opt-partial": "పాక్షికం",
        "blocklist-rangeblocks": "శ్రేణి నిరోధకాలను దాచు",
        "blocklist-timestamp": "కాలముద్ర",
        "blocklist-target": "గమ్యం",
        "tooltip-pt-anoncontribs": "ఈ IP అడ్రసు నుండి చేసిన దిద్దుబాట్ల జాబితా",
        "tooltip-pt-login": "మిమ్మల్ని లాగినవమని ప్రోత్సహిస్తున్నాం; కానీ అది తప్పనిసరేమీ కాదు.",
        "tooltip-pt-login-private": "ఈ వికీని వాడాలంటే మీరు లాగినై ఉండాలి.",
-       "tooltip-pt-logout": "లాà°\97à±\8cà°\9fà°µండి",
+       "tooltip-pt-logout": "నిషà±\8dà°\95à±\8dరమిà°\82à°\9aండి",
        "tooltip-pt-createaccount": "మీరొక ఖాతాని సృష్టించుకొని ప్రవేశించటాన్ని సమర్ధిస్తున్నాము; కానీ, అది అవసరం కాదు, ఐచ్ఛికం మాత్రమే.",
        "tooltip-ca-talk": "విషయపు పేజీ గురించి చర్చ",
        "tooltip-ca-edit": "ఈ పేజీని సవరించండి",
        "tooltip-ca-addsection": "కొత్త విభాగాన్ని మొదలుపెట్టండి",
        "tooltip-ca-viewsource": "ఈ పుటని సంరక్షించారు. మీరు దీని మూలాన్ని చూడవచ్చు",
-       "tooltip-ca-history": "à°\88 à°ªà±\87à°\9cà±\80 à°¯à±\8aà°\95à±\8dà°\95 à°µà±\86à°¨à±\81à°\95టి కూర్పులు",
+       "tooltip-ca-history": "à°\88 à°ªà±\87à°\9cà±\80 à°®à±\81à°¨à±\81à°ªటి కూర్పులు",
        "tooltip-ca-protect": "ఈ పేజీని సంరక్షించండి",
        "tooltip-ca-unprotect": "ఈ పేజీ సంరక్షణను మార్చండి",
        "tooltip-ca-delete": "ఈ పేజీని తొలగించండి",
        "tooltip-n-mainpage": "మొదటి పేజీ చూడండి",
        "tooltip-n-mainpage-description": "మొదటి పేజీ చూడండి",
        "tooltip-n-portal": "ప్రాజెక్టు గురించి, మీరేం చేయవచ్చు, సమాచారం ఎక్కడ దొరుకుతుంది",
-       "tooltip-n-currentevents": "వరà±\8dతమాన à°\98à°\9fనల à°¯à±\8aà°\95à±\8dà°\95 à°¨à±\87పథà±\8dయానà±\8dని à°¤à±\86à°²à±\81à°¸à±\81à°\95à±\8bà°\82à°¡à°¿",
+       "tooltip-n-currentevents": "వర్తమాన ఘటనల నేపథ్యాన్ని తెలుసుకోండి",
        "tooltip-n-recentchanges": "వికీలో ఇటీవల జరిగిన మార్పుల జాబితా.",
        "tooltip-n-randompage": "ఓ యాదృచ్చిక పేజీని చూడండి",
        "tooltip-n-help": "నేర్చుకునే చోటు",
        "tooltip-t-emailuser": "ఈ {{GENDER:$1|వాడుకరికి}} ఓ ఈమెయిలు పంపండి",
        "tooltip-t-info": "ఈ పేజీ గురించి మరింత సమాచారం",
        "tooltip-t-upload": "దస్త్రాలను ఎక్కించండి",
-       "tooltip-t-specialpages": "à°\85à°¨à±\8dని à°ªà±\8dà°°à°¤à±\8dà°¯à±\87à°\95 à°ªà±\81à°\9fà°² జాబితా",
-       "tooltip-t-print": "ఈ పేజీ యొక్క ముద్రణా రూపు",
-       "tooltip-t-permalink": "à°ªà±\87à°\9cà±\80 à°¯à±\8aà°\95à±\8dà°\95 à°\88 à°\95à±\82à°°à±\8dà°ªà±\81à°\95à°¿ à°¶à°¾à°¶à±\8dవత à°²à°\82à°\95à±\86",
+       "tooltip-t-specialpages": "à°ªà±\8dà°°à°¤à±\8dà°¯à±\87à°\95 à°ªà±\87à°\9cà±\80లనà±\8dనిà°\9fà°¿ జాబితా",
+       "tooltip-t-print": "ఈ పేజీకి ముద్రించుకోదగ్గ కూర్పు",
+       "tooltip-t-permalink": "ఈ కూర్పుకి శాశ్వత లంకె",
        "tooltip-ca-nstab-main": "విషయపు పేజీని చూడండి",
        "tooltip-ca-nstab-user": "వాడుకరి పేజీని చూడండి",
        "tooltip-ca-nstab-media": "మీడియా పేజీని చూడండి",
-       "tooltip-ca-nstab-special": "à°\87ది à°\92à°\95 à°ªà±\8dà°°à°¤à±\8dà°¯à±\87à°\95 à°ªà±\87à°\9cà±\80, à°¦à±\80à°¨à±\8dని à°®à±\80à°°à±\81 à°¸à°°à°¿à°¦à°¿à°¦à±\8dదలà±\87à°°à±\81",
+       "tooltip-ca-nstab-special": "ఇది ఒక ప్రత్యేక పేజీ, దీన్ని సరిదిద్దలేరు",
        "tooltip-ca-nstab-project": "ప్రాజెక్టు పేజీని చూడండి",
        "tooltip-ca-nstab-image": "ఫైలు పేజీని చూడండి",
        "tooltip-ca-nstab-mediawiki": "వ్యవస్థా సందేశం చూడండి",
index d7e5a59..500bc6c 100644 (file)
        "linkstoimage-redirect": "$1 (ไฟล์เปลี่ยนทาง) $2",
        "duplicatesoffile": "$1 ไฟล์ต่อไปนี้ เป็นไฟล์เดียวกับไฟล์นี้ ([[Special:FileDuplicateSearch/$2|รายละเอียดเพิ่มเติม]]):",
        "sharedupload": "ไฟล์นี้มาจาก $1 และอาจมีใช้ในโครงการอื่น",
-       "sharedupload-desc-there": "ไฟล์นี้มาจาก $1 และอาจใช้บนโครงการอื่น\nกรุณาดู[หน้าคำอธิบายไฟล์ $2] สำหรับข้อมูลเพิ่มเติม",
+       "sharedupload-desc-there": "ไฟล์นี้มาจาก $1 และอาจใช้บนโครงการอื่น\nกรุณาดูสารสนเทศเพิ่มเติมที่ [$2 หน้าคำอธิบายไฟล์]",
        "sharedupload-desc-here": "ไฟล์นี้มาจาก $1 และอาจมีใช้ในโครงการอื่น\nคำอธิบายใน[$2 หน้าคำอธิบายไฟล์]แสดงไว้ด้านล่างนี้",
        "sharedupload-desc-edit": "ไฟล์นี้มาจาก $1 และอาจมีใช้ในโครงการอื่น\nคุณอาจต้องการแก้ไขคำอธิบายใน[$2 หน้าคำอธิบายไฟล์]นั้น",
        "sharedupload-desc-create": "ไฟล์นี้มาจาก $1 และอาจมีใช้ไฟล์นี้ในโครงการอื่น\nคุณอาจต้องการแก้ไขคำอธิบายใน[$2 หน้าคำอธิบายไฟล์]นั้น",
        "log-name-tag": "ปูมป้ายระบุ",
        "log-description-tag": "หน้านี้แสดงเมื่อผู้ใช้เพิ่มหรือลบ[[Special:Tags|ป้ายระบุ]]จากรุ่นแก้ไขหรือรายการปูมอันใดอันหนึ่ง ปูมนี้ไม่แสดงรายการการกระทำติดป้ายระบุเมื่อเกิดเป็นส่้วนหนึ่งของการแก้ไข การลบหรือการกระทำที่คล้ายกัน",
        "rightsnone": "(ไม่มี)",
+       "rightslogentry-temporary-group": "$1 (ชั่วคราว จนถึง $2)",
        "feedback-adding": "เพิ่มคำติชมเข้าไปที่หน้า...",
        "feedback-bugcheck": "ยอดเยี่ยม! เพียงตรวจสอบว่าจุดบกพร่องนั้นมิใช่หนึ่งใน[$1 จุดบกพร่องที่ทราบแล้ว]",
        "feedback-bugnew": "ฉันตรวจสอบแล้ว รายงานจุดบกพร่องใหม่",
index bfa144d..d47c030 100644 (file)
@@ -5,7 +5,8 @@
                        "Ganbarzada",
                        "Tuzkozbir",
                        "Гусейн",
-                       "아라"
+                       "아라",
+                       "Baskervill"
                ]
        },
        "tog-underline": "Линки жинтоно ријә быкәш:",
        "newuserlogpage": "Иштирокәкон ғеидијоти журнал",
        "action-edit": "Ым сәһифә сәрост кардеј",
        "nchanges": "$1 {{PLURAL:$1|дәгиши|дәгишон}}",
+       "enhancedrc-history": "Tarıx",
        "recentchanges": "Ән нујә дәгишон",
        "recentchanges-legend": "Ән нујә дәгишон кукон",
        "recentchanges-summary": "Тәмшо быкән бы сәһифәдә че вики охоминә дәгишон нишо доә быән.",
index fac3da1..50b5d24 100644 (file)
        "blocklink": "заблокувати",
        "unblocklink": "розблокувати",
        "change-blocklink": "змінити блокування",
+       "empty-username": "(ім'я користувача недоступне)",
        "contribslink": "внесок",
        "emaillink": "Надіслати повідомлення електронною поштою",
        "autoblocker": "Доступ заблоковано автоматично, тому що ви використовуєте ту саму адресу, що й \"[[User:$1|$1]]\". Причина блокування $1: \"$2\".",
index b7dc9c4..c1bd7fd 100644 (file)
        "mycontris": "個人貢獻",
        "anoncontribs": "貢獻",
        "contribsub2": "{{GENDER:$3|$1}}嘅貢獻 ($2)",
+       "contributions-subtitle": "{{GENDER:$3|$1}}",
        "contributions-userdoesnotexist": "用戶「$1」未有註冊。",
        "nocontribs": "搵唔到符合呢啲條件嘅修改。",
        "uctop": "最新",
index 847a13d..446d214 100644 (file)
@@ -22,6 +22,7 @@
  * @author Pitr2311
  * @author Ragimiri
  * @author Reedy
+ * @author Robertvazan
  * @author Rudko
  * @author Sp5uhe
  * @author Sudo77(new)
@@ -30,6 +31,7 @@
  * @author Urhixidur
  * @author Valasek
  * @author Wizzard
+ * @author Zoranzoki21
  * @author לערי ריינהארט
  */
 
@@ -40,19 +42,28 @@ $specialPageAliases = [
        'Allmessages'               => [ 'VšetkySprávy' ],
        'Allpages'                  => [ 'VšetkyStránky' ],
        'Ancientpages'              => [ 'StaréStránky' ],
+       'ApiSandbox'                => [ 'APIPieskovisko' ],
+       'AutoblockList'             => [ 'AutomatickéBlokovania' ],
        'Blankpage'                 => [ 'PrázdnaStránka' ],
        'Block'                     => [ 'Blokovanie' ],
        'Booksources'               => [ 'KnižnéZdroje' ],
+       'BotPasswords'              => [ 'HesláPreBotov' ],
        'BrokenRedirects'           => [ 'PokazenéPresmerovania' ],
        'Categories'                => [ 'Kategórie' ],
+       'ChangeCredentials'         => [ 'ZmenaPrihlasovacíchÚdajov' ],
+       'ChangeEmail'               => [ 'ZmenaEmailu' ],
        'ChangePassword'            => [ 'ZmenaHesla' ],
+       'ComparePages'              => [ 'PorovnaťStránky' ],
        'Confirmemail'              => [ 'PotvrdiťEmail' ],
        'Contributions'             => [ 'Príspevky' ],
        'CreateAccount'             => [ 'VytvorenieÚčtu' ],
        'Deadendpages'              => [ 'StránkyBezOdkazov' ],
        'DeletedContributions'      => [ 'ZmazanéPríspevky' ],
+       'Diff'                      => [ 'Rozdiel' ],
        'DoubleRedirects'           => [ 'DvojitéPresmerovania' ],
        'Emailuser'                 => [ 'EmailPoužívateľovi' ],
+       'ExpandTemplates'           => [ 'SubstituovaťŠablóny' ],
+       'Export'                    => [ 'ExportovaťStránky' ],
        'Fewestrevisions'           => [ 'NajmenejRevízií' ],
        'FileDuplicateSearch'       => [ 'HľadanieDuplicitnýchSúborov' ],
        'Filepath'                  => [ 'CestaKSúboru' ],
@@ -61,7 +72,9 @@ $specialPageAliases = [
        'LinkSearch'                => [ 'HľadanieOdkazov' ],
        'Listadmins'                => [ 'ZoznamSprávcov' ],
        'Listbots'                  => [ 'ZoznamBotov' ],
+       'ListDuplicatedFiles'       => [ 'ZoznamDuplicitnýchSúborov' ],
        'Listfiles'                 => [ 'ZoznamSúborov' ],
+       'Listgrants'                => [ 'SkupinyOprávnení' ],
        'Listgrouprights'           => [ 'ZoznamSkupinovýchPráv' ],
        'Listredirects'             => [ 'ZoznamPresmerovaní' ],
        'Listusers'                 => [ 'ZoznamPoužívateľov' ],
@@ -69,10 +82,12 @@ $specialPageAliases = [
        'Log'                       => [ 'Záznamy' ],
        'Lonelypages'               => [ 'OsirotenéStránky' ],
        'Longpages'                 => [ 'DlhéStránky' ],
+       'MediaStatistics'           => [ 'ŠtatistikaSúborov' ],
        'MergeHistory'              => [ 'HistóriaZlúčení' ],
        'MIMEsearch'                => [ 'HľadanieMIME' ],
        'Mostcategories'            => [ 'NajviacKategórií' ],
        'Mostimages'                => [ 'NajodkazovanejšieSúbory' ],
+       'MostInterwikis'            => [ 'NajviacInterwiki' ],
        'Mostlinked'                => [ 'NajodkazovanejšieStránky' ],
        'Mostlinkedcategories'      => [ 'NajodkazovanejšieKategórie' ],
        'Mostlinkedtemplates'       => [ 'NajodkazovanejšieŠablóny' ],
@@ -83,20 +98,30 @@ $specialPageAliases = [
        'Mytalk'                    => [ 'MojaDiskusia' ],
        'Newimages'                 => [ 'NovéSúbory' ],
        'Newpages'                  => [ 'NovéStránky' ],
+       'PagesWithProp'             => [ 'StránkySVlastnosťou' ],
+       'PasswordPolicies'          => [ 'PravidláPreHeslá' ],
+       'PasswordReset'             => [ 'ObnovaHesla' ],
+       'PermanentLink'             => [ 'TrvalýOdkaz' ],
        'Preferences'               => [ 'Nastavenia' ],
-       'Prefixindex'               => [ 'IndexPredpon' ],
+       'Prefixindex'               => [ 'StránkyZačínajúceNa', 'IndexPredpon' ],
        'Protectedpages'            => [ 'ZamknutéStránky' ],
        'Protectedtitles'           => [ 'ZamknutéNázvy' ],
+       'RandomInCategory'          => [ 'NáhodnáVKategórii' ],
        'Randompage'                => [ 'Náhodná', 'NáhodnáStránka' ],
        'Randomredirect'            => [ 'NáhodnéPresmerovanie' ],
+       'Randomrootpage'            => [ 'NáhodnáKoreňováStránka' ],
        'Recentchanges'             => [ 'PoslednéÚpravy' ],
        'Recentchangeslinked'       => [ 'SúvisiacePoslednéÚpravy' ],
+       'Redirect'                  => [ 'Presmerovanie' ],
+       'RemoveCredentials'         => [ 'OdstráneniePrihlasovacíchÚdajov' ],
+       'ResetTokens'               => [ 'ObnovaKľúčov' ],
        'Revisiondelete'            => [ 'ZmazaťRevíziu' ],
        'Search'                    => [ 'Hľadanie' ],
        'Shortpages'                => [ 'KrátkeStránky' ],
        'Specialpages'              => [ 'ŠpeciálneStránky' ],
        'Statistics'                => [ 'Štatistika' ],
        'Tags'                      => [ 'Značky' ],
+       'TrackingCategories'        => [ 'SledovacieKategórie' ],
        'Uncategorizedcategories'   => [ 'NekategorizovanéKategórie' ],
        'Uncategorizedimages'       => [ 'NekategorizovanéSúbory' ],
        'Uncategorizedpages'        => [ 'NekategorizovanéStránky' ],
diff --git a/maintenance/7zip.inc b/maintenance/7zip.inc
deleted file mode 100644 (file)
index 6a763f2..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-<?php
-/**
- * 7z stream wrapper
- *
- * Copyright © 2005 Brion Vibber <brion@pobox.com>
- * https://www.mediawiki.org/
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Maintenance
- */
-
-use MediaWiki\Shell\Shell;
-
-/**
- * Stream wrapper around 7za filter program.
- * Required since we can't pass an open file resource to XMLReader->open()
- * which is used for the text prefetch.
- *
- * @ingroup Maintenance
- */
-class SevenZipStream {
-       protected $stream;
-
-       private function stripPath( $path ) {
-               $prefix = 'mediawiki.compress.7z://';
-
-               return substr( $path, strlen( $prefix ) );
-       }
-
-       function stream_open( $path, $mode, $options, &$opened_path ) {
-               if ( $mode[0] == 'r' ) {
-                       $options = 'e -bd -so';
-               } elseif ( $mode[0] == 'w' ) {
-                       $options = 'a -bd -si';
-               } else {
-                       return false;
-               }
-               $arg = Shell::escape( $this->stripPath( $path ) );
-               $command = "7za $options $arg";
-               if ( !wfIsWindows() ) {
-                       // Suppress the stupid messages on stderr
-                       $command .= ' 2>/dev/null';
-               }
-               $this->stream = popen( $command, $mode[0] ); // popen() doesn't like two-letter modes
-               return ( $this->stream !== false );
-       }
-
-       function url_stat( $path, $flags ) {
-               return stat( $this->stripPath( $path ) );
-       }
-
-       // This is all so lame; there should be a default class we can extend
-
-       function stream_close() {
-               return fclose( $this->stream );
-       }
-
-       function stream_flush() {
-               return fflush( $this->stream );
-       }
-
-       function stream_read( $count ) {
-               return fread( $this->stream, $count );
-       }
-
-       function stream_write( $data ) {
-               return fwrite( $this->stream, $data );
-       }
-
-       function stream_tell() {
-               return ftell( $this->stream );
-       }
-
-       function stream_eof() {
-               return feof( $this->stream );
-       }
-
-       function stream_seek( $offset, $whence ) {
-               return fseek( $this->stream, $offset, $whence );
-       }
-}
-
-stream_wrapper_register( 'mediawiki.compress.7z', SevenZipStream::class );
index 1c53fe8..94ae95d 100644 (file)
@@ -61,6 +61,7 @@ if ( !defined( 'MW_CONFIG_CALLBACK' ) && !defined( 'MW_CONFIG_FILE' ) ) {
 
 // Custom setup for Maintenance entry point
 if ( !defined( 'MW_SETUP_CALLBACK' ) ) {
+
        function wfMaintenanceSetup() {
                // phpcs:ignore MediaWiki.NamingConventions.ValidGlobalName.wgPrefix
                global $maintenance, $wgLocalisationCacheConf, $wgCacheDirectory;
@@ -75,6 +76,7 @@ if ( !defined( 'MW_SETUP_CALLBACK' ) ) {
 
                $maintenance->finalSetup();
        }
+
        define( 'MW_SETUP_CALLBACK', 'wfMaintenanceSetup' );
 }
 
index b942302..938a6d1 100644 (file)
@@ -65,6 +65,7 @@ TEXT
                $this->addOption( 'stub', 'Don\'t perform old_text lookups; for 2-pass dump' );
                $this->addOption( 'uploads', 'Include upload records without files' );
                $this->addOption( 'include-files', 'Include files within the XML stream' );
+               $this->addOption( 'namespaces', 'Limit to this comma-separated list of namespace numbers' );
 
                if ( $args ) {
                        $this->loadWithArgv( $args );
@@ -131,6 +132,11 @@ TEXT
                $this->dumpUploads = $this->hasOption( 'uploads' );
                $this->dumpUploadFileContents = $this->hasOption( 'include-files' );
                $this->orderRevs = $this->hasOption( 'orderrevs' );
+               if ( $this->hasOption( 'namespaces' ) ) {
+                       $this->limitNamespaces = explode( ',', $this->getOption( 'namespaces' ) );
+               } else {
+                       $this->limitNamespaces = null;
+               }
        }
 }
 
index 7566fe0..a80ac7e 100644 (file)
  * @file
  * @ingroup Maintenance
  */
-
-require_once __DIR__ . '/includes/BackupDumper.php';
-require_once __DIR__ . '/7zip.inc';
-require_once __DIR__ . '/../includes/export/WikiExporter.php';
-
-use MediaWiki\MediaWikiServices;
-use MediaWiki\Shell\Shell;
-use MediaWiki\Storage\BlobAccessException;
-use MediaWiki\Storage\SqlBlobStore;
-use Wikimedia\Rdbms\IMaintainableDatabase;
-
-/**
- * @ingroup Maintenance
- */
-class TextPassDumper extends BackupDumper {
-       /** @var BaseDump */
-       public $prefetch = null;
-       /** @var string|bool */
-       private $thisPage;
-       /** @var string|bool */
-       private $thisRev;
-
-       // when we spend more than maxTimeAllowed seconds on this run, we continue
-       // processing until we write out the next complete page, then save output file(s),
-       // rename it/them and open new one(s)
-       public $maxTimeAllowed = 0; // 0 = no limit
-
-       protected $input = "php://stdin";
-       protected $history = WikiExporter::FULL;
-       protected $fetchCount = 0;
-       protected $prefetchCount = 0;
-       protected $prefetchCountLast = 0;
-       protected $fetchCountLast = 0;
-
-       protected $maxFailures = 5;
-       protected $maxConsecutiveFailedTextRetrievals = 200;
-       protected $failureTimeout = 5; // Seconds to sleep after db failure
-
-       protected $bufferSize = 524288; // In bytes. Maximum size to read from the stub in on go.
-
-       protected $php = "php";
-       protected $spawn = false;
-
-       /**
-        * @var bool|resource
-        */
-       protected $spawnProc = false;
-
-       /**
-        * @var bool|resource
-        */
-       protected $spawnWrite = false;
-
-       /**
-        * @var bool|resource
-        */
-       protected $spawnRead = false;
-
-       /**
-        * @var bool|resource
-        */
-       protected $spawnErr = false;
-
-       /**
-        * @var bool|XmlDumpWriter
-        */
-       protected $xmlwriterobj = false;
-
-       protected $timeExceeded = false;
-       protected $firstPageWritten = false;
-       protected $lastPageWritten = false;
-       protected $checkpointJustWritten = false;
-       protected $checkpointFiles = [];
-
-       /**
-        * @var IMaintainableDatabase
-        */
-       protected $db;
-
-       /**
-        * @param array|null $args For backward compatibility
-        */
-       function __construct( $args = null ) {
-               parent::__construct();
-
-               $this->addDescription( <<<TEXT
-This script postprocesses XML dumps from dumpBackup.php to add
-page text which was stubbed out (using --stub).
-
-XML input is accepted on stdin.
-XML output is sent to stdout; progress reports are sent to stderr.
-TEXT
-               );
-               $this->stderr = fopen( "php://stderr", "wt" );
-
-               $this->addOption( 'stub', 'To load a compressed stub dump instead of stdin. ' .
-                       'Specify as --stub=<type>:<file>.', false, true );
-               $this->addOption( 'prefetch', 'Use a prior dump file as a text source, to savepressure on the ' .
-                       'database. (Requires the XMLReader extension). Specify as --prefetch=<type>:<file>',
-                       false, true );
-               $this->addOption( 'maxtime', 'Write out checkpoint file after this many minutes (writing' .
-                       'out complete page, closing xml file properly, and opening new one' .
-                       'with header).  This option requires the checkpointfile option.', false, true );
-               $this->addOption( 'checkpointfile', 'Use this string for checkpoint filenames,substituting ' .
-                       'first pageid written for the first %s (required) and the last pageid written for the ' .
-                       'second %s if it exists.', false, true, false, true ); // This can be specified multiple times
-               $this->addOption( 'quiet', 'Don\'t dump status reports to stderr.' );
-               $this->addOption( 'full', 'Dump all revisions of every page' );
-               $this->addOption( 'current', 'Base ETA on number of pages in database instead of all revisions' );
-               $this->addOption( 'spawn', 'Spawn a subprocess for loading text records' );
-               $this->addOption( 'buffersize', 'Buffer size in bytes to use for reading the stub. ' .
-                       '(Default: 512KB, Minimum: 4KB)', false, true );
-
-               if ( $args ) {
-                       $this->loadWithArgv( $args );
-                       $this->processOptions();
-               }
-       }
-
-       /**
-        * @return SqlBlobStore
-        */
-       private function getBlobStore() {
-               return MediaWikiServices::getInstance()->getBlobStore();
-       }
-
-       function execute() {
-               $this->processOptions();
-               $this->dump( true );
-       }
-
-       function processOptions() {
-               parent::processOptions();
-
-               if ( $this->hasOption( 'buffersize' ) ) {
-                       $this->bufferSize = max( intval( $this->getOption( 'buffersize' ) ), 4 * 1024 );
-               }
-
-               if ( $this->hasOption( 'prefetch' ) ) {
-                       $url = $this->processFileOpt( $this->getOption( 'prefetch' ) );
-                       $this->prefetch = new BaseDump( $url );
-               }
-
-               if ( $this->hasOption( 'stub' ) ) {
-                       $this->input = $this->processFileOpt( $this->getOption( 'stub' ) );
-               }
-
-               if ( $this->hasOption( 'maxtime' ) ) {
-                       $this->maxTimeAllowed = intval( $this->getOption( 'maxtime' ) ) * 60;
-               }
-
-               if ( $this->hasOption( 'checkpointfile' ) ) {
-                       $this->checkpointFiles = $this->getOption( 'checkpointfile' );
-               }
-
-               if ( $this->hasOption( 'current' ) ) {
-                       $this->history = WikiExporter::CURRENT;
-               }
-
-               if ( $this->hasOption( 'full' ) ) {
-                       $this->history = WikiExporter::FULL;
-               }
-
-               if ( $this->hasOption( 'spawn' ) ) {
-                       $this->spawn = true;
-                       $val = $this->getOption( 'spawn' );
-                       if ( $val !== 1 ) {
-                               $this->php = $val;
-                       }
-               }
-       }
-
-       /**
-        * Drop the database connection $this->db and try to get a new one.
-        *
-        * This function tries to get a /different/ connection if this is
-        * possible. Hence, (if this is possible) it switches to a different
-        * failover upon each call.
-        *
-        * This function resets $this->lb and closes all connections on it.
-        *
-        * @throws MWException
-        */
-       function rotateDb() {
-               // Cleaning up old connections
-               if ( isset( $this->lb ) ) {
-                       $this->lb->closeAll();
-                       unset( $this->lb );
-               }
-
-               if ( $this->forcedDb !== null ) {
-                       $this->db = $this->forcedDb;
-
-                       return;
-               }
-
-               if ( isset( $this->db ) && $this->db->isOpen() ) {
-                       throw new MWException( 'DB is set and has not been closed by the Load Balancer' );
-               }
-
-               unset( $this->db );
-
-               // Trying to set up new connection.
-               // We do /not/ retry upon failure, but delegate to encapsulating logic, to avoid
-               // individually retrying at different layers of code.
-
-               try {
-                       $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
-                       $this->lb = $lbFactory->newMainLB();
-               } catch ( Exception $e ) {
-                       throw new MWException( __METHOD__
-                               . " rotating DB failed to obtain new load balancer (" . $e->getMessage() . ")" );
-               }
-
-               try {
-                       $this->db = $this->lb->getConnection( DB_REPLICA, 'dump' );
-               } catch ( Exception $e ) {
-                       throw new MWException( __METHOD__
-                               . " rotating DB failed to obtain new database (" . $e->getMessage() . ")" );
-               }
-       }
-
-       function initProgress( $history = WikiExporter::FULL ) {
-               parent::initProgress();
-               $this->timeOfCheckpoint = $this->startTime;
-       }
-
-       function dump( $history, $text = WikiExporter::TEXT ) {
-               // Notice messages will foul up your XML output even if they're
-               // relatively harmless.
-               if ( ini_get( 'display_errors' ) ) {
-                       ini_set( 'display_errors', 'stderr' );
-               }
-
-               $this->initProgress( $this->history );
-
-               // We are trying to get an initial database connection to avoid that the
-               // first try of this request's first call to getText fails. However, if
-               // obtaining a good DB connection fails it's not a serious issue, as
-               // getText does retry upon failure and can start without having a working
-               // DB connection.
-               try {
-                       $this->rotateDb();
-               } catch ( Exception $e ) {
-                       // We do not even count this as failure. Just let eventual
-                       // watchdogs know.
-                       $this->progress( "Getting initial DB connection failed (" .
-                               $e->getMessage() . ")" );
-               }
-
-               $this->egress = new ExportProgressFilter( $this->sink, $this );
-
-               // it would be nice to do it in the constructor, oh well. need egress set
-               $this->finalOptionCheck();
-
-               // we only want this so we know how to close a stream :-P
-               $this->xmlwriterobj = new XmlDumpWriter();
-
-               $input = fopen( $this->input, "rt" );
-               $this->readDump( $input );
-
-               if ( $this->spawnProc ) {
-                       $this->closeSpawn();
-               }
-
-               $this->report( true );
-       }
-
-       function processFileOpt( $opt ) {
-               $split = explode( ':', $opt, 2 );
-               $val = $split[0];
-               $param = '';
-               if ( count( $split ) === 2 ) {
-                       $param = $split[1];
-               }
-               $fileURIs = explode( ';', $param );
-               foreach ( $fileURIs as $URI ) {
-                       switch ( $val ) {
-                               case "file":
-                                       $newURI = $URI;
-                                       break;
-                               case "gzip":
-                                       $newURI = "compress.zlib://$URI";
-                                       break;
-                               case "bzip2":
-                                       $newURI = "compress.bzip2://$URI";
-                                       break;
-                               case "7zip":
-                                       $newURI = "mediawiki.compress.7z://$URI";
-                                       break;
-                               default:
-                                       $newURI = $URI;
-                       }
-                       $newFileURIs[] = $newURI;
-               }
-               $val = implode( ';', $newFileURIs );
-
-               return $val;
-       }
-
-       /**
-        * Overridden to include prefetch ratio if enabled.
-        */
-       function showReport() {
-               if ( !$this->prefetch ) {
-                       parent::showReport();
-
-                       return;
-               }
-
-               if ( $this->reporting ) {
-                       $now = wfTimestamp( TS_DB );
-                       $nowts = microtime( true );
-                       $deltaAll = $nowts - $this->startTime;
-                       $deltaPart = $nowts - $this->lastTime;
-                       $this->pageCountPart = $this->pageCount - $this->pageCountLast;
-                       $this->revCountPart = $this->revCount - $this->revCountLast;
-
-                       if ( $deltaAll ) {
-                               $portion = $this->revCount / $this->maxCount;
-                               $eta = $this->startTime + $deltaAll / $portion;
-                               $etats = wfTimestamp( TS_DB, intval( $eta ) );
-                               if ( $this->fetchCount ) {
-                                       $fetchRate = 100.0 * $this->prefetchCount / $this->fetchCount;
-                               } else {
-                                       $fetchRate = '-';
-                               }
-                               $pageRate = $this->pageCount / $deltaAll;
-                               $revRate = $this->revCount / $deltaAll;
-                       } else {
-                               $pageRate = '-';
-                               $revRate = '-';
-                               $etats = '-';
-                               $fetchRate = '-';
-                       }
-                       if ( $deltaPart ) {
-                               if ( $this->fetchCountLast ) {
-                                       $fetchRatePart = 100.0 * $this->prefetchCountLast / $this->fetchCountLast;
-                               } else {
-                                       $fetchRatePart = '-';
-                               }
-                               $pageRatePart = $this->pageCountPart / $deltaPart;
-                               $revRatePart = $this->revCountPart / $deltaPart;
-                       } else {
-                               $fetchRatePart = '-';
-                               $pageRatePart = '-';
-                               $revRatePart = '-';
-                       }
-                       $this->progress( sprintf(
-                               "%s: %s (ID %d) %d pages (%0.1f|%0.1f/sec all|curr), "
-                                       . "%d revs (%0.1f|%0.1f/sec all|curr), %0.1f%%|%0.1f%% "
-                                       . "prefetched (all|curr), ETA %s [max %d]",
-                               $now, wfWikiID(), $this->ID, $this->pageCount, $pageRate,
-                               $pageRatePart, $this->revCount, $revRate, $revRatePart,
-                               $fetchRate, $fetchRatePart, $etats, $this->maxCount
-                       ) );
-                       $this->lastTime = $nowts;
-                       $this->revCountLast = $this->revCount;
-                       $this->prefetchCountLast = $this->prefetchCount;
-                       $this->fetchCountLast = $this->fetchCount;
-               }
-       }
-
-       function setTimeExceeded() {
-               $this->timeExceeded = true;
-       }
-
-       function checkIfTimeExceeded() {
-               if ( $this->maxTimeAllowed
-                       && ( $this->lastTime - $this->timeOfCheckpoint > $this->maxTimeAllowed )
-               ) {
-                       return true;
-               }
-
-               return false;
-       }
-
-       function finalOptionCheck() {
-               if ( ( $this->checkpointFiles && !$this->maxTimeAllowed )
-                       || ( $this->maxTimeAllowed && !$this->checkpointFiles )
-               ) {
-                       throw new MWException( "Options checkpointfile and maxtime must be specified together.\n" );
-               }
-               foreach ( $this->checkpointFiles as $checkpointFile ) {
-                       $count = substr_count( $checkpointFile, "%s" );
-                       if ( $count != 2 ) {
-                               throw new MWException( "Option checkpointfile must contain two '%s' "
-                                       . "for substitution of first and last pageids, count is $count instead, "
-                                       . "file is $checkpointFile.\n" );
-                       }
-               }
-
-               if ( $this->checkpointFiles ) {
-                       $filenameList = (array)$this->egress->getFilenames();
-                       if ( count( $filenameList ) != count( $this->checkpointFiles ) ) {
-                               throw new MWException( "One checkpointfile must be specified "
-                                       . "for each output option, if maxtime is used.\n" );
-                       }
-               }
-       }
-
-       /**
-        * @throws MWException Failure to parse XML input
-        * @param string $input
-        * @return bool
-        */
-       function readDump( $input ) {
-               $this->buffer = "";
-               $this->openElement = false;
-               $this->atStart = true;
-               $this->state = "";
-               $this->lastName = "";
-               $this->thisPage = 0;
-               $this->thisRev = 0;
-               $this->thisRevModel = null;
-               $this->thisRevFormat = null;
-
-               $parser = xml_parser_create( "UTF-8" );
-               xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, false );
-
-               xml_set_element_handler(
-                       $parser,
-                       [ $this, 'startElement' ],
-                       [ $this, 'endElement' ]
-               );
-               xml_set_character_data_handler( $parser, [ $this, 'characterData' ] );
-
-               $offset = 0; // for context extraction on error reporting
-               do {
-                       if ( $this->checkIfTimeExceeded() ) {
-                               $this->setTimeExceeded();
-                       }
-                       $chunk = fread( $input, $this->bufferSize );
-                       if ( !xml_parse( $parser, $chunk, feof( $input ) ) ) {
-                               wfDebug( "TextDumpPass::readDump encountered XML parsing error\n" );
-
-                               $byte = xml_get_current_byte_index( $parser );
-                               $msg = wfMessage( 'xml-error-string',
-                                       'XML import parse failure',
-                                       xml_get_current_line_number( $parser ),
-                                       xml_get_current_column_number( $parser ),
-                                       $byte . ( is_null( $chunk ) ? null : ( '; "' . substr( $chunk, $byte - $offset, 16 ) . '"' ) ),
-                                       xml_error_string( xml_get_error_code( $parser ) ) )->escaped();
-
-                               xml_parser_free( $parser );
-
-                               throw new MWException( $msg );
-                       }
-                       $offset += strlen( $chunk );
-               } while ( $chunk !== false && !feof( $input ) );
-               if ( $this->maxTimeAllowed ) {
-                       $filenameList = (array)$this->egress->getFilenames();
-                       // we wrote some stuff after last checkpoint that needs renamed
-                       if ( file_exists( $filenameList[0] ) ) {
-                               $newFilenames = [];
-                               # we might have just written the header and footer and had no
-                               # pages or revisions written... perhaps they were all deleted
-                               # there's no pageID 0 so we use that. the caller is responsible
-                               # for deciding what to do with a file containing only the
-                               # siteinfo information and the mw tags.
-                               if ( !$this->firstPageWritten ) {
-                                       $firstPageID = str_pad( 0, 9, "0", STR_PAD_LEFT );
-                                       $lastPageID = str_pad( 0, 9, "0", STR_PAD_LEFT );
-                               } else {
-                                       $firstPageID = str_pad( $this->firstPageWritten, 9, "0", STR_PAD_LEFT );
-                                       $lastPageID = str_pad( $this->lastPageWritten, 9, "0", STR_PAD_LEFT );
-                               }
-
-                               $filenameCount = count( $filenameList );
-                               for ( $i = 0; $i < $filenameCount; $i++ ) {
-                                       $checkpointNameFilledIn = sprintf( $this->checkpointFiles[$i], $firstPageID, $lastPageID );
-                                       $fileinfo = pathinfo( $filenameList[$i] );
-                                       $newFilenames[] = $fileinfo['dirname'] . '/' . $checkpointNameFilledIn;
-                               }
-                               $this->egress->closeAndRename( $newFilenames );
-                       }
-               }
-               xml_parser_free( $parser );
-
-               return true;
-       }
-
-       /**
-        * Applies applicable export transformations to $text.
-        *
-        * @param string $text
-        * @param string $model
-        * @param string|null $format
-        *
-        * @return string
-        */
-       private function exportTransform( $text, $model, $format = null ) {
-               try {
-                       $handler = ContentHandler::getForModelID( $model );
-                       $text = $handler->exportTransform( $text, $format );
-               }
-               catch ( MWException $ex ) {
-                       $this->progress(
-                               "Unable to apply export transformation for content model '$model': " .
-                               $ex->getMessage()
-                       );
-               }
-
-               return $text;
-       }
-
-       /**
-        * Tries to load revision text.
-        * Export transformations are applied if the content model is given or can be
-        * determined from the database.
-        *
-        * Upon errors, retries (Up to $this->maxFailures tries each call).
-        * If still no good revision could be found even after this retrying, "" is returned.
-        * If no good revision text could be returned for
-        * $this->maxConsecutiveFailedTextRetrievals consecutive calls to getText, MWException
-        * is thrown.
-        *
-        * @param int|string $id Content address, or text row ID.
-        * @param string|bool|null $model The content model used to determine
-        *  applicable export transformations.
-        *  If $model is null, it will be determined from the database.
-        * @param string|null $format The content format used when applying export transformations.
-        *
-        * @throws MWException
-        * @return string The revision text for $id, or ""
-        */
-       function getText( $id, $model = null, $format = null ) {
-               global $wgContentHandlerUseDB;
-
-               $prefetchNotTried = true; // Whether or not we already tried to get the text via prefetch.
-               $text = false; // The candidate for a good text. false if no proper value.
-               $failures = 0; // The number of times, this invocation of getText already failed.
-
-               // The number of times getText failed without yielding a good text in between.
-               static $consecutiveFailedTextRetrievals = 0;
-
-               $this->fetchCount++;
-
-               // To allow to simply return on success and do not have to worry about book keeping,
-               // we assume, this fetch works (possible after some retries). Nevertheless, we koop
-               // the old value, so we can restore it, if problems occur (See after the while loop).
-               $oldConsecutiveFailedTextRetrievals = $consecutiveFailedTextRetrievals;
-               $consecutiveFailedTextRetrievals = 0;
-
-               if ( $model === null && $wgContentHandlerUseDB ) {
-                       // TODO: MCR: use content table
-                       $row = $this->db->selectRow(
-                               'revision',
-                               [ 'rev_content_model', 'rev_content_format' ],
-                               [ 'rev_id' => $this->thisRev ],
-                               __METHOD__
-                       );
-
-                       if ( $row ) {
-                               $model = $row->rev_content_model;
-                               $format = $row->rev_content_format;
-                       }
-               }
-
-               if ( $model === null || $model === '' ) {
-                       $model = false;
-               }
-
-               while ( $failures < $this->maxFailures ) {
-                       // As soon as we found a good text for the $id, we will return immediately.
-                       // Hence, if we make it past the try catch block, we know that we did not
-                       // find a good text.
-
-                       try {
-                               // Step 1: Get some text (or reuse from previous iteratuon if checking
-                               //         for plausibility failed)
-
-                               // Trying to get prefetch, if it has not been tried before
-                               if ( $text === false && isset( $this->prefetch ) && $prefetchNotTried ) {
-                                       $prefetchNotTried = false;
-                                       $tryIsPrefetch = true;
-                                       $text = $this->prefetch->prefetch( (int)$this->thisPage, (int)$this->thisRev );
-
-                                       if ( $text === null ) {
-                                               $text = false;
-                                       }
-
-                                       if ( is_string( $text ) && $model !== false ) {
-                                               // Apply export transformation to text coming from an old dump.
-                                               // The purpose of this transformation is to convert up from legacy
-                                               // formats, which may still be used in the older dump that is used
-                                               // for pre-fetching. Applying the transformation again should not
-                                               // interfere with content that is already in the correct form.
-                                               $text = $this->exportTransform( $text, $model, $format );
-                                       }
-                               }
-
-                               if ( $text === false ) {
-                                       // Fallback to asking the database
-                                       $tryIsPrefetch = false;
-                                       if ( $this->spawn ) {
-                                               $text = $this->getTextSpawned( $id );
-                                       } else {
-                                               $text = $this->getTextDb( $id );
-                                       }
-
-                                       if ( $text !== false && $model !== false ) {
-                                               // Apply export transformation to text coming from the database.
-                                               // Prefetched text should already have transformations applied.
-                                               $text = $this->exportTransform( $text, $model, $format );
-                                       }
-
-                                       // No more checks for texts from DB for now.
-                                       // If we received something that is not false,
-                                       // We treat it as good text, regardless of whether it actually is or is not
-                                       if ( $text !== false ) {
-                                               return $text;
-                                       }
-                               }
-
-                               if ( $text === false ) {
-                                       throw new MWException( "Generic error while obtaining text for id " . $id );
-                               }
-
-                               // We received a good candidate for the text of $id via some method
-
-                               // Step 2: Checking for plausibility and return the text if it is
-                               //         plausible
-                               $revID = intval( $this->thisRev );
-                               if ( !isset( $this->db ) ) {
-                                       throw new MWException( "No database available" );
-                               }
-
-                               if ( $model !== CONTENT_MODEL_WIKITEXT ) {
-                                       $revLength = strlen( $text );
-                               } else {
-                                       $revLength = $this->db->selectField( 'revision', 'rev_len', [ 'rev_id' => $revID ] );
-                               }
-
-                               if ( strlen( $text ) == $revLength ) {
-                                       if ( $tryIsPrefetch ) {
-                                               $this->prefetchCount++;
-                                       }
-
-                                       return $text;
-                               }
-
-                               $text = false;
-                               throw new MWException( "Received text is unplausible for id " . $id );
-                       } catch ( Exception $e ) {
-                               $msg = "getting/checking text " . $id . " failed (" . $e->getMessage() . ")";
-                               if ( $failures + 1 < $this->maxFailures ) {
-                                       $msg .= " (Will retry " . ( $this->maxFailures - $failures - 1 ) . " more times)";
-                               }
-                               $this->progress( $msg );
-                       }
-
-                       // Something went wrong; we did not a text that was plausible :(
-                       $failures++;
-
-                       // A failure in a prefetch hit does not warrant resetting db connection etc.
-                       if ( !$tryIsPrefetch ) {
-                               // After backing off for some time, we try to reboot the whole process as
-                               // much as possible to not carry over failures from one part to the other
-                               // parts
-                               sleep( $this->failureTimeout );
-                               try {
-                                       $this->rotateDb();
-                                       if ( $this->spawn ) {
-                                               $this->closeSpawn();
-                                               $this->openSpawn();
-                                       }
-                               } catch ( Exception $e ) {
-                                       $this->progress( "Rebooting getText infrastructure failed (" . $e->getMessage() . ")" .
-                                               " Trying to continue anyways" );
-                               }
-                       }
-               }
-
-               // Retirieving a good text for $id failed (at least) maxFailures times.
-               // We abort for this $id.
-
-               // Restoring the consecutive failures, and maybe aborting, if the dump
-               // is too broken.
-               $consecutiveFailedTextRetrievals = $oldConsecutiveFailedTextRetrievals + 1;
-               if ( $consecutiveFailedTextRetrievals > $this->maxConsecutiveFailedTextRetrievals ) {
-                       throw new MWException( "Graceful storage failure" );
-               }
-
-               return "";
-       }
-
-       /**
-        * Loads the serialized content from storage.
-        *
-        * @param int|string $id Content address, or text row ID.
-        * @return bool|string
-        */
-       private function getTextDb( $id ) {
-               $store = $this->getBlobStore();
-               $address = ( is_int( $id ) || strpos( $id, ':' ) === false )
-                       ? SqlBlobStore::makeAddressFromTextId( (int)$id )
-                       : $id;
-
-               try {
-                       $text = $store->getBlob( $address );
-
-                       $stripped = str_replace( "\r", "", $text );
-                       $normalized = MediaWikiServices::getInstance()->getContentLanguage()
-                               ->normalize( $stripped );
-
-                       return $normalized;
-               } catch ( BlobAccessException $ex ) {
-                       // XXX: log a warning?
-                       return false;
-               }
-       }
-
-       /**
-        * @param int|string $address Content address, or text row ID.
-        * @return bool|string
-        */
-       private function getTextSpawned( $address ) {
-               Wikimedia\suppressWarnings();
-               if ( !$this->spawnProc ) {
-                       // First time?
-                       $this->openSpawn();
-               }
-               $text = $this->getTextSpawnedOnce( $address );
-               Wikimedia\restoreWarnings();
-
-               return $text;
-       }
-
-       function openSpawn() {
-               global $IP;
-
-               if ( file_exists( "$IP/../multiversion/MWScript.php" ) ) {
-                       $cmd = implode( " ",
-                               array_map( [ Shell::class, 'escape' ],
-                                       [
-                                               $this->php,
-                                               "$IP/../multiversion/MWScript.php",
-                                               "fetchText.php",
-                                               '--wiki', wfWikiID() ] ) );
-               } else {
-                       $cmd = implode( " ",
-                               array_map( [ Shell::class, 'escape' ],
-                                       [
-                                               $this->php,
-                                               "$IP/maintenance/fetchText.php",
-                                               '--wiki', wfWikiID() ] ) );
-               }
-               $spec = [
-                       0 => [ "pipe", "r" ],
-                       1 => [ "pipe", "w" ],
-                       2 => [ "file", "/dev/null", "a" ] ];
-               $pipes = [];
-
-               $this->progress( "Spawning database subprocess: $cmd" );
-               $this->spawnProc = proc_open( $cmd, $spec, $pipes );
-               if ( !$this->spawnProc ) {
-                       $this->progress( "Subprocess spawn failed." );
-
-                       return false;
-               }
-               list(
-                       $this->spawnWrite, // -> stdin
-                       $this->spawnRead, // <- stdout
-               ) = $pipes;
-
-               return true;
-       }
-
-       private function closeSpawn() {
-               Wikimedia\suppressWarnings();
-               if ( $this->spawnRead ) {
-                       fclose( $this->spawnRead );
-               }
-               $this->spawnRead = false;
-               if ( $this->spawnWrite ) {
-                       fclose( $this->spawnWrite );
-               }
-               $this->spawnWrite = false;
-               if ( $this->spawnErr ) {
-                       fclose( $this->spawnErr );
-               }
-               $this->spawnErr = false;
-               if ( $this->spawnProc ) {
-                       pclose( $this->spawnProc );
-               }
-               $this->spawnProc = false;
-               Wikimedia\restoreWarnings();
-       }
-
-       /**
-        * @param int|string $address Content address, or text row ID.
-        * @return bool|string
-        */
-       private function getTextSpawnedOnce( $address ) {
-               if ( is_int( $address ) || intval( $address ) ) {
-                       $address = SqlBlobStore::makeAddressFromTextId( (int)$address );
-               }
-
-               $ok = fwrite( $this->spawnWrite, "$address\n" );
-               // $this->progress( ">> $id" );
-               if ( !$ok ) {
-                       return false;
-               }
-
-               $ok = fflush( $this->spawnWrite );
-               // $this->progress( ">> [flush]" );
-               if ( !$ok ) {
-                       return false;
-               }
-
-               // check that the text address they are sending is the one we asked for
-               // this avoids out of sync revision text errors we have encountered in the past
-               $newAddress = fgets( $this->spawnRead );
-               if ( $newAddress === false ) {
-                       return false;
-               }
-               $newAddress = trim( $newAddress );
-               if ( strpos( $newAddress, ':' ) === false ) {
-                       $newAddress = SqlBlobStore::makeAddressFromTextId( intval( $newAddress ) );
-               }
-
-               if ( $newAddress !== $address ) {
-                       return false;
-               }
-
-               $len = fgets( $this->spawnRead );
-               // $this->progress( "<< " . trim( $len ) );
-               if ( $len === false ) {
-                       return false;
-               }
-
-               $nbytes = intval( $len );
-               // actual error, not zero-length text
-               if ( $nbytes < 0 ) {
-                       return false;
-               }
-
-               $text = "";
-
-               // Subprocess may not send everything at once, we have to loop.
-               while ( $nbytes > strlen( $text ) ) {
-                       $buffer = fread( $this->spawnRead, $nbytes - strlen( $text ) );
-                       if ( $buffer === false ) {
-                               break;
-                       }
-                       $text .= $buffer;
-               }
-
-               $gotbytes = strlen( $text );
-               if ( $gotbytes != $nbytes ) {
-                       $this->progress( "Expected $nbytes bytes from database subprocess, got $gotbytes " );
-
-                       return false;
-               }
-
-               // Do normalization in the dump thread...
-               $stripped = str_replace( "\r", "", $text );
-               $normalized = MediaWikiServices::getInstance()->getContentLanguage()->
-                       normalize( $stripped );
-
-               return $normalized;
-       }
-
-       function startElement( $parser, $name, $attribs ) {
-               $this->checkpointJustWritten = false;
-
-               $this->clearOpenElement( null );
-               $this->lastName = $name;
-
-               if ( $name == 'revision' ) {
-                       $this->state = $name;
-                       $this->egress->writeOpenPage( null, $this->buffer );
-                       $this->buffer = "";
-               } elseif ( $name == 'page' ) {
-                       $this->state = $name;
-                       if ( $this->atStart ) {
-                               $this->egress->writeOpenStream( $this->buffer );
-                               $this->buffer = "";
-                               $this->atStart = false;
-                       }
-               }
-
-               if ( $name == "text" && isset( $attribs['id'] ) ) {
-                       $id = $attribs['id'];
-                       $model = trim( $this->thisRevModel );
-                       $format = trim( $this->thisRevFormat );
-
-                       $model = $model === '' ? null : $model;
-                       $format = $format === '' ? null : $format;
-
-                       $text = $this->getText( $id, $model, $format );
-                       $this->openElement = [ $name, [ 'xml:space' => 'preserve' ] ];
-                       if ( strlen( $text ) > 0 ) {
-                               $this->characterData( $parser, $text );
-                       }
-               } else {
-                       $this->openElement = [ $name, $attribs ];
-               }
-       }
-
-       function endElement( $parser, $name ) {
-               $this->checkpointJustWritten = false;
-
-               if ( $this->openElement ) {
-                       $this->clearOpenElement( "" );
-               } else {
-                       $this->buffer .= "</$name>";
-               }
-
-               if ( $name == 'revision' ) {
-                       $this->egress->writeRevision( null, $this->buffer );
-                       $this->buffer = "";
-                       $this->thisRev = "";
-                       $this->thisRevModel = null;
-                       $this->thisRevFormat = null;
-               } elseif ( $name == 'page' ) {
-                       if ( !$this->firstPageWritten ) {
-                               $this->firstPageWritten = trim( $this->thisPage );
-                       }
-                       $this->lastPageWritten = trim( $this->thisPage );
-                       if ( $this->timeExceeded ) {
-                               $this->egress->writeClosePage( $this->buffer );
-                               // nasty hack, we can't just write the chardata after the
-                               // page tag, it will include leading blanks from the next line
-                               $this->egress->sink->write( "\n" );
-
-                               $this->buffer = $this->xmlwriterobj->closeStream();
-                               $this->egress->writeCloseStream( $this->buffer );
-
-                               $this->buffer = "";
-                               $this->thisPage = "";
-                               // this could be more than one file if we had more than one output arg
-
-                               $filenameList = (array)$this->egress->getFilenames();
-                               $newFilenames = [];
-                               $firstPageID = str_pad( $this->firstPageWritten, 9, "0", STR_PAD_LEFT );
-                               $lastPageID = str_pad( $this->lastPageWritten, 9, "0", STR_PAD_LEFT );
-                               $filenamesCount = count( $filenameList );
-                               for ( $i = 0; $i < $filenamesCount; $i++ ) {
-                                       $checkpointNameFilledIn = sprintf( $this->checkpointFiles[$i], $firstPageID, $lastPageID );
-                                       $fileinfo = pathinfo( $filenameList[$i] );
-                                       $newFilenames[] = $fileinfo['dirname'] . '/' . $checkpointNameFilledIn;
-                               }
-                               $this->egress->closeRenameAndReopen( $newFilenames );
-                               $this->buffer = $this->xmlwriterobj->openStream();
-                               $this->timeExceeded = false;
-                               $this->timeOfCheckpoint = $this->lastTime;
-                               $this->firstPageWritten = false;
-                               $this->checkpointJustWritten = true;
-                       } else {
-                               $this->egress->writeClosePage( $this->buffer );
-                               $this->buffer = "";
-                               $this->thisPage = "";
-                       }
-               } elseif ( $name == 'mediawiki' ) {
-                       $this->egress->writeCloseStream( $this->buffer );
-                       $this->buffer = "";
-               }
-       }
-
-       function characterData( $parser, $data ) {
-               $this->clearOpenElement( null );
-               if ( $this->lastName == "id" ) {
-                       if ( $this->state == "revision" ) {
-                               $this->thisRev .= $data;
-                       } elseif ( $this->state == "page" ) {
-                               $this->thisPage .= $data;
-                       }
-               } elseif ( $this->lastName == "model" ) {
-                       $this->thisRevModel .= $data;
-               } elseif ( $this->lastName == "format" ) {
-                       $this->thisRevFormat .= $data;
-               }
-
-               // have to skip the newline left over from closepagetag line of
-               // end of checkpoint files. nasty hack!!
-               if ( $this->checkpointJustWritten ) {
-                       if ( $data[0] == "\n" ) {
-                               $data = substr( $data, 1 );
-                       }
-                       $this->checkpointJustWritten = false;
-               }
-               $this->buffer .= htmlspecialchars( $data );
-       }
-
-       function clearOpenElement( $style ) {
-               if ( $this->openElement ) {
-                       $this->buffer .= Xml::element( $this->openElement[0], $this->openElement[1], $style );
-                       $this->openElement = false;
-               }
-       }
-}
+require_once __DIR__ . '/includes/TextPassDumper.php';
 
 $maintClass = TextPassDumper::class;
 require_once RUN_MAINTENANCE_IF_MAIN;
index 0b450a6..0118c94 100644 (file)
@@ -48,6 +48,7 @@ abstract class BackupDumper extends Maintenance {
        public $dumpUploads = false;
        public $dumpUploadFileContents = false;
        public $orderRevs = false;
+       public $limitNamespaces = [];
 
        protected $reportingInterval = 100;
        protected $pageCount = 0;
@@ -264,7 +265,7 @@ abstract class BackupDumper extends Maintenance {
                $this->initProgress( $history );
 
                $db = $this->backupDb();
-               $exporter = new WikiExporter( $db, $history, $text );
+               $exporter = new WikiExporter( $db, $history, $text, $this->limitNamespaces );
                $exporter->setSchemaVersion( $this->schemaVersion );
                $exporter->dumpUploads = $this->dumpUploads;
                $exporter->dumpUploadFileContents = $this->dumpUploadFileContents;
diff --git a/maintenance/includes/SevenZipStream.php b/maintenance/includes/SevenZipStream.php
new file mode 100644 (file)
index 0000000..6a763f2
--- /dev/null
@@ -0,0 +1,98 @@
+<?php
+/**
+ * 7z stream wrapper
+ *
+ * Copyright © 2005 Brion Vibber <brion@pobox.com>
+ * https://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+
+use MediaWiki\Shell\Shell;
+
+/**
+ * Stream wrapper around 7za filter program.
+ * Required since we can't pass an open file resource to XMLReader->open()
+ * which is used for the text prefetch.
+ *
+ * @ingroup Maintenance
+ */
+class SevenZipStream {
+       protected $stream;
+
+       private function stripPath( $path ) {
+               $prefix = 'mediawiki.compress.7z://';
+
+               return substr( $path, strlen( $prefix ) );
+       }
+
+       function stream_open( $path, $mode, $options, &$opened_path ) {
+               if ( $mode[0] == 'r' ) {
+                       $options = 'e -bd -so';
+               } elseif ( $mode[0] == 'w' ) {
+                       $options = 'a -bd -si';
+               } else {
+                       return false;
+               }
+               $arg = Shell::escape( $this->stripPath( $path ) );
+               $command = "7za $options $arg";
+               if ( !wfIsWindows() ) {
+                       // Suppress the stupid messages on stderr
+                       $command .= ' 2>/dev/null';
+               }
+               $this->stream = popen( $command, $mode[0] ); // popen() doesn't like two-letter modes
+               return ( $this->stream !== false );
+       }
+
+       function url_stat( $path, $flags ) {
+               return stat( $this->stripPath( $path ) );
+       }
+
+       // This is all so lame; there should be a default class we can extend
+
+       function stream_close() {
+               return fclose( $this->stream );
+       }
+
+       function stream_flush() {
+               return fflush( $this->stream );
+       }
+
+       function stream_read( $count ) {
+               return fread( $this->stream, $count );
+       }
+
+       function stream_write( $data ) {
+               return fwrite( $this->stream, $data );
+       }
+
+       function stream_tell() {
+               return ftell( $this->stream );
+       }
+
+       function stream_eof() {
+               return feof( $this->stream );
+       }
+
+       function stream_seek( $offset, $whence ) {
+               return fseek( $this->stream, $offset, $whence );
+       }
+}
+
+stream_wrapper_register( 'mediawiki.compress.7z', SevenZipStream::class );
diff --git a/maintenance/includes/TextPassDumper.php b/maintenance/includes/TextPassDumper.php
new file mode 100644 (file)
index 0000000..03cad5c
--- /dev/null
@@ -0,0 +1,1019 @@
+<?php
+/**
+ * BackupDumper that postprocesses XML dumps from dumpBackup.php to add page text
+ *
+ * Copyright (C) 2005 Brion Vibber <brion@pobox.com>
+ * https://www.mediawiki.org/
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Dump
+ * @ingroup Maintenance
+ */
+
+require_once __DIR__ . '/BackupDumper.php';
+require_once __DIR__ . '/SevenZipStream.php';
+require_once __DIR__ . '/../../includes/export/WikiExporter.php';
+
+use MediaWiki\MediaWikiServices;
+use MediaWiki\Shell\Shell;
+use MediaWiki\Storage\BlobAccessException;
+use MediaWiki\Storage\SqlBlobStore;
+use Wikimedia\Rdbms\IMaintainableDatabase;
+
+/**
+ * @ingroup Maintenance
+ */
+class TextPassDumper extends BackupDumper {
+       /** @var BaseDump */
+       public $prefetch = null;
+       /** @var string|bool */
+       private $thisPage;
+       /** @var string|bool */
+       private $thisRev;
+
+       // when we spend more than maxTimeAllowed seconds on this run, we continue
+       // processing until we write out the next complete page, then save output file(s),
+       // rename it/them and open new one(s)
+       public $maxTimeAllowed = 0; // 0 = no limit
+
+       protected $input = "php://stdin";
+       protected $history = WikiExporter::FULL;
+       protected $fetchCount = 0;
+       protected $prefetchCount = 0;
+       protected $prefetchCountLast = 0;
+       protected $fetchCountLast = 0;
+
+       protected $maxFailures = 5;
+       protected $maxConsecutiveFailedTextRetrievals = 200;
+       protected $failureTimeout = 5; // Seconds to sleep after db failure
+
+       protected $bufferSize = 524288; // In bytes. Maximum size to read from the stub in on go.
+
+       protected $php = "php";
+       protected $spawn = false;
+
+       /**
+        * @var bool|resource
+        */
+       protected $spawnProc = false;
+
+       /**
+        * @var bool|resource
+        */
+       protected $spawnWrite = false;
+
+       /**
+        * @var bool|resource
+        */
+       protected $spawnRead = false;
+
+       /**
+        * @var bool|resource
+        */
+       protected $spawnErr = false;
+
+       /**
+        * @var bool|XmlDumpWriter
+        */
+       protected $xmlwriterobj = false;
+
+       protected $timeExceeded = false;
+       protected $firstPageWritten = false;
+       protected $lastPageWritten = false;
+       protected $checkpointJustWritten = false;
+       protected $checkpointFiles = [];
+
+       /**
+        * @var IMaintainableDatabase
+        */
+       protected $db;
+
+       /**
+        * @param array|null $args For backward compatibility
+        */
+       function __construct( $args = null ) {
+               parent::__construct();
+
+               $this->addDescription( <<<TEXT
+This script postprocesses XML dumps from dumpBackup.php to add
+page text which was stubbed out (using --stub).
+
+XML input is accepted on stdin.
+XML output is sent to stdout; progress reports are sent to stderr.
+TEXT
+               );
+               $this->stderr = fopen( "php://stderr", "wt" );
+
+               $this->addOption( 'stub', 'To load a compressed stub dump instead of stdin. ' .
+                       'Specify as --stub=<type>:<file>.', false, true );
+               $this->addOption( 'prefetch', 'Use a prior dump file as a text source, to savepressure on the ' .
+                       'database. (Requires the XMLReader extension). Specify as --prefetch=<type>:<file>',
+                       false, true );
+               $this->addOption( 'maxtime', 'Write out checkpoint file after this many minutes (writing' .
+                       'out complete page, closing xml file properly, and opening new one' .
+                       'with header).  This option requires the checkpointfile option.', false, true );
+               $this->addOption( 'checkpointfile', 'Use this string for checkpoint filenames,substituting ' .
+                       'first pageid written for the first %s (required) and the last pageid written for the ' .
+                       'second %s if it exists.', false, true, false, true ); // This can be specified multiple times
+               $this->addOption( 'quiet', 'Don\'t dump status reports to stderr.' );
+               $this->addOption( 'full', 'Dump all revisions of every page' );
+               $this->addOption( 'current', 'Base ETA on number of pages in database instead of all revisions' );
+               $this->addOption( 'spawn', 'Spawn a subprocess for loading text records' );
+               $this->addOption( 'buffersize', 'Buffer size in bytes to use for reading the stub. ' .
+                       '(Default: 512KB, Minimum: 4KB)', false, true );
+
+               if ( $args ) {
+                       $this->loadWithArgv( $args );
+                       $this->processOptions();
+               }
+       }
+
+       /**
+        * @return SqlBlobStore
+        */
+       private function getBlobStore() {
+               return MediaWikiServices::getInstance()->getBlobStore();
+       }
+
+       function execute() {
+               $this->processOptions();
+               $this->dump( true );
+       }
+
+       function processOptions() {
+               parent::processOptions();
+
+               if ( $this->hasOption( 'buffersize' ) ) {
+                       $this->bufferSize = max( intval( $this->getOption( 'buffersize' ) ), 4 * 1024 );
+               }
+
+               if ( $this->hasOption( 'prefetch' ) ) {
+                       $url = $this->processFileOpt( $this->getOption( 'prefetch' ) );
+                       $this->prefetch = new BaseDump( $url );
+               }
+
+               if ( $this->hasOption( 'stub' ) ) {
+                       $this->input = $this->processFileOpt( $this->getOption( 'stub' ) );
+               }
+
+               if ( $this->hasOption( 'maxtime' ) ) {
+                       $this->maxTimeAllowed = intval( $this->getOption( 'maxtime' ) ) * 60;
+               }
+
+               if ( $this->hasOption( 'checkpointfile' ) ) {
+                       $this->checkpointFiles = $this->getOption( 'checkpointfile' );
+               }
+
+               if ( $this->hasOption( 'current' ) ) {
+                       $this->history = WikiExporter::CURRENT;
+               }
+
+               if ( $this->hasOption( 'full' ) ) {
+                       $this->history = WikiExporter::FULL;
+               }
+
+               if ( $this->hasOption( 'spawn' ) ) {
+                       $this->spawn = true;
+                       $val = $this->getOption( 'spawn' );
+                       if ( $val !== 1 ) {
+                               $this->php = $val;
+                       }
+               }
+       }
+
+       /**
+        * Drop the database connection $this->db and try to get a new one.
+        *
+        * This function tries to get a /different/ connection if this is
+        * possible. Hence, (if this is possible) it switches to a different
+        * failover upon each call.
+        *
+        * This function resets $this->lb and closes all connections on it.
+        *
+        * @throws MWException
+        */
+       function rotateDb() {
+               // Cleaning up old connections
+               if ( isset( $this->lb ) ) {
+                       $this->lb->closeAll();
+                       unset( $this->lb );
+               }
+
+               if ( $this->forcedDb !== null ) {
+                       $this->db = $this->forcedDb;
+
+                       return;
+               }
+
+               if ( isset( $this->db ) && $this->db->isOpen() ) {
+                       throw new MWException( 'DB is set and has not been closed by the Load Balancer' );
+               }
+
+               unset( $this->db );
+
+               // Trying to set up new connection.
+               // We do /not/ retry upon failure, but delegate to encapsulating logic, to avoid
+               // individually retrying at different layers of code.
+
+               try {
+                       $lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+                       $this->lb = $lbFactory->newMainLB();
+               } catch ( Exception $e ) {
+                       throw new MWException( __METHOD__
+                               . " rotating DB failed to obtain new load balancer (" . $e->getMessage() . ")" );
+               }
+
+               try {
+                       $this->db = $this->lb->getConnection( DB_REPLICA, 'dump' );
+               } catch ( Exception $e ) {
+                       throw new MWException( __METHOD__
+                               . " rotating DB failed to obtain new database (" . $e->getMessage() . ")" );
+               }
+       }
+
+       function initProgress( $history = WikiExporter::FULL ) {
+               parent::initProgress();
+               $this->timeOfCheckpoint = $this->startTime;
+       }
+
+       function dump( $history, $text = WikiExporter::TEXT ) {
+               // Notice messages will foul up your XML output even if they're
+               // relatively harmless.
+               if ( ini_get( 'display_errors' ) ) {
+                       ini_set( 'display_errors', 'stderr' );
+               }
+
+               $this->initProgress( $this->history );
+
+               // We are trying to get an initial database connection to avoid that the
+               // first try of this request's first call to getText fails. However, if
+               // obtaining a good DB connection fails it's not a serious issue, as
+               // getText does retry upon failure and can start without having a working
+               // DB connection.
+               try {
+                       $this->rotateDb();
+               } catch ( Exception $e ) {
+                       // We do not even count this as failure. Just let eventual
+                       // watchdogs know.
+                       $this->progress( "Getting initial DB connection failed (" .
+                               $e->getMessage() . ")" );
+               }
+
+               $this->egress = new ExportProgressFilter( $this->sink, $this );
+
+               // it would be nice to do it in the constructor, oh well. need egress set
+               $this->finalOptionCheck();
+
+               // we only want this so we know how to close a stream :-P
+               $this->xmlwriterobj = new XmlDumpWriter();
+
+               $input = fopen( $this->input, "rt" );
+               $this->readDump( $input );
+
+               if ( $this->spawnProc ) {
+                       $this->closeSpawn();
+               }
+
+               $this->report( true );
+       }
+
+       function processFileOpt( $opt ) {
+               $split = explode( ':', $opt, 2 );
+               $val = $split[0];
+               $param = '';
+               if ( count( $split ) === 2 ) {
+                       $param = $split[1];
+               }
+               $fileURIs = explode( ';', $param );
+               foreach ( $fileURIs as $URI ) {
+                       switch ( $val ) {
+                               case "file":
+                                       $newURI = $URI;
+                                       break;
+                               case "gzip":
+                                       $newURI = "compress.zlib://$URI";
+                                       break;
+                               case "bzip2":
+                                       $newURI = "compress.bzip2://$URI";
+                                       break;
+                               case "7zip":
+                                       $newURI = "mediawiki.compress.7z://$URI";
+                                       break;
+                               default:
+                                       $newURI = $URI;
+                       }
+                       $newFileURIs[] = $newURI;
+               }
+               $val = implode( ';', $newFileURIs );
+
+               return $val;
+       }
+
+       /**
+        * Overridden to include prefetch ratio if enabled.
+        */
+       function showReport() {
+               if ( !$this->prefetch ) {
+                       parent::showReport();
+
+                       return;
+               }
+
+               if ( $this->reporting ) {
+                       $now = wfTimestamp( TS_DB );
+                       $nowts = microtime( true );
+                       $deltaAll = $nowts - $this->startTime;
+                       $deltaPart = $nowts - $this->lastTime;
+                       $this->pageCountPart = $this->pageCount - $this->pageCountLast;
+                       $this->revCountPart = $this->revCount - $this->revCountLast;
+
+                       if ( $deltaAll ) {
+                               $portion = $this->revCount / $this->maxCount;
+                               $eta = $this->startTime + $deltaAll / $portion;
+                               $etats = wfTimestamp( TS_DB, intval( $eta ) );
+                               if ( $this->fetchCount ) {
+                                       $fetchRate = 100.0 * $this->prefetchCount / $this->fetchCount;
+                               } else {
+                                       $fetchRate = '-';
+                               }
+                               $pageRate = $this->pageCount / $deltaAll;
+                               $revRate = $this->revCount / $deltaAll;
+                       } else {
+                               $pageRate = '-';
+                               $revRate = '-';
+                               $etats = '-';
+                               $fetchRate = '-';
+                       }
+                       if ( $deltaPart ) {
+                               if ( $this->fetchCountLast ) {
+                                       $fetchRatePart = 100.0 * $this->prefetchCountLast / $this->fetchCountLast;
+                               } else {
+                                       $fetchRatePart = '-';
+                               }
+                               $pageRatePart = $this->pageCountPart / $deltaPart;
+                               $revRatePart = $this->revCountPart / $deltaPart;
+                       } else {
+                               $fetchRatePart = '-';
+                               $pageRatePart = '-';
+                               $revRatePart = '-';
+                       }
+                       $this->progress( sprintf(
+                               "%s: %s (ID %d) %d pages (%0.1f|%0.1f/sec all|curr), "
+                                       . "%d revs (%0.1f|%0.1f/sec all|curr), %0.1f%%|%0.1f%% "
+                                       . "prefetched (all|curr), ETA %s [max %d]",
+                               $now, wfWikiID(), $this->ID, $this->pageCount, $pageRate,
+                               $pageRatePart, $this->revCount, $revRate, $revRatePart,
+                               $fetchRate, $fetchRatePart, $etats, $this->maxCount
+                       ) );
+                       $this->lastTime = $nowts;
+                       $this->revCountLast = $this->revCount;
+                       $this->prefetchCountLast = $this->prefetchCount;
+                       $this->fetchCountLast = $this->fetchCount;
+               }
+       }
+
+       function setTimeExceeded() {
+               $this->timeExceeded = true;
+       }
+
+       function checkIfTimeExceeded() {
+               if ( $this->maxTimeAllowed
+                       && ( $this->lastTime - $this->timeOfCheckpoint > $this->maxTimeAllowed )
+               ) {
+                       return true;
+               }
+
+               return false;
+       }
+
+       function finalOptionCheck() {
+               if ( ( $this->checkpointFiles && !$this->maxTimeAllowed )
+                       || ( $this->maxTimeAllowed && !$this->checkpointFiles )
+               ) {
+                       throw new MWException( "Options checkpointfile and maxtime must be specified together.\n" );
+               }
+               foreach ( $this->checkpointFiles as $checkpointFile ) {
+                       $count = substr_count( $checkpointFile, "%s" );
+                       if ( $count != 2 ) {
+                               throw new MWException( "Option checkpointfile must contain two '%s' "
+                                       . "for substitution of first and last pageids, count is $count instead, "
+                                       . "file is $checkpointFile.\n" );
+                       }
+               }
+
+               if ( $this->checkpointFiles ) {
+                       $filenameList = (array)$this->egress->getFilenames();
+                       if ( count( $filenameList ) != count( $this->checkpointFiles ) ) {
+                               throw new MWException( "One checkpointfile must be specified "
+                                       . "for each output option, if maxtime is used.\n" );
+                       }
+               }
+       }
+
+       /**
+        * @throws MWException Failure to parse XML input
+        * @param string $input
+        * @return bool
+        */
+       function readDump( $input ) {
+               $this->buffer = "";
+               $this->openElement = false;
+               $this->atStart = true;
+               $this->state = "";
+               $this->lastName = "";
+               $this->thisPage = 0;
+               $this->thisRev = 0;
+               $this->thisRevModel = null;
+               $this->thisRevFormat = null;
+
+               $parser = xml_parser_create( "UTF-8" );
+               xml_parser_set_option( $parser, XML_OPTION_CASE_FOLDING, false );
+
+               xml_set_element_handler(
+                       $parser,
+                       [ $this, 'startElement' ],
+                       [ $this, 'endElement' ]
+               );
+               xml_set_character_data_handler( $parser, [ $this, 'characterData' ] );
+
+               $offset = 0; // for context extraction on error reporting
+               do {
+                       if ( $this->checkIfTimeExceeded() ) {
+                               $this->setTimeExceeded();
+                       }
+                       $chunk = fread( $input, $this->bufferSize );
+                       if ( !xml_parse( $parser, $chunk, feof( $input ) ) ) {
+                               wfDebug( "TextDumpPass::readDump encountered XML parsing error\n" );
+
+                               $byte = xml_get_current_byte_index( $parser );
+                               $msg = wfMessage( 'xml-error-string',
+                                       'XML import parse failure',
+                                       xml_get_current_line_number( $parser ),
+                                       xml_get_current_column_number( $parser ),
+                                       $byte . ( is_null( $chunk ) ? null : ( '; "' . substr( $chunk, $byte - $offset, 16 ) . '"' ) ),
+                                       xml_error_string( xml_get_error_code( $parser ) ) )->escaped();
+
+                               xml_parser_free( $parser );
+
+                               throw new MWException( $msg );
+                       }
+                       $offset += strlen( $chunk );
+               } while ( $chunk !== false && !feof( $input ) );
+               if ( $this->maxTimeAllowed ) {
+                       $filenameList = (array)$this->egress->getFilenames();
+                       // we wrote some stuff after last checkpoint that needs renamed
+                       if ( file_exists( $filenameList[0] ) ) {
+                               $newFilenames = [];
+                               # we might have just written the header and footer and had no
+                               # pages or revisions written... perhaps they were all deleted
+                               # there's no pageID 0 so we use that. the caller is responsible
+                               # for deciding what to do with a file containing only the
+                               # siteinfo information and the mw tags.
+                               if ( !$this->firstPageWritten ) {
+                                       $firstPageID = str_pad( 0, 9, "0", STR_PAD_LEFT );
+                                       $lastPageID = str_pad( 0, 9, "0", STR_PAD_LEFT );
+                               } else {
+                                       $firstPageID = str_pad( $this->firstPageWritten, 9, "0", STR_PAD_LEFT );
+                                       $lastPageID = str_pad( $this->lastPageWritten, 9, "0", STR_PAD_LEFT );
+                               }
+
+                               $filenameCount = count( $filenameList );
+                               for ( $i = 0; $i < $filenameCount; $i++ ) {
+                                       $checkpointNameFilledIn = sprintf( $this->checkpointFiles[$i], $firstPageID, $lastPageID );
+                                       $fileinfo = pathinfo( $filenameList[$i] );
+                                       $newFilenames[] = $fileinfo['dirname'] . '/' . $checkpointNameFilledIn;
+                               }
+                               $this->egress->closeAndRename( $newFilenames );
+                       }
+               }
+               xml_parser_free( $parser );
+
+               return true;
+       }
+
+       /**
+        * Applies applicable export transformations to $text.
+        *
+        * @param string $text
+        * @param string $model
+        * @param string|null $format
+        *
+        * @return string
+        */
+       private function exportTransform( $text, $model, $format = null ) {
+               try {
+                       $handler = ContentHandler::getForModelID( $model );
+                       $text = $handler->exportTransform( $text, $format );
+               }
+               catch ( MWException $ex ) {
+                       $this->progress(
+                               "Unable to apply export transformation for content model '$model': " .
+                               $ex->getMessage()
+                       );
+               }
+
+               return $text;
+       }
+
+       /**
+        * Tries to load revision text.
+        * Export transformations are applied if the content model is given or can be
+        * determined from the database.
+        *
+        * Upon errors, retries (Up to $this->maxFailures tries each call).
+        * If still no good revision could be found even after this retrying, "" is returned.
+        * If no good revision text could be returned for
+        * $this->maxConsecutiveFailedTextRetrievals consecutive calls to getText, MWException
+        * is thrown.
+        *
+        * @param int|string $id Content address, or text row ID.
+        * @param string|bool|null $model The content model used to determine
+        *  applicable export transformations.
+        *  If $model is null, it will be determined from the database.
+        * @param string|null $format The content format used when applying export transformations.
+        *
+        * @throws MWException
+        * @return string The revision text for $id, or ""
+        */
+       function getText( $id, $model = null, $format = null ) {
+               global $wgContentHandlerUseDB;
+
+               $prefetchNotTried = true; // Whether or not we already tried to get the text via prefetch.
+               $text = false; // The candidate for a good text. false if no proper value.
+               $failures = 0; // The number of times, this invocation of getText already failed.
+
+               // The number of times getText failed without yielding a good text in between.
+               static $consecutiveFailedTextRetrievals = 0;
+
+               $this->fetchCount++;
+
+               // To allow to simply return on success and do not have to worry about book keeping,
+               // we assume, this fetch works (possible after some retries). Nevertheless, we koop
+               // the old value, so we can restore it, if problems occur (See after the while loop).
+               $oldConsecutiveFailedTextRetrievals = $consecutiveFailedTextRetrievals;
+               $consecutiveFailedTextRetrievals = 0;
+
+               if ( $model === null && $wgContentHandlerUseDB ) {
+                       // TODO: MCR: use content table
+                       $row = $this->db->selectRow(
+                               'revision',
+                               [ 'rev_content_model', 'rev_content_format' ],
+                               [ 'rev_id' => $this->thisRev ],
+                               __METHOD__
+                       );
+
+                       if ( $row ) {
+                               $model = $row->rev_content_model;
+                               $format = $row->rev_content_format;
+                       }
+               }
+
+               if ( $model === null || $model === '' ) {
+                       $model = false;
+               }
+
+               while ( $failures < $this->maxFailures ) {
+                       // As soon as we found a good text for the $id, we will return immediately.
+                       // Hence, if we make it past the try catch block, we know that we did not
+                       // find a good text.
+
+                       try {
+                               // Step 1: Get some text (or reuse from previous iteratuon if checking
+                               //         for plausibility failed)
+
+                               // Trying to get prefetch, if it has not been tried before
+                               if ( $text === false && isset( $this->prefetch ) && $prefetchNotTried ) {
+                                       $prefetchNotTried = false;
+                                       $tryIsPrefetch = true;
+                                       $text = $this->prefetch->prefetch( (int)$this->thisPage, (int)$this->thisRev );
+
+                                       if ( $text === null ) {
+                                               $text = false;
+                                       }
+
+                                       if ( is_string( $text ) && $model !== false ) {
+                                               // Apply export transformation to text coming from an old dump.
+                                               // The purpose of this transformation is to convert up from legacy
+                                               // formats, which may still be used in the older dump that is used
+                                               // for pre-fetching. Applying the transformation again should not
+                                               // interfere with content that is already in the correct form.
+                                               $text = $this->exportTransform( $text, $model, $format );
+                                       }
+                               }
+
+                               if ( $text === false ) {
+                                       // Fallback to asking the database
+                                       $tryIsPrefetch = false;
+                                       if ( $this->spawn ) {
+                                               $text = $this->getTextSpawned( $id );
+                                       } else {
+                                               $text = $this->getTextDb( $id );
+                                       }
+
+                                       if ( $text !== false && $model !== false ) {
+                                               // Apply export transformation to text coming from the database.
+                                               // Prefetched text should already have transformations applied.
+                                               $text = $this->exportTransform( $text, $model, $format );
+                                       }
+
+                                       // No more checks for texts from DB for now.
+                                       // If we received something that is not false,
+                                       // We treat it as good text, regardless of whether it actually is or is not
+                                       if ( $text !== false ) {
+                                               return $text;
+                                       }
+                               }
+
+                               if ( $text === false ) {
+                                       throw new MWException( "Generic error while obtaining text for id " . $id );
+                               }
+
+                               // We received a good candidate for the text of $id via some method
+
+                               // Step 2: Checking for plausibility and return the text if it is
+                               //         plausible
+                               $revID = intval( $this->thisRev );
+                               if ( !isset( $this->db ) ) {
+                                       throw new MWException( "No database available" );
+                               }
+
+                               if ( $model !== CONTENT_MODEL_WIKITEXT ) {
+                                       $revLength = strlen( $text );
+                               } else {
+                                       $revLength = $this->db->selectField( 'revision', 'rev_len', [ 'rev_id' => $revID ] );
+                               }
+
+                               if ( strlen( $text ) == $revLength ) {
+                                       if ( $tryIsPrefetch ) {
+                                               $this->prefetchCount++;
+                                       }
+
+                                       return $text;
+                               }
+
+                               $text = false;
+                               throw new MWException( "Received text is unplausible for id " . $id );
+                       } catch ( Exception $e ) {
+                               $msg = "getting/checking text " . $id . " failed (" . $e->getMessage() . ")";
+                               if ( $failures + 1 < $this->maxFailures ) {
+                                       $msg .= " (Will retry " . ( $this->maxFailures - $failures - 1 ) . " more times)";
+                               }
+                               $this->progress( $msg );
+                       }
+
+                       // Something went wrong; we did not a text that was plausible :(
+                       $failures++;
+
+                       // A failure in a prefetch hit does not warrant resetting db connection etc.
+                       if ( !$tryIsPrefetch ) {
+                               // After backing off for some time, we try to reboot the whole process as
+                               // much as possible to not carry over failures from one part to the other
+                               // parts
+                               sleep( $this->failureTimeout );
+                               try {
+                                       $this->rotateDb();
+                                       if ( $this->spawn ) {
+                                               $this->closeSpawn();
+                                               $this->openSpawn();
+                                       }
+                               } catch ( Exception $e ) {
+                                       $this->progress( "Rebooting getText infrastructure failed (" . $e->getMessage() . ")" .
+                                               " Trying to continue anyways" );
+                               }
+                       }
+               }
+
+               // Retirieving a good text for $id failed (at least) maxFailures times.
+               // We abort for this $id.
+
+               // Restoring the consecutive failures, and maybe aborting, if the dump
+               // is too broken.
+               $consecutiveFailedTextRetrievals = $oldConsecutiveFailedTextRetrievals + 1;
+               if ( $consecutiveFailedTextRetrievals > $this->maxConsecutiveFailedTextRetrievals ) {
+                       throw new MWException( "Graceful storage failure" );
+               }
+
+               return "";
+       }
+
+       /**
+        * Loads the serialized content from storage.
+        *
+        * @param int|string $id Content address, or text row ID.
+        * @return bool|string
+        */
+       private function getTextDb( $id ) {
+               $store = $this->getBlobStore();
+               $address = ( is_int( $id ) || strpos( $id, ':' ) === false )
+                       ? SqlBlobStore::makeAddressFromTextId( (int)$id )
+                       : $id;
+
+               try {
+                       $text = $store->getBlob( $address );
+
+                       $stripped = str_replace( "\r", "", $text );
+                       $normalized = MediaWikiServices::getInstance()->getContentLanguage()
+                               ->normalize( $stripped );
+
+                       return $normalized;
+               } catch ( BlobAccessException $ex ) {
+                       // XXX: log a warning?
+                       return false;
+               }
+       }
+
+       /**
+        * @param int|string $address Content address, or text row ID.
+        * @return bool|string
+        */
+       private function getTextSpawned( $address ) {
+               Wikimedia\suppressWarnings();
+               if ( !$this->spawnProc ) {
+                       // First time?
+                       $this->openSpawn();
+               }
+               $text = $this->getTextSpawnedOnce( $address );
+               Wikimedia\restoreWarnings();
+
+               return $text;
+       }
+
+       function openSpawn() {
+               global $IP;
+
+               if ( file_exists( "$IP/../multiversion/MWScript.php" ) ) {
+                       $cmd = implode( " ",
+                               array_map( [ Shell::class, 'escape' ],
+                                       [
+                                               $this->php,
+                                               "$IP/../multiversion/MWScript.php",
+                                               "fetchText.php",
+                                               '--wiki', wfWikiID() ] ) );
+               } else {
+                       $cmd = implode( " ",
+                               array_map( [ Shell::class, 'escape' ],
+                                       [
+                                               $this->php,
+                                               "$IP/maintenance/fetchText.php",
+                                               '--wiki', wfWikiID() ] ) );
+               }
+               $spec = [
+                       0 => [ "pipe", "r" ],
+                       1 => [ "pipe", "w" ],
+                       2 => [ "file", "/dev/null", "a" ] ];
+               $pipes = [];
+
+               $this->progress( "Spawning database subprocess: $cmd" );
+               $this->spawnProc = proc_open( $cmd, $spec, $pipes );
+               if ( !$this->spawnProc ) {
+                       $this->progress( "Subprocess spawn failed." );
+
+                       return false;
+               }
+               list(
+                       $this->spawnWrite, // -> stdin
+                       $this->spawnRead, // <- stdout
+               ) = $pipes;
+
+               return true;
+       }
+
+       private function closeSpawn() {
+               Wikimedia\suppressWarnings();
+               if ( $this->spawnRead ) {
+                       fclose( $this->spawnRead );
+               }
+               $this->spawnRead = false;
+               if ( $this->spawnWrite ) {
+                       fclose( $this->spawnWrite );
+               }
+               $this->spawnWrite = false;
+               if ( $this->spawnErr ) {
+                       fclose( $this->spawnErr );
+               }
+               $this->spawnErr = false;
+               if ( $this->spawnProc ) {
+                       pclose( $this->spawnProc );
+               }
+               $this->spawnProc = false;
+               Wikimedia\restoreWarnings();
+       }
+
+       /**
+        * @param int|string $address Content address, or text row ID.
+        * @return bool|string
+        */
+       private function getTextSpawnedOnce( $address ) {
+               if ( is_int( $address ) || intval( $address ) ) {
+                       $address = SqlBlobStore::makeAddressFromTextId( (int)$address );
+               }
+
+               $ok = fwrite( $this->spawnWrite, "$address\n" );
+               // $this->progress( ">> $id" );
+               if ( !$ok ) {
+                       return false;
+               }
+
+               $ok = fflush( $this->spawnWrite );
+               // $this->progress( ">> [flush]" );
+               if ( !$ok ) {
+                       return false;
+               }
+
+               // check that the text address they are sending is the one we asked for
+               // this avoids out of sync revision text errors we have encountered in the past
+               $newAddress = fgets( $this->spawnRead );
+               if ( $newAddress === false ) {
+                       return false;
+               }
+               $newAddress = trim( $newAddress );
+               if ( strpos( $newAddress, ':' ) === false ) {
+                       $newAddress = SqlBlobStore::makeAddressFromTextId( intval( $newAddress ) );
+               }
+
+               if ( $newAddress !== $address ) {
+                       return false;
+               }
+
+               $len = fgets( $this->spawnRead );
+               // $this->progress( "<< " . trim( $len ) );
+               if ( $len === false ) {
+                       return false;
+               }
+
+               $nbytes = intval( $len );
+               // actual error, not zero-length text
+               if ( $nbytes < 0 ) {
+                       return false;
+               }
+
+               $text = "";
+
+               // Subprocess may not send everything at once, we have to loop.
+               while ( $nbytes > strlen( $text ) ) {
+                       $buffer = fread( $this->spawnRead, $nbytes - strlen( $text ) );
+                       if ( $buffer === false ) {
+                               break;
+                       }
+                       $text .= $buffer;
+               }
+
+               $gotbytes = strlen( $text );
+               if ( $gotbytes != $nbytes ) {
+                       $this->progress( "Expected $nbytes bytes from database subprocess, got $gotbytes " );
+
+                       return false;
+               }
+
+               // Do normalization in the dump thread...
+               $stripped = str_replace( "\r", "", $text );
+               $normalized = MediaWikiServices::getInstance()->getContentLanguage()->
+                       normalize( $stripped );
+
+               return $normalized;
+       }
+
+       function startElement( $parser, $name, $attribs ) {
+               $this->checkpointJustWritten = false;
+
+               $this->clearOpenElement( null );
+               $this->lastName = $name;
+
+               if ( $name == 'revision' ) {
+                       $this->state = $name;
+                       $this->egress->writeOpenPage( null, $this->buffer );
+                       $this->buffer = "";
+               } elseif ( $name == 'page' ) {
+                       $this->state = $name;
+                       if ( $this->atStart ) {
+                               $this->egress->writeOpenStream( $this->buffer );
+                               $this->buffer = "";
+                               $this->atStart = false;
+                       }
+               }
+
+               if ( $name == "text" && isset( $attribs['id'] ) ) {
+                       $id = $attribs['id'];
+                       $model = trim( $this->thisRevModel );
+                       $format = trim( $this->thisRevFormat );
+
+                       $model = $model === '' ? null : $model;
+                       $format = $format === '' ? null : $format;
+
+                       $text = $this->getText( $id, $model, $format );
+                       $this->openElement = [ $name, [ 'xml:space' => 'preserve' ] ];
+                       if ( strlen( $text ) > 0 ) {
+                               $this->characterData( $parser, $text );
+                       }
+               } else {
+                       $this->openElement = [ $name, $attribs ];
+               }
+       }
+
+       function endElement( $parser, $name ) {
+               $this->checkpointJustWritten = false;
+
+               if ( $this->openElement ) {
+                       $this->clearOpenElement( "" );
+               } else {
+                       $this->buffer .= "</$name>";
+               }
+
+               if ( $name == 'revision' ) {
+                       $this->egress->writeRevision( null, $this->buffer );
+                       $this->buffer = "";
+                       $this->thisRev = "";
+                       $this->thisRevModel = null;
+                       $this->thisRevFormat = null;
+               } elseif ( $name == 'page' ) {
+                       if ( !$this->firstPageWritten ) {
+                               $this->firstPageWritten = trim( $this->thisPage );
+                       }
+                       $this->lastPageWritten = trim( $this->thisPage );
+                       if ( $this->timeExceeded ) {
+                               $this->egress->writeClosePage( $this->buffer );
+                               // nasty hack, we can't just write the chardata after the
+                               // page tag, it will include leading blanks from the next line
+                               $this->egress->sink->write( "\n" );
+
+                               $this->buffer = $this->xmlwriterobj->closeStream();
+                               $this->egress->writeCloseStream( $this->buffer );
+
+                               $this->buffer = "";
+                               $this->thisPage = "";
+                               // this could be more than one file if we had more than one output arg
+
+                               $filenameList = (array)$this->egress->getFilenames();
+                               $newFilenames = [];
+                               $firstPageID = str_pad( $this->firstPageWritten, 9, "0", STR_PAD_LEFT );
+                               $lastPageID = str_pad( $this->lastPageWritten, 9, "0", STR_PAD_LEFT );
+                               $filenamesCount = count( $filenameList );
+                               for ( $i = 0; $i < $filenamesCount; $i++ ) {
+                                       $checkpointNameFilledIn = sprintf( $this->checkpointFiles[$i], $firstPageID, $lastPageID );
+                                       $fileinfo = pathinfo( $filenameList[$i] );
+                                       $newFilenames[] = $fileinfo['dirname'] . '/' . $checkpointNameFilledIn;
+                               }
+                               $this->egress->closeRenameAndReopen( $newFilenames );
+                               $this->buffer = $this->xmlwriterobj->openStream();
+                               $this->timeExceeded = false;
+                               $this->timeOfCheckpoint = $this->lastTime;
+                               $this->firstPageWritten = false;
+                               $this->checkpointJustWritten = true;
+                       } else {
+                               $this->egress->writeClosePage( $this->buffer );
+                               $this->buffer = "";
+                               $this->thisPage = "";
+                       }
+               } elseif ( $name == 'mediawiki' ) {
+                       $this->egress->writeCloseStream( $this->buffer );
+                       $this->buffer = "";
+               }
+       }
+
+       function characterData( $parser, $data ) {
+               $this->clearOpenElement( null );
+               if ( $this->lastName == "id" ) {
+                       if ( $this->state == "revision" ) {
+                               $this->thisRev .= $data;
+                       } elseif ( $this->state == "page" ) {
+                               $this->thisPage .= $data;
+                       }
+               } elseif ( $this->lastName == "model" ) {
+                       $this->thisRevModel .= $data;
+               } elseif ( $this->lastName == "format" ) {
+                       $this->thisRevFormat .= $data;
+               }
+
+               // have to skip the newline left over from closepagetag line of
+               // end of checkpoint files. nasty hack!!
+               if ( $this->checkpointJustWritten ) {
+                       if ( $data[0] == "\n" ) {
+                               $data = substr( $data, 1 );
+                       }
+                       $this->checkpointJustWritten = false;
+               }
+               $this->buffer .= htmlspecialchars( $data );
+       }
+
+       function clearOpenElement( $style ) {
+               if ( $this->openElement ) {
+                       $this->buffer .= Xml::element( $this->openElement[0], $this->openElement[1], $style );
+                       $this->openElement = false;
+               }
+       }
+}
index ec68ef2..bee8d69 100644 (file)
@@ -21,6 +21,7 @@ class RemoveInvalidEmails extends Maintenance {
                $this->addOption( 'commit', 'Whether to actually update the database', false, false );
                $this->setBatchSize( 500 );
        }
+
        public function execute() {
                $this->commit = $this->hasOption( 'commit' );
                $dbr = $this->getDB( DB_REPLICA );
index 0d6cfa2..a704d61 100644 (file)
@@ -11,6 +11,7 @@ class ValidateRegistrationFile extends Maintenance {
                        true
                );
        }
+
        public function execute() {
                $validator = new ExtensionJsonValidator( function ( $msg ) {
                        $this->fatalError( $msg );
index c28ac4a..6b0b233 100644 (file)
@@ -169,10 +169,6 @@ return [
                'messages' => [ 'brackets', 'word-separator' ],
                'targets' => [ 'mobile', 'desktop' ],
        ],
-       'jquery.async' => [
-               'scripts' => 'resources/lib/jquery.async.js',
-               'deprecated' => true,
-       ],
        'jquery.byteLength' => [
                'scripts' => 'resources/src/jquery/jquery.byteLength.js',
                'deprecated' => 'Use "mediawiki.String" instead.',
index 3adca1b..4609c04 100644 (file)
@@ -121,8 +121,6 @@ jquery:
   integrity: sha256-2Kok7MbOyxpgUVvAk/HJ2jigOSYS2auK4Pfzbm7uH60=
   dest: jquery.js
 
-# TODO: jquery.async.js
-
 # TODO: jquery.chosen
 
 jquery.client:
diff --git a/resources/lib/jquery.async.js b/resources/lib/jquery.async.js
deleted file mode 100644 (file)
index 2161f6b..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * jQuery Asynchronous Plugin 1.0
- *
- * Copyright (c) 2008 Vincent Robert (genezys.net)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- */
-(function($){
-
-// opts.delay : (default 10) delay between async call in ms
-// opts.bulk : (default 500) delay during which the loop can continue synchronously without yielding the CPU
-// opts.test : (default true) function to test in the while test part
-// opts.loop : (default empty) function to call in the while loop part
-// opts.end : (default empty) function to call at the end of the while loop
-$.whileAsync = function(opts) {
-       var delay = Math.abs(opts.delay) || 10,
-               bulk = isNaN(opts.bulk) ? 500 : Math.abs(opts.bulk),
-               test = opts.test || function(){ return true; },
-               loop = opts.loop || function(){},
-               end = opts.end || function(){};
-       
-       (function(){
-
-               var t = false,
-                       begin = new Date();
-                       
-               while( t = test() ) {
-                       loop();
-                       if( bulk === 0 || (new Date() - begin) > bulk ) {
-                               break;
-                       }
-               }
-               if( t ) {
-                       setTimeout(arguments.callee, delay);
-               }
-               else {
-                       end();
-               }
-               
-       })();
-};
-
-// opts.delay : (default 10) delay between async call in ms
-// opts.bulk : (default 500) delay during which the loop can continue synchronously without yielding the CPU
-// opts.loop : (default empty) function to call in the each loop part, signature: function(index, value) this = value
-// opts.end : (default empty) function to call at the end of the each loop
-$.eachAsync = function(array, opts) {
-       var     i = 0,
-               l = array.length,
-               loop = opts.loop || function(){};
-       
-       $.whileAsync(
-               $.extend(opts, {
-                       test: function() { return i < l; },
-                       loop: function() {
-                               var val = array[i];
-                               return loop.call(val, i++, val);
-                       }
-               })
-       );
-};
-
-$.fn.eachAsync = function(opts) {
-       $.eachAsync(this, opts);
-       return this;
-}
-
-})(jQuery);
\ No newline at end of file
index de0688a..fe21f07 100644 (file)
                                        }
 
                                        // If the call flat out failed, we may want to try again...
-                                       retry = api.uploadChunk.bind( this, file, data, start, end, filekey, retries - 1 );
+                                       retry = api.uploadChunk.bind( api, file, data, start, end, filekey, retries - 1 );
                                        return api.retry( code, result, retry );
                                },
                                function ( fraction ) {
                                        return finishUpload;
                                },
                                function ( errorCode, result ) {
-                                       if ( result && result.upload && result.upload.filekey ) {
-                                               // Ignore any warnings if 'filekey' was returned, that's all we care about
+                                       if ( result && result.upload && result.upload.result === 'Success' && result.upload.filekey ) {
+                                               // Catch handler is also called in case of warnings (e.g. 'duplicate')
+                                               // We don't really care about those warnings, as long as the upload got stashed...
                                                filekey = result.upload.filekey;
                                                return $.Deferred().resolve( finishUpload );
                                        }
index 3ffc496..306d93a 100644 (file)
                                this.messagePosterPromise = settings.messagePosterPromise;
                                this.setBugReportLink( settings.bugsTaskSubmissionLink );
                                this.feedbackPageTitle = settings.title;
-                               this.feedbackPageName = settings.title.getNameText();
+                               this.feedbackPageName = settings.title.getMainText();
 
                                // Useragent checkbox
                                if ( settings.useragentCheckbox.show ) {
index c1884b8..3717c8b 100644 (file)
@@ -6,4 +6,311 @@
  */
 class CurlHttpRequestTest extends MWHttpRequestTestCase {
        protected static $httpEngine = 'curl';
+
+       /**
+        * Constant values are from PHP 5.3.28 using cURL 7.24.0
+        * @see https://www.php.net/manual/en/curl.constants.php
+        *
+        * All constant values are present so that developers don’t need to remember
+        * to add them if added at a later date. The commented out constants were
+        * not found anywhere in the MediaWiki core code.
+        *
+        * Commented out constants that were not available in:
+        * HipHop VM 3.3.0 (rel)
+        * Compiler: heads/master-0-g08810d920dfff59e0774cf2d651f92f13a637175
+        * Repo schema: 3214fc2c684a4520485f715ee45f33f2182324b1
+        * Extension API: 20140829
+        *
+        * Commented out constants that were removed in PHP 5.6.0
+        */
+       public function provideCurlConstants() {
+               return [
+                       [ 'CURLAUTH_ANY' ],
+                       [ 'CURLAUTH_ANYSAFE' ],
+                       [ 'CURLAUTH_BASIC' ],
+                       [ 'CURLAUTH_DIGEST' ],
+                       [ 'CURLAUTH_GSSNEGOTIATE' ],
+                       [ 'CURLAUTH_NTLM' ],
+                       // [ 'CURLCLOSEPOLICY_CALLBACK' ], // removed in PHP 5.6.0
+                       // [ 'CURLCLOSEPOLICY_LEAST_RECENTLY_USED' ], // removed in PHP 5.6.0
+                       // [ 'CURLCLOSEPOLICY_LEAST_TRAFFIC' ], // removed in PHP 5.6.0
+                       // [ 'CURLCLOSEPOLICY_OLDEST' ], // removed in PHP 5.6.0
+                       // [ 'CURLCLOSEPOLICY_SLOWEST' ], // removed in PHP 5.6.0
+                       [ 'CURLE_ABORTED_BY_CALLBACK' ],
+                       [ 'CURLE_BAD_CALLING_ORDER' ],
+                       [ 'CURLE_BAD_CONTENT_ENCODING' ],
+                       [ 'CURLE_BAD_FUNCTION_ARGUMENT' ],
+                       [ 'CURLE_BAD_PASSWORD_ENTERED' ],
+                       [ 'CURLE_COULDNT_CONNECT' ],
+                       [ 'CURLE_COULDNT_RESOLVE_HOST' ],
+                       [ 'CURLE_COULDNT_RESOLVE_PROXY' ],
+                       [ 'CURLE_FAILED_INIT' ],
+                       [ 'CURLE_FILESIZE_EXCEEDED' ],
+                       [ 'CURLE_FILE_COULDNT_READ_FILE' ],
+                       [ 'CURLE_FTP_ACCESS_DENIED' ],
+                       [ 'CURLE_FTP_BAD_DOWNLOAD_RESUME' ],
+                       [ 'CURLE_FTP_CANT_GET_HOST' ],
+                       [ 'CURLE_FTP_CANT_RECONNECT' ],
+                       [ 'CURLE_FTP_COULDNT_GET_SIZE' ],
+                       [ 'CURLE_FTP_COULDNT_RETR_FILE' ],
+                       [ 'CURLE_FTP_COULDNT_SET_ASCII' ],
+                       [ 'CURLE_FTP_COULDNT_SET_BINARY' ],
+                       [ 'CURLE_FTP_COULDNT_STOR_FILE' ],
+                       [ 'CURLE_FTP_COULDNT_USE_REST' ],
+                       [ 'CURLE_FTP_PORT_FAILED' ],
+                       [ 'CURLE_FTP_QUOTE_ERROR' ],
+                       [ 'CURLE_FTP_SSL_FAILED' ],
+                       [ 'CURLE_FTP_USER_PASSWORD_INCORRECT' ],
+                       [ 'CURLE_FTP_WEIRD_227_FORMAT' ],
+                       [ 'CURLE_FTP_WEIRD_PASS_REPLY' ],
+                       [ 'CURLE_FTP_WEIRD_PASV_REPLY' ],
+                       [ 'CURLE_FTP_WEIRD_SERVER_REPLY' ],
+                       [ 'CURLE_FTP_WEIRD_USER_REPLY' ],
+                       [ 'CURLE_FTP_WRITE_ERROR' ],
+                       [ 'CURLE_FUNCTION_NOT_FOUND' ],
+                       [ 'CURLE_GOT_NOTHING' ],
+                       [ 'CURLE_HTTP_NOT_FOUND' ],
+                       [ 'CURLE_HTTP_PORT_FAILED' ],
+                       [ 'CURLE_HTTP_POST_ERROR' ],
+                       [ 'CURLE_HTTP_RANGE_ERROR' ],
+                       [ 'CURLE_LDAP_CANNOT_BIND' ],
+                       [ 'CURLE_LDAP_INVALID_URL' ],
+                       [ 'CURLE_LDAP_SEARCH_FAILED' ],
+                       [ 'CURLE_LIBRARY_NOT_FOUND' ],
+                       [ 'CURLE_MALFORMAT_USER' ],
+                       [ 'CURLE_OBSOLETE' ],
+                       [ 'CURLE_OK' ],
+                       [ 'CURLE_OPERATION_TIMEOUTED' ],
+                       [ 'CURLE_OUT_OF_MEMORY' ],
+                       [ 'CURLE_PARTIAL_FILE' ],
+                       [ 'CURLE_READ_ERROR' ],
+                       [ 'CURLE_RECV_ERROR' ],
+                       [ 'CURLE_SEND_ERROR' ],
+                       [ 'CURLE_SHARE_IN_USE' ],
+                       // [ 'CURLE_SSH' ], // not present in HHVM 3.3.0-dev
+                       [ 'CURLE_SSL_CACERT' ],
+                       [ 'CURLE_SSL_CERTPROBLEM' ],
+                       [ 'CURLE_SSL_CIPHER' ],
+                       [ 'CURLE_SSL_CONNECT_ERROR' ],
+                       [ 'CURLE_SSL_ENGINE_NOTFOUND' ],
+                       [ 'CURLE_SSL_ENGINE_SETFAILED' ],
+                       [ 'CURLE_SSL_PEER_CERTIFICATE' ],
+                       [ 'CURLE_TELNET_OPTION_SYNTAX' ],
+                       [ 'CURLE_TOO_MANY_REDIRECTS' ],
+                       [ 'CURLE_UNKNOWN_TELNET_OPTION' ],
+                       [ 'CURLE_UNSUPPORTED_PROTOCOL' ],
+                       [ 'CURLE_URL_MALFORMAT' ],
+                       [ 'CURLE_URL_MALFORMAT_USER' ],
+                       [ 'CURLE_WRITE_ERROR' ],
+                       [ 'CURLFTPAUTH_DEFAULT' ],
+                       [ 'CURLFTPAUTH_SSL' ],
+                       [ 'CURLFTPAUTH_TLS' ],
+                       // [ 'CURLFTPMETHOD_MULTICWD' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLFTPMETHOD_NOCWD' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLFTPMETHOD_SINGLECWD' ], // not present in HHVM 3.3.0-dev
+                       [ 'CURLFTPSSL_ALL' ],
+                       [ 'CURLFTPSSL_CONTROL' ],
+                       [ 'CURLFTPSSL_NONE' ],
+                       [ 'CURLFTPSSL_TRY' ],
+                       // [ 'CURLINFO_CERTINFO' ], // not present in HHVM 3.3.0-dev
+                       [ 'CURLINFO_CONNECT_TIME' ],
+                       [ 'CURLINFO_CONTENT_LENGTH_DOWNLOAD' ],
+                       [ 'CURLINFO_CONTENT_LENGTH_UPLOAD' ],
+                       [ 'CURLINFO_CONTENT_TYPE' ],
+                       [ 'CURLINFO_EFFECTIVE_URL' ],
+                       [ 'CURLINFO_FILETIME' ],
+                       [ 'CURLINFO_HEADER_OUT' ],
+                       [ 'CURLINFO_HEADER_SIZE' ],
+                       [ 'CURLINFO_HTTP_CODE' ],
+                       [ 'CURLINFO_NAMELOOKUP_TIME' ],
+                       [ 'CURLINFO_PRETRANSFER_TIME' ],
+                       [ 'CURLINFO_PRIVATE' ],
+                       [ 'CURLINFO_REDIRECT_COUNT' ],
+                       [ 'CURLINFO_REDIRECT_TIME' ],
+                       // [ 'CURLINFO_REDIRECT_URL' ], // not present in HHVM 3.3.0-dev
+                       [ 'CURLINFO_REQUEST_SIZE' ],
+                       [ 'CURLINFO_SIZE_DOWNLOAD' ],
+                       [ 'CURLINFO_SIZE_UPLOAD' ],
+                       [ 'CURLINFO_SPEED_DOWNLOAD' ],
+                       [ 'CURLINFO_SPEED_UPLOAD' ],
+                       [ 'CURLINFO_SSL_VERIFYRESULT' ],
+                       [ 'CURLINFO_STARTTRANSFER_TIME' ],
+                       [ 'CURLINFO_TOTAL_TIME' ],
+                       [ 'CURLMSG_DONE' ],
+                       [ 'CURLM_BAD_EASY_HANDLE' ],
+                       [ 'CURLM_BAD_HANDLE' ],
+                       [ 'CURLM_CALL_MULTI_PERFORM' ],
+                       [ 'CURLM_INTERNAL_ERROR' ],
+                       [ 'CURLM_OK' ],
+                       [ 'CURLM_OUT_OF_MEMORY' ],
+                       [ 'CURLOPT_AUTOREFERER' ],
+                       [ 'CURLOPT_BINARYTRANSFER' ],
+                       [ 'CURLOPT_BUFFERSIZE' ],
+                       [ 'CURLOPT_CAINFO' ],
+                       [ 'CURLOPT_CAPATH' ],
+                       // [ 'CURLOPT_CERTINFO' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLOPT_CLOSEPOLICY' ], // removed in PHP 5.6.0
+                       [ 'CURLOPT_CONNECTTIMEOUT' ],
+                       [ 'CURLOPT_CONNECTTIMEOUT_MS' ],
+                       [ 'CURLOPT_COOKIE' ],
+                       [ 'CURLOPT_COOKIEFILE' ],
+                       [ 'CURLOPT_COOKIEJAR' ],
+                       [ 'CURLOPT_COOKIESESSION' ],
+                       [ 'CURLOPT_CRLF' ],
+                       [ 'CURLOPT_CUSTOMREQUEST' ],
+                       [ 'CURLOPT_DNS_CACHE_TIMEOUT' ],
+                       [ 'CURLOPT_DNS_USE_GLOBAL_CACHE' ],
+                       [ 'CURLOPT_EGDSOCKET' ],
+                       [ 'CURLOPT_ENCODING' ],
+                       [ 'CURLOPT_FAILONERROR' ],
+                       [ 'CURLOPT_FILE' ],
+                       [ 'CURLOPT_FILETIME' ],
+                       [ 'CURLOPT_FOLLOWLOCATION' ],
+                       [ 'CURLOPT_FORBID_REUSE' ],
+                       [ 'CURLOPT_FRESH_CONNECT' ],
+                       [ 'CURLOPT_FTPAPPEND' ],
+                       [ 'CURLOPT_FTPLISTONLY' ],
+                       [ 'CURLOPT_FTPPORT' ],
+                       [ 'CURLOPT_FTPSSLAUTH' ],
+                       [ 'CURLOPT_FTP_CREATE_MISSING_DIRS' ],
+                       // [ 'CURLOPT_FTP_FILEMETHOD' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLOPT_FTP_SKIP_PASV_IP' ], // not present in HHVM 3.3.0-dev
+                       [ 'CURLOPT_FTP_SSL' ],
+                       [ 'CURLOPT_FTP_USE_EPRT' ],
+                       [ 'CURLOPT_FTP_USE_EPSV' ],
+                       [ 'CURLOPT_HEADER' ],
+                       [ 'CURLOPT_HEADERFUNCTION' ],
+                       [ 'CURLOPT_HTTP200ALIASES' ],
+                       [ 'CURLOPT_HTTPAUTH' ],
+                       [ 'CURLOPT_HTTPGET' ],
+                       [ 'CURLOPT_HTTPHEADER' ],
+                       [ 'CURLOPT_HTTPPROXYTUNNEL' ],
+                       [ 'CURLOPT_HTTP_VERSION' ],
+                       [ 'CURLOPT_INFILE' ],
+                       [ 'CURLOPT_INFILESIZE' ],
+                       [ 'CURLOPT_INTERFACE' ],
+                       [ 'CURLOPT_IPRESOLVE' ],
+                       // [ 'CURLOPT_KEYPASSWD' ], // not present in HHVM 3.3.0-dev
+                       [ 'CURLOPT_KRB4LEVEL' ],
+                       [ 'CURLOPT_LOW_SPEED_LIMIT' ],
+                       [ 'CURLOPT_LOW_SPEED_TIME' ],
+                       [ 'CURLOPT_MAXCONNECTS' ],
+                       [ 'CURLOPT_MAXREDIRS' ],
+                       // [ 'CURLOPT_MAX_RECV_SPEED_LARGE' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLOPT_MAX_SEND_SPEED_LARGE' ], // not present in HHVM 3.3.0-dev
+                       [ 'CURLOPT_NETRC' ],
+                       [ 'CURLOPT_NOBODY' ],
+                       [ 'CURLOPT_NOPROGRESS' ],
+                       [ 'CURLOPT_NOSIGNAL' ],
+                       [ 'CURLOPT_PORT' ],
+                       [ 'CURLOPT_POST' ],
+                       [ 'CURLOPT_POSTFIELDS' ],
+                       [ 'CURLOPT_POSTQUOTE' ],
+                       [ 'CURLOPT_POSTREDIR' ],
+                       [ 'CURLOPT_PRIVATE' ],
+                       [ 'CURLOPT_PROGRESSFUNCTION' ],
+                       // [ 'CURLOPT_PROTOCOLS' ], // not present in HHVM 3.3.0-dev
+                       [ 'CURLOPT_PROXY' ],
+                       [ 'CURLOPT_PROXYAUTH' ],
+                       [ 'CURLOPT_PROXYPORT' ],
+                       [ 'CURLOPT_PROXYTYPE' ],
+                       [ 'CURLOPT_PROXYUSERPWD' ],
+                       [ 'CURLOPT_PUT' ],
+                       [ 'CURLOPT_QUOTE' ],
+                       [ 'CURLOPT_RANDOM_FILE' ],
+                       [ 'CURLOPT_RANGE' ],
+                       [ 'CURLOPT_READDATA' ],
+                       [ 'CURLOPT_READFUNCTION' ],
+                       // [ 'CURLOPT_REDIR_PROTOCOLS' ], // not present in HHVM 3.3.0-dev
+                       [ 'CURLOPT_REFERER' ],
+                       [ 'CURLOPT_RESUME_FROM' ],
+                       [ 'CURLOPT_RETURNTRANSFER' ],
+                       // [ 'CURLOPT_SSH_AUTH_TYPES' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLOPT_SSH_HOST_PUBLIC_KEY_MD5' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLOPT_SSH_PRIVATE_KEYFILE' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLOPT_SSH_PUBLIC_KEYFILE' ], // not present in HHVM 3.3.0-dev
+                       [ 'CURLOPT_SSLCERT' ],
+                       [ 'CURLOPT_SSLCERTPASSWD' ],
+                       [ 'CURLOPT_SSLCERTTYPE' ],
+                       [ 'CURLOPT_SSLENGINE' ],
+                       [ 'CURLOPT_SSLENGINE_DEFAULT' ],
+                       [ 'CURLOPT_SSLKEY' ],
+                       [ 'CURLOPT_SSLKEYPASSWD' ],
+                       [ 'CURLOPT_SSLKEYTYPE' ],
+                       [ 'CURLOPT_SSLVERSION' ],
+                       [ 'CURLOPT_SSL_CIPHER_LIST' ],
+                       [ 'CURLOPT_SSL_VERIFYHOST' ],
+                       [ 'CURLOPT_SSL_VERIFYPEER' ],
+                       [ 'CURLOPT_STDERR' ],
+                       [ 'CURLOPT_TCP_NODELAY' ],
+                       [ 'CURLOPT_TIMECONDITION' ],
+                       [ 'CURLOPT_TIMEOUT' ],
+                       [ 'CURLOPT_TIMEOUT_MS' ],
+                       [ 'CURLOPT_TIMEVALUE' ],
+                       [ 'CURLOPT_TRANSFERTEXT' ],
+                       [ 'CURLOPT_UNRESTRICTED_AUTH' ],
+                       [ 'CURLOPT_UPLOAD' ],
+                       [ 'CURLOPT_URL' ],
+                       [ 'CURLOPT_USERAGENT' ],
+                       [ 'CURLOPT_USERPWD' ],
+                       [ 'CURLOPT_VERBOSE' ],
+                       [ 'CURLOPT_WRITEFUNCTION' ],
+                       [ 'CURLOPT_WRITEHEADER' ],
+                       // [ 'CURLPROTO_ALL' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLPROTO_DICT' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLPROTO_FILE' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLPROTO_FTP' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLPROTO_FTPS' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLPROTO_HTTP' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLPROTO_HTTPS' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLPROTO_LDAP' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLPROTO_LDAPS' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLPROTO_SCP' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLPROTO_SFTP' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLPROTO_TELNET' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLPROTO_TFTP' ], // not present in HHVM 3.3.0-dev
+                       [ 'CURLPROXY_HTTP' ],
+                       // [ 'CURLPROXY_SOCKS4' ], // not present in HHVM 3.3.0-dev
+                       [ 'CURLPROXY_SOCKS5' ],
+                       // [ 'CURLSSH_AUTH_DEFAULT' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLSSH_AUTH_HOST' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLSSH_AUTH_KEYBOARD' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLSSH_AUTH_NONE' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLSSH_AUTH_PASSWORD' ], // not present in HHVM 3.3.0-dev
+                       // [ 'CURLSSH_AUTH_PUBLICKEY' ], // not present in HHVM 3.3.0-dev
+                       [ 'CURLVERSION_NOW' ],
+                       [ 'CURL_HTTP_VERSION_1_0' ],
+                       [ 'CURL_HTTP_VERSION_1_1' ],
+                       [ 'CURL_HTTP_VERSION_NONE' ],
+                       [ 'CURL_IPRESOLVE_V4' ],
+                       [ 'CURL_IPRESOLVE_V6' ],
+                       [ 'CURL_IPRESOLVE_WHATEVER' ],
+                       [ 'CURL_NETRC_IGNORED' ],
+                       [ 'CURL_NETRC_OPTIONAL' ],
+                       [ 'CURL_NETRC_REQUIRED' ],
+                       [ 'CURL_TIMECOND_IFMODSINCE' ],
+                       [ 'CURL_TIMECOND_IFUNMODSINCE' ],
+                       [ 'CURL_TIMECOND_LASTMOD' ],
+                       [ 'CURL_VERSION_IPV6' ],
+                       [ 'CURL_VERSION_KERBEROS4' ],
+                       [ 'CURL_VERSION_LIBZ' ],
+                       [ 'CURL_VERSION_SSL' ],
+               ];
+       }
+
+       /**
+        * Added this test based on an issue experienced with HHVM 3.3.0-dev
+        * where it did not define a cURL constant. T72570
+        *
+        * @dataProvider provideCurlConstants
+        * @coversNothing
+        */
+       public function testCurlConstants( $value ) {
+               $loaded = extension_loaded( 'curl' );
+               if ( !$loaded ) {
+                       $this->markTestSkipped( "PHP extension 'curl' is not loaded, skipping." );
+               }
+
+               $this->assertTrue( defined( $value ), "Is $value defined?" );
+       }
 }
diff --git a/tests/integration/includes/http/MWHttpRequestTest.php b/tests/integration/includes/http/MWHttpRequestTest.php
new file mode 100644 (file)
index 0000000..5b90b78
--- /dev/null
@@ -0,0 +1,93 @@
+<?php
+
+/**
+ * @covers MWHttpRequest
+ */
+class MWHttpRequestTest extends PHPUnit\Framework\TestCase {
+
+       public function testFactory() {
+               $this->assertInstanceOf( 'MWHttpRequest', MWHttpRequest::factory( 'http://example.test' ) );
+       }
+
+       /**
+        * Feeds URI to test a long regular expression in Http::isValidURI
+        */
+       public static function provideURI() {
+               /** Format: 'boolean expectation', 'URI to test', 'Optional message' */
+               return [
+                       [ false, '¿non sens before!! http://a', 'Allow anything before URI' ],
+
+                       # (http|https) - only two schemes allowed
+                       [ true, 'http://www.example.org/' ],
+                       [ true, 'https://www.example.org/' ],
+                       [ true, 'http://www.example.org', 'URI without directory' ],
+                       [ true, 'http://a', 'Short name' ],
+                       [ true, 'http://étoile', 'Allow UTF-8 in hostname' ], # 'étoile' is french for 'star'
+                       [ false, '\\host\directory', 'CIFS share' ],
+                       [ false, 'gopher://host/dir', 'Reject gopher scheme' ],
+                       [ false, 'telnet://host', 'Reject telnet scheme' ],
+
+                       # :\/\/ - double slashes
+                       [ false, 'http//example.org', 'Reject missing colon in protocol' ],
+                       [ false, 'http:/example.org', 'Reject missing slash in protocol' ],
+                       [ false, 'http:example.org', 'Must have two slashes' ],
+                       # Following fail since hostname can be made of anything
+                       [ false, 'http:///example.org', 'Must have exactly two slashes, not three' ],
+
+                       # (\w+:{0,1}\w*@)? - optional user:pass
+                       [ true, 'http://user@host', 'Username provided' ],
+                       [ true, 'http://user:@host', 'Username provided, no password' ],
+                       [ true, 'http://user:pass@host', 'Username and password provided' ],
+
+                       # (\S+) - host part is made of anything not whitespaces
+                       // commented these out in order to remove @group Broken
+                       // @todo are these valid tests? if so, fix Http::isValidURI so it can handle them
+                       // [ false, 'http://!"èèè¿¿¿~~\'', 'hostname is made of any non whitespace' ],
+                       // [ false, 'http://exam:ple.org/', 'hostname can not use colons!' ],
+
+                       # (:[0-9]+)? - port number
+                       [ true, 'http://example.org:80/' ],
+                       [ true, 'https://example.org:80/' ],
+                       [ true, 'http://example.org:443/' ],
+                       [ true, 'https://example.org:443/' ],
+
+                       # Part after the hostname is / or / with something else
+                       [ true, 'http://example/#' ],
+                       [ true, 'http://example/!' ],
+                       [ true, 'http://example/:' ],
+                       [ true, 'http://example/.' ],
+                       [ true, 'http://example/?' ],
+                       [ true, 'http://example/+' ],
+                       [ true, 'http://example/=' ],
+                       [ true, 'http://example/&' ],
+                       [ true, 'http://example/%' ],
+                       [ true, 'http://example/@' ],
+                       [ true, 'http://example/-' ],
+                       [ true, 'http://example//' ],
+                       [ true, 'http://example/&' ],
+
+                       # Fragment
+                       [ true, 'http://exam#ple.org', ], # This one is valid, really!
+                       [ true, 'http://example.org:80#anchor' ],
+                       [ true, 'http://example.org/?id#anchor' ],
+                       [ true, 'http://example.org/?#anchor' ],
+
+                       [ false, 'http://a ¿non !!sens after', 'Allow anything after URI' ],
+               ];
+       }
+
+       /**
+        * Test MWHttpRequest::isValidURI()
+        * T29854 : Http::isValidURI is too lax
+        * @dataProvider provideURI
+        * @covers Http::isValidURI
+        */
+       public function testIsValidUri( $expect, $URI, $message = '' ) {
+               $this->assertEquals(
+                       $expect,
+                       (bool)MWHttpRequest::isValidURI( $URI ),
+                       $message
+               );
+       }
+
+}
index f7a4cc4..d17b9b3 100644 (file)
@@ -1,5 +1,6 @@
 <?php
 
+use MediaWiki\Http\HttpRequestFactory;
 use MediaWiki\MediaWikiServices;
 use Wikimedia\TestingAccessWrapper;
 
@@ -253,4 +254,53 @@ abstract class MWHttpRequestTestCase extends PHPUnit\Framework\TestCase {
                        array_change_key_case( $cookieJar->cookie, CASE_LOWER ) );
        }
 
+       public static function provideRelativeRedirects() {
+               return [
+                       [
+                               'location' => [ 'http://newsite/file.ext', '/newfile.ext' ],
+                               'final' => 'http://newsite/newfile.ext',
+                               'Relative file path Location: interpreted as full URL'
+                       ],
+                       [
+                               'location' => [ 'https://oldsite/file.ext' ],
+                               'final' => 'https://oldsite/file.ext',
+                               'Location to the HTTPS version of the site'
+                       ],
+                       [
+                               'location' => [
+                                       '/anotherfile.ext',
+                                       'http://anotherfile/hoster.ext',
+                                       'https://anotherfile/hoster.ext'
+                               ],
+                               'final' => 'https://anotherfile/hoster.ext',
+                               'Relative file path Location: should keep the latest host and scheme!'
+                       ],
+                       [
+                               'location' => [ '/anotherfile.ext' ],
+                               'final' => 'http://oldsite/anotherfile.ext',
+                               'Relative Location without domain '
+                       ],
+                       [
+                               'location' => null,
+                               'final' => 'http://oldsite/file.ext',
+                               'No Location (no redirect) '
+                       ],
+               ];
+       }
+
+       /**
+        * @dataProvider provideRelativeRedirects
+        * @covers MWHttpRequest::getFinalUrl
+        */
+       public function testRelativeRedirections( $location, $final, $message = null ) {
+               $h = $this->factory->create( 'http://oldsite/file.ext', [], __METHOD__ );
+               $h = TestingAccessWrapper::newFromObject( $h );
+
+               // Forge a Location header
+               $h->respHeaders['location'] = $location;
+
+               // Verify it correctly fixes the Location
+               $this->assertEquals( $final, $h->getFinalUrl(), $message );
+       }
+
 }
index 3e80598..4f48f48 100644 (file)
@@ -106,6 +106,7 @@ class NoopSuppressor extends Suppressor {
        public function __construct( $mode ) {
                $this->mode = $mode;
        }
+
        public function suppress( $input ) {
                echo "Unsupported output mode: {$this->mode}\n$input";
                return true;
index 329f0ba..999813f 100644 (file)
@@ -817,29 +817,6 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase {
                return false;
        }
 
-       /**
-        * Stashes the global, will be restored in tearDown()
-        *
-        * Individual test functions may override globals through the setMwGlobals() function
-        * or directly. When directly overriding globals their keys should first be passed to this
-        * method in setUp to avoid breaking global state for other tests
-        *
-        * That way all other tests are executed with the same settings (instead of using the
-        * unreliable local settings for most tests and fix it only for some tests).
-        *
-        * @param array|string $globalKeys Key to the global variable, or an array of keys.
-        *
-        * @note To allow changes to global variables to take effect on global service instances,
-        *       call overrideMwServices().
-        *
-        * @since 1.23
-        * @deprecated since 1.32, use setMwGlobals() and don't alter globals directly
-        */
-       protected function stashMwGlobals( $globalKeys ) {
-               wfDeprecated( __METHOD__, '1.32' );
-               $this->doStashMwGlobals( $globalKeys );
-       }
-
        private function doStashMwGlobals( $globalKeys ) {
                if ( is_string( $globalKeys ) ) {
                        $globalKeys = [ $globalKeys ];
index 57f56f4..e9a8a1f 100644 (file)
@@ -137,6 +137,7 @@ class ResourceLoaderTestModule extends ResourceLoaderModule {
        public function isRaw() {
                return $this->isRaw;
        }
+
        public function isKnownEmpty( ResourceLoaderContext $context ) {
                return $this->isKnownEmpty;
        }
index 2ee8b98..da08670 100644 (file)
@@ -42,15 +42,19 @@ class FormOptionsTest extends MediaWikiTestCase {
        private function assertGuessBoolean( $data ) {
                $this->guess( FormOptions::BOOL, $data );
        }
+
        private function assertGuessInt( $data ) {
                $this->guess( FormOptions::INT, $data );
        }
+
        private function assertGuessFloat( $data ) {
                $this->guess( FormOptions::FLOAT, $data );
        }
+
        private function assertGuessString( $data ) {
                $this->guess( FormOptions::STRING, $data );
        }
+
        private function assertGuessArray( $data ) {
                $this->guess( FormOptions::ARR, $data );
        }
@@ -62,6 +66,7 @@ class FormOptionsTest extends MediaWikiTestCase {
                        FormOptions::guessType( $data )
                );
        }
+
        /* @} */
 
        /**
index ef8766a..afc6bb5 100644 (file)
@@ -25,6 +25,7 @@ class OutputPageTest extends MediaWikiTestCase {
                parent::setUp();
                ResourceLoader::clearCache();
        }
+
        protected function tearDown() {
                parent::tearDown();
                ResourceLoader::clearCache();
index 4e19822..64b2cd6 100644 (file)
@@ -1336,7 +1336,7 @@ class ApiBaseTest extends ApiTestCase {
                $userInfoTrait = TestingAccessWrapper::newFromObject(
                        $this->getMockForTrait( ApiBlockInfoTrait::class )
                );
-               $blockinfo = [ 'blockinfo' => $userInfoTrait->getBlockInfo( $block ) ];
+               $blockinfo = [ 'blockinfo' => $userInfoTrait->getBlockDetails( $block ) ];
 
                $expect = Status::newGood();
                $expect->fatal( ApiMessage::create( 'apierror-blocked', 'blocked', $blockinfo ) );
@@ -1394,7 +1394,7 @@ class ApiBaseTest extends ApiTestCase {
                $userInfoTrait = TestingAccessWrapper::newFromObject(
                        $this->getObjectForTrait( ApiBlockInfoTrait::class )
                );
-               $blockinfo = [ 'blockinfo' => $userInfoTrait->getBlockInfo( $block ) ];
+               $blockinfo = [ 'blockinfo' => $userInfoTrait->getBlockDetails( $block ) ];
 
                $expect = Status::newGood();
                $expect->fatal( ApiMessage::create( 'apierror-blocked', 'blocked', $blockinfo ) );
index 932495a..a6e2d0d 100644 (file)
@@ -8,11 +8,11 @@ use MediaWiki\Block\SystemBlock;
  */
 class ApiBlockInfoTraitTest extends MediaWikiTestCase {
        /**
-        * @dataProvider provideGetBlockInfo
+        * @dataProvider provideGetBlockDetails
         */
-       public function testGetBlockInfo( $block, $expectedInfo ) {
+       public function testGetBlockDetails( $block, $expectedInfo ) {
                $mock = $this->getMockForTrait( ApiBlockInfoTrait::class );
-               $info = TestingAccessWrapper::newFromObject( $mock )->getBlockInfo( $block );
+               $info = TestingAccessWrapper::newFromObject( $mock )->getBlockDetails( $block );
                $subset = array_merge( [
                        'blockid' => null,
                        'blockedby' => '',
@@ -23,7 +23,7 @@ class ApiBlockInfoTraitTest extends MediaWikiTestCase {
                $this->assertArraySubset( $subset, $info );
        }
 
-       public static function provideGetBlockInfo() {
+       public static function provideGetBlockDetails() {
                return [
                        'Sitewide block' => [
                                new Block(),
diff --git a/tests/phpunit/includes/api/ApiQueryUserInfoTest.php b/tests/phpunit/includes/api/ApiQueryUserInfoTest.php
new file mode 100644 (file)
index 0000000..703c150
--- /dev/null
@@ -0,0 +1,51 @@
+<?php
+
+/**
+ * @group medium
+ * @covers ApiQueryUserInfo
+ */
+class ApiQueryUserInfoTest extends ApiTestCase {
+       public function testGetBlockInfo() {
+               $this->hideDeprecated( 'ApiQueryUserInfo::getBlockInfo' );
+
+               $apiQueryUserInfo = new ApiQueryUserInfo(
+                       new ApiQuery( new ApiMain( $this->apiContext ), 'userinfo' ),
+                       'userinfo'
+               );
+
+               $block = new Block();
+               $info = $apiQueryUserInfo->getBlockInfo( $block );
+               $subset = [
+                       'blockid' => null,
+                       'blockedby' => '',
+                       'blockedbyid' => 0,
+                       'blockreason' => '',
+                       'blockexpiry' => 'infinite',
+                       'blockpartial' => false,
+               ];
+               $this->assertArraySubset( $subset, $info );
+       }
+
+       public function testGetBlockInfoPartial() {
+               $this->hideDeprecated( 'ApiQueryUserInfo::getBlockInfo' );
+
+               $apiQueryUserInfo = new ApiQueryUserInfo(
+                       new ApiQuery( new ApiMain( $this->apiContext ), 'userinfo' ),
+                       'userinfo'
+               );
+
+               $block = new Block( [
+                       'sitewide' => false,
+               ] );
+               $info = $apiQueryUserInfo->getBlockInfo( $block );
+               $subset = [
+                       'blockid' => null,
+                       'blockedby' => '',
+                       'blockedbyid' => 0,
+                       'blockreason' => '',
+                       'blockexpiry' => 'infinite',
+                       'blockpartial' => true,
+               ];
+               $this->assertArraySubset( $subset, $info );
+       }
+}
index 8546d96..8d6c3ae 100644 (file)
@@ -92,6 +92,7 @@ class JsonContentTest extends MediaWikiLangTestCase {
                        ->disableOriginalConstructor()
                        ->getMock();
        }
+
        private function getMockParserOptions() {
                return $this->getMockBuilder( ParserOptions::class )
                        ->disableOriginalConstructor()
diff --git a/tests/phpunit/includes/http/HttpRequestFactoryTest.php b/tests/phpunit/includes/http/HttpRequestFactoryTest.php
new file mode 100644 (file)
index 0000000..7429dcc
--- /dev/null
@@ -0,0 +1,119 @@
+<?php
+
+use MediaWiki\Http\HttpRequestFactory;
+
+/**
+ * @covers MediaWiki\Http\HttpRequestFactory
+ */
+class HttpRequestFactoryTest extends MediaWikiTestCase {
+
+       /**
+        * @return HttpRequestFactory
+        */
+       private function newFactory() {
+               return new HttpRequestFactory();
+       }
+
+       /**
+        * @return HttpRequestFactory
+        */
+       private function newFactoryWithFakeRequest(
+               MWHttpRequest $req,
+               $expectedUrl,
+               $expectedOptions = []
+       ) {
+               $factory = $this->getMockBuilder( HttpRequestFactory::class )
+                       ->setMethods( [ 'create' ] )
+                       ->getMock();
+
+               $factory->method( 'create' )
+                       ->willReturnCallback(
+                               function ( $url, array $options = [], $caller = __METHOD__ )
+                                       use ( $req, $expectedUrl, $expectedOptions )
+                               {
+                                       $this->assertSame( $url, $expectedUrl );
+
+                                       foreach ( $expectedOptions as $opt => $exp ) {
+                                               $this->assertArrayHasKey( $opt, $options );
+                                               $this->assertSame( $exp, $options[$opt] );
+                                       }
+
+                                       return $req;
+                               }
+                       );
+
+               return $factory;
+       }
+
+       /**
+        * @return MWHttpRequest
+        */
+       private function newFakeRequest( $result ) {
+               $req = $this->getMockBuilder( MWHttpRequest::class )
+                       ->disableOriginalConstructor()
+                       ->setMethods( [ 'getContent', 'execute' ] )
+                       ->getMock();
+
+               if ( $result instanceof Status ) {
+                       $req->method( 'getContent' )
+                               ->willReturn( $result->getValue() );
+                       $req->method( 'execute' )
+                               ->willReturn( $result );
+               } else {
+                       $req->method( 'getContent' )
+                               ->willReturn( $result );
+                       $req->method( 'execute' )
+                               ->willReturn( Status::newGood( $result ) );
+               }
+
+               return $req;
+       }
+
+       public function testCreate() {
+               $factory = $this->newFactory();
+               $this->assertInstanceOf( 'MWHttpRequest', $factory->create( 'http://example.test' ) );
+       }
+
+       public function testGetUserAgent() {
+               $factory = $this->newFactory();
+               $this->assertStringStartsWith( 'MediaWiki/', $factory->getUserAgent() );
+       }
+
+       public function testGet() {
+               $req = $this->newFakeRequest( __METHOD__ );
+               $factory = $this->newFactoryWithFakeRequest(
+                       $req, 'https://example.test', [ 'method' => 'GET' ]
+               );
+
+               $this->assertSame( __METHOD__, $factory->get( 'https://example.test' ) );
+       }
+
+       public function testPost() {
+               $req = $this->newFakeRequest( __METHOD__ );
+               $factory = $this->newFactoryWithFakeRequest(
+                       $req, 'https://example.test', [ 'method' => 'POST' ]
+               );
+
+               $this->assertSame( __METHOD__, $factory->post( 'https://example.test' ) );
+       }
+
+       public function testRequest() {
+               $req = $this->newFakeRequest( __METHOD__ );
+               $factory = $this->newFactoryWithFakeRequest(
+                       $req, 'https://example.test', [ 'method' => 'GET' ]
+               );
+
+               $this->assertSame( __METHOD__, $factory->request( 'GET', 'https://example.test' ) );
+       }
+
+       public function testRequest_failed() {
+               $status = Status::newFatal( 'testing' );
+               $req = $this->newFakeRequest( $status );
+               $factory = $this->newFactoryWithFakeRequest(
+                       $req, 'https://example.test', [ 'method' => 'POST' ]
+               );
+
+               $this->assertNull( $factory->request( 'POST', 'https://example.test' ) );
+       }
+
+}
index a8c53d9..09bcfc9 100644 (file)
@@ -1,53 +1,11 @@
 <?php
 
 /**
+ * @covers Http
  * @group Http
  * @group small
  */
 class HttpTest extends MediaWikiTestCase {
-       /**
-        * @dataProvider cookieDomains
-        * @covers Cookie::validateCookieDomain
-        */
-       public function testValidateCookieDomain( $expected, $domain, $origin = null ) {
-               if ( $origin ) {
-                       $ok = Cookie::validateCookieDomain( $domain, $origin );
-                       $msg = "$domain against origin $origin";
-               } else {
-                       $ok = Cookie::validateCookieDomain( $domain );
-                       $msg = "$domain";
-               }
-               $this->assertEquals( $expected, $ok, $msg );
-       }
-
-       public static function cookieDomains() {
-               return [
-                       [ false, "org" ],
-                       [ false, ".org" ],
-                       [ true, "wikipedia.org" ],
-                       [ true, ".wikipedia.org" ],
-                       [ false, "co.uk" ],
-                       [ false, ".co.uk" ],
-                       [ false, "gov.uk" ],
-                       [ false, ".gov.uk" ],
-                       [ true, "supermarket.uk" ],
-                       [ false, "uk" ],
-                       [ false, ".uk" ],
-                       [ false, "127.0.0." ],
-                       [ false, "127." ],
-                       [ false, "127.0.0.1." ],
-                       [ true, "127.0.0.1" ],
-                       [ false, "333.0.0.1" ],
-                       [ true, "example.com" ],
-                       [ false, "example.com." ],
-                       [ true, ".example.com" ],
-
-                       [ true, ".example.com", "www.example.com" ],
-                       [ false, "example.com", "www.example.com" ],
-                       [ true, "127.0.0.1", "127.0.0.1" ],
-                       [ false, "127.0.0.1", "localhost" ],
-               ];
-       }
 
        /**
         * Test Http::isValidURI()
@@ -150,409 +108,4 @@ class HttpTest extends MediaWikiTestCase {
                ];
        }
 
-       public static function provideRelativeRedirects() {
-               return [
-                       [
-                               'location' => [ 'http://newsite/file.ext', '/newfile.ext' ],
-                               'final' => 'http://newsite/newfile.ext',
-                               'Relative file path Location: interpreted as full URL'
-                       ],
-                       [
-                               'location' => [ 'https://oldsite/file.ext' ],
-                               'final' => 'https://oldsite/file.ext',
-                               'Location to the HTTPS version of the site'
-                       ],
-                       [
-                               'location' => [
-                                       '/anotherfile.ext',
-                                       'http://anotherfile/hoster.ext',
-                                       'https://anotherfile/hoster.ext'
-                               ],
-                               'final' => 'https://anotherfile/hoster.ext',
-                               'Relative file path Location: should keep the latest host and scheme!'
-                       ],
-                       [
-                               'location' => [ '/anotherfile.ext' ],
-                               'final' => 'http://oldsite/anotherfile.ext',
-                               'Relative Location without domain '
-                       ],
-                       [
-                               'location' => null,
-                               'final' => 'http://oldsite/file.ext',
-                               'No Location (no redirect) '
-                       ],
-               ];
-       }
-
-       /**
-        * Warning:
-        *
-        * These tests are for code that makes use of an artifact of how CURL
-        * handles header reporting on redirect pages, and will need to be
-        * rewritten when T31232 is taken care of (high-level handling of HTTP redirects).
-        *
-        * @dataProvider provideRelativeRedirects
-        * @covers MWHttpRequest::getFinalUrl
-        */
-       public function testRelativeRedirections( $location, $final, $message = null ) {
-               $h = MWHttpRequestTester::factory( 'http://oldsite/file.ext', [], __METHOD__ );
-               // Forge a Location header
-               $h->setRespHeaders( 'location', $location );
-               // Verify it correctly fixes the Location
-               $this->assertEquals( $final, $h->getFinalUrl(), $message );
-       }
-
-       /**
-        * Constant values are from PHP 5.3.28 using cURL 7.24.0
-        * @see https://www.php.net/manual/en/curl.constants.php
-        *
-        * All constant values are present so that developers don’t need to remember
-        * to add them if added at a later date. The commented out constants were
-        * not found anywhere in the MediaWiki core code.
-        *
-        * Commented out constants that were not available in:
-        * HipHop VM 3.3.0 (rel)
-        * Compiler: heads/master-0-g08810d920dfff59e0774cf2d651f92f13a637175
-        * Repo schema: 3214fc2c684a4520485f715ee45f33f2182324b1
-        * Extension API: 20140829
-        *
-        * Commented out constants that were removed in PHP 5.6.0
-        */
-       public function provideCurlConstants() {
-               return [
-                       [ 'CURLAUTH_ANY' ],
-                       [ 'CURLAUTH_ANYSAFE' ],
-                       [ 'CURLAUTH_BASIC' ],
-                       [ 'CURLAUTH_DIGEST' ],
-                       [ 'CURLAUTH_GSSNEGOTIATE' ],
-                       [ 'CURLAUTH_NTLM' ],
-                       // [ 'CURLCLOSEPOLICY_CALLBACK' ], // removed in PHP 5.6.0
-                       // [ 'CURLCLOSEPOLICY_LEAST_RECENTLY_USED' ], // removed in PHP 5.6.0
-                       // [ 'CURLCLOSEPOLICY_LEAST_TRAFFIC' ], // removed in PHP 5.6.0
-                       // [ 'CURLCLOSEPOLICY_OLDEST' ], // removed in PHP 5.6.0
-                       // [ 'CURLCLOSEPOLICY_SLOWEST' ], // removed in PHP 5.6.0
-                       [ 'CURLE_ABORTED_BY_CALLBACK' ],
-                       [ 'CURLE_BAD_CALLING_ORDER' ],
-                       [ 'CURLE_BAD_CONTENT_ENCODING' ],
-                       [ 'CURLE_BAD_FUNCTION_ARGUMENT' ],
-                       [ 'CURLE_BAD_PASSWORD_ENTERED' ],
-                       [ 'CURLE_COULDNT_CONNECT' ],
-                       [ 'CURLE_COULDNT_RESOLVE_HOST' ],
-                       [ 'CURLE_COULDNT_RESOLVE_PROXY' ],
-                       [ 'CURLE_FAILED_INIT' ],
-                       [ 'CURLE_FILESIZE_EXCEEDED' ],
-                       [ 'CURLE_FILE_COULDNT_READ_FILE' ],
-                       [ 'CURLE_FTP_ACCESS_DENIED' ],
-                       [ 'CURLE_FTP_BAD_DOWNLOAD_RESUME' ],
-                       [ 'CURLE_FTP_CANT_GET_HOST' ],
-                       [ 'CURLE_FTP_CANT_RECONNECT' ],
-                       [ 'CURLE_FTP_COULDNT_GET_SIZE' ],
-                       [ 'CURLE_FTP_COULDNT_RETR_FILE' ],
-                       [ 'CURLE_FTP_COULDNT_SET_ASCII' ],
-                       [ 'CURLE_FTP_COULDNT_SET_BINARY' ],
-                       [ 'CURLE_FTP_COULDNT_STOR_FILE' ],
-                       [ 'CURLE_FTP_COULDNT_USE_REST' ],
-                       [ 'CURLE_FTP_PORT_FAILED' ],
-                       [ 'CURLE_FTP_QUOTE_ERROR' ],
-                       [ 'CURLE_FTP_SSL_FAILED' ],
-                       [ 'CURLE_FTP_USER_PASSWORD_INCORRECT' ],
-                       [ 'CURLE_FTP_WEIRD_227_FORMAT' ],
-                       [ 'CURLE_FTP_WEIRD_PASS_REPLY' ],
-                       [ 'CURLE_FTP_WEIRD_PASV_REPLY' ],
-                       [ 'CURLE_FTP_WEIRD_SERVER_REPLY' ],
-                       [ 'CURLE_FTP_WEIRD_USER_REPLY' ],
-                       [ 'CURLE_FTP_WRITE_ERROR' ],
-                       [ 'CURLE_FUNCTION_NOT_FOUND' ],
-                       [ 'CURLE_GOT_NOTHING' ],
-                       [ 'CURLE_HTTP_NOT_FOUND' ],
-                       [ 'CURLE_HTTP_PORT_FAILED' ],
-                       [ 'CURLE_HTTP_POST_ERROR' ],
-                       [ 'CURLE_HTTP_RANGE_ERROR' ],
-                       [ 'CURLE_LDAP_CANNOT_BIND' ],
-                       [ 'CURLE_LDAP_INVALID_URL' ],
-                       [ 'CURLE_LDAP_SEARCH_FAILED' ],
-                       [ 'CURLE_LIBRARY_NOT_FOUND' ],
-                       [ 'CURLE_MALFORMAT_USER' ],
-                       [ 'CURLE_OBSOLETE' ],
-                       [ 'CURLE_OK' ],
-                       [ 'CURLE_OPERATION_TIMEOUTED' ],
-                       [ 'CURLE_OUT_OF_MEMORY' ],
-                       [ 'CURLE_PARTIAL_FILE' ],
-                       [ 'CURLE_READ_ERROR' ],
-                       [ 'CURLE_RECV_ERROR' ],
-                       [ 'CURLE_SEND_ERROR' ],
-                       [ 'CURLE_SHARE_IN_USE' ],
-                       // [ 'CURLE_SSH' ], // not present in HHVM 3.3.0-dev
-                       [ 'CURLE_SSL_CACERT' ],
-                       [ 'CURLE_SSL_CERTPROBLEM' ],
-                       [ 'CURLE_SSL_CIPHER' ],
-                       [ 'CURLE_SSL_CONNECT_ERROR' ],
-                       [ 'CURLE_SSL_ENGINE_NOTFOUND' ],
-                       [ 'CURLE_SSL_ENGINE_SETFAILED' ],
-                       [ 'CURLE_SSL_PEER_CERTIFICATE' ],
-                       [ 'CURLE_TELNET_OPTION_SYNTAX' ],
-                       [ 'CURLE_TOO_MANY_REDIRECTS' ],
-                       [ 'CURLE_UNKNOWN_TELNET_OPTION' ],
-                       [ 'CURLE_UNSUPPORTED_PROTOCOL' ],
-                       [ 'CURLE_URL_MALFORMAT' ],
-                       [ 'CURLE_URL_MALFORMAT_USER' ],
-                       [ 'CURLE_WRITE_ERROR' ],
-                       [ 'CURLFTPAUTH_DEFAULT' ],
-                       [ 'CURLFTPAUTH_SSL' ],
-                       [ 'CURLFTPAUTH_TLS' ],
-                       // [ 'CURLFTPMETHOD_MULTICWD' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLFTPMETHOD_NOCWD' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLFTPMETHOD_SINGLECWD' ], // not present in HHVM 3.3.0-dev
-                       [ 'CURLFTPSSL_ALL' ],
-                       [ 'CURLFTPSSL_CONTROL' ],
-                       [ 'CURLFTPSSL_NONE' ],
-                       [ 'CURLFTPSSL_TRY' ],
-                       // [ 'CURLINFO_CERTINFO' ], // not present in HHVM 3.3.0-dev
-                       [ 'CURLINFO_CONNECT_TIME' ],
-                       [ 'CURLINFO_CONTENT_LENGTH_DOWNLOAD' ],
-                       [ 'CURLINFO_CONTENT_LENGTH_UPLOAD' ],
-                       [ 'CURLINFO_CONTENT_TYPE' ],
-                       [ 'CURLINFO_EFFECTIVE_URL' ],
-                       [ 'CURLINFO_FILETIME' ],
-                       [ 'CURLINFO_HEADER_OUT' ],
-                       [ 'CURLINFO_HEADER_SIZE' ],
-                       [ 'CURLINFO_HTTP_CODE' ],
-                       [ 'CURLINFO_NAMELOOKUP_TIME' ],
-                       [ 'CURLINFO_PRETRANSFER_TIME' ],
-                       [ 'CURLINFO_PRIVATE' ],
-                       [ 'CURLINFO_REDIRECT_COUNT' ],
-                       [ 'CURLINFO_REDIRECT_TIME' ],
-                       // [ 'CURLINFO_REDIRECT_URL' ], // not present in HHVM 3.3.0-dev
-                       [ 'CURLINFO_REQUEST_SIZE' ],
-                       [ 'CURLINFO_SIZE_DOWNLOAD' ],
-                       [ 'CURLINFO_SIZE_UPLOAD' ],
-                       [ 'CURLINFO_SPEED_DOWNLOAD' ],
-                       [ 'CURLINFO_SPEED_UPLOAD' ],
-                       [ 'CURLINFO_SSL_VERIFYRESULT' ],
-                       [ 'CURLINFO_STARTTRANSFER_TIME' ],
-                       [ 'CURLINFO_TOTAL_TIME' ],
-                       [ 'CURLMSG_DONE' ],
-                       [ 'CURLM_BAD_EASY_HANDLE' ],
-                       [ 'CURLM_BAD_HANDLE' ],
-                       [ 'CURLM_CALL_MULTI_PERFORM' ],
-                       [ 'CURLM_INTERNAL_ERROR' ],
-                       [ 'CURLM_OK' ],
-                       [ 'CURLM_OUT_OF_MEMORY' ],
-                       [ 'CURLOPT_AUTOREFERER' ],
-                       [ 'CURLOPT_BINARYTRANSFER' ],
-                       [ 'CURLOPT_BUFFERSIZE' ],
-                       [ 'CURLOPT_CAINFO' ],
-                       [ 'CURLOPT_CAPATH' ],
-                       // [ 'CURLOPT_CERTINFO' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLOPT_CLOSEPOLICY' ], // removed in PHP 5.6.0
-                       [ 'CURLOPT_CONNECTTIMEOUT' ],
-                       [ 'CURLOPT_CONNECTTIMEOUT_MS' ],
-                       [ 'CURLOPT_COOKIE' ],
-                       [ 'CURLOPT_COOKIEFILE' ],
-                       [ 'CURLOPT_COOKIEJAR' ],
-                       [ 'CURLOPT_COOKIESESSION' ],
-                       [ 'CURLOPT_CRLF' ],
-                       [ 'CURLOPT_CUSTOMREQUEST' ],
-                       [ 'CURLOPT_DNS_CACHE_TIMEOUT' ],
-                       [ 'CURLOPT_DNS_USE_GLOBAL_CACHE' ],
-                       [ 'CURLOPT_EGDSOCKET' ],
-                       [ 'CURLOPT_ENCODING' ],
-                       [ 'CURLOPT_FAILONERROR' ],
-                       [ 'CURLOPT_FILE' ],
-                       [ 'CURLOPT_FILETIME' ],
-                       [ 'CURLOPT_FOLLOWLOCATION' ],
-                       [ 'CURLOPT_FORBID_REUSE' ],
-                       [ 'CURLOPT_FRESH_CONNECT' ],
-                       [ 'CURLOPT_FTPAPPEND' ],
-                       [ 'CURLOPT_FTPLISTONLY' ],
-                       [ 'CURLOPT_FTPPORT' ],
-                       [ 'CURLOPT_FTPSSLAUTH' ],
-                       [ 'CURLOPT_FTP_CREATE_MISSING_DIRS' ],
-                       // [ 'CURLOPT_FTP_FILEMETHOD' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLOPT_FTP_SKIP_PASV_IP' ], // not present in HHVM 3.3.0-dev
-                       [ 'CURLOPT_FTP_SSL' ],
-                       [ 'CURLOPT_FTP_USE_EPRT' ],
-                       [ 'CURLOPT_FTP_USE_EPSV' ],
-                       [ 'CURLOPT_HEADER' ],
-                       [ 'CURLOPT_HEADERFUNCTION' ],
-                       [ 'CURLOPT_HTTP200ALIASES' ],
-                       [ 'CURLOPT_HTTPAUTH' ],
-                       [ 'CURLOPT_HTTPGET' ],
-                       [ 'CURLOPT_HTTPHEADER' ],
-                       [ 'CURLOPT_HTTPPROXYTUNNEL' ],
-                       [ 'CURLOPT_HTTP_VERSION' ],
-                       [ 'CURLOPT_INFILE' ],
-                       [ 'CURLOPT_INFILESIZE' ],
-                       [ 'CURLOPT_INTERFACE' ],
-                       [ 'CURLOPT_IPRESOLVE' ],
-                       // [ 'CURLOPT_KEYPASSWD' ], // not present in HHVM 3.3.0-dev
-                       [ 'CURLOPT_KRB4LEVEL' ],
-                       [ 'CURLOPT_LOW_SPEED_LIMIT' ],
-                       [ 'CURLOPT_LOW_SPEED_TIME' ],
-                       [ 'CURLOPT_MAXCONNECTS' ],
-                       [ 'CURLOPT_MAXREDIRS' ],
-                       // [ 'CURLOPT_MAX_RECV_SPEED_LARGE' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLOPT_MAX_SEND_SPEED_LARGE' ], // not present in HHVM 3.3.0-dev
-                       [ 'CURLOPT_NETRC' ],
-                       [ 'CURLOPT_NOBODY' ],
-                       [ 'CURLOPT_NOPROGRESS' ],
-                       [ 'CURLOPT_NOSIGNAL' ],
-                       [ 'CURLOPT_PORT' ],
-                       [ 'CURLOPT_POST' ],
-                       [ 'CURLOPT_POSTFIELDS' ],
-                       [ 'CURLOPT_POSTQUOTE' ],
-                       [ 'CURLOPT_POSTREDIR' ],
-                       [ 'CURLOPT_PRIVATE' ],
-                       [ 'CURLOPT_PROGRESSFUNCTION' ],
-                       // [ 'CURLOPT_PROTOCOLS' ], // not present in HHVM 3.3.0-dev
-                       [ 'CURLOPT_PROXY' ],
-                       [ 'CURLOPT_PROXYAUTH' ],
-                       [ 'CURLOPT_PROXYPORT' ],
-                       [ 'CURLOPT_PROXYTYPE' ],
-                       [ 'CURLOPT_PROXYUSERPWD' ],
-                       [ 'CURLOPT_PUT' ],
-                       [ 'CURLOPT_QUOTE' ],
-                       [ 'CURLOPT_RANDOM_FILE' ],
-                       [ 'CURLOPT_RANGE' ],
-                       [ 'CURLOPT_READDATA' ],
-                       [ 'CURLOPT_READFUNCTION' ],
-                       // [ 'CURLOPT_REDIR_PROTOCOLS' ], // not present in HHVM 3.3.0-dev
-                       [ 'CURLOPT_REFERER' ],
-                       [ 'CURLOPT_RESUME_FROM' ],
-                       [ 'CURLOPT_RETURNTRANSFER' ],
-                       // [ 'CURLOPT_SSH_AUTH_TYPES' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLOPT_SSH_HOST_PUBLIC_KEY_MD5' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLOPT_SSH_PRIVATE_KEYFILE' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLOPT_SSH_PUBLIC_KEYFILE' ], // not present in HHVM 3.3.0-dev
-                       [ 'CURLOPT_SSLCERT' ],
-                       [ 'CURLOPT_SSLCERTPASSWD' ],
-                       [ 'CURLOPT_SSLCERTTYPE' ],
-                       [ 'CURLOPT_SSLENGINE' ],
-                       [ 'CURLOPT_SSLENGINE_DEFAULT' ],
-                       [ 'CURLOPT_SSLKEY' ],
-                       [ 'CURLOPT_SSLKEYPASSWD' ],
-                       [ 'CURLOPT_SSLKEYTYPE' ],
-                       [ 'CURLOPT_SSLVERSION' ],
-                       [ 'CURLOPT_SSL_CIPHER_LIST' ],
-                       [ 'CURLOPT_SSL_VERIFYHOST' ],
-                       [ 'CURLOPT_SSL_VERIFYPEER' ],
-                       [ 'CURLOPT_STDERR' ],
-                       [ 'CURLOPT_TCP_NODELAY' ],
-                       [ 'CURLOPT_TIMECONDITION' ],
-                       [ 'CURLOPT_TIMEOUT' ],
-                       [ 'CURLOPT_TIMEOUT_MS' ],
-                       [ 'CURLOPT_TIMEVALUE' ],
-                       [ 'CURLOPT_TRANSFERTEXT' ],
-                       [ 'CURLOPT_UNRESTRICTED_AUTH' ],
-                       [ 'CURLOPT_UPLOAD' ],
-                       [ 'CURLOPT_URL' ],
-                       [ 'CURLOPT_USERAGENT' ],
-                       [ 'CURLOPT_USERPWD' ],
-                       [ 'CURLOPT_VERBOSE' ],
-                       [ 'CURLOPT_WRITEFUNCTION' ],
-                       [ 'CURLOPT_WRITEHEADER' ],
-                       // [ 'CURLPROTO_ALL' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLPROTO_DICT' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLPROTO_FILE' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLPROTO_FTP' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLPROTO_FTPS' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLPROTO_HTTP' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLPROTO_HTTPS' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLPROTO_LDAP' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLPROTO_LDAPS' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLPROTO_SCP' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLPROTO_SFTP' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLPROTO_TELNET' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLPROTO_TFTP' ], // not present in HHVM 3.3.0-dev
-                       [ 'CURLPROXY_HTTP' ],
-                       // [ 'CURLPROXY_SOCKS4' ], // not present in HHVM 3.3.0-dev
-                       [ 'CURLPROXY_SOCKS5' ],
-                       // [ 'CURLSSH_AUTH_DEFAULT' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLSSH_AUTH_HOST' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLSSH_AUTH_KEYBOARD' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLSSH_AUTH_NONE' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLSSH_AUTH_PASSWORD' ], // not present in HHVM 3.3.0-dev
-                       // [ 'CURLSSH_AUTH_PUBLICKEY' ], // not present in HHVM 3.3.0-dev
-                       [ 'CURLVERSION_NOW' ],
-                       [ 'CURL_HTTP_VERSION_1_0' ],
-                       [ 'CURL_HTTP_VERSION_1_1' ],
-                       [ 'CURL_HTTP_VERSION_NONE' ],
-                       [ 'CURL_IPRESOLVE_V4' ],
-                       [ 'CURL_IPRESOLVE_V6' ],
-                       [ 'CURL_IPRESOLVE_WHATEVER' ],
-                       [ 'CURL_NETRC_IGNORED' ],
-                       [ 'CURL_NETRC_OPTIONAL' ],
-                       [ 'CURL_NETRC_REQUIRED' ],
-                       [ 'CURL_TIMECOND_IFMODSINCE' ],
-                       [ 'CURL_TIMECOND_IFUNMODSINCE' ],
-                       [ 'CURL_TIMECOND_LASTMOD' ],
-                       [ 'CURL_VERSION_IPV6' ],
-                       [ 'CURL_VERSION_KERBEROS4' ],
-                       [ 'CURL_VERSION_LIBZ' ],
-                       [ 'CURL_VERSION_SSL' ],
-               ];
-       }
-
-       /**
-        * Added this test based on an issue experienced with HHVM 3.3.0-dev
-        * where it did not define a cURL constant. T72570
-        *
-        * @dataProvider provideCurlConstants
-        * @coversNothing
-        */
-       public function testCurlConstants( $value ) {
-               $this->checkPHPExtension( 'curl' );
-
-               $this->assertTrue( defined( $value ), $value . ' not defined' );
-       }
-}
-
-/**
- * Class to let us overwrite MWHttpRequest respHeaders variable
- */
-class MWHttpRequestTester extends MWHttpRequest {
-       // function derived from the MWHttpRequest factory function but
-       // returns appropriate tester class here
-       public static function factory( $url, array $options = null, $caller = __METHOD__ ) {
-               if ( !Http::$httpEngine ) {
-                       Http::$httpEngine = 'guzzle';
-               } elseif ( Http::$httpEngine == 'curl' && !function_exists( 'curl_init' ) ) {
-                       throw new DomainException( __METHOD__ . ': curl (https://www.php.net/curl) is not ' .
-                               'installed, but Http::$httpEngine is set to "curl"' );
-               }
-
-               switch ( Http::$httpEngine ) {
-                       case 'guzzle':
-                               return new GuzzleHttpRequestTester( $url, $options, $caller );
-                       case 'curl':
-                               return new CurlHttpRequestTester( $url, $options, $caller );
-                       case 'php':
-                               if ( !wfIniGetBool( 'allow_url_fopen' ) ) {
-                                       throw new DomainException( __METHOD__ .
-                                               ': allow_url_fopen needs to be enabled for pure PHP HTTP requests to work. '
-                                                       . 'If possible, curl should be used instead. See https://www.php.net/curl.' );
-                               }
-
-                               return new PhpHttpRequestTester( $url, $options, $caller );
-                       default:
-               }
-       }
-}
-
-class GuzzleHttpRequestTester extends GuzzleHttpRequest {
-       function setRespHeaders( $name, $value ) {
-               $this->respHeaders[$name] = $value;
-       }
-}
-
-class CurlHttpRequestTester extends CurlHttpRequest {
-       function setRespHeaders( $name, $value ) {
-               $this->respHeaders[$name] = $value;
-       }
-}
-
-class PhpHttpRequestTester extends PhpHttpRequest {
-       function setRespHeaders( $name, $value ) {
-               $this->respHeaders[$name] = $value;
-       }
 }
diff --git a/tests/phpunit/includes/libs/CookieTest.php b/tests/phpunit/includes/libs/CookieTest.php
new file mode 100644 (file)
index 0000000..e383be9
--- /dev/null
@@ -0,0 +1,52 @@
+<?php
+
+/**
+ * @covers Cookie
+ */
+class CookieTest extends \PHPUnit\Framework\TestCase {
+
+       /**
+        * @dataProvider cookieDomains
+        * @covers Cookie::validateCookieDomain
+        */
+       public function testValidateCookieDomain( $expected, $domain, $origin = null ) {
+               if ( $origin ) {
+                       $ok = Cookie::validateCookieDomain( $domain, $origin );
+                       $msg = "$domain against origin $origin";
+               } else {
+                       $ok = Cookie::validateCookieDomain( $domain );
+                       $msg = "$domain";
+               }
+               $this->assertEquals( $expected, $ok, $msg );
+       }
+
+       public static function cookieDomains() {
+               return [
+                       [ false, "org" ],
+                       [ false, ".org" ],
+                       [ true, "wikipedia.org" ],
+                       [ true, ".wikipedia.org" ],
+                       [ false, "co.uk" ],
+                       [ false, ".co.uk" ],
+                       [ false, "gov.uk" ],
+                       [ false, ".gov.uk" ],
+                       [ true, "supermarket.uk" ],
+                       [ false, "uk" ],
+                       [ false, ".uk" ],
+                       [ false, "127.0.0." ],
+                       [ false, "127." ],
+                       [ false, "127.0.0.1." ],
+                       [ true, "127.0.0.1" ],
+                       [ false, "333.0.0.1" ],
+                       [ true, "example.com" ],
+                       [ false, "example.com." ],
+                       [ true, ".example.com" ],
+
+                       [ true, ".example.com", "www.example.com" ],
+                       [ false, "example.com", "www.example.com" ],
+                       [ true, "127.0.0.1", "127.0.0.1" ],
+                       [ false, "127.0.0.1", "localhost" ],
+               ];
+       }
+
+}
index 35c3ef6..b0512fa 100644 (file)
@@ -129,6 +129,7 @@ class ResourceLoaderImageTestable extends ResourceLoaderImage {
        public function massageSvgPathdata( $svg ) {
                return parent::massageSvgPathdata( $svg );
        }
+
        // Stub, since we don't know if we even have a SVG handler, much less what exactly it'll output
        public function rasterize( $svg ) {
                return 'RASTERIZESTUB';
index ad8fa78..c1bdebe 100644 (file)
@@ -451,6 +451,7 @@ class ResourceLoaderWikiModuleTest extends ResourceLoaderTestCase {
 
 class TestResourceLoaderWikiModule extends ResourceLoaderWikiModule {
        public static $returnFetchTitleInfo = null;
+
        protected static function fetchTitleInfo( IDatabase $db, array $pages, $fname = null ) {
                $ret = self::$returnFetchTitleInfo;
                self::$returnFetchTitleInfo = null;
index f545948..968db42 100644 (file)
@@ -400,6 +400,7 @@ class ChangesListSpecialPageTest extends AbstractChangesListSpecialPageTestCase
                        $user
                );
        }
+
        public function testRcHidepatrolledFilter() {
                $user = $this->getTestSysop()->getUser();
                $this->assertConditions(
index 556c640..4e376e8 100644 (file)
@@ -601,6 +601,7 @@ class NamespaceInfoTest extends MediaWikiTestCase {
         * getSubject/Talk/Associated
         * %{
         */
+
        /**
         * @dataProvider provideSubjectTalk
         * @covers NamespaceInfo::getSubject
@@ -880,6 +881,7 @@ class NamespaceInfoTest extends MediaWikiTestCase {
 
        // No canonical namespace names
        // %{
+
        /**
         * @covers NamespaceInfo::getCanonicalNamespaces
         */
@@ -982,6 +984,7 @@ class NamespaceInfoTest extends MediaWikiTestCase {
 
        // Hook namespaces
        // %{
+
        /**
         * @return array Expected canonical namespaces
         */
@@ -1047,6 +1050,7 @@ class NamespaceInfoTest extends MediaWikiTestCase {
 
        // Extra namespaces
        // %{
+
        /**
         * @return NamespaceInfo
         */
@@ -1102,6 +1106,7 @@ class NamespaceInfoTest extends MediaWikiTestCase {
 
        // Canonical namespace caching
        // %{
+
        /**
         * @covers NamespaceInfo::getCanonicalNamespaces
         */
index c9f2f3e..8da7602 100644 (file)
@@ -238,6 +238,7 @@ class LanguageSrTest extends LanguageClassesTestCase {
        }
 
        # #### HELPERS #####################################################
+
        /**
         *Wrapper to verify text stay the same after applying conversion
         * @param string $text Text to convert
index 18b2031..abc63ee 100644 (file)
@@ -60,6 +60,7 @@ class LanguageUzTest extends LanguageClassesTestCase {
        }
 
        # #### HELPERS #####################################################
+
        /**
         * Wrapper to verify text stay the same after applying conversion
         * @param string $text Text to convert
index d92d39a..e92eb56 100644 (file)
@@ -7,6 +7,7 @@ class MockSearchResult extends SearchResult {
        public function isMissingRevision() {
                return $this->isMissingRevision;
        }
+
        public function setMissingRevision( $isMissingRevision ) {
                $this->isMissingRevision = $isMissingRevision;
                return $this;
index 6b5a487..cfc01ea 100644 (file)
@@ -67,32 +67,7 @@ class MediaWikiTestCaseTest extends MediaWikiTestCase {
        }
 
        /**
-        * @dataProvider provideExistingKeysAndNewValues
-        *
-        * @covers MediaWikiTestCase::stashMwGlobals
-        * @covers MediaWikiTestCase::tearDown
-        */
-       public function testStashedGlobalsAreRestoredOnTearDown( $globalKey, $newValue ) {
-               $this->hideDeprecated( 'MediaWikiTestCase::stashMwGlobals' );
-               $this->stashMwGlobals( $globalKey );
-               $GLOBALS[$globalKey] = $newValue;
-               $this->assertEquals(
-                       $newValue,
-                       $GLOBALS[$globalKey],
-                       'Global failed to correctly set'
-               );
-
-               $this->tearDown();
-
-               $this->assertEquals(
-                       self::$startGlobals[$globalKey],
-                       $GLOBALS[$globalKey],
-                       'Global failed to be restored on tearDown'
-               );
-       }
-
-       /**
-        * @covers MediaWikiTestCase::stashMwGlobals
+        * @covers MediaWikiTestCase::setMwGlobals
         * @covers MediaWikiTestCase::tearDown
         */
        public function testSetNonExistentGlobalsAreUnsetOnTearDown() {