Merge "Remove suggestions for negative namespaces in Page Restrictions"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 21 Feb 2019 15:26:35 +0000 (15:26 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 21 Feb 2019 15:26:35 +0000 (15:26 +0000)
184 files changed:
.eslintrc.json
.fresnel.yml [new file with mode: 0644]
.gitignore
Gruntfile.js
RELEASE-NOTES-1.33
autoload.php
includes/Block.php
includes/DefaultSettings.php
includes/FeedUtils.php
includes/GlobalFunctions.php
includes/LinkFilter.php
includes/MediaWikiServices.php
includes/OutputPage.php
includes/Revision.php
includes/ServiceWiring.php
includes/Setup.php
includes/actions/RawAction.php
includes/api/ApiBase.php
includes/api/ApiEditPage.php
includes/api/ApiFeedContributions.php
includes/api/ApiMove.php
includes/api/ApiParse.php
includes/api/ApiQueryRevisionsBase.php
includes/api/i18n/ar.json
includes/api/i18n/fr.json
includes/auth/TemporaryPasswordAuthenticationRequest.php
includes/cache/MessageBlobStore.php
includes/cache/localisation/LocalisationCache.php
includes/changes/ChangesList.php
includes/changetags/ChangeTags.php
includes/collation/IcuCollation.php
includes/content/ContentHandler.php
includes/diff/DifferenceEngine.php
includes/import/WikiRevision.php
includes/installer/DatabaseInstaller.php
includes/installer/DatabaseUpdater.php
includes/installer/Installer.php
includes/installer/WebInstallerOutput.php
includes/installer/i18n/ar.json
includes/installer/i18n/ca.json
includes/installer/i18n/da.json
includes/installer/i18n/is.json
includes/jobqueue/JobQueueDB.php
includes/libs/MultiHttpClient.php
includes/libs/objectcache/WANObjectCache.php
includes/libs/objectcache/WANObjectCacheReaper.php
includes/libs/rdbms/database/Database.php
includes/libs/rdbms/database/DatabaseMssql.php
includes/libs/rdbms/database/DatabaseMysqlBase.php
includes/page/WikiPage.php
includes/parser/LinkHolderArray.php
includes/password/Argon2Password.php [new file with mode: 0644]
includes/password/Password.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderContext.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/specialpage/ChangesListSpecialPage.php
includes/specials/SpecialBlock.php
includes/specials/SpecialBooksources.php
includes/specials/SpecialContributions.php
includes/specials/SpecialDeletedContributions.php
includes/specials/SpecialEmailuser.php
includes/specials/SpecialProtectedpages.php
includes/specials/SpecialRedirect.php
includes/specials/SpecialUndelete.php
includes/specials/pagers/ActiveUsersPager.php
includes/specials/pagers/BlockListPager.php
includes/specials/pagers/NewPagesPager.php
includes/specials/pagers/ProtectedPagesPager.php
includes/widget/SelectWithInputWidget.php
languages/LanguageConverter.php
languages/data/Names.php
languages/i18n/aeb-arab.json
languages/i18n/ar.json
languages/i18n/as.json
languages/i18n/bn.json
languages/i18n/bqi.json
languages/i18n/ca.json
languages/i18n/da.json
languages/i18n/diq.json
languages/i18n/en.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/exif/da.json
languages/i18n/exif/lrc.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/gl.json
languages/i18n/gom-latn.json
languages/i18n/he.json
languages/i18n/is.json
languages/i18n/lrc.json
languages/i18n/mk.json
languages/i18n/myv.json
languages/i18n/ne.json
languages/i18n/pa.json
languages/i18n/qqq.json
languages/i18n/sv.json
languages/i18n/tcy.json
languages/i18n/ur.json
languages/i18n/uz.json
languages/i18n/xsy.json [new file with mode: 0644]
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesGcr.php
load.php
maintenance/cleanupRemovedModules.php
maintenance/compareParsers.php
maintenance/includes/DeleteLocalPasswords.php
maintenance/includes/MigrateActors.php
maintenance/preprocessDump.php
maintenance/view.php
mw-config/config.js
package.json
resources/Resources.php
resources/src/jquery.tablesorter/jquery.tablesorter.js
resources/src/mediawiki.Title/Title.js
resources/src/mediawiki.Uri/Uri.js
resources/src/mediawiki.action/mediawiki.action.edit.preview.js
resources/src/mediawiki.action/mediawiki.action.view.dblClickEdit.js
resources/src/mediawiki.action/mediawiki.action.view.rightClickEdit.js
resources/src/mediawiki.api/index.js
resources/src/mediawiki.api/options.js
resources/src/mediawiki.api/upload.js
resources/src/mediawiki.debug/debug.js
resources/src/mediawiki.htmlform.checker.js
resources/src/mediawiki.inspect.js
resources/src/mediawiki.jqueryMsg/mediawiki.jqueryMsg.js
resources/src/mediawiki.legacy/protect.js
resources/src/mediawiki.notification/notification.js
resources/src/mediawiki.rcfilters/Controller.js
resources/src/mediawiki.rcfilters/dm/FilterGroup.js
resources/src/mediawiki.rcfilters/dm/FilterItem.js
resources/src/mediawiki.rcfilters/dm/FiltersViewModel.js
resources/src/mediawiki.rcfilters/dm/SavedQueriesModel.js
resources/src/mediawiki.rcfilters/ui/ChangesListWrapperWidget.js
resources/src/mediawiki.rcfilters/ui/FilterTagMultiselectWidget.js
resources/src/mediawiki.rcfilters/ui/GroupWidget.js
resources/src/mediawiki.rcfilters/ui/MenuSelectWidget.js
resources/src/mediawiki.searchSuggest/searchSuggest.js
resources/src/mediawiki.special.apisandbox/apisandbox.js
resources/src/mediawiki.template.mustache.js
resources/src/mediawiki.toc.styles/screen.less
resources/src/mediawiki.toc/toc.js
resources/src/mediawiki.widgets.datetime/DateTimeFormatter.js
resources/src/mediawiki.widgets.datetime/DateTimeInputWidget.js
resources/src/mediawiki.widgets.datetime/DiscordianDateTimeFormatter.js
resources/src/mediawiki.widgets.datetime/ProlepticGregorianDateTimeFormatter.js
resources/src/mediawiki.widgets/mw.widgets.CheckMatrixWidget.js
resources/src/mediawiki.widgets/mw.widgets.NamespaceInputWidget.js
resources/src/mediawiki.widgets/mw.widgets.SearchInputWidget.js
tests/phpunit/includes/BlockTest.php
tests/phpunit/includes/CommentStoreTest.php
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/Revision/SlotRecordTest.php
tests/phpunit/includes/RevisionDbTestBase.php
tests/phpunit/includes/api/ApiBaseTest.php
tests/phpunit/includes/api/ApiEditPageTest.php
tests/phpunit/includes/api/ApiMoveTest.php
tests/phpunit/includes/auth/TemporaryPasswordAuthenticationRequestTest.php
tests/phpunit/includes/block/BlockRestrictionTest.php
tests/phpunit/includes/diff/CustomDifferenceEngine.php
tests/phpunit/includes/import/ImportTest.php
tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php
tests/phpunit/includes/page/ArticleViewTest.php
tests/phpunit/includes/page/WikiPageDbTestBase.php
tests/phpunit/includes/password/Argon2PasswordTest.php [new file with mode: 0644]
tests/phpunit/includes/password/EncryptedPasswordTest.php
tests/phpunit/includes/password/PasswordTest.php
tests/phpunit/includes/password/PasswordTestCase.php
tests/phpunit/includes/resourceloader/MessageBlobStoreTest.php
tests/phpunit/includes/specials/SpecialBlockTest.php
tests/phpunit/mocks/content/DummyContentForTesting.php
tests/phpunit/mocks/content/DummyNonTextContent.php
tests/phpunit/structure/ResourcesTest.php
tests/phpunit/suites/LessTestSuite.php
tests/qunit/.eslintrc.json
tests/qunit/data/testrunner.js
tests/qunit/suites/resources/jquery/jquery.color.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.options.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.cldr.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js

index 0c0a7b5..85d91b6 100644 (file)
@@ -12,6 +12,6 @@
        "rules": {
                "quote-props": [ "error", "as-needed" ],
                "max-len": "off",
-               "jquery/no-global-selector": "off"
+               "no-jquery/no-global-selector": "off"
        }
 }
diff --git a/.fresnel.yml b/.fresnel.yml
new file mode 100644 (file)
index 0000000..f081fb5
--- /dev/null
@@ -0,0 +1,17 @@
+warmup: true
+runs: 3
+scenarios:
+  # View the Main Page without redirect
+  - url: "{MW_SERVER}{MW_SCRIPT_PATH}/index.php?mainpage"
+    viewport:
+      width: 1100
+      height: 700
+    reports:
+      - navtiming
+      - paint
+      - transfer
+    probes:
+      - screenshot
+      - trace
+    # alerts:
+    #   navtiming/loadEventEnd: 10%
index d25d525..def5a08 100644 (file)
@@ -52,6 +52,7 @@ npm-debug.log
 node_modules/
 /tests/phpunit/phpunit.phar
 /tests/selenium/log
+.eslintcache
 
 # Composer
 /vendor
index 2592815..fbb93bf 100644 (file)
@@ -22,7 +22,8 @@ module.exports = function ( grunt ) {
        grunt.initConfig( {
                eslint: {
                        options: {
-                               reportUnusedDisableDirectives: true
+                               reportUnusedDisableDirectives: true,
+                               cache: true
                        },
                        all: [
                                '**/*.js',
index 0cee392..43d4249 100644 (file)
@@ -22,6 +22,10 @@ production.
   MediaWiki 1.32, now defaults to MIGRATION_NEW instead of MIGRATION_WRITE_BOTH.
 * Special:ActiveUsers will no longer filter out users who became inactive since
   the last time the active users query cache was updated.
+* If you ran migrateActors.php using an older version of MediaWiki and want to
+  run your wiki with $wgActorTableSchemaMigrationStage SCHEMA_COMPAT_READ_OLD,
+  note that log_search rows needed to find revision deletions by target user
+  were incorrectly deleted. See T215464 for details.
 
 ==== Removed configuration ====
 * (T199334) $wgTagStatisticsNewTable — This temporary setting, added in
@@ -50,6 +54,9 @@ production.
   pages.
 * (T214706) LinksUpdate::getAddedExternalLinks() and
   LinksUpdate::getRemovedExternalLinks() were introduced.
+* Argon2 password hashing is now available, can be enabled via
+  $wgPasswordDefault = 'argon2'. It's designed to resist timing attacks
+  (requires PHP 7.2+) and GPU hacking (7.3+).
 
 === External library changes in 1.33 ===
 
@@ -96,6 +103,8 @@ production.
   deletion will be processed via the job queue.
 * action=setnotificationtimestamp will now update the watchlist asynchronously
   if entirewatchlist is set, so updates may not be visible immediately
+* Block info will be added to "blocked" errors from more modules.
+* (T216245) Autoblocks will now be spread by action=edit and action=move.
 
 === Action API internal changes in 1.33 ===
 * A number of deprecated methods for API documentation, intended for overriding
@@ -112,6 +121,8 @@ production.
   hyphen. Methods such as ApiBase::dieWithError() and
   ApiMessageTrait::setApiCode() will throw an InvalidArgumentException if
   passed a bad code.
+* ApiBase::checkTitleUserPermissions() now takes an options array as its third
+  parameter. Passing a User object or null is deprecated.
 
 === Languages updated in 1.33 ===
 MediaWiki supports over 350 languages. Many localisations are updated regularly.
@@ -246,6 +257,12 @@ because of Phabricator reports.
   Use require( 'mediawiki.libs.jpegmeta' ) instead.
 * The mw.user.stickyRandomId() method, deprecated in 1.32, was removed.
   Use mw.user.getPageviewToken() instead.
+* Removed deprecated class property WikiRevision::$importer.
+* ResourceLoaderFileModule::readStyleFiles() now requires its $context
+  parameter.
+* The ChangeList::insertArticleLink() method, that was deprecated in 1.27, has
+  been removed.
+* MessageBlobStore::__construct() now requires its $rl parameter.
 
 === Deprecations in 1.33 ===
 * The configuration option $wgUseESI has been deprecated, and is expected
@@ -293,10 +310,18 @@ because of Phabricator reports.
 * The mw.language.specialCharacters property from the
   'mediawiki.language.specialCharacters' module has been deprecated.
   Use require( 'mediawiki.language.specialCharacters' ) instead.
+* ChangeTags::purgeTagUsageCache() has been deprecated, and is expected to be
+  removed in a future release.
+* Passing a User object or null as the third parameter to
+  ApiBase::checkTitleUserPermissions() has been deprecated. Pass an array
+  [ 'user' => $user ] instead.
 
 === Other changes in 1.33 ===
 * (T201747) Html::openElement() warns if given an element name with a space
   in it.
+* The implementation of buildStringCast() in Wikimedia\Rdbms\Database has
+  changed to explicitly cast. Subclasses relying on the base-class
+  implementation should check whether they need to override it now.
 
 == Compatibility ==
 MediaWiki 1.33 requires PHP 7.0.13 or later. Although HHVM 3.18.5 or later is
index d577272..a13763e 100644 (file)
@@ -156,6 +156,7 @@ $wgAutoloadLocalClasses = [
        'ApiValidatePassword' => __DIR__ . '/includes/api/ApiValidatePassword.php',
        'ApiWatch' => __DIR__ . '/includes/api/ApiWatch.php',
        'ArchivedFile' => __DIR__ . '/includes/filerepo/file/ArchivedFile.php',
+       'Argon2Password' => __DIR__ . '/includes/password/Argon2Password.php',
        'ArrayDiffFormatter' => __DIR__ . '/includes/diff/ArrayDiffFormatter.php',
        'ArrayUtils' => __DIR__ . '/includes/libs/ArrayUtils.php',
        'Article' => __DIR__ . '/includes/page/Article.php',
index 85fa341..573ce3d 100644 (file)
@@ -68,7 +68,10 @@ class Block {
        /** @var int Hack for foreign blocking (CentralAuth) */
        private $forcedTargetID;
 
-       /** @var int Block::TYPE_ constant. Can only be USER, IP or RANGE internally */
+       /**
+        * @var int Block::TYPE_ constant. After the block has been loaded
+        * from the database, this can only be USER, IP or RANGE.
+        */
        private $type;
 
        /** @var User */
@@ -188,7 +191,7 @@ class Block {
        }
 
        /**
-        * Load a blocked user from their block id.
+        * Load a block from the block id.
         *
         * @param int $id Block id to search for
         * @return Block|null
@@ -1547,7 +1550,9 @@ class Block {
        }
 
        /**
-        * Get the type of target for this particular block
+        * Get the type of target for this particular block. Autoblocks have whichever type
+        * corresponds to their target, so to detect if a block is an autoblock, we have to
+        * check the mAuto property instead.
         * @return int Block::TYPE_ constant, will never be TYPE_ID
         */
        public function getType() {
index dc8f1e8..9286591 100644 (file)
@@ -1234,7 +1234,7 @@ $wgAllowTitlesInSVG = false;
  *
  * @since 1.33
  */
-$wgMediaInTargetLanguage = false;
+$wgMediaInTargetLanguage = true;
 
 /**
  * The maximum number of pixels a source image can have if it is to be scaled
@@ -2456,23 +2456,20 @@ $wgMainWANCache = false;
  *
  * The format is an associative array where the key is a cache identifier, and
  * the value is an associative array of parameters. The "cacheId" parameter is
- * a cache identifier from $wgObjectCaches. The "channels" parameter is a map of
- * actions ('purge') to PubSub channels defined in $wgEventRelayerConfig.
- * The "loggroup" parameter controls where log events are sent.
+ * a cache identifier from $wgObjectCaches. The "loggroup" parameter controls
+ * where log events are sent.
  *
  * @since 1.26
  */
 $wgWANObjectCaches = [
        CACHE_NONE => [
                'class'    => WANObjectCache::class,
-               'cacheId'  => CACHE_NONE,
-               'channels' => []
+               'cacheId'  => CACHE_NONE
        ]
        /* Example of a simple single data-center cache:
        'memcached-php' => [
                'class'    => WANObjectCache::class,
-               'cacheId'  => 'memcached-php',
-               'channels' => [ 'purge' => 'wancache-main-memcached-purge' ]
+               'cacheId'  => 'memcached-php'
        ]
        */
 ];
@@ -4785,6 +4782,24 @@ $wgPasswordConfig = [
                'cost' => '30000',
                'length' => '64',
        ],
+       'argon2' => [
+               'class' => Argon2Password::class,
+
+               // Algorithm used:
+               // * 'argon2i' is optimized against side-channel attacks (PHP 7.2+)
+               // * 'argon2id' is optimized against both side-channel and GPU cracking (PHP 7.3+)
+               // * 'auto' to use best available algorithm. If you're using more than one server, be
+               //   careful when you're mixing PHP versions because newer PHP might generate hashes that
+               //   older versions might would not understand.
+               'algo' => 'auto',
+
+               // The parameters below are the same as options accepted by password_hash().
+               // Set them to override that function's defaults.
+               //
+               // 'memory_cost' => PASSWORD_ARGON2_DEFAULT_MEMORY_COST,
+               // 'time_cost' => PASSWORD_ARGON2_DEFAULT_TIME_COST,
+               // 'threads' => PASSWORD_ARGON2_DEFAULT_THREADS,
+       ],
 ];
 
 /**
index 4dde52d..899ac09 100644 (file)
@@ -173,7 +173,7 @@ class FeedUtils {
 
                        if ( $newContent instanceof TextContent ) {
                                // only textual content has a "source view".
-                               $text = $newContent->getNativeData();
+                               $text = $newContent->getText();
 
                                if ( $wgFeedDiffCutoff <= 0 || strlen( $text ) > $wgFeedDiffCutoff ) {
                                        $html = null;
index bd98932..51fe167 100644 (file)
@@ -225,7 +225,7 @@ function wfMergeErrorArrays( ...$args ) {
  *
  * @param array $array The array.
  * @param array $insert The array to insert.
- * @param mixed $after The key to insert after
+ * @param mixed $after The key to insert after. Callers need to make sure the key is set.
  * @return array
  */
 function wfArrayInsertAfter( array $array, array $insert, $after ) {
index ffb36e0..a4e94da 100644 (file)
@@ -54,7 +54,7 @@ class LinkFilter {
                        return 0;
                }
 
-               $text = $content->getNativeData();
+               $text = $content->getText();
 
                $regex = self::makeRegex( $filterEntry, $protocol );
                return preg_match( $regex, $text );
index 4abd729..292e8df 100644 (file)
@@ -44,6 +44,7 @@ use ParserCache;
 use ParserFactory;
 use PasswordFactory;
 use ProxyLookup;
+use ResourceLoader;
 use SearchEngine;
 use SearchEngineConfig;
 use SearchEngineFactory;
@@ -744,6 +745,14 @@ class MediaWikiServices extends ServiceContainer {
                return $this->getService( 'ReadOnlyMode' );
        }
 
+       /**
+        * @since 1.33
+        * @return ResourceLoader
+        */
+       public function getResourceLoader() {
+               return $this->getService( 'ResourceLoader' );
+       }
+
        /**
         * @since 1.31
         * @return RevisionFactory
index 61a1ef2..9b766bb 100644 (file)
@@ -21,7 +21,6 @@
  */
 
 use MediaWiki\Linker\LinkTarget;
-use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Session\SessionManager;
 use Wikimedia\Rdbms\IResultWrapper;
@@ -3276,10 +3275,8 @@ class OutputPage extends ContextSource {
         */
        public function getResourceLoader() {
                if ( is_null( $this->mResourceLoader ) ) {
-                       $this->mResourceLoader = new ResourceLoader(
-                               $this->getConfig(),
-                               LoggerFactory::getInstance( 'resourceloader' )
-                       );
+                       // Lazy-initialise as needed
+                       $this->mResourceLoader = MediaWikiServices::getInstance()->getResourceLoader();
                }
                return $this->mResourceLoader;
        }
index aaf1069..f2ca79a 100644 (file)
@@ -832,17 +832,15 @@ class Revision implements IDBAccessObject {
        }
 
        /**
-        * Fetch revision comment if it's available to the specified audience.
-        * If the specified audience does not have access to the comment, an
-        * empty string will be returned.
-        *
         * @param int $audience One of:
         *   Revision::FOR_PUBLIC       to be displayed to all users
         *   Revision::FOR_THIS_USER    to be displayed to the given user
         *   Revision::RAW              get the text regardless of permissions
         * @param User|null $user User object to check for, only if FOR_THIS_USER is passed
         *   to the $audience parameter
-        * @return string
+        *
+        * @return string|null Returns null if the specified audience does not have access to the
+        *  comment.
         */
        function getComment( $audience = self::FOR_PUBLIC, User $user = null ) {
                global $wgUser;
index 44ca502..46dd913 100644 (file)
@@ -413,6 +413,13 @@ return [
                );
        },
 
+       'ResourceLoader' => function ( MediaWikiServices $services ) : ResourceLoader {
+               return new ResourceLoader(
+                       $services->getMainConfig(),
+                       LoggerFactory::getInstance( 'resourceloader' )
+               );
+       },
+
        'RevisionFactory' => function ( MediaWikiServices $services ) : RevisionFactory {
                return $services->getRevisionStore();
        },
index b4b6ce6..f8b9546 100644 (file)
@@ -690,8 +690,7 @@ if ( $wgMainWANCache === false ) {
        $wgMainWANCache = 'mediawiki-main-default';
        $wgWANObjectCaches[$wgMainWANCache] = [
                'class'    => WANObjectCache::class,
-               'cacheId'  => $wgMainCacheType,
-               'channels' => [ 'purge' => 'wancache-main-default-purge' ]
+               'cacheId'  => $wgMainCacheType
        ];
 }
 
index 77a8b14..73594bc 100644 (file)
@@ -215,7 +215,7 @@ class RawAction extends FormlessAction {
                                        // section not found (or section not supported, e.g. for JS, JSON, and CSS)
                                        $text = false;
                                } else {
-                                       $text = $content->getNativeData();
+                                       $text = $content->getText();
                                }
                        }
                }
index 21e20c2..dfaff8b 100644 (file)
@@ -271,6 +271,14 @@ abstract class ApiBase extends ContextSource {
        /** @var int[][][] Cache for self::filterIDs() */
        private static $filterIDsCache = [];
 
+       /** $var array Map of web UI block messages to corresponding API messages and codes */
+       private static $blockMsgMap = [
+               'blockedtext' => [ 'apierror-blocked', 'blocked' ],
+               'blockedtext-partial' => [ 'apierror-blocked', 'blocked' ],
+               'autoblockedtext' => [ 'apierror-autoblocked', 'autoblocked' ],
+               'systemblockedtext' => [ 'apierror-systemblocked', 'blocked' ],
+       ];
+
        /** @var ApiMain */
        private $mMainModule;
        /** @var string */
@@ -1797,28 +1805,9 @@ abstract class ApiBase extends ContextSource {
 
                $status = Status::newGood();
                foreach ( $errors as $error ) {
-                       if ( is_array( $error ) && $error[0] === 'blockedtext' && $user->getBlock() ) {
-                               $status->fatal( ApiMessage::create(
-                                       'apierror-blocked',
-                                       'blocked',
-                                       [ 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $user->getBlock() ) ]
-                               ) );
-                       } elseif ( is_array( $error ) && $error[0] === 'blockedtext-partial' && $user->getBlock() ) {
-                               $status->fatal( ApiMessage::create(
-                                       'apierror-blocked-partial',
-                                       'blocked',
-                                       [ 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $user->getBlock() ) ]
-                               ) );
-                       } elseif ( is_array( $error ) && $error[0] === 'autoblockedtext' && $user->getBlock() ) {
-                               $status->fatal( ApiMessage::create(
-                                       'apierror-autoblocked',
-                                       'autoblocked',
-                                       [ 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $user->getBlock() ) ]
-                               ) );
-                       } elseif ( is_array( $error ) && $error[0] === 'systemblockedtext' && $user->getBlock() ) {
-                               $status->fatal( ApiMessage::create(
-                                       'apierror-systemblocked',
-                                       'blocked',
+                       if ( is_array( $error ) && isset( self::$blockMsgMap[$error[0]] ) && $user->getBlock() ) {
+                               list( $msg, $code ) = self::$blockMsgMap[$error[0]];
+                               $status->fatal( ApiMessage::create( $msg, $code,
                                        [ 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $user->getBlock() ) ]
                                ) );
                        } else {
@@ -1828,6 +1817,26 @@ abstract class ApiBase extends ContextSource {
                return $status;
        }
 
+       /**
+        * Add block info to block messages in a Status
+        * @since 1.33
+        * @param StatusValue $status
+        * @param User|null $user
+        */
+       public function addBlockInfoToStatus( StatusValue $status, User $user = null ) {
+               if ( $user === null ) {
+                       $user = $this->getUser();
+               }
+
+               foreach ( self::$blockMsgMap as $msg => list( $apiMsg, $code ) ) {
+                       if ( $status->hasMessage( $msg ) && $user->getBlock() ) {
+                               $status->replaceMessage( $msg, ApiMessage::create( $apiMsg, $code,
+                                       [ 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $user->getBlock() ) ]
+                               ) );
+                       }
+               }
+       }
+
        /**
         * Call wfTransactionalTimeLimit() if this request was POSTed
         * @since 1.26
@@ -2065,6 +2074,7 @@ abstract class ApiBase extends ContextSource {
                        $status = $newStatus;
                }
 
+               $this->addBlockInfoToStatus( $status );
                throw new ApiUsageException( $this, $status );
        }
 
@@ -2102,15 +2112,21 @@ abstract class ApiBase extends ContextSource {
        /**
         * Helper function for permission-denied errors
         * @since 1.29
+        * @since 1.33 Changed the third parameter from $user to $options.
         * @param Title $title
         * @param string|string[] $actions
-        * @param User|null $user
+        * @param array $options Additional options
+        *   - user: (User) User to use rather than $this->getUser()
+        *   - autoblock: (bool, default false) Whether to spread autoblocks
+        *  For compatibility, passing a User object is treated as the value for the 'user' option.
         * @throws ApiUsageException if the user doesn't have all of the rights.
         */
-       public function checkTitleUserPermissions( Title $title, $actions, $user = null ) {
-               if ( !$user ) {
-                       $user = $this->getUser();
+       public function checkTitleUserPermissions( Title $title, $actions, $options = [] ) {
+               if ( !is_array( $options ) ) {
+                       wfDeprecated( '$user as the third parameter to ' . __METHOD__, '1.33' );
+                       $options = [ 'user' => $options ];
                }
+               $user = $options['user'] ?? $this->getUser();
 
                $errors = [];
                foreach ( (array)$actions as $action ) {
@@ -2123,6 +2139,10 @@ abstract class ApiBase extends ContextSource {
                                $this->trackBlockNotices( $errors );
                        }
 
+                       if ( !empty( $options['autoblock'] ) ) {
+                               $user->spreadAnyEditBlock();
+                       }
+
                        $this->dieStatus( $this->errorArrayToStatus( $errors, $user ) );
                }
        }
index 5e5efa5..8131ea5 100644 (file)
@@ -116,7 +116,8 @@ class ApiEditPage extends ApiBase {
                // Now let's check whether we're even allowed to do this
                $this->checkTitleUserPermissions(
                        $titleObj,
-                       $titleObj->exists() ? 'edit' : [ 'edit', 'create' ]
+                       $titleObj->exists() ? 'edit' : [ 'edit', 'create' ],
+                       [ 'autoblock' => true ]
                );
 
                $toMD5 = $params['text'];
index 9edf929..2492db2 100644 (file)
@@ -181,7 +181,7 @@ class ApiFeedContributions extends ApiBase {
 
                if ( $content instanceof TextContent ) {
                        // only textual content has a "source view".
-                       $html = nl2br( htmlspecialchars( $content->getNativeData() ) );
+                       $html = nl2br( htmlspecialchars( $content->getText() ) );
                } else {
                        // XXX: we could get an HTML representation of the content via getParserOutput, but that may
                        //     contain JS magic and generally may not be suitable for inclusion in a feed.
index f6b6b35..cc4490e 100644 (file)
@@ -86,6 +86,7 @@ class ApiMove extends ApiBase {
                $status = $this->movePage( $fromTitle, $toTitle, $params['reason'], !$params['noredirect'],
                        $params['tags'] ?: [] );
                if ( !$status->isOK() ) {
+                       $user->spreadAnyEditBlock();
                        $this->dieStatus( $status );
                }
 
index 148ac67..9f561b7 100644 (file)
@@ -487,7 +487,7 @@ class ApiParse extends ApiBase {
                        }
 
                        $wgParser->startExternalParse( $titleObj, $popts, Parser::OT_PREPROCESS );
-                       $xml = $wgParser->preprocessToDom( $this->content->getNativeData() )->__toString();
+                       $xml = $wgParser->preprocessToDom( $this->content->getText() )->__toString();
                        $result_array['parsetree'] = $xml;
                        $result_array[ApiResult::META_BC_SUBELEMENTS][] = 'parsetree';
                }
index 3d0a0fb..0d2aeab 100644 (file)
@@ -471,7 +471,7 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
 
                if ( $this->fld_parsetree || ( $this->fld_content && $this->generateXML ) ) {
                        if ( $content->getModel() === CONTENT_MODEL_WIKITEXT ) {
-                               $t = $content->getNativeData(); # note: don't set $text
+                               $t = $content->getText(); # note: don't set $text
 
                                $wgParser->startExternalParse(
                                        $title,
@@ -503,7 +503,7 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
 
                        if ( $this->expandTemplates && !$this->parseContent ) {
                                if ( $content->getModel() === CONTENT_MODEL_WIKITEXT ) {
-                                       $text = $content->getNativeData();
+                                       $text = $content->getText();
 
                                        $text = $wgParser->preprocess(
                                                $text,
index b667382..c933bc4 100644 (file)
        "apihelp-compare-paramvalue-prop-size": "حجم المراجعات 'من' و'إلى'.",
        "apihelp-compare-param-slots": "إرجاع فرق فردي لهذه الفتحات، بدلا من فرق واحد مشترك لجميع فتحات.",
        "apihelp-compare-example-1": "إنشاء فرق بين المراجعة 1 و2.",
-       "apihelp-createaccount-summary": "انشاء حساب مستخدم جديد",
+       "apihelp-createaccount-summary": "Ø¥نشاء حساب مستخدم جديد",
        "apihelp-createaccount-param-preservestate": "إذا تم عرض <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> بشكل صحيح لـ<samp>hasprimarypreservedstate</samp>، فقد تم تعليم طلبات <samp>primary-required</samp> لكي يجب حذفها، إذا عرضت قيمة غير فارغة لـ<samp>preservedusername</samp> فيجب استخدام اسم المستخدم هذا للوسيط <var>username</var>.",
        "apihelp-createaccount-example-create": "بدء عملية إنشاء المستخدم <kbd>Example</kbd> بكلمة المرور <kbd>ExamplePassword</kbd>.",
        "apihelp-cspreport-summary": "مستخدمة من قبل المتصفحات للإبلاغ عن انتهاكات سياسة أمن المحتوى. لا ينبغي أبدا أن تستخدم هذه الوحدة، إلا عند استخدامها تلقائيا باستخدام متصفح ويب CSP متوافق.",
        "apihelp-userrights-example-user": "إضافة المستخدم <kbd>FooBot</kbd> إلى مجموعة <kbd>bot</kbd> وإزالته من المجموعات <kbd>sysop</kbd> و<kbd>bureaucrat</kbd>.",
        "apihelp-userrights-example-userid": "إضافة المستخدم بالمعرف <kbd>123</kbd> إلى مجموعة <kbd>bot</kbd> وإزالته من المجموعات <kbd>sysop</kbd> و<kbd>bureaucrat</kbd>.",
        "apihelp-userrights-example-expiry": "إضافة المستخدم <kbd>SometimeSysop</kbd> إلى مجموعة <kbd>sysop</kbd> لمدة شهر واحد.",
-       "apihelp-validatepassword-summary": "التحقق من صحة كلمة المرور ضد سياسات كلمة مرور الويكي.",
+       "apihelp-validatepassword-summary": "التحقق من صحة كلمة السر ضد سياسات كلمة السر للويكي.",
        "apihelp-validatepassword-extended-description": "يتم الإبلاغ عن الصلاحية كـ<samp>Good</samp> إذا كانت كلمة المرور مقبولة، أو <samp>Change</samp> إذا كان قد يتم استخدام كلمة المرور لتسجيل الدخول ولكن يجب تغييرها، أو <samp>Invalid</samp> إذا كان كلمة المرور غير قابلة للاستخدام.",
        "apihelp-validatepassword-param-password": "كلمة المرور للتحقق.",
        "apihelp-validatepassword-param-user": "اسم المستخدم; للاستخدام عند اختبار إنشاء الحساب، يجب ألا يكون المستخدم المحدد موجودا.",
index 0516448..1c1b14c 100644 (file)
        "apihelp-query+allpages-param-limit": "Combien de pages renvoyer au total.",
        "apihelp-query+allpages-param-dir": "L'ordre dans lequel lister.",
        "apihelp-query+allpages-param-filterlanglinks": "Filtrer si une page a des liens de langue. Noter que cela ne prend pas en compte les liens de langue ajoutés par des extensions.",
-       "apihelp-query+allpages-param-prexpiry": "Quelle expiration de protection sur laquelle filtrer la page :\n;indefinite:N’obtenir que les pages avec une expiration de protection infinie.\n;definite:N’obtenir que les pages avec une expiration de protection définie (spécifique).\n;all:Obtenir toutes les pages avec une expiration de protection.",
+       "apihelp-query+allpages-param-prexpiry": "Quelle expiration de protection sur laquelle filtrer la page :\n;indefinite:N’obtenir que les pages avec une expiration de protection infinie.\n;definite:N’obtenir que les pages avec une expiration de protection définie (spécifique).\n;all:Obtenir toutes les pages avec une expiration de protection quelconque.",
        "apihelp-query+allpages-example-B": "Afficher une liste des pages commençant par la lettre <kbd>B</kbd>.",
        "apihelp-query+allpages-example-generator": "Afficher l’information sur 4 pages commençant par la lettre <kbd>T</kbd>.",
        "apihelp-query+allpages-example-generator-revisions": "Afficher le contenu des 2 premières pages hors redirections commençant par <kbd>Re</kbd>.",
        "apihelp-userrights-summary": "Modifier l’appartenance d’un utilisateur à un groupe.",
        "apihelp-userrights-param-user": "Nom d’utilisateur.",
        "apihelp-userrights-param-userid": "ID de l’utilisateur.",
-       "apihelp-userrights-param-add": "Ajouter l’utilisateur à ces groupes, ou s’ils sont déjà membres, mettre à jour la date d’expiration de leur appartenance à ce groupe.",
+       "apihelp-userrights-param-add": "Ajouter les utilisateurs à ces groupes, ou s’ils sont déjà membres, mettre à jour la date d’expiration de leur appartenance à ce groupe.",
        "apihelp-userrights-param-expiry": "Horodatages d’expiration. Peuvent être relatifs (par ex. <kbd>5 mois</kbd> ou <kbd>2 semaines</kbd>) ou absolus (par ex. <kbd>2014-09-18T12:34:56Z</kbd>). Si uniquement un horodatage est fixé, il sera utilisé pour tous les groupes passés au paramètre <var>$1add</var>. Utiliser <kbd>infinite</kbd>, <kbd>indefinite</kbd>, <kbd>infinity</kbd>, ou <kbd>never</kbd> pour une lien utilisateur-groupe qui n’expire jamais.",
        "apihelp-userrights-param-remove": "Supprimer l’utilisateur de ces groupes.",
        "apihelp-userrights-param-reason": "Motif de la modification.",
        "apierror-mustbeloggedin-generic": "Vous devez être connecté.",
        "apierror-mustbeloggedin-linkaccounts": "Vous devez être connecté pour lier des comptes.",
        "apierror-mustbeloggedin-removeauth": "Vous devez être connecté pour supprimer les données d’authentification.",
-       "apierror-mustbeloggedin-uploadstash": "La réserve de téléversement n’est disponible que pour les utilisateurs connectés.",
+       "apierror-mustbeloggedin-uploadstash": "La zone de préparation des téléversements n’est disponible que pour les utilisateurs connectés.",
        "apierror-mustbeloggedin": "Vous devez être connecté pour $1.",
        "apierror-mustbeposted": "Le module <kbd>$1</kbd> nécessite une requête POST.",
-       "apierror-mustpostparams": "{{PLURAL:$2|Le paramètre suivant a été trouvé|Les paramètres suivants ont été trouvés}} dans la chaîne de requête, mais doit être dans le corps du POST : $1.",
+       "apierror-mustpostparams": "{{PLURAL:$2|Le paramètre suivant a été trouvé|Les paramètres suivants ont été trouvés}} dans la chaîne de requête, mais {{PLURAL:$2|doit|doivent}} être dans le corps du POST : $1.",
        "apierror-noapiwrite": "La modification de ce wiki via l’API est désactivée. Assurez-vous que la déclaration <code>$wgEnableWriteAPI=true;</code> est incluse dans le fichier <code>LocalSettings.php</code> du wiki.",
        "apierror-nochanges": "Aucun changement n’a été demandé.",
        "apierror-nodeleteablefile": "Pas de telle ancienne version du fichier.",
        "apiwarn-tokennotallowed": "L'action « $1 » n'est pas autorisée pour l'utilisateur actuel.",
        "apiwarn-tokens-origin": "Les jetons ne peuvent pas être obtenus quand la politique de même origine n’est pas appliquée.",
        "apiwarn-truncatedresult": "Ce résultat a été tronqué parce que sinon, il dépasserait la limite de $1 octets.",
-       "apiwarn-unclearnowtimestamp": "Passer « $2 » comme paramètre d’horodatage <var>$1</var> a été rendu désuet. Si, pour une raison quelconque, vous avez besoin de spécifier explicitement l’heure courante sans la recalculer du côté client, utilisez <kbd>now</kbd>.",
+       "apiwarn-unclearnowtimestamp": "Passer « $2 » comme paramètre d’horodatage <var>$1</var> est obsolète. Si, pour une raison quelconque, vous avez besoin de spécifier explicitement l’heure courante sans la recalculer du côté client, utilisez <kbd>now</kbd>.",
        "apiwarn-unrecognizedvalues": "{{PLURAL:$3|Valeur non reconnue|Valeurs non reconnues}} pour le paramètre <var>$1</var> : $2.",
        "apiwarn-unsupportedarray": "Le paramètre <var>$1</var> utilise une syntaxe PHP de tableau non prise en charge.",
        "apiwarn-urlparamwidth": "Valeur de la largeur définie dans <var>$1urlparam</var> ($2) ignorée en faveur de la largeur calculée à partir de <var>$1urlwidth</var>/<var>$1urlheight</var> ($3).",
        "api-usage-mailinglist-ref": "S’abonner à la liste de diffusion mediawiki-api-announce sur &lt;https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce&gt; pour les signalisations d’obsolescence de l’API ou de modifications en rupture.",
        "api-exception-trace": "$1 à $2($3)\n$4",
        "api-credits-header": "Remerciements",
-       "api-credits": "Développeurs de l’API :\n* Roan Kattouw (développeur en chef Sept. 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (créateur, développeur en chef Sept. 2006–Sept. 2007)\n* Brad Jorsch (développeur en chef depuis 2013)\n\nVeuillez envoyer vos commentaires, suggestions et questions à mediawiki-api@lists.wikimedia.org\nou remplir un rapport de bogue sur https://phabricator.wikimedia.org/."
+       "api-credits": "Développeurs de l’API :\n* Yuri Astrakhan (créateur, développeur en chef Sept. 2006–Sept. 2007)\n* Roan Kattouw (développeur en chef Sept. 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Brad Jorsch (développeur en chef depuis 2013)\n\nVeuillez envoyer vos commentaires, suggestions et questions à mediawiki-api@lists.wikimedia.org\nou remplir un rapport de bogue sur https://phabricator.wikimedia.org/."
 }
index bc7c779..1c87ea9 100644 (file)
@@ -69,11 +69,8 @@ class TemporaryPasswordAuthenticationRequest extends AuthenticationRequest {
                $minLength = $config->get( 'MinimalPasswordLength' );
                $policy = $config->get( 'PasswordPolicy' );
                foreach ( $policy['policies'] as $p ) {
-                       if ( isset( $p['MinimalPasswordLength'] ) ) {
-                               $minLength = max( $minLength, $p['MinimalPasswordLength'] );
-                       }
-                       if ( isset( $p['MinimalPasswordLengthToLogin'] ) ) {
-                               $minLength = max( $minLength, $p['MinimalPasswordLengthToLogin'] );
+                       foreach ( [ 'MinimalPasswordLength', 'MinimumPasswordLengthToLogin' ] as $check ) {
+                               $minLength = max( $minLength, $p[$check]['value'] ?? $p[$check] ?? 0 );
                        }
                }
 
index 65e659d..ceb51f2 100644 (file)
@@ -23,6 +23,7 @@
  * @author Timo Tijhof
  */
 
+use MediaWiki\MediaWikiServices;
 use Psr\Log\LoggerAwareInterface;
 use Psr\Log\LoggerInterface;
 use Psr\Log\NullLogger;
@@ -36,7 +37,7 @@ use Wikimedia\Rdbms\Database;
  */
 class MessageBlobStore implements LoggerAwareInterface {
 
-       /* @var ResourceLoader|null */
+       /* @var ResourceLoader */
        private $resourceloader;
 
        /**
@@ -50,13 +51,13 @@ class MessageBlobStore implements LoggerAwareInterface {
        protected $wanCache;
 
        /**
-        * @param ResourceLoader|null $rl
+        * @param ResourceLoader $rl
         * @param LoggerInterface|null $logger
         */
-       public function __construct( ResourceLoader $rl = null, LoggerInterface $logger = null ) {
+       public function __construct( ResourceLoader $rl, LoggerInterface $logger = null ) {
                $this->resourceloader = $rl;
                $this->logger = $logger ?: new NullLogger();
-               $this->wanCache = ObjectCache::getMainWANInstance();
+               $this->wanCache = MediaWikiServices::getInstance()->getMainWANObjectCache();
        }
 
        /**
@@ -190,12 +191,6 @@ class MessageBlobStore implements LoggerAwareInterface {
         * @return ResourceLoader
         */
        protected function getResourceLoader() {
-               // Back-compat: This class supports instantiation without a ResourceLoader object.
-               // Lazy-initialise this property because most callers don't need it.
-               if ( $this->resourceloader === null ) {
-                       $this->logger->warning( __CLASS__ . ' created without a ResourceLoader instance' );
-                       $this->resourceloader = new ResourceLoader();
-               }
                return $this->resourceloader;
        }
 
index 21b262a..1d00d19 100644 (file)
@@ -1034,7 +1034,9 @@ class LocalisationCache {
                # HACK: If using a null (i.e. disabled) storage backend, we
                # can't write to the MessageBlobStore either
                if ( $purgeBlobs && !$this->store instanceof LCStoreNull ) {
-                       $blobStore = new MessageBlobStore();
+                       $blobStore = new MessageBlobStore(
+                               MediaWikiServices::getInstance()->getResourceLoader()
+                       );
                        $blobStore->clear();
                }
        }
index 7a54f95..b8ab971 100644 (file)
@@ -472,17 +472,6 @@ class ChangesList extends ContextSource {
                        ' <span class="mw-changeslist-separator"></span> ';
        }
 
-       /**
-        * @param string &$s Article link will be appended to this string, in place.
-        * @param RecentChange $rc
-        * @param bool $unpatrolled
-        * @param bool $watched
-        * @deprecated since 1.27, use getArticleLink instead.
-        */
-       public function insertArticleLink( &$s, RecentChange $rc, $unpatrolled, $watched ) {
-               $s .= $this->getArticleLink( $rc, $unpatrolled, $watched );
-       }
-
        /**
         * @param RecentChange &$rc
         * @param bool $unpatrolled
index a1cf468..66a8165 100644 (file)
@@ -420,8 +420,6 @@ class ChangeTags {
                        }
                }
 
-               self::purgeTagUsageCache();
-
                Hooks::run( 'ChangeTagsAfterUpdateTags', [ $tagsToAdd, $tagsToRemove, $prevTags,
                        $rc_id, $rev_id, $log_id, $params, $rc, $user ] );
 
@@ -1456,18 +1454,15 @@ class ChangeTags {
                $cache->touchCheckKey( $cache->makeKey( 'valid-tags-hook' ) );
 
                MediaWikiServices::getInstance()->getChangeTagDefStore()->reloadMap();
-
-               self::purgeTagUsageCache();
        }
 
        /**
         * Invalidates the tag statistics cache only.
         * @since 1.25
+        * @deprecated since 1.33 the cache this purges no longer exists
         */
        public static function purgeTagUsageCache() {
-               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
-
-               $cache->touchCheckKey( $cache->makeKey( 'change-tag-statistics' ) );
+               wfDeprecated( __METHOD__, '1.33' );
        }
 
        /**
index 8fea3ec..d45b2ce 100644 (file)
@@ -22,7 +22,7 @@
  * @since 1.16.3
  */
 class IcuCollation extends Collation {
-       const FIRST_LETTER_VERSION = 3;
+       const FIRST_LETTER_VERSION = 4;
 
        /** @var Collator */
        private $primaryCollator;
@@ -225,6 +225,7 @@ class IcuCollation extends Collation {
                'tl' => [ "Ñ", "Ng" ], // not in libicu
                'to' => [ "Ng", "ʻ" ],
                'tr' => [ "Ç", "Ğ", "İ", "Ö", "Ş", "Ü" ],
+               '-tr' => [ "ı" ],
                'tt' => [ "Ә", "Ө", "Ү", "Җ", "Ң", "Һ" ], // not in libicu
                'uk' => [ "Ґ", "Ь" ],
                'uz' => [ "Ch", "G'", "Ng", "O'", "Sh" ], // not in libicu
index ae47b86..49e3132 100644 (file)
@@ -59,7 +59,7 @@ abstract class ContentHandler {
         * If $content is null, this method returns the empty string.
         *
         * If $content is an instance of TextContent, this method returns the flat
-        * text as returned by $content->getNativeData().
+        * text as returned by $content->getText().
         *
         * If $content is not a TextContent object, the behavior of this method
         * depends on the global $wgContentHandlerTextFallback:
index 40521d5..87863a4 100644 (file)
@@ -1033,7 +1033,7 @@ class DifferenceEngine extends ContextSource {
                        // Try cache
                        if ( !$this->mRefreshCache ) {
                                $difftext = $cache->get( $key );
-                               if ( $difftext ) {
+                               if ( is_string( $difftext ) ) {
                                        wfIncrStats( 'diff_cache.hit' );
                                        $difftext = $this->localiseDiff( $difftext );
                                        $difftext .= "\n<!-- diff cache key $key -->\n";
@@ -1642,8 +1642,8 @@ class DifferenceEngine extends ContextSource {
                        $this->mOldPage = Title::newFromLinkTarget( $oldRevision->getPageAsLinkTarget() );
                        // This method is meant for edit diffs and such so there is no reason to provide a
                        // revision that's not readable to the user, but check it just in case.
-                       $this->mOldContent = $oldRevision ? $oldRevision->getContent( SlotRecord::MAIN,
-                               RevisionRecord::FOR_THIS_USER, $this->getUser() ) : null;
+                       $this->mOldContent = $oldRevision->getContent( SlotRecord::MAIN,
+                               RevisionRecord::FOR_THIS_USER, $this->getUser() );
                } else {
                        $this->mOldPage = null;
                        $this->mOldRev = $this->mOldid = false;
index 55a7b2d..96b43d6 100644 (file)
@@ -36,13 +36,6 @@ use MediaWiki\MediaWikiServices;
  */
 class WikiRevision implements ImportableUploadRevision, ImportableOldRevision {
 
-       /**
-        * @since 1.17
-        * @deprecated in 1.29. Unused.
-        * @note Introduced in 9b3128eb2b654761f21fd4ca1d5a1a4b796dc912, unused there, unused now.
-        */
-       public $importer = null;
-
        /**
         * @since 1.2
         * @var Title
index bb30d3d..6315de4 100644 (file)
@@ -373,6 +373,7 @@ abstract class DatabaseInstaller {
        /**
         * Perform database upgrades
         *
+        * @suppress SecurityCheck-XSS Escaping provided by $this->outputHandler
         * @return bool
         */
        public function doUpgrade() {
index d64e2d7..7a92807 100644 (file)
@@ -1074,7 +1074,9 @@ abstract class DatabaseUpdater {
                }
 
                // ResourceLoader: Message cache
-               $blobStore = new MessageBlobStore();
+               $blobStore = new MessageBlobStore(
+                       MediaWikiServices::getInstance()->getResourceLoader()
+               );
                $blobStore->clear();
 
                // ResourceLoader: File-dependency cache
index 5a3d77a..20661f2 100644 (file)
@@ -1464,6 +1464,7 @@ abstract class Installer {
        /**
         * Installs the auto-detected extensions.
         *
+        * @suppress SecurityCheck-OTHER It thinks $exts/$IP is user controlled but they are not.
         * @return Status
         */
        protected function includeExtensions() {
index ae07d0c..b061d0d 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Deployment
  */
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * Output class modelled on OutputPage.
  *
@@ -147,7 +149,7 @@ class WebInstallerOutput {
                        'mediawiki.skinning.interface',
                ];
 
-               $resourceLoader = new ResourceLoader();
+               $resourceLoader = MediaWikiServices::getInstance()->getResourceLoader();
 
                if ( file_exists( "$wgStyleDirectory/Vector/skin.json" ) ) {
                        // Force loading Vector skin if available as a fallback skin
index a212289..8c17ac7 100644 (file)
        "config-db-username": "اسم مستخدم قاعدة البيانات:",
        "config-db-password": "كلمة سر قاعدة البيانات:",
        "config-db-install-username": "أدخل اسم المستخدم الذي سيتم استخدامه للاتصال بقاعدة البيانات أثناء عملية التثبيت. هذا ليس اسم مستخدم لحساب ميدياويكي. هذا اسم مستخدم لقاعدة البيانات الخاصة بك.",
-       "config-db-install-password": "أدخل كلمة المرور التي سيتم استخدامها للاتصال بقاعدة البيانات أثناء عملية التثبيت. ليست هذه كلمة مرور لحساب ميدياويكي. هذه كلمة مرور لقاعدة البيانات الخاصة بك.",
+       "config-db-install-password": "أدخل كلمة السر التي سيتم استخدامها للاتصال بقاعدة البيانات أثناء عملية التثبيت. ليست هذه كلمة سر لحساب ميدياويكي. هذه كلمة سر لقاعدة البيانات الخاصة بك.",
        "config-db-install-help": "أدخل اسم المستخدم وكلمة المرور الذين سيتم استخدامهما للاتصال بقاعدة البيانات أثناء عملية التثبيت.",
        "config-db-account-lock": "استخدم نفس اسم المستخدم وكلمة المرور أثناء التشغيل العادي",
        "config-db-wiki-account": "حساب المستخدم للتشغيل العادي",
        "config-admin-help": "أدخل اسم المستخدم المفضل لديك هنا، على سبيل المثال \"جو أشرف فاروق\". هذا هو الاسم الذي ستستخدمه لتسجيل الدخول إلى الويكي.",
        "config-admin-name-blank": "أدخل اسم مستخدم لإداري.",
        "config-admin-name-invalid": "اسم المستخدم المحدد \"<nowiki>$1</ nowiki>\" غير صالح. حدد اسم مستخدم مختلفا.",
-       "config-admin-password-blank": "أدخل كلمة مرور حساب الإداري.",
+       "config-admin-password-blank": "أدخل كلمة سر حساب الإداري.",
        "config-admin-password-mismatch": "كلمات السر اثنين التي أدخلتها لا تتطابق.",
        "config-admin-email": "عنوان البريد الإلكتروني:",
        "config-admin-email-help": "إدخال عنوان البريد الإلكتروني هنا ليسمح لك لتلقي البريد الإلكتروني من المستخدمين الآخرين على ويكي، إعادة تعيين كلمة المرور الخاصة بك، ويتم إخطار من التغييرات للصفحات في قائمة مراقبتك. يمكنك ترك هذا الحقل فارغا.",
        "config-admin-error-user": "خطأ داخلي عند إنشاء إداري باسم \"<nowiki>$1</ nowiki>\".",
-       "config-admin-error-password": "خطأ داخلي عند عند وضع كلمة مرور للإداري \"<nowiki>$1</nowiki>\": <pre>$2</pre>.",
+       "config-admin-error-password": "خطأ داخلي عند عند وضع كلمة سر للإداري \"<nowiki>$1</nowiki>\": <pre>$2</pre>",
        "config-admin-error-bademail": "لقد قمت بإدخال عنوان البريد الإلكتروني غير صالح.",
        "config-subscribe": "اشترك في [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce نشر إعلانات القائمة البريدية].",
        "config-subscribe-help": "هذه قائمة بريدية ذات حجم منخفض تُستخدَم لإعلانات الإصدار، بما في ذلك إعلانات الأمان المهمة، \nيجب عليك الاشتراك فيها وتحديث تثبيت ميدياويكي الخاص بك عندما تظهر إصدارات جديدة.",
index 35088ed..dd265a1 100644 (file)
@@ -81,6 +81,7 @@
        "config-uploads-not-safe": "<strong>Avís:</strong> El directori de càrregues per defecte <code>$1</code> és vulnerable a l'execució d'scripts arbitraris.\nEncara que el MediaWiki comprova tots els fitxers que es carreguen davant d'amenaces de seguretat, és molt recomanable [https://www.mediawiki.org/ wiki/Special:MyLanguage/Manual:Security#Upload_security tancar aquesta vulnerabilitat de seguretat] abans d'habilitar les càrregues.",
        "config-db-type": "Tipus de base de dades:",
        "config-db-host": "Servidor de la base de dades:",
+       "config-db-host-help": "Si el servidor de base de dades és en un servidor diferent, introduïu el nom del servidor o l'adreça IP a continuació.\n\nSi feu servir un hostatge web compartit, el vostre proveïdor us hauria de proporcionar el nom del servidor a la documentació.\n\nSi feu servir MySQL, «localhost» podria no funcionar com a nom de servidor. Si no funciona, proveu «127.0.0.1» com a adreça IP local.\n\nSi feu servir PostgreSQL, deixeu aquest camp en blanc per a connectar-vos a través d'un sòcol Unix.",
        "config-db-host-oracle": "TNS de la base de dades:",
        "config-db-wiki-settings": "Identifica aquest wiki",
        "config-db-name": "Nom de la base de dades (sense guionets):",
        "config-missing-db-server-oracle": "Heu d’introduir un valor per a «{{int:config-db-host-oracle}}».",
        "config-invalid-db-name": "El nom de la base de dades, «$1», no és vàlid.\nUtilitzeu només lletres de l’ASCII (a-z, A-Z), xifres (0-9), guions baixos (_) i guionets (-).",
        "config-invalid-db-prefix": "El prefix de la base de dades, «$1», no és vàlid.\nUtilitzeu només lletres de l’ASCII (a-z, A-Z), xifres (0-9), guions baixos (_) i guionets (-).",
-       "config-connection-error": "$1.\n\nComproveu el servidor central, el nom d'usuari i la contrasenya i torneu-ho a provar.",
+       "config-connection-error": "$1.\n\nComproveu el servidor central, el nom d'usuari i la contrasenya i torneu-ho a provar. Si feu servir «localhost» com a servidor de base de dades, proveu llavors d'utilitzar «127.0.0.1» (o a l'inrevés).",
        "config-invalid-schema": "L’esquema «$1» no és vàlid per al MediaWiki.\nUtilitzeu només lletres de l’ASCII (a-z, A-Z), xifres (0-9), guions baixos (_) i guionets (-).",
        "config-db-sys-create-oracle": "L'instal·lador només accepta emprar un compte SYSDBA per a la creació d'un nou compte.",
        "config-db-sys-user-exists-oracle": "El compte d’usuari «$1» ja existeix. SYSDBA només es pot fer servir per crear comptes nous.",
index 92d508a..943b8fc 100644 (file)
@@ -64,6 +64,8 @@
        "config-header-sqlite": "SQLite-indstillinger",
        "config-header-oracle": "Oracle-indstillinger",
        "config-invalid-db-type": "Ugyldig databasetype",
+       "config-sqlite-readonly": "Filen <code>$1</code> er ikke skrivbar.",
+       "config-sqlite-cant-create-db": "Kunne ikke oprette databasefilen <code>$1</code>.",
        "config-db-web-create": "Opret kontoen hvis den ikke allerede findes",
        "config-mysql-innodb": "InnoDB (anbefalet)",
        "config-mysql-myisam": "MyISAM",
index 93039ff..707fc24 100644 (file)
        "config-env-hhvm": "HHVM $1 er uppsett.",
        "config-apc": "[https://secure.php.net/apc APC] er uppsett",
        "config-wincache": "[https://www.iis.net/downloads/microsoft/wincache-extension WinCache] er uppsett",
-       "config-diff3-bad": "GNU diff3 fannst ekki.",
+       "config-diff3-bad": "GNU diff3 textasamanburðartólið fannst ekki. Þú getur hunsað þetta núna, en þú gætir lent oftar í breytingaárekstrum.",
        "config-using-server": "Nota \"<nowiki>$1</nowiki>\" sem heiti á þjóni.",
        "config-using-uri": "Nota \"<nowiki>$1$2</nowiki>\" sem slóð á þjón.",
        "config-db-type": "Tegund gagnagrunns:",
        "config-db-host": "Netþjónn gagnagrunns:",
-       "config-db-name": "Heiti gagnagrunns:",
+       "config-db-name": "Heiti gagnagrunns (engin bandstrik):",
        "config-db-name-oracle": "Gagnagrunnsskema:",
        "config-db-username": "Notandanafn á gagnagrunni:",
        "config-db-password": "Lykilorð gagnagrunns:",
        "config-db-port": "Gátt gagnagrunns:",
        "config-sqlite-dir": "Gagnamappa SQLite:",
-       "config-type-mysql": "MySQL (eða samhæft)",
+       "config-type-mysql": "MariaDB, MySQL, eða samhæft",
        "config-type-postgres": "PostgreSQL",
        "config-type-sqlite": "SQLite",
        "config-type-oracle": "Oracle",
        "config-type-mssql": "Microsoft SQL Server",
-       "config-header-mysql": "Stillingar MySQL",
+       "config-header-mysql": "Stillingar MariaDB/MySQL",
        "config-header-postgres": "Stillingar PostgreSQL",
        "config-header-sqlite": "Stillingar SQLite",
        "config-header-oracle": "Stillingar Oracle",
@@ -61,7 +61,7 @@
        "config-show-table-status": "<code>SHOW TABLE STATUS</code> beiðni mistókst!",
        "config-db-web-account": "Gagnagrunnsreikningur fyrir vefaðgang",
        "config-mysql-engine": "Gagnagrunnshýsing:",
-       "config-mysql-innodb": "InnoDB",
+       "config-mysql-innodb": "InnoDB (mælt með)",
        "config-mysql-myisam": "MyISAM",
        "config-mssql-auth": "Tegund auðkenningar:",
        "config-mssql-sqlauth": "SQL Server auðkenning",
index fa17284..cda0636 100644 (file)
@@ -206,6 +206,7 @@ class JobQueueDB extends JobQueue {
        /**
         * This function should *not* be called outside of JobQueueDB
         *
+        * @suppress SecurityCheck-SQLInjection Bug in phan-taint-check handling bulk inserts
         * @param IDatabase $dbw
         * @param IJobSpecification[] $jobs
         * @param int $flags
index 6ce8f45..536177e 100644 (file)
@@ -384,7 +384,7 @@ class MultiHttpClient implements LoggerAwareInterface {
 
                curl_setopt( $ch, CURLOPT_HEADERFUNCTION,
                        function ( $ch, $header ) use ( &$req ) {
-                               if ( !empty( $req['flags']['relayResponseHeaders'] ) ) {
+                               if ( !empty( $req['flags']['relayResponseHeaders'] ) && trim( $header ) !== '' ) {
                                        header( $header );
                                }
                                $length = strlen( $header );
index c1428e6..40030c3 100644 (file)
@@ -74,13 +74,11 @@ use Psr\Log\NullLogger;
  *
  * ### Deploying WANObjectCache
  *
- * There are three supported ways to set up broadcasted operations:
+ * There are two supported ways to set up broadcasted operations:
  *
- *   - A) Configure the 'purge' EventRelayer to point to a valid PubSub endpoint
- *        that has subscribed listeners on the cache servers applying the cache updates.
- *   - B) Omit the 'purge' EventRelayer parameter and set up mcrouter as the underlying cache
- *        backend, using a memcached BagOStuff class for the 'cache' parameter. The 'region'
- *        and 'cluster' parameters must be provided and 'mcrouterAware' must be set to `true`.
+ *   - A) Set up mcrouter as the underlying cache backend, using a memcached BagOStuff class
+ *        for the 'cache' parameter. The 'region' and 'cluster' parameters must be provided
+ *        and 'mcrouterAware' must be set to `true`.
  *        Configure mcrouter as follows:
  *          - 1) Use Route Prefixing based on region (datacenter) and cache cluster.
  *               See https://github.com/facebook/mcrouter/wiki/Routing-Prefix and
@@ -90,11 +88,11 @@ use Psr\Log\NullLogger;
  *               configure 'set' and 'delete' operations to go to all servers in the cache
  *               cluster, instead of just one server determined by hashing.
  *               See https://github.com/facebook/mcrouter/wiki/List-of-Route-Handles.
- *   - C) Omit the 'purge' EventRelayer parameter and set up dynomite as cache middleware
- *        between the web servers and either memcached or redis. This will broadcast all
- *        key setting operations, not just purges, which can be useful for cache warming.
- *        Writes are eventually consistent via the Dynamo replication model.
- *        See https://github.com/Netflix/dynomite.
+ *   - B) Set up dynomite as a cache middleware between the web servers and either memcached
+ *        or redis and use it as the underlying cache backend, using a memcached BagOStuff
+ *        class for the 'cache' parameter. This will broadcast all key setting operations,
+ *        not just purges, which can be useful for cache warming. Writes are eventually
+ *        consistent via the Dynamo replication model. See https://github.com/Netflix/dynomite.
  *
  * Broadcasted operations like delete() and touchCheckKey() are done asynchronously
  * in all datacenters this way, though the local one should likely be near immediate.
@@ -120,10 +118,6 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
        protected $cache;
        /** @var MapCacheLRU[] Map of group PHP instance caches */
        protected $processCaches = [];
-       /** @var string Purge channel name */
-       protected $purgeChannel;
-       /** @var EventRelayer Bus that handles purge broadcasts */
-       protected $purgeRelayer;
        /** @bar bool Whether to use mcrouter key prefixing for routing */
        protected $mcrouterAware;
        /** @var string Physical region for mcrouter use */
@@ -141,9 +135,6 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
        /** @var float Unix timestamp of the oldest possible valid values */
        protected $epoch;
 
-       /** @var int ERR_* constant for the "last error" registry */
-       protected $lastRelayError = self::ERR_NONE;
-
        /** @var int Callback stack depth for getWithSetCallback() */
        private $callbackDepth = 0;
        /** @var mixed[] Temporary warm-up cache */
@@ -168,6 +159,8 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
 
        /** Seconds to keep lock keys around */
        const LOCK_TTL = 10;
+       /** Seconds to no-op key set() calls to avoid large blob I/O stampedes */
+       const COOLOFF_TTL = 1;
        /** Default remaining TTL at which to consider pre-emptive regeneration */
        const LOW_TTL = 30;
 
@@ -199,6 +192,9 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
        /** Tiny negative float to use when CTL comes up >= 0 due to clock skew */
        const TINY_NEGATIVE = -0.000001;
 
+       /** Seconds of delay after get() where set() storms are a consideration with 'lockTSE' */
+       const SET_DELAY_HIGH_SEC = 0.1;
+
        /** Cache format version number */
        const VERSION = 1;
 
@@ -222,6 +218,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
        const INTERIM_KEY_PREFIX = 'WANCache:i:';
        const TIME_KEY_PREFIX = 'WANCache:t:';
        const MUTEX_KEY_PREFIX = 'WANCache:m:';
+       const COOLOFF_KEY_PREFIX = 'WANCache:c:';
 
        const PURGE_VAL_PREFIX = 'PURGED:';
 
@@ -230,13 +227,9 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
 
        const PC_PRIMARY = 'primary:1000'; // process cache name and max key count
 
-       const DEFAULT_PURGE_CHANNEL = 'wancache-purge';
-
        /**
         * @param array $params
         *   - cache    : BagOStuff object for a persistent cache
-        *   - channels : Map of (action => channel string). Actions include "purge".
-        *   - relayers : Map of (action => EventRelayer object). Actions include "purge".
         *   - logger   : LoggerInterface object
         *   - stats    : LoggerInterface object
         *   - asyncHandler : A function that takes a callback and runs it later. If supplied,
@@ -260,8 +253,6 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
         */
        public function __construct( array $params ) {
                $this->cache = $params['cache'];
-               $this->purgeChannel = $params['channels']['purge'] ?? self::DEFAULT_PURGE_CHANNEL;
-               $this->purgeRelayer = $params['relayers']['purge'] ?? new EventRelayerNull( [] );
                $this->region = $params['region'] ?? 'main';
                $this->cluster = $params['cluster'] ?? 'wan-main';
                $this->mcrouterAware = !empty( $params['mcrouterAware'] );
@@ -1049,21 +1040,28 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
         *      is useful if thousands or millions of keys depend on the same entity. The entity can
         *      simply have its "check" key updated whenever the entity is modified.
         *      Default: [].
-        *   - graceTTL: If the key is invalidated (by "checkKeys") less than this many seconds ago,
-        *      consider reusing the stale value. The odds of a refresh becomes more likely over time,
-        *      becoming certain once the grace period is reached. This can reduce traffic spikes
-        *      when millions of keys are compared to the same "check" key and touchCheckKey() or
-        *      resetCheckKey() is called on that "check" key. This option is not useful for the
-        *      case of the key simply expiring on account of its TTL (use "lowTTL" instead).
+        *   - graceTTL: If the key is invalidated (by "checkKeys"/"touchedCallback") less than this
+        *      many seconds ago, consider reusing the stale value. The odds of a refresh becomes
+        *      more likely over time, becoming certain once the grace period is reached. This can
+        *      reduce traffic spikes when millions of keys are compared to the same "check" key and
+        *      touchCheckKey() or resetCheckKey() is called on that "check" key. This option is not
+        *      useful for avoiding traffic spikes in the case of the key simply expiring on account
+        *      of its TTL (use "lowTTL" instead).
         *      Default: WANObjectCache::GRACE_TTL_NONE.
-        *   - lockTSE: If the key is tombstoned or invalidated (by "checkKeys") less than this many
-        *      seconds ago, try to have a single thread handle cache regeneration at any given time.
-        *      Other threads will try to use stale values if possible. If, on miss, the time since
-        *      expiration is low, the assumption is that the key is hot and that a stampede is worth
-        *      avoiding. Setting this above WANObjectCache::HOLDOFF_TTL makes no difference. The
-        *      higher this is set, the higher the worst-case staleness can be. This option does not
-        *      by itself handle the case of the key simply expiring on account of its TTL, so make
-        *      sure that "lowTTL" is not disabled when using this option.
+        *   - lockTSE: If the key is tombstoned or invalidated (by "checkKeys"/"touchedCallback")
+        *      less than this many seconds ago, try to have a single thread handle cache regeneration
+        *      at any given time. Other threads will use stale values if possible. If, on miss,
+        *      the time since expiration is low, the assumption is that the key is hot and that a
+        *      stampede is worth avoiding. Note that if the key falls out of cache then concurrent
+        *      threads will all run the callback on cache miss until the value is saved in cache.
+        *      The only stampede protection in that case is from duplicate cache sets when the
+        *      callback takes longer than WANObjectCache::SET_DELAY_HIGH_SEC seconds; consider
+        *      using "busyValue" if such stampedes are a problem. Note that the higher "lockTSE" is
+        *      set, the higher the worst-case staleness of returned values can be. Also note that
+        *      this option does not by itself handle the case of the key simply expiring on account
+        *      of its TTL, so make sure that "lowTTL" is not disabled when using this option. Avoid
+        *      combining this option with delete() as it can always cause a stampede due to their
+        *      being no stale value available until after a thread completes the callback.
         *      Use WANObjectCache::TSE_NONE to disable this logic.
         *      Default: WANObjectCache::TSE_NONE.
         *   - busyValue: If no value exists and another thread is currently regenerating it, use this
@@ -1282,12 +1280,12 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                        // This avoids stampedes on eviction or preemptive regeneration taking too long.
                        ( $busyValue !== null && $value === false );
 
-               $lockAcquired = false;
+               $hasLock = false;
                if ( $useMutex ) {
                        // Acquire a datacenter-local non-blocking lock
                        if ( $this->cache->add( self::MUTEX_KEY_PREFIX . $key, 1, self::LOCK_TTL ) ) {
                                // Lock acquired; this thread will recompute the value and update cache
-                               $lockAcquired = true;
+                               $hasLock = true;
                        } elseif ( $this->isValid( $value, $versioned, $asOf, $minTime ) ) {
                                // Lock not acquired and a stale value exists; use the stale value
                                $this->stats->increment( "wanobjectcache.$kClass.hit.stale" );
@@ -1330,26 +1328,31 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                $valueIsCacheable = ( $value !== false && $ttl >= 0 );
 
                if ( $valueIsCacheable ) {
+                       $ago = max( $this->getCurrentTime() - $preCallbackTime, 0.0 );
                        if ( $isKeyTombstoned ) {
-                               // When delete() is called, writes are write-holed by the tombstone,
-                               // so use a special INTERIM key to pass the new value among threads.
-                               $tempTTL = max( self::INTERIM_KEY_TTL, (int)$lockTSE ); // set() expects seconds
-                               $newAsOf = $this->getCurrentTime();
-                               $wrapped = $this->wrap( $value, $tempTTL, $newAsOf );
-                               // Avoid using set() to avoid pointless mcrouter broadcasting
-                               $this->setInterimValue( $key, $wrapped, $tempTTL );
-                       } elseif ( !$useMutex || $lockAcquired ) {
-                               // Save the value unless a lock-winning thread is already expected to do that
-                               $setOpts['lockTSE'] = $lockTSE;
-                               $setOpts['staleTTL'] = $staleTTL;
-                               // Use best known "since" timestamp if not provided
-                               $setOpts += [ 'since' => $preCallbackTime ];
-                               // Update the cache; this will fail if the key is tombstoned
-                               $this->set( $key, $value, $ttl, $setOpts );
+                               if ( $this->checkAndSetCooloff( $key, $kClass, $ago, $lockTSE, $hasLock ) ) {
+                                       // When delete() is called, writes are write-holed by the tombstone,
+                                       // so use a special INTERIM key to pass the new value among threads.
+                                       $tempTTL = max( self::INTERIM_KEY_TTL, (int)$lockTSE ); // set() expects seconds
+                                       $newAsOf = $this->getCurrentTime();
+                                       $wrapped = $this->wrap( $value, $tempTTL, $newAsOf );
+                                       // Avoid using set() to avoid pointless mcrouter broadcasting
+                                       $this->setInterimValue( $key, $wrapped, $tempTTL );
+                               }
+                       } elseif ( !$useMutex || $hasLock ) {
+                               if ( $this->checkAndSetCooloff( $key, $kClass, $ago, $lockTSE, $hasLock ) ) {
+                                       // Save the value unless a lock-winning thread is already expected to do that
+                                       $setOpts['lockTSE'] = $lockTSE;
+                                       $setOpts['staleTTL'] = $staleTTL;
+                                       // Use best known "since" timestamp if not provided
+                                       $setOpts += [ 'since' => $preCallbackTime ];
+                                       // Update the cache; this will fail if the key is tombstoned
+                                       $this->set( $key, $value, $ttl, $setOpts );
+                               }
                        }
                }
 
-               if ( $lockAcquired ) {
+               if ( $hasLock ) {
                        // Avoid using delete() to avoid pointless mcrouter broadcasting
                        $this->cache->changeTTL( self::MUTEX_KEY_PREFIX . $key, (int)$preCallbackTime - 60 );
                }
@@ -1360,6 +1363,41 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                return $value;
        }
 
+       /**
+        * @param string $key
+        * @param string $kClass
+        * @param float $elapsed Seconds spent regenerating the value
+        * @param float $lockTSE
+        * @param $hasLock bool
+        * @return bool Whether it is OK to proceed with a key set operation
+        */
+       private function checkAndSetCooloff( $key, $kClass, $elapsed, $lockTSE, $hasLock ) {
+               // If $lockTSE is set, the lock was bypassed because there was no stale/interim value,
+               // and $elapsed indicates that regeration is slow, then there is a risk of set()
+               // stampedes with large blobs. With a typical scale-out infrastructure, CPU and query
+               // load from $callback invocations is distributed among appservers and replica DBs,
+               // but cache operations for a given key route to a single cache server (e.g. striped
+               // consistent hashing).
+               if ( $lockTSE < 0 || $hasLock ) {
+                       return true; // either not a priori hot or thread has the lock
+               } elseif ( $elapsed <= self::SET_DELAY_HIGH_SEC ) {
+                       return true; // not enough time for threads to pile up
+               }
+
+               $this->cache->clearLastError();
+               if (
+                       !$this->cache->add( self::COOLOFF_KEY_PREFIX . $key, 1, self::COOLOFF_TTL ) &&
+                       // Don't treat failures due to I/O errors as the key being in cooloff
+                       $this->cache->getLastError() === BagOStuff::ERR_NONE
+               ) {
+                       $this->stats->increment( "wanobjectcache.$kClass.cooloff_bounce" );
+
+                       return false;
+               }
+
+               return true;
+       }
+
        /**
         * @param mixed $value
         * @param float $asOf
@@ -1752,15 +1790,6 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
         * @return int ERR_* class constant for the "last error" registry
         */
        final public function getLastError() {
-               if ( $this->lastRelayError ) {
-                       // If the cache and the relayer failed, focus on the latter.
-                       // An update not making it to the relayer means it won't show up
-                       // in other DCs (nor will consistent re-hashing see up-to-date values).
-                       // On the other hand, if just the cache update failed, then it should
-                       // eventually be applied by the relayer.
-                       return $this->lastRelayError;
-               }
-
                $code = $this->cache->getLastError();
                switch ( $code ) {
                        case BagOStuff::ERR_NONE:
@@ -1779,7 +1808,6 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
         */
        final public function clearLastError() {
                $this->cache->clearLastError();
-               $this->lastRelayError = self::ERR_NONE;
        }
 
        /**
@@ -1928,26 +1956,13 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                                $this->makePurgeValue( $this->getCurrentTime(), self::HOLDOFF_NONE ),
                                $ttl
                        );
-               } elseif ( $this->purgeRelayer instanceof EventRelayerNull ) {
+               } else {
                        // This handles the mcrouter and the single-DC case
                        $ok = $this->cache->set(
                                $key,
                                $this->makePurgeValue( $this->getCurrentTime(), self::HOLDOFF_NONE ),
                                $ttl
                        );
-               } else {
-                       $event = $this->cache->modifySimpleRelayEvent( [
-                               'cmd' => 'set',
-                               'key' => $key,
-                               'val' => 'PURGED:$UNIXTIME$:' . (int)$holdoff,
-                               'ttl' => max( $ttl, self::TTL_SECOND ),
-                               'sbt' => true, // substitute $UNIXTIME$ with actual microtime
-                       ] );
-
-                       $ok = $this->purgeRelayer->notify( $this->purgeChannel, $event );
-                       if ( !$ok ) {
-                               $this->lastRelayError = self::ERR_RELAY;
-                       }
                }
 
                return $ok;
@@ -1964,19 +1979,9 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface {
                        // See https://github.com/facebook/mcrouter/wiki/Multi-cluster-broadcast-setup
                        // Wildcards select all matching routes, e.g. the WAN cluster on all DCs
                        $ok = $this->cache->delete( "/*/{$this->cluster}/{$key}" );
-               } elseif ( $this->purgeRelayer instanceof EventRelayerNull ) {
+               } else {
                        // Some other proxy handles broadcasting or there is only one datacenter
                        $ok = $this->cache->delete( $key );
-               } else {
-                       $event = $this->cache->modifySimpleRelayEvent( [
-                               'cmd' => 'delete',
-                               'key' => $key,
-                       ] );
-
-                       $ok = $this->purgeRelayer->notify( $this->purgeChannel, $event );
-                       if ( !$ok ) {
-                               $this->lastRelayError = self::ERR_RELAY;
-                       }
                }
 
                return $ok;
index e4ab95c..fb8a754 100644 (file)
@@ -69,7 +69,6 @@ class WANObjectCacheReaper implements LoggerAwareInterface {
         *        The callback must fully duck-type test the object, since can be any model class.
         * @param array $params Additional options:
         *          - channel: the name of the update event stream.
-        *            Default: WANObjectCache::DEFAULT_PURGE_CHANNEL.
         *          - initialStartWindow: seconds back in time to start if the position is lost.
         *            Default: 1 hour.
         *          - logger: an SPL monolog instance [optional]
index 974c7df..b3597df 100644 (file)
@@ -2278,7 +2278,9 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
        }
 
        public function buildStringCast( $field ) {
-               return $field;
+               // In theory this should work for any standards-compliant
+               // SQL implementation, although it may not be the best way to do it.
+               return "CAST( $field AS CHARACTER )";
        }
 
        public function buildIntegerCast( $field ) {
index 93bb5d3..a6027e6 100644 (file)
@@ -1398,6 +1398,11 @@ class DatabaseMssql extends Database {
 
                return $old;
        }
+
+       public function buildStringCast( $field ) {
+               return "CAST( $field AS NVARCHAR )";
+       }
+
 }
 
 /**
index 186c89f..62110ef 100644 (file)
@@ -1548,6 +1548,10 @@ abstract class DatabaseMysqlBase extends Database {
                        !preg_match( '/^SELECT\s+(GET|RELEASE|IS_FREE)_LOCK\(/', $sql );
        }
 
+       public function buildStringCast( $field ) {
+               return "CAST( $field AS BINARY )";
+       }
+
        /**
         * @param string $field Field or column to cast
         * @return string
index 072c3c6..df9259b 100644 (file)
@@ -895,7 +895,8 @@ class WikiPage implements Page, IDBAccessObject {
         *   Revision::RAW              get the text regardless of permissions
         * @param User|null $user User object to check for, only if FOR_THIS_USER is passed
         *   to the $audience parameter
-        * @return string Comment stored for the last article revision
+        * @return string|null Comment stored for the last article revision, or null if the specified
+        *  audience does not have access to the comment.
         */
        public function getComment( $audience = Revision::FOR_PUBLIC, User $user = null ) {
                $this->loadLastEdit();
index f4856be..078c819 100644 (file)
@@ -275,6 +275,7 @@ class LinkHolderArray {
 
        /**
         * Replace internal links
+        * @suppress SecurityCheck-XSS Gets confused with $entry['pdbk']
         * @param string &$text
         */
        protected function replaceInternal( &$text ) {
@@ -418,6 +419,7 @@ class LinkHolderArray {
        /**
         * Replace interwiki links
         * @param string &$text
+        * @suppress SecurityCheck-XSS Gets confused with $this->interwikis['pdbk']
         */
        protected function replaceInterwiki( &$text ) {
                if ( empty( $this->interwikis ) ) {
diff --git a/includes/password/Argon2Password.php b/includes/password/Argon2Password.php
new file mode 100644 (file)
index 0000000..9138c33
--- /dev/null
@@ -0,0 +1,117 @@
+<?php
+
+use Wikimedia\Assert\Assert;
+
+/**
+ * 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
+ */
+
+/**
+ * Implements Argon2, a modern key derivation algorithm designed to resist GPU cracking and
+ * side-channel attacks.
+ *
+ * @see https://en.wikipedia.org/wiki/Argon2
+ */
+class Argon2Password extends Password {
+       /**
+        * @var null[] Array with known password_hash() option names as keys
+        */
+       private static $knownOptions = [
+               'memory_cost' => null,
+               'time_cost' => null,
+               'threads' => null,
+       ];
+
+       /**
+        * @inheritDoc
+        */
+       protected function isSupported() {
+               // It is actually possible to have a PHP build with Argon2i but not Argon2id
+               return defined( 'PASSWORD_ARGON2I' ) || defined( 'PASSWORD_ARGON2ID' );
+       }
+
+       /**
+        * @return mixed[] Array of 2nd and third parmeters to password_hash()
+        */
+       private function prepareParams() {
+               switch ( $this->config['algo'] ) {
+                       case 'argon2i':
+                               $algo = PASSWORD_ARGON2I;
+                               break;
+                       case 'argon2id':
+                               $algo = PASSWORD_ARGON2ID;
+                               break;
+                       case 'auto':
+                               $algo = defined( 'PASSWORD_ARGON2ID' ) ? PASSWORD_ARGON2ID : PASSWORD_ARGON2I;
+                               break;
+                       default:
+                               throw new LogicException( "Unexpected algo: {$this->config['algo']}" );
+
+               }
+
+               $params = array_intersect_key( $this->config, self::$knownOptions );
+
+               return [ $algo, $params ];
+       }
+
+       /**
+        * @inheritDoc
+        */
+       public function crypt( $password ) {
+               list( $algo, $params ) = $this->prepareParams();
+               $this->hash = password_hash( $password, $algo, $params );
+       }
+
+       /**
+        * @inheritDoc
+        */
+       public function equals( $other ) {
+               if ( is_string( $other ) ) {
+                       return $this->verify( $other );
+               }
+
+               // Argon2 key derivation is not deterministic, can't pass objects to equals()
+               return false;
+       }
+
+       /**
+        * @inheritDoc
+        */
+       public function verify( $password ) {
+               Assert::parameterType( 'string', $password, '$password' );
+
+               return password_verify( $password, $this->hash );
+       }
+
+       /**
+        * @inheritDoc
+        */
+       public function toString() {
+               $res = ":argon2:{$this->hash}";
+               $this->assertIsSafeSize( $res );
+               return $res;
+       }
+
+       /**
+        * @inheritDoc
+        */
+       public function needsUpdate() {
+               list( $algo, $params ) = $this->prepareParams();
+               return password_needs_rehash( $this->hash, $algo, $params );
+       }
+}
index f167f95..8f6cb3e 100644 (file)
@@ -101,8 +101,11 @@ abstract class Password {
         * @param string|null $hash The raw hash, including the type
         */
        final public function __construct( PasswordFactory $factory, array $config, $hash = null ) {
+               if ( !$this->isSupported() ) {
+                       throw new Exception( 'PHP support not found for ' . get_class( $this ) );
+               }
                if ( !isset( $config['type'] ) ) {
-                       throw new MWException( 'Password configuration must contain a type name.' );
+                       throw new Exception( 'Password configuration must contain a type name.' );
                }
                $this->config = $config;
                $this->factory = $factory;
@@ -125,6 +128,15 @@ abstract class Password {
                return $this->config['type'];
        }
 
+       /**
+        * Whether current password type is supported on this system.
+        *
+        * @return bool
+        */
+       protected function isSupported() {
+               return true;
+       }
+
        /**
         * Perform any parsing necessary on the hash to see if the hash is valid
         * and/or to perform logic for seeing if the hash needs updating.
@@ -169,9 +181,7 @@ abstract class Password {
         * @return bool
         */
        public function verify( $password ) {
-               Assert::parameter( is_string( $password ),
-                       '$password', 'must be string, actual: ' . gettype( $password )
-               );
+               Assert::parameterType( 'string', $password, '$password' );
 
                // No need to use the factory because we're definitely making
                // an object of the same type.
index b648260..4158082 100644 (file)
@@ -245,6 +245,7 @@ class ResourceLoader implements LoggerAwareInterface {
                $this->logger = $logger ?: new NullLogger();
 
                if ( !$config ) {
+                       // TODO: Deprecate and remove.
                        $this->logger->debug( __METHOD__ . ' was called without providing a Config instance' );
                        $config = MediaWikiServices::getInstance()->getMainConfig();
                }
@@ -422,6 +423,11 @@ class ResourceLoader implements LoggerAwareInterface {
 
                // Add the QUnit testrunner as implicit dependency to extension test suites.
                foreach ( $testModules['qunit'] as &$module ) {
+                       // Shuck any single-module dependency as an array
+                       if ( is_string( $module['dependencies'] ) ) {
+                               $module['dependencies'] = [ $module['dependencies'] ];
+                       }
+
                        $module['dependencies'][] = 'test.mediawiki.qunit.testrunner';
                }
 
index 57392b9..67de192 100644 (file)
@@ -133,9 +133,19 @@ class ResourceLoaderContext implements MessageLocalizer {
        /**
         * Return a dummy ResourceLoaderContext object suitable for passing into
         * things that don't "really" need a context.
+        *
+        * Use cases:
+        * - Creating html5shiv script tag in OutputPage.
+        * - Unit tests (deprecated, create empty instance directly or use RLTestCase).
+        *
         * @return ResourceLoaderContext
         */
        public static function newDummyContext() {
+               // This currently creates a non-empty instance of ResourceLoader (all modules registered),
+               // but that's probably not needed. So once that moves into ServiceWiring, this'll
+               // become more like the EmptyResourceLoader class we have in PHPUnit tests, which
+               // is what this should've had originally. If this turns out to be untrue, change to:
+               // `MediaWikiServices::getInstance()->getResourceLoader()` instead.
                return new self( new ResourceLoader(
                        MediaWikiServices::getInstance()->getMainConfig(),
                        LoggerFactory::getInstance( 'resourceloader' )
index 0e53e5e..4444b13 100644 (file)
@@ -878,25 +878,16 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        /**
         * Get the contents of a list of CSS files.
         *
-        * This is considered a private method. Exposed for internal use by WebInstallerOutput.
-        *
-        * @private
+        * @internal This is considered a private method. Exposed for internal use by WebInstallerOutput.
         * @param array $styles Map of media type to file paths to read, remap, and concatenate
         * @param bool $flip
-        * @param ResourceLoaderContext|null $context
+        * @param ResourceLoaderContext $context
         * @return array List of concatenated and remapped CSS data from $styles,
         *     keyed by media type
         * @throws MWException
-        * @since 1.27 Calling this method without a ResourceLoaderContext instance
-        *   is deprecated.
         */
-       public function readStyleFiles( array $styles, $flip, $context = null ) {
-               if ( $context === null ) {
-                       wfDeprecated( __METHOD__ . ' without a ResourceLoader context', '1.27' );
-                       $context = ResourceLoaderContext::newDummyContext();
-               }
-
-               if ( empty( $styles ) ) {
+       public function readStyleFiles( array $styles, $flip, $context ) {
+               if ( !$styles ) {
                        return [];
                }
                foreach ( $styles as $media => $files ) {
index ea1cf59..dfdbc07 100644 (file)
@@ -848,23 +848,23 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                $explicitlyDefinedTags = array_fill_keys( ChangeTags::listExplicitlyDefinedTags(), 0 );
                                $softwareActivatedTags = array_fill_keys( ChangeTags::listSoftwareActivatedTags(), 0 );
 
-                               // Hit counts disabled for perf reasons, see T169997
-                               /*
                                $tagStats = ChangeTags::tagUsageStatistics();
                                $tagHitCounts = array_merge( $explicitlyDefinedTags, $softwareActivatedTags, $tagStats );
 
-                               // Sort by hits
-                               arsort( $tagHitCounts );
-                               */
-                               $tagHitCounts = array_merge( $explicitlyDefinedTags, $softwareActivatedTags );
+                               // Sort by hits (disabled for now)
+                               //arsort( $tagHitCounts );
 
                                // Build the list and data
                                $result = [];
                                foreach ( $tagHitCounts as $tagName => $hits ) {
                                        if (
-                                               // Only get active tags
-                                               isset( $explicitlyDefinedTags[ $tagName ] ) ||
-                                               isset( $softwareActivatedTags[ $tagName ] )
+                                               (
+                                                       // Only get active tags
+                                                       isset( $explicitlyDefinedTags[ $tagName ] ) ||
+                                                       isset( $softwareActivatedTags[ $tagName ] )
+                                               ) &&
+                                               // Only get tags with more than 0 hits
+                                               $hits > 0
                                        ) {
                                                $result[] = [
                                                        'name' => $tagName,
index b4b6e26..0b37910 100644 (file)
@@ -177,8 +177,8 @@ class SpecialBlock extends FormSpecialPage {
                                'type' => 'radio',
                                'cssclass' => 'mw-block-editing-restriction',
                                'options' => [
-                                       $this->msg( 'ipb-sitewide' )->text() => 'sitewide',
-                                       $this->msg( 'ipb-partial' )->text() => 'partial',
+                                       $this->msg( 'ipb-sitewide' )->escaped() => 'sitewide',
+                                       $this->msg( 'ipb-partial' )->escaped() => 'partial',
                                ],
                                'section' => 'actions',
                        ];
index 02c33b5..2fe38ed 100644 (file)
@@ -171,7 +171,7 @@ class SpecialBookSources extends SpecialPage {
                        if ( $content instanceof TextContent ) {
                                // XXX: in the future, this could be stored as structured data, defining a list of book sources
 
-                               $text = $content->getNativeData();
+                               $text = $content->getText();
                                $out->addWikiTextAsInterface( str_replace( 'MAGICNUMBER', $isbn, $text ) );
 
                                return true;
index 5b939ef..3a180db 100644 (file)
@@ -152,6 +152,15 @@ class SpecialContributions extends IncludableSpecialPage {
                }
                $this->opts = ContribsPager::processDateFilter( $this->opts );
 
+               if ( $this->opts['namespace'] < NS_MAIN ) {
+                       $this->getOutput()->wrapWikiMsg(
+                               "<div class=\"mw-negative-namespace-not-supported error\">\n\$1\n</div>",
+                               [ 'negative-namespace-not-supported' ]
+                       );
+                       $out->addHTML( $this->getForm() );
+                       return;
+               }
+
                $feedType = $request->getVal( 'feed' );
 
                $feedParams = [
index e4672f8..6022ff4 100644 (file)
@@ -146,15 +146,18 @@ class DeletedContributionsPage extends SpecialPage {
                if ( $talk ) {
                        $tools = SpecialContributions::getUserLinks( $this, $userObj );
 
-                       # Link to contributions
-                       $insert['contribs'] = $linkRenderer->makeKnownLink(
+                       $contributionsLink = $linkRenderer->makeKnownLink(
                                SpecialPage::getTitleFor( 'Contributions', $nt->getDBkey() ),
                                $this->msg( 'sp-deletedcontributions-contribs' )->text()
                        );
-
-                       // Swap out the deletedcontribs link for our contribs one
-                       $tools = wfArrayInsertAfter( $tools, $insert, 'deletedcontribs' );
-                       unset( $tools['deletedcontribs'] );
+                       if ( isset( $tools['deletedcontribs'] ) ) {
+                               // Swap out the deletedcontribs link for our contribs one
+                               $tools = wfArrayInsertAfter(
+                                       $tools, [ 'contribs' => $contributionsLink ], 'deletedcontribs' );
+                               unset( $tools['deletedcontribs'] );
+                       } else {
+                               $tools['contribs'] = $contributionsLink;
+                       }
 
                        $links = $this->getLanguage()->pipeList( $tools );
 
index aebec2f..10a9e96 100644 (file)
@@ -468,7 +468,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
                        if ( $data['CCMe'] && $to != $from ) {
                                $ccTo = $from;
                                $ccFrom = $from;
-                               $ccSubject = $context->msg( 'emailccsubject' )->rawParams(
+                               $ccSubject = $context->msg( 'emailccsubject' )->plaintextParams(
                                        $target->getName(), $subject )->text();
                                $ccText = $text;
 
index 4b1b344..d99de1e 100644 (file)
@@ -110,10 +110,10 @@ class SpecialProtectedpages extends SpecialPage {
                                'class' => 'HTMLMultiSelectField',
                                'label' => $this->msg( 'protectedpages-filters' )->text(),
                                'flatlist' => true,
-                               'options' => [
-                                       $this->msg( 'protectedpages-indef' )->text() => 'indefonly',
-                                       $this->msg( 'protectedpages-cascade' )->text() => 'cascadeonly',
-                                       $this->msg( 'protectedpages-noredirect' )->text() => 'noredirect',
+                               'options-messages' => [
+                                       'protectedpages-indef' => 'indefonly',
+                                       'protectedpages-cascade' => 'cascadeonly',
+                                       'protectedpages-noredirect' => 'noredirect',
                                ],
                                'default' => $filters,
                        ],
index 1b2bda9..c4e4635 100644 (file)
@@ -119,7 +119,9 @@ class SpecialRedirect extends FormSpecialPage {
                        // ... and we can
                        if ( $mto && !$mto->isError() ) {
                                // ... change the URL to point to a thumbnail.
-                               $url = $mto->getUrl();
+                               // Note: This url is more temporary as can change
+                               // if file is reuploaded and has different aspect ratio.
+                               $url = [ $mto->getUrl(), $height === -1 ? 301 : 302 ];
                        }
                }
 
@@ -224,7 +226,21 @@ class SpecialRedirect extends FormSpecialPage {
                                break;
                }
                if ( $status && $status->isGood() ) {
-                       $this->getOutput()->redirect( $status->getValue() );
+                       // These urls can sometimes be linked from prominent places,
+                       // so varnish cache.
+                       $value = $status->getValue();
+                       if ( is_array( $value ) ) {
+                               list( $url, $code ) = $value;
+                       } else {
+                               $url = $value;
+                               $code = 301;
+                       }
+                       if ( $code === 301 ) {
+                               $this->getOutput()->setCdnMaxage( 60 * 60 );
+                       } else {
+                               $this->getOutput()->setCdnMaxage( 10 );
+                       }
+                       $this->getOutput()->redirect( $url, $code );
 
                        return true;
                }
index 9654bb7..3e560ad 100644 (file)
@@ -493,7 +493,7 @@ class SpecialUndelete extends SpecialPage {
                                'readonly' => 'readonly',
                                'cols' => 80,
                                'rows' => 25
-                       ], $content->getNativeData() . "\n" );
+                       ], $content->getText() . "\n" );
 
                        $buttonFields[] = new OOUI\ButtonInputWidget( [
                                'type' => 'submit',
index 3fac73c..aedb9e6 100644 (file)
@@ -99,7 +99,7 @@ class ActiveUsersPager extends UsersPager {
                ];
                $options = [];
                if ( $data !== null ) {
-                       $options['ORDER BY'] = 'qcc_title ' . $data['dir'];
+                       $options['ORDER BY'] = 'qcc_title ' . $data['order'];
                        $options['LIMIT'] = $data['limit'];
                        $conds = array_merge( $conds, $data['conds'] );
                }
index 69dce53..2fc946e 100644 (file)
@@ -32,7 +32,6 @@ use Wikimedia\Rdbms\IResultWrapper;
 class BlockListPager extends TablePager {
 
        protected $conds;
-       protected $page;
 
        /**
         * Array of restrictions.
@@ -46,7 +45,6 @@ class BlockListPager extends TablePager {
         * @param array $conds
         */
        public function __construct( $page, $conds ) {
-               $this->page = $page;
                $this->conds = $conds;
                $this->mDefaultDirection = IndexPager::DIR_DESCENDING;
                parent::__construct( $page->getContext() );
index 2b094b1..d03401d 100644 (file)
  */
 class NewPagesPager extends ReverseChronologicalPager {
 
-       // Stored opts
+       /**
+        * @var FormOptions
+        */
        protected $opts;
 
        /**
-        * @var HTMLForm
+        * @var SpecialNewpages
         */
        protected $mForm;
 
+       /**
+        * @param SpecialNewpages $form
+        * @param FormOptions $opts
+        */
        public function __construct( $form, FormOptions $opts ) {
                parent::__construct( $form->getContext() );
                $this->mForm = $form;
index f457d2f..bc4202e 100644 (file)
@@ -23,7 +23,7 @@ use MediaWiki\Linker\LinkRenderer;
 
 class ProtectedPagesPager extends TablePager {
 
-       public $mForm, $mConds;
+       public $mConds;
        private $type, $level, $namespace, $sizetype, $size, $indefonly, $cascadeonly, $noredirect;
 
        /**
@@ -32,7 +32,7 @@ class ProtectedPagesPager extends TablePager {
        private $linkRenderer;
 
        /**
-        * @param SpecialProtectedpages $form
+        * @param SpecialPage $form
         * @param array $conds
         * @param string $type
         * @param string $level
@@ -48,7 +48,6 @@ class ProtectedPagesPager extends TablePager {
                $sizetype, $size, $indefonly, $cascadeonly, $noredirect,
                LinkRenderer $linkRenderer
        ) {
-               $this->mForm = $form;
                $this->mConds = $conds;
                $this->type = ( $type ) ? $type : 'edit';
                $this->level = $level;
index 262903d..de0e4a6 100644 (file)
@@ -23,7 +23,7 @@ class SelectWithInputWidget extends \OOUI\Widget {
         *   - array $config['textinput'] Configuration for the TextInputWidget
         *   - array $config['dropdowninput'] Configuration for the DropdownInputWidget
         *   - bool $config['or'] Configuration for whether the widget is dropdown AND input
-        *                              or dropdown OR input
+        *       or dropdown OR input
         */
        public function __construct( array $config = [] ) {
                // Configuration initialization
@@ -36,7 +36,7 @@ class SelectWithInputWidget extends \OOUI\Widget {
                        $config
                );
 
-               if ( isset( $config['disabled'] ) && $config['disabled'] == true ) {
+               if ( isset( $config['disabled'] ) && $config['disabled'] ) {
                        $config['textinput']['disabled'] = true;
                        $config['dropdowninput']['disabled'] = true;
                }
index 006e3b7..8aa7c87 100644 (file)
@@ -1033,7 +1033,7 @@ class LanguageConverter {
                                $revision = Revision::newFromTitle( $title );
                                if ( $revision ) {
                                        if ( $revision->getContentModel() == CONTENT_MODEL_WIKITEXT ) {
-                                               $txt = $revision->getContent( Revision::RAW )->getNativeData();
+                                               $txt = $revision->getContent( Revision::RAW )->getText();
                                        }
 
                                        // @todo in the future, use a specialized content model, perhaps based on json!
index 4f24713..aaa5d16 100644 (file)
@@ -173,7 +173,7 @@ class Names {
                'gan' => '贛語', # Gan (multiple scripts - defaults to Traditional)
                'gan-hans' => "赣语(简体)\u{200E}", # Gan (Simplified Han)
                'gan-hant' => "贛語(繁體)\u{200E}", # Gan (Traditional Han)
-               'gcr' => 'kréyòl gwiyanè', # Guianan Creole
+               'gcr' => 'kriyòl gwiyannen', # Guianan Creole
                'gd' => 'Gàidhlig', # Scots Gaelic
                'gl' => 'galego', # Galician
                'glk' => 'گیلکی', # Gilaki
index 37055b1..b36855f 100644 (file)
        "passwordreset-domain": "النطاق:",
        "passwordreset-email": "عنوان البريد الإلكتروني:",
        "passwordreset-emailtitle": "تفاصيل حساب {{SITENAME}}",
-       "passwordreset-emailtext-ip": "احد Ù\85ا (Ù\82د Ù\8aÙ\83Ù\88Ù\86 Ø§Ù\86ت$1)Ø·Ù\84ب Ù\85Ø°Ù\83رة ØªÙ\81اصÙ\8aÙ\84 Ø§Ù\84حساب Ù\84{{SITENAME}} ($4).اÙ\84Ù\85ستخدÙ\85 Ø§Ù\84اتÙ\8a {{PLURAL:$3|اÙ\84حساب Ù\87Ù\88|اÙ\84حسابات Ù\87Ù\8a}} Ù\82د Ù\82رÙ\86 Ø¨Ù\87ذا Ø§Ù\84عÙ\86Ù\88اÙ\86 :\n\n$2\n\n{{PLURAL:$3|Ù\83Ù\84Ù\85Ø© Ø§Ù\84Ù\85رÙ\88ر Ø§Ù\84Ù\85ؤÙ\82تة|Ù\83Ù\84Ù\85ات Ø§Ù\84Ù\85رÙ\88ر Ø§Ù\84Ù\85ؤÙ\82Ø©}}سÙ\8aÙ\86تÙ\87Ù\8a Ù\81Ù\8a {{PLURAL:$5|Ù\8aÙ\88Ù\85|اÙ\8aاÙ\85$5 }}\nÙ\85Ù\86 Ø§Ù\84اÙ\81ضÙ\84 Ø§Ù\86 ØªØ³Ø¬Ù\84 Ø§Ù\84دخÙ\88Ù\84 Ù\88تختار Ù\83Ù\84Ù\85Ø© Ù\85رÙ\88ر Ø¬Ø¯Ù\8aدة Ø§Ù\84اÙ\86 .\nإذا Ù\82اÙ\85 Ø´Ø®Øµ Ø¢Ø®Ø± Ø¨Ù\87ذا Ø§Ù\84Ø·Ù\84بØ\8c Ø£Ù\88 Ø¥Ø°Ø§  ØªØ°Ù\83رت Ù\83Ù\84Ù\85Ø© Ø§Ù\84Ù\85رÙ\88ر Ø§Ù\84أصÙ\84Ù\8aØ© Ø§Ù\84خاصة Ø¨Ù\83Ø\8cÙ\88Ù\84Ù\85 ØªØ¹Ø¯ ØªØ±ØºØ¨ Ù\81Ù\8a ØªØºÙ\8aÙ\8aرÙ\87Ø\8c Ù\8aÙ\85Ù\83Ù\86Ù\83 ØªØ¬Ø§Ù\87Ù\84 Ù\87Ø°Ù\87 Ø§Ù\84رساÙ\84Ø© Ù\88Ù\85تابعة Ø§Ø³ØªØ®Ø¯Ø§Ù\85  Ù\83Ù\84Ù\85Ø© Ø§Ù\84Ù\85رÙ\88رالقديمة.",
-       "passwordreset-emailtext-user": "احد ما (قد يكون انت$1)طلب مذكرة تفاصيل الحساب ل{{SITENAME}} ($4).المستخدم الاتي {{PLURAL:$3|الحساب هو|الحسابات هي}} قد قرن بهذا العنوان :\n\n$2\n\n{{PLURAL:$3|كلمة المرور المؤقتة|كلمات المرور المؤقة}}سينتهي في {{PLURAL:$5|يوم|ايام$5 }}\nمن الافضل ان تسجل الدخول وتختار كلمة مرور جديدة الان .\nإذا قام شخص آخر بهذا الطلب، أو إذا  تذكرت كلمة المرور الأصلية الخاصة بك،ولم تعد ترغب في تغييره، يمكنك تجاهل هذه الرسالة ومتابعة استخدام  كلمة المرورالقديمة.",
+       "passwordreset-emailtext-ip": "أحد Ù\85ا (Ù\82د Ù\8aÙ\83Ù\88Ù\86 Ø£Ù\86تØ\8c Ù\85Ù\86 Ø§Ù\84عÙ\86Ù\88اÙ\86 $1)  Ø·Ù\84ب Ø¥Ø¹Ø§Ø¯Ø© Ø¶Ø¨Ø· Ù\83Ù\84Ù\85Ø© Ø³Ø± Ø­Ø³Ø§Ø¨Ù\83 Ø¹Ù\84Ù\89 {{SITENAME}} ($4). {{PLURAL:$3||اÙ\84حساب|اÙ\84حساباÙ\86| Ø§Ù\84حسابات}} Ø£Ø¯Ù\86اÙ\87 Ù\82د Ø§Ù\82ترÙ\86ت Ø¨Ø¨Ø±Ù\8aدÙ\83 Ø§Ù\84Ø¥Ù\84Ù\83ترÙ\88Ù\86Ù\8a :\n\n$2\n\n{{PLURAL:$3||Ù\83Ù\84Ù\85Ø© Ø§Ù\84سر Ø§Ù\84Ù\85ؤÙ\82تة|Ù\83Ù\84Ù\85ات Ø§Ù\84سر Ø§Ù\84Ù\85ؤÙ\82تة}} Ø³ØªÙ\86تÙ\87Ù\8a ØµÙ\84احÙ\8aتÙ\87ا Ù\81Ù\8a {{PLURAL:$5||Ù\8aÙ\88Ù\85 Ù\88احد|Ù\8aÙ\88Ù\85Ù\8aÙ\86|$5 Ø£Ù\8aاÙ\85|$5 Ù\8aÙ\88Ù\85ا|$5 Ù\8aÙ\88Ù\85}}\nÙ\8aÙ\85Ù\83Ù\86Ù\83 ØªØ³Ø¬Ù\8aÙ\84 Ø§Ù\84دخÙ\88Ù\84 Ù\88اختÙ\8aار Ù\83Ù\84Ù\85Ø© Ø³Ø± Ø¬Ø¯Ù\8aدة. Ø¥Ø°Ø§ Ù\83اÙ\86 Ù\87ذا Ø§Ù\84Ø·Ù\84ب ØªÙ\85 Ø¨Ù\88اسطة Ø´Ø®Øµ Ø£Ø®Ø±Ø\8c Ø£Ù\88 Ø¥Ø°Ø§ ØªØ°Ù\83رت Ù\83Ù\84Ù\85Ø© Ø§Ù\84سر Ø§Ù\84أصÙ\84Ù\8aØ© Ø§Ù\84خاصة Ø¨Ù\83Ø\8c Ù\88Ù\84Ù\85 ØªØ¹Ø¯ ØªØ±ØºØ¨ Ù\81Ù\8a ØªØºÙ\8aÙ\8aرÙ\87اØ\8c Ù\8aÙ\85Ù\83Ù\86Ù\83 ØªØ¬Ø§Ù\87Ù\84 Ù\87Ø°Ù\87 Ø§Ù\84رساÙ\84Ø© Ù\88Ù\85تابعة Ø§Ø³ØªØ®Ø¯Ø§Ù\85 Ù\83Ù\84Ù\85Ø© Ø§Ù\84سر القديمة.",
+       "passwordreset-emailtext-user": "المستخدم $1 على {{SITENAME}} طلب إعادة ضبط كلمة سر حسابك على {{SITENAME}} ($4). {{PLURAL:$3||الحساب|الحسابان| الحسابات}} أدناه قد اقترنت ببريدك الإلكتروني :\n\n$2\n\n{{PLURAL:$3||كلمة السر المؤقتة|كلمات السر المؤقتة}} ستنتهي صلاحيتها في {{PLURAL:$5||يوم واحد|يومين|$5 أيام|$5 يوما|$5 يوم}}\nيمكنك تسجيل الدخول واختيار كلمة سر جديدة. إذا كان هذا الطلب تم بواسطة شخص أخر، أو إذا تذكرت كلمة السر الأصلية الخاصة بك، ولم تعد ترغب في تغييرها، يمكنك تجاهل هذه الرسالة ومتابعة استخدام كلمة السر القديمة.",
        "passwordreset-emailelement": "اسم المستخدم: \n$1\n\nكلمة السر المؤقتة: \n$2",
        "passwordreset-emailsentemail": "أرسل بريد إلكتروني تذكيري",
        "changeemail": "تغيير عنوان البريد الإلكتروني",
        "recentchangeslinked": "تغييرات ذات علاقة",
        "recentchangeslinked-title": "التغييرات المرتبطة ب \"$1\"",
        "recentchangeslinked-summary": "هذي ليستة بالتبديلات إلّي صاروا ما صارلهمش برشا للپاجات إلّي موجود ليان يدّي ليهم في پاج بذاتها (ولّا في پاج متاع تصنيف معين).\nالپاجات في [[Special:Watchlist|ليستة الپاجات إلّي تّبعها]] '''مكتوبين بالغليظ'''",
-       "recentchangeslinked-page": "Ø¥سم الپاج:",
+       "recentchangeslinked-page": "اسم الپاج:",
        "recentchangeslinked-to": "أظهر التغييرات للصفحات الموصولة للصفحة المعطاة عوضاً عن ذلك",
        "upload": "صبّ فشياي",
        "uploadlogpage": "سجل الرفع",
index 9118eae..5d02563 100644 (file)
        "wrongpasswordempty": "كلمة السر المدخلة كانت فارغة.\nمن فضلك حاول مرة أخرى.",
        "passwordtooshort": "يجب أن تتكون كلمة السر على الأقل من {{PLURAL:$1|حرف واحد|حرفين|$1 حروف|$1 حرفا|$1 حرف}}.",
        "passwordtoolong": "كلمات السر لا يجب أن تكون أطول من  {{PLURAL:$1|1 حرف|$1 حروف}}.",
-       "passwordtoopopular": "لا يمكن استخدام كلمات المرور المختارة بشكل عام; يُرجَى اختيار كلمة مرور يصعب تخمينها.",
-       "passwordinlargeblacklist": "كلمة المرور التي تم إدخالها موجودة في قائمة كلمات المرور شائعة الاستخدام; الرجاء اختيار كلمة مرور فريدة.",
+       "passwordtoopopular": "لا يمكن استخدام كلمات السر المختارة بشكل عام; يرجى اختيار كلمة سر يصعب تخمينها.",
+       "passwordinlargeblacklist": "كلمة السر التي تم إدخالها موجودة في قائمة كلمات المرور شائعة الاستخدام; الرجاء اختيار كلمة سر فريدة.",
        "password-name-match": "يجب أن تكون كلمة المرور مختلفة عن اسم المستخدم.",
        "password-login-forbidden": "تم منع استخدام اسم المستخدم هذا وكلمة السر.",
        "mailmypassword": "أعد تعيين كلمة السر",
        "botpasswords-disabled": "كلمات السر الخاصة بالبوت معطلة.",
        "botpasswords-no-central-id": "لاستخدام كلمة السر الخاصة بالبوت، يجب أن تقوم بتسجيل الدخول من خلال حساب موحد.",
        "botpasswords-existing": "كلمات مرور البوت الموجودة",
-       "botpasswords-createnew": "إنشاء كلمة مرور جديدة للبوت",
-       "botpasswords-editexisting": "تعديل كلمة مرور موجودة للبوت",
+       "botpasswords-createnew": "إنشاء كلمة سر جديدة للبوت",
+       "botpasswords-editexisting": "تعديل كلمة سر موجودة للبوت",
        "botpasswords-label-needsreset": "(تحتاج كلمة المرور إلى إعادة الضبط)",
        "botpasswords-label-appid": "اسم البوت:",
        "botpasswords-label-create": "أنشأ",
        "botpasswords-deleted-body": "كلمة سر البوت \"$1\" {{GENDER:$2|للمستخدم|للمستخدمة}} \"$2\" قد حذفت.",
        "botpasswords-newpassword": "كلمة السر الجديدة لتسجيل الدخول ب <strong>$1</strong> هي <strong>$2</strong>. <em>من فضلك سجل هذه كمرجع في المستقبل .</em><br> (للبوتات القديمة التي تتطلب أن يكون اسم تسجيل الدخول مثل اسم المستخدم النهائي، يمكنك أيضا استخدام <strong>$3</strong> كاسم مستخدم و <strong>$4</strong> ككلمة سر.)",
        "botpasswords-no-provider": "BotPasswordsSessionProvider غير متاح.",
-       "botpasswords-restriction-failed": "قيود كلمة مرور البوت تمنع هذا الولوج.",
+       "botpasswords-restriction-failed": "قيود كلمة سر البوت تمنع هذا الولوج.",
        "botpasswords-invalid-name": "اسم المستخدم الموفر لا يحتوي على فاصل كلمة سر البوت (\"$1\").",
        "botpasswords-not-exist": "المستخدم \"$1\" لا يمتلك كلمة سر بوت بالاسم \"$2\".",
-       "botpasswords-needs-reset": "يجب إعادة تعيين كلمة مرور البوت لاسم بوت \"$2\" {{GENDER:$1|المستخدم|المستخدم}}\".",
+       "botpasswords-needs-reset": "يجب إعادة تعيين كلمة سر البوت لاسم بوت \"$2\" {{GENDER:$1|المستخدم|المستخدم}}\".",
        "botpasswords-locked": "لا يمكنك تسجيل الدخول بكلمة مرور بوت حيث تم منع حسابك.",
        "resetpass_forbidden": "كلمات السر لا يمكن تغييرها",
        "resetpass_forbidden-reason": "لا يمكن تغيير كلمة المرور: $1",
        "resetpass-abort-generic": "منعت مُلحقة إتمام صيرورة تغيير كلمة السّر.",
        "resetpass-expired": "انتهت مدة صلاحية كلمة السر الخاصة بك. الرجاء تعيين كلمة سر جديدة لتسجيل الدخول.",
        "resetpass-expired-soft": "انتهت مدة صلاحية كلمة السر الخاصة بك; الرجاء تغيير كلمة سر جديدة الآن أو النقر على زر إلغاء لإعادة تعيين كلمة السر لاحقاً.",
-       "resetpass-validity": "كلمة المرور غير صالحة: $1\n\nيُرجَى تعيين كلمة مرور جديدة لتسجيل الدخول.",
+       "resetpass-validity": "كلمة السر غير صالحة: $1\n\nيرجى تعيين كلمة سر جديدة لتسجيل الدخول.",
        "resetpass-validity-soft": "كلمة السر الخاصة بك غير صالحة :  $1 \n\nرجاءا اختر كلمة سر جديدة الآن، أو انقر فوق \"{{int:authprovider-resetpass-skip-label}}\" لتغييرها في وقت لاحق.",
        "passwordreset": "إعادة ضبط كلمة السر",
        "passwordreset-text-one": "أكمل هذا النموذج لإعادة ضبط كلمة السر الخاصة بك.",
        "edit-slots-cannot-add": "{{PLURAL:$1|الفتحة|الفتحات}} التالية غير مدعومة هنا: $2.",
        "edit-slots-cannot-remove": "{{PLURAL:$1|الفتحة|الفتحات}} التالية مطلوبة ولا يمكن إزالتها: $2.",
        "edit-slots-missing": "{{PLURAL:$1|الفتحة|الفتحات}} التالية مفقودة: $2.",
-       "postedit-confirmation-created": "تÙ\85 Ø§نشاء الصفحة.",
+       "postedit-confirmation-created": "تÙ\85 Ø¥نشاء الصفحة.",
        "postedit-confirmation-restored": "تم استعادة الصفحة.",
        "postedit-confirmation-saved": "تعديلك حفظ.",
        "postedit-confirmation-published": "تم نشر تعديلك.",
        "statistics-edits-average": "متوسط التعديلات لكل صفحة",
        "statistics-users": "مستخدمون مسجلون",
        "statistics-users-active": "مستخدمون نشطون",
-       "statistics-users-active-desc": "المستخدمون الذين قاموا بفعل في آخر {{PLURAL:$1||يوم|يومين|$1 أيام|$1 يوماً|$1 يوم}}",
+       "statistics-users-active-desc": "المستخدمون الذين قاموا بفعل في آخر {{PLURAL:$1|$1 يوم|يوم|يومين|$1 أيام|$1 يوما|$1 يوم}}",
        "pageswithprop": "صفحات مع خاصية الصفحة",
        "pageswithprop-legend": "صفحات مع خاصية الصفحة",
        "pageswithprop-text": "تسرد هذه الصفحة الصفحات التي تستخدم خاصية صفحة معينة.",
        "authmanager-realname-help": "الاسم الحقيقي للمستخدم",
        "authmanager-provider-password": "توثيق مبني على كلمة المرور",
        "authmanager-provider-password-domain": "توثيق مبني على كلمة المرور والنطاق",
-       "authmanager-provider-temporarypassword": "كلمة مرور مؤقتة",
+       "authmanager-provider-temporarypassword": "كلمة سر مؤقتة",
        "authprovider-confirmlink-message": "بناء على محاولات تسجيل الدخول الحديثة الخاصة بك، فالحسابات التالية يمكن وصلها بحساب الويكي الخاص بك. وصلهم يفعل تسجيل الدخول عبر هذه الحسابات. من فضلك اختر أيهم ينبغي أن يتم وصلها.",
        "authprovider-confirmlink-request-label": "الحسابات التي ينبغي أن يتم وصلها",
        "authprovider-confirmlink-success-line": "$1: تم الوصل بشكل صحيح.",
index 7155b22..3030ab4 100644 (file)
@@ -24,7 +24,8 @@
                        "Fitoschido",
                        "Sagsag",
                        "Bodhisattwa",
-                       "Vlad5250"
+                       "Vlad5250",
+                       "ৰাজীৱ গোস্বামী"
                ]
        },
        "tog-underline": "সংযোগসমূহ অধোৰেখিত কৰক:",
        "resetpass_submit": "গুপ্তশব্দ বহুৱাওক আৰু প্ৰৱেশ কৰক",
        "changepassword-success": "আপোনাৰ গুপ্তশব্দ সফলতাৰে সলনি কৰা হৈছে!",
        "changepassword-throttled": "আপুনি স‍ম্প্ৰতি অজস্ৰবাৰ লগ্‌-ইনৰ প্ৰয়াস কৰিছে।\nঅনুগ্ৰহ কৰি $1 সময়ৰ পিছত আকৌ চেষ্টা কৰক।",
+       "botpasswords-disabled": "Bot গুপ্তশব্দ নিষ্ক্ৰিয়",
        "botpasswords-label-create": "সৃষ্টি কৰক",
        "botpasswords-label-update": "আপডেট কৰক",
        "botpasswords-label-cancel": "বাতিল কৰক",
index fd356d7..74c7e34 100644 (file)
        "privacypage": "Project:গোপনীয়তার নীতি",
        "badaccess": "অনুমোদন ত্রুটি",
        "badaccess-group0": "আপনি যে কাজের জন্য অনুরোধ করেছেন তা আপনার সম্পন্ন করার অনুমতি নেই।",
-       "badaccess-groups": "à¦\86পনি à¦¯à§\87 à¦\95াà¦\9cà¦\9fি à¦\95রতà§\87 à¦\9aাà¦\9aà§\8dà¦\9bà§\87ন à¦¤à¦¾ à¦\95à§\87বল {{PLURAL:$2|à¦\8fà¦\87 à¦¦à¦²à§\87র|à¦\8fà¦\87 à¦¦à¦²à¦\97à§\81লির à¦¯à§\87à¦\95à§\8bন à¦\8fà¦\95à¦\9fির}} à¦\8fà¦\95à¦\9cন à¦¸à¦¦à¦¸à§\8dয à¦¬à§\8dযবহারà¦\95ারà§\80 à¦¸à¦®à§\8dপাদন à¦\95রতà§\87 à¦ªà¦¾à¦°à§\87ন: $1।",
+       "badaccess-groups": "আপনি যে কাজটি করতে চাচ্ছেন তা কেবল {{PLURAL:$2|এই দলের|এই দলগুলির যেকোন একটির}} একজন ব্যবহারকারী সম্পাদন করতে পারেন: $1।",
        "versionrequired": "মিডিয়াউইকির $1 নং সংস্করণ প্রয়োজন",
        "versionrequiredtext": "এই পাতাটি ব্যবহার করার জন্য মিডিয়াউইকির $1 নং সংস্করণ প্রয়োজন। [[Special:Version|সংস্করণ পাতা]] দেখুন।",
        "ok": "ঠিক আছে",
index 2636d28..ab3b572 100644 (file)
@@ -10,7 +10,8 @@
                        "아라",
                        "Mjbmr",
                        "Beyronvan",
-                       "Isevand"
+                       "Isevand",
+                       "Kikumoron"
                ]
        },
        "tog-underline": "هومپاٛیڤٱندٱل زیر خٱتدار",
        "mypreferencesprotected": "ایسا سلا آلشدکاری چیا دیٱر خوتۊناْ نارین.",
        "ns-specialprotected": "نیبۊ بٱلگاْیٱل ڤیجاْ ناْ آلشد کرد",
        "titleprotected": "ای داسۊن ڤا دٱسدا کاریار [[User:$1|$1]] نیاگری ڤابیڌاْ.\nدلیلس یوناْ <em>$2</em>.",
+       "filereadonlyerror": "ایسا نٱترین جانیا \"$1\" ناْ آلشد کونین سی یو کاْ جاگٱ جانیا \"$2\" فٱقٱت ب هال و بال خوندناْ.\nدیڤونداری کاْ قولفس کرداْ چونو گوهڌاْ:\"$3\".",
        "invalidtitle": "داسوݩ بی ٱرزشد",
        "invalidtitle-knownnamespace": "داسوݩ نادیار سی نوم جا \"$2\" و متن \"$3\"",
        "invalidtitle-unknownnamespace": "داسوݩ گٱن ڤا شوماراْ نومجا نادیار سی $1 و متن \"$2\"",
        "nocookiesnew": "هساو کاریاری راست ڤابی، ڤٱلی ایسا هاْنی نٱڤوڌیناْ ڤامیٛن.{{SITENAME}} کۊکیا ناْ سی ڤامیٛن ٱڤوڌن ناْ کاریارٱل اْڤٱناْ ڤا کار.\nکۊکیا ایسا ناکونشتگٱر ڤابیڌناْ.\nلوتف کونین کونشتگٱرسون کونین، اوسو ڤا یٱ نوم کاریاری و رازیناْ گوڌٱشتن دیٱ بیائین ڤامیٛن.",
        "nocookieslogin": "{{SITENAME}} کۊکیٱل سی ڤامیٛن ٱڤوڌن ڤٱنس ڤاکار.\nکۊکیٱل ایسا ناکونشتگٱر ڤابیڌناْ.\nلوتف کونین ڤنوناْ کونشتگٱر کونین و ز نۉ تلاش کونین.",
        "nocookiesfornew": "هساو کاریاری راسد نٱڤابی، سی یو ناْ کاْ ایما نٱتریم سرچشماْساْ پوشت راست کاری کونیم.\nخاتر جٱم بۊین کاْ کۊکیٱل کونشتکار ڤابیناْ، ای بٱلگاْ ناْ ز نۉ سوڤار کونین و یٱ کاْرٱت دیٱ تلاش کونین.",
+       "createacct-loginerror": "هساو ڤا خۊڤی راسد ڤابی، ڤیٛلی ایسا نٱترین خودٱنجوم بیائین ڤامیٛن.لوتف کونین چونو [[Special:UserLogin|manual login]] بیائین ڤامیٛن.",
        "noname": "ایسا یٱ نوم کاریاری خۊ تیار نٱکردیناْ.",
        "loginsuccesstitle": "ایسا ٱڤوڌین ڤامیٛن",
        "loginsuccess": "'''ایسا ٱڤوڌین ڤامیٛن {{SITENAME}} چی \"$1\".'''",
        "wrongpasswordempty": "رازیناْ گوڌٱشتنتۊن هالی یا نادیار بی.\nمٱنمۊنداریم ز نۉ تلاش کونین.",
        "passwordtooshort": "رازیناْ گوڌاْشدن ایسا ڤا هٱدٱقل {{PLURAL:$1|1 کاراکتر|$1 کاراکترٱل}} داشداْ بۊ.",
        "passwordtoolong": "رازیناْ گوڌاْشدن ایسا نٱڤا  بیشتر ز {{PLURAL:$1|1 کاراکتر|$1 کاراکترٱل}} داشداْ بۊ.",
+       "passwordtoopopular": "نٱترین رازیناْ گوڌٱشتن دٱم دٱسد ناْ ڤٱنین ڤاکار. لوتف کونین رازیناْ گوڌٱشتنی ناْ ڤوردارین کاْ ب ڤیر کٱسی نٱرٱساْ.",
+       "passwordinlargeblacklist": "رازیناْ گوڌٱشتن ایسا میٛن نومگٱ رازیناْیٱل گوڌٱشتن دٱم دٱسداْ. لوتف کونین یٱ رازیناْ گوڌٱشتن دیٱ ناْ ڤوردارین.",
        "password-name-match": "رازیناْ گوڌٱشتنتوݩ ڤا نوم کاریاری فٱرخ داشداْ بۊ",
        "password-login-forbidden": "ایسا نٱترین ای نوم کاریاری و رازیناْ گوڌٱشتن ناْ ڤٱنین ڤا کار.",
        "mailmypassword": "ز نۉ داڌن رازیناْ گوڌٱشتن",
        "noemail": "هیژ تیرنشوݩ ٱنجوماناماْیی سی کاریار \"$1\" زٱفت نٱڤابیڌاْ.",
        "noemailcreate": "ایسا ڤا یٱ تیرنشوݩ جادیار داشداْ بۊین",
        "passwordsent": "یٱ رازیناْ گوڌٱشتن باْسی ڤابی ب تیرنشوݩ ٱنجوماناماْیی کاْ سٱڤت کردیناْ \"$1\".\nخاهشت اْکونیم نیا گرهڌنس بیائین ڤامیٛن.",
+       "blocked-mailpassword": "ایسا نٱترین ڤا تیرنشوݩ آی پی خوتوݩ ڤیرایشد کونین، سی نیاگری ز سۊاٛستفاڌاْ ز سلا ٱڤوردن سی ڤاجوسد رازیناْ گوڌٱشتنتوݩ ز ای آی پی ناْ ناراْ.",
        "eauthentsent": "یٱ ٱنجوماناماْ پوشت راست کردنی سی یٱ تیرنشوݩ ڤیجاْ بیٛسی ڤابیڌاْ.\nنیا یو کاْ یٱ ٱنجوماناماْ دیٱر سی هساوتوݩ بیٛسی ڤابۊ، ایسا ڤا نیا رٱدیارکونی ناْ ز ٱنجوماناماْ بگرین، سی یو کاْ هساو ایسا ز راستی پوشت راست ڤابۊ.",
        "throttled-mailpassword": "یٱ رازیناْ گوڌٱشتن ز نۉ سیتو بیٛسی ڤابیڌاْ، میٛن {{PLURAL:$1|ساعت|$1 ساعتٱل}}.\nسی نیاگری ز ٱزیٱت ڤابیڌن، فٱقٱت یٱ رازیناْ گوڌٱشتن ز نۉ بیٛسی ڤابیڌاْ سی ٱنجوماناماْتوݩ میٛن {{PLURAL:$1|ساعت|$1 ساعتٱل}} .",
        "mailerror": "خٱتا میٛن باْسی کردن ٱنجوماناماْ:$1",
+       "acct_creation_throttle_hit": "ڤانیٱرٱل ای ڤیکی کاْ تیرنشوݩ آی پی ایسا ناْ ڤٱندناْ ڤا کار میٛن $2 دیندایی{{PLURAL:$1|یٱ هساو کاریاری|$1 هساو کاریاری}} ناْ راسد کردناْ، کاْ بیشترین ٱندازاْ موجاز سیسوݩ میٛن هٱمو گات بیڌاْ.\nسی هٱمی یو، ڤانیٱرٱلی کاْ ای تیرنشوݩ آی پی ناْ ڤٱندناْ ڤا کار ایساْ نٱترن یٱ هساو کاریاری تازاْ راسد کونن.",
        "emailauthenticated": "تیرنشوݩ ٱنجوماناماْتوݩ میٛن $2 سی $3 پوشت راسد کاری ڤابی.",
        "emailnotauthenticated": "تیرنشوݩ ٱنجوماناماْتوݩ هٱنی پوشت راسدکاری نٱڤٱبیڌاْ.\nهٱنی ٱنجوماناماْیی سی چیٱلی کاْ نیاتونن بیٛسی نٱڤابیڌاْ.",
+       "noemailprefs": "سی رٱڤٱندن چونو چی یٱ تیرنشوݩ ٱنجوماناماْ میٛن چیا خوتوݩ تیار کونین.",
        "emailconfirmlink": "تیرنشوݩ ٱنجوماناماْ خوتوناْ پوشت راسدکاری کونین.",
+       "invalidemailaddress": "تیرنشوݩ ٱنجوماناماْیی کاْ داڌیناْ خۊ نی، سی یو کاْ فورمٱتس گٱناْ.\nلوتف کونین یٱ تیرنشوݩ ڤا فورمٱت خۊ بزنین یا جاساْ هالی بیٛنین.",
        "cannotchangeemail": "نٱترین تیرنشوݩ ٱنجوماناماْ هساو میٛن ای ڤیکی ناْ آلشدکاری کونین",
        "emaildisabled": "ای دیارگٱ نٱتٱراْ سیتوݩ ٱنجوماناماْ بفرشناْ",
        "accountcreated": "هساو راسد ڤابی",
        "accountcreatedtext": "هساو کاریاری سی  [[{{ns:کاریار}}:$1|$1]] ([[{{ns:چٱک چناْ کاریار}}:$1|چٱک چناْ]]) راسد ڤابیڌاْ.",
        "createaccount-title": "هساو سی {{SITENAME}} راسد ڤابی",
+       "createaccount-text": "یٱ نفر ڤا ٱنجوماناماْ ایسا یٱ هساو کاریاری میٛن  {{SITENAME}} ($4) ڤا نوم\"$2\" راسد کرداْ، و رازیناْ گوڌٱشتنس یوناْ:\"$3\"\nایسا ڤا رۉین ڤامیٛن و رازیناْ گوڌٱشتن خوتوناْ آلشد کونین.\nٱر چونو هساو اٛشتاڤایی راسد ڤابیڌاْ کاری ڤا ای پاٛیغوم ناشداْ بۊین.",
        "login-throttled": "ایسا تا ایساْ سی ڤامیٛن ٱڤوڌن غٱلٱڤاْ تلاش کردیناْ.\n$1 لوتف کو یاْتی دٱس ڤاڌار و ز نۉ تلاش کو.",
        "login-abort-generic": "ٱڤوڌن ڤامیٛنتو خراو ڤابی یا نتیجاْ ناشت.",
        "login-migrated-generic": "هساو کاریاریتوݩ جا ب جا ڤابیڌاْ، و نوم کاریاری ایسا دٱ میٛن ڤیکی نیڌس.",
        "loginlanguagelabel": "زڤون:$1",
+       "suspicious-userlogout": "خاستتوݩ سی رٱهڌن ب دٱر ز ساموناْ رٱڌ ڤابی چونو کاْ دیاراْ چونو خاستی ڤا یٱ یا یٱ پوروکسی میٛنجقاگر بیٛسی ڤابیڌاْ بۊ",
+       "createacct-another-realname-tip": "نو راستٱکی دل ب خائیاْ.\nٱر بزنینس گات ڤورگٱشتن ب آریٛنگٱلتوݩ و ڤورگٱشت هونو ب ایسا نوم راستٱکی توݩ ناْ ڤٱناْ ڤا کار.",
        "pt-login": "ڤامین ٱڤوڌن",
        "pt-login-button": "ڤامیٛن ٱڤوڌن",
        "pt-login-continue-button": "پوشت سریٱک بیائین ڤامیٛن",
        "pt-userlogout": "ز ساموناْ درٱڤوڌن",
        "php-mail-error-unknown": "خٱتا نادیار د آلشتگٱر PHP's mail()",
        "user-mail-no-addy": "سی بیٛسی کردن ٱنجوماناماْ بی یو کاْ یٱ تیرنشوݩ ٱنجوماناماْیی بۊ تلاش ڤابی",
+       "user-mail-no-body": "ایسا تلاش کردین یٱ ٱنجوماناماْ ڤا میٛنوناْ کۊتال یا هالی بیٛسی کونین.",
        "changepassword": "آلشد کردن رازیناْ گوڌٱشتن",
        "resetpass_announce": "سی تٱموم کردن ڤامیٛن ٱڤوڌن، ایسا ڤا یٱ رازیناْ گوڌٱشتن تازاْ ناْ بزنین.",
        "resetpass_header": "رازیناْ گوڌاْشتن هساو ناْ آلشد کونین",
        "changepassword-success": "رازیناْ گوڌٱشتنتوݩ آلشد ڤابی!",
        "changepassword-throttled": "ایسا تا ایساْ سی ڤامیٛن ٱڤوڌن غٱلٱڤاْ تلاش کردیناْ.\n$1 لوتف کو یاْتی دٱس ڤاڌار و ز نۉ تلاش کو.",
        "botpasswords": "رازیناْیٱل گوڌٱشتن بوتٱل",
+       "botpasswords-summary": "<em>زازیناْ گوڌٱشتن روباتی</em> سلا دٱرسی ب یٱ هساو کاریاری ڤا اْی آی پی ناْ بی یو کاْ رازیناْ گوڌٱشتن ٱسلی هساو کاریاری ناْ بزنین اْڌاْ.\nدٱسرسی کاریاری مۉجۊڌ گاتی کاْ ڤا رازیناْ گوڌٱشتن روباتیک اٛرین ڤامیٛن گاشا دٱسگر بۊ.\nار نڌونین کاْ گاشا ڤاس چ کونین، اٛئتمالٱ نٱڤا هیژ کاری کونین، هیژ کٱسی نٱڤا زیسا بخا کاْ یکی ز یونونی کاْ راسد کردیناْ بڌین ڤورس.",
        "botpasswords-disabled": "نٱترین سی بوتٱل رازیناْ گوڌٱشتن باْنین",
        "botpasswords-no-central-id": "سی ڤاکار ڤٱندن رازیناْیٱل گوڌٱشتن بوت، ایسا ڤا بیائین ڤامیٛن سی یو کاْ هساو کاریاریتو یٱکاگر ڤابۊ.",
        "botpasswords-existing": "رازیناْ گوڌٱشتن سی بوتٱل",
        "botpasswords-label-cancel": "ٱنجومشیڤ کردن",
        "botpasswords-label-delete": "پاکسا کردن",
        "botpasswords-label-resetpassword": "ز نۉ داڌن رازیناْ گوڌٱشتن",
+       "botpasswords-label-grants": "هوقۊق کونشتگٱر ڤابیڌنی:",
        "botpasswords-label-grants-column": "داڌاْ ڤابی",
        "botpasswords-bad-appid": "نوم\"$1\" سی بوت خۊ نی.",
        "botpasswords-insert-failed": "اْزاف کردن نوم \"$1\" سی بوت ناخوش سرٱنجوم بی. آیا هاْنی اْزاف نٱڤابیڌاْ?",
        "botpasswords-updated-body": "رازیناْ گوڌٱشتن سی \"$1\" {{GENDER:$2|کاریار}} \"$2\" ب هنگوم ساز ڤابی.",
        "botpasswords-deleted-title": "رازیناْ گوڌٱشتن سی بوت پاکسا ڤابی",
        "botpasswords-deleted-body": "رازیناْ گوڌٱشتن سی \"$1\" {{GENDER:$2|کاریار}} \"$2\" پاکسا ڤابی.",
+       "botpasswords-no-provider": "BotPasswordsSessionProvider نیڌس.",
+       "botpasswords-restriction-failed": "دٱسگریٱل رازیناْ گوڌٱشتن روبات نیا ای ڤامیٛن ٱڤوڌن ناْ اْگراْ.",
+       "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": "لوتف کونین رازیناْ گوڌٱشتن خوتوناْ آلشد کونین سی یٱ رازیناْ گوڌٱشتن غیٛر ز رازیناْ گوڌٱشتن ایسنی.",
        "resetpass-temp-password": "رازیناْ گوڌٱشتن موڤٱقٱت:",
+       "resetpass-abort-generic": "آلشد کردن رازیناْ گوڌٱشتن ڤا یکی ز دیندادیسٱل ٱنجومشیڤ ڤابیڌاْ.",
        "resetpass-expired": "گات رازیناْ گوڌٱشتن ایسا خلاس ڤابیڌاْ. لوتف کونین یٱ رازیناْ گوڌٱشتن تازاْ سی ڤامیٛن ٱڤوڌن بیٛنین.",
+       "resetpass-validity": "رازیناْ گوڌٱشتن ایسا خۊ نیڌ:$1\n\nلوتف کونین یٱ رازیناْ گوڌٱشتن تازاْ سی ڤامیٛن ٱڤوڌن بیٛنین.",
        "passwordreset": "ز نۉ داڌن رازیناْ گوڌٱشتن",
+       "passwordreset-text-one": "سی ڤاجوست رازیناْ گوڌٱشتنتوݩ ای فورم ناْ پور کونین.",
+       "passwordreset-text-many": "{{PLURAL:$1|سی گرهڌن یٱ رازیناْ گوڌٱشتن موڤٱقٱت ز ٱنجوماناماْ، یکی ز هوناْیٱل ناْ پور کونین.}}",
        "passwordreset-username": "نوم کاریاری",
        "passwordreset-domain": "پۊشگر",
        "passwordreset-email": "تیرنشوݩ ٱنجومانامٱ",
        "content-json-empty-array": "آرایاْ هالی",
        "template-loop-category": "بٱلگاْیٱلی کاْ خٱتا هٱلقاْ چۊاْ دارن",
        "undo-failure": "سی نڤیڌن سلۊکی ڤا آلشڌکاریٱل مؽنجخائی ای آلشڌکاریناْ نؽڤۊ بؽ هرنڳ کرڌ",
+       "undo-nochange": "چونو کاْ دیار ای آلشدکاری سرییٛ خومسا ڤابیڌاْ.",
+       "undo-summary": "ٱنجومشیڤ ڤابیڌاْن ڤانیٱری $1 ڤا [[Special:Contributions/$2|$2]] ([[User talk:$2|چٱک چناْ]])",
+       "undo-summary-username-hidden": "ٱنجومشیڤ کردن ڤانیٱری $1 کاْ ڤا یٱ کاریار نادیٱر ٱنجوم ڤابیڌاْ.",
        "viewpagelogs": "دیاری کردن پهرستنۊماْیٱل ای بٱلگاْ",
        "nohistory": "هیژ ڤیرگار ڤیرایشتی سی ای بٱلگاْ نیڌ.",
        "currentrev": "آخری ڤانیٱری",
        "revdelete-radio-set": "قام آبیڌاْ",
        "revdelete-radio-unset": "دٱم تی",
        "revdelete-log": "دلیل:",
+       "revdel-restore": "آلشد هال و بال ديڌن",
        "pagehist": "ڤیرگار بٱلگاْ",
        "deletedhist": "ڤیرگار پاکسا ڤابیڌاْ",
        "revdelete-reasonotherlist": "دلیل هاْنی",
        "revdelete-edit-reasonlist": "دلیل پاکسا کردن آلشدکاریٱل",
        "mergehistory-from": "بٱلگاْ سرچشماْ:",
        "mergehistory-into": "بٱگاْ مٱقسٱڌ:",
+       "mergehistory-list": "ڤیرگار آلشدکاریٱل سٱریٱک بیڌنی",
+       "mergehistory-go": "دیاری کردن آلشدکاریٱل سٱریٱک بیڌنی",
        "mergehistory-submit": "سر یٱک کردن ڤانیاریٱل",
+       "mergehistory-fail-invalid-source": "سرچشمٱ بٱلگاْ نادیاراْ.",
+       "mergehistory-fail-invalid-dest": "بٱلگاْ مٱقسٱڌ نادیاراْ.",
        "mergehistory-reason": "دلیل:",
        "mergelog": "سیائاْ ؤریٱک",
        "revertmerge": "سٱڤا کردن",
        "history-title": "دوڤارتاْ دیڌن ڤیرگار $1",
        "difference-title": "فٱرخ میٛنجقا ڤاناٛیریا \"$1\"",
-       "difference-multipage": "(فٱخ میٛنجقا بٱلگاْیٱل)",
+       "difference-title-multipage": "فٱرخ میٛنجقا بٱلگاْیٱل \"$1\" و \"$2\"",
+       "difference-multipage": "(فٱرخ میٛنجقا بٱلگاْیٱل)",
        "lineno": "خٱت $1:",
        "compareselectedversions": "کنار یٱک ناهاڌن ڤانیٱریٱل گولاْڤورچین ڤابیڌاْ",
        "editundo": "ٱنجومشیڤ کردن",
        "diff-empty": "(یٱ جۊر)",
        "diff-multi-sameuser": "({{PLURAL:$1|یٱ دۊناٛ نوسقاٛ مؽنجخایی|$1 نوسقاٛیٱل مؽنجخایی}} ب دٱسد{{PLURAL:$2|کاریاری ديٱ|$2 کاريارا}} نشۊن دیاری نٱکرداْ)",
        "diff-multi-otherusers": "({{PLURAL:$1|یٱ نوسقاْ میٛنجقایی|$1 نوسقاْیٱل میٛنجایی}} ڤا دٱسد {{PLURAL:$2|کاریاری دیٱ|$2 کاریارٱل}} نشۊن داڌاْ نٱڤابیڌاْ)",
+       "diff-paragraph-moved-tonew": "پاراگراف جا ب جا ڤابی، یٱ کاْرٱت بپۊرنین تا رۉین یٱ جا دیٱر.",
+       "diff-paragraph-moved-toold": "پاراگراف جا ب جا ڤابی، یٱ کاْرٱت بپۊرنین تا رۉین ب جا نیایی.",
        "searchresults": "نتيجاْیٱل پاٛی جۊری",
        "search-filter-title-prefix-reset": "پاٛی جۊری میٛن تٱموم بٱلگاْیٱل",
        "searchresults-title": "نتيجاْیٱل پاٛی جۊری سی \"$1\"",
        "search-redirect": "(ڤاگٱردونی ز $1)",
        "search-section": "(بٱرجا $1)",
        "search-category": "(دٱسداْ $1)",
-       "search-file-match": "(Û\8cÚ©Û\8c Ú©Ø±Ø¯Ù\86 Ù\85Û\8cÙ\86Û\8aناْ جانیا)",
+       "search-file-match": "(Û\8cÚ©Û\8c Ú©Ø±Ø¯Ù\86 Ù\85Û\8cÙ\9bÙ\86Ù\88ناْ جانیا)",
        "search-suggest": "مٱنزۊرت یو بی:$1",
        "search-interwiki-default": "نتیجاْیٱل $1:",
        "search-interwiki-more": "(بيشتر)",
        "prefs-rc": "آلشدکاریٱل ایسنی",
        "prefs-watchlist": "ساٛیل بٱرگ",
        "prefs-editwatchlist": "آلشدکاری ساٛیل بٱرگ",
+       "prefs-editwatchlist-clear": "ساٛیل بٱرگ خوتوناْ پاکسا کونین",
        "prefs-watchlist-edits-max": "شوماراْ بیشتروناْ:1000",
        "prefs-watchlist-token": "نشوناْ ساٛیل بٱرگ:",
        "prefs-misc": "شيڤسدن",
        "saveprefs": "کۊ کردن",
        "prefs-editing": "ب هال و بال ڤیرایشت",
        "searchresultshead": "پاٛی جۊری",
-       "stub-threshold-sample-link": "نمۊناْ",
+       "stub-threshold-sample-link": "نموناْ",
        "stub-threshold-disabled": "ناکونشتگٱر کردن",
        "prefs-help-recentchangescount": "شوماراْ بیشتروناْ:1000",
        "timezonelegend": "گات راستاگٱ:",
        "localtime": "گات ڤولاتی:",
        "timezoneuseserverdefault": "ڤیکی پیش فٱرز($1) ڤٱنین ڤا کار",
+       "timezone-useoffset-placeholder": "ٱرزایشت نموناْ:\"-07:00\" یا \"01:00\"",
        "servertime": "گات رسیناْجا:",
        "guesstimezone": "ڤا جاگٱرد پور اْبۊ",
        "timezoneregion-africa": "اْفرقا",
        "timezoneregion-america": "اْمرکا",
+       "timezoneregion-arctic": "قوتب شمال",
        "timezoneregion-asia": "آسيا",
        "timezoneregion-atlantic": "جهون اۉ آتلانتیک",
        "timezoneregion-australia": "اوستارالیا",
        "timezoneregion-europe": "اورۊپا",
        "timezoneregion-indian": "جهون اۉ هند",
+       "timezoneregion-pacific": "جهون اۉ آروم",
+       "allowemail": "کاریارٱل دیٱر تٱرن سیم ٱنجوماناماْ بیٛسی کونن.",
        "prefs-searchoptions": "پاٛی جۊری",
        "prefs-namespaces": "نوم ڤارگٱیٱل",
        "default": "پیش فٱرز",
        "prefs-custom-css": "CSS جاڤٱسداْ",
        "prefs-custom-json": "JSON جاڤٱسداْ",
        "prefs-custom-js": "JavaScript جاڤٱسداْ",
+       "prefs-common-config": "CSS/JSON/JavaScript هومبٱئر سی تٱموم پۊستاْیٱل:",
        "prefs-emailconfirm-label": "پوشت راست کاری انجوماناماْ:",
        "youremail": "ٱنجوماناماْ",
        "username": "{{GENDER:$1|نوم کاریاری}}:",
        "prefs-registration": "گات سٱڤت نام:",
        "yourrealname": "نوم راستاْکی:",
        "yourlanguage": "زڤون",
+       "yourvariant": "میٛنوناْ آلشتگٱر زڤون:",
        "yournick": "اْمزا تازاْ",
+       "badsig": "اْمزار خوم نادیار.\nسٱردیسٱل HTML ناْ ڤارسی کو.",
+       "yourgender": "ایسا بیشتر دۊس دارین چ جۊری گوهڌاْ ڤابۊ؟",
        "gender-male": "هو(پیا) ڤیکی ناْ آلشد کرد.",
        "gender-female": "هو(زیناْ) ڤیکی ناْ آلشد کرد.",
        "email": "ٱنجوماناماْ",
        "prefs-help-realname": "نوم راستٱکی دل ب خاییاْ.\nار ایسا هوناْ ڤارڌ کونین، میٛن گات ڤاگٱردونی سی کارٱلتون ڤا نوم خوتون اٛستفاڌاْ بۊ.",
+       "prefs-help-email-required": "ڤا تیرنشوݩ ٱنجوماناماْ بۊ.",
+       "prefs-info": "ڌونائیٱل ٱسلی",
        "prefs-i18n": "میٛن زایاراْیی سازی",
        "prefs-signature": "اْمزا",
        "prefs-dateformat": "شلگ گات",
        "prefs-advancedrendering": "گوزیناْیٱل پیشکرداْ",
        "prefs-advancedsearchoptions": "گوزیناْیٱل پیشکرداْ",
        "prefs-advancedwatchlist": "گوزیناْیٱل پیشکرداْ",
+       "prefs-displayrc": "گوزیناْیٱل نشوݩ داڌئن",
+       "prefs-displaywatchlist": "گوزیناْیٱل نشوݩ داڌئن",
+       "prefs-pageswatchlist": "بٱلگاْیٱل زیر تی",
        "prefs-tokenwatchlist": "نشوݩ",
        "prefs-diffs": "فٱرخ",
        "userrights": "هوقۊق کاریار",
        "userrights-lookup-user": "یٱ کاریار ناْ گولاْ ڤورچین کونین",
        "userrights-user-editname": "نوم کاریاریتۊناْ بزنین",
+       "editusergroup": "سوڤارکرد جٱرغاْیٱل کاریار",
+       "editinguser": "آلشدکاری هوقۊق کاریاری {{GENDER:$1|کاریار}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "دیڌن هوقۊق کاریاری {{GENDER:$1|کاریار}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "آلشدکاری {{GENDER:$1|کاریار}} جٱرغاْیٱل",
        "userrights-viewusergroup": "دیڌن {{GENDER:$1|کاریار}} جٱرغاْیٱل",
        "saveusergroups": "کۊ کردن {{GENDER:$1|کاریار}} جٱرغاْیٱل",
        "userrights-groupsmember": "ٱندوم:",
        "userrights-groupsmember-auto": "ٱندوم نادیار:",
        "userrights-reason": "دلیل:",
+       "userrights-changeable-col": "جٱرغاْیٱلی کاْ ایسا تٱرین آلشدسوݩ کونین.",
+       "userrights-unchangeable-col": "جٱرغاْیٱلی کاْ ایسا نٱتٱرین آلشدسوݩ کونین.",
+       "userrights-expiry-none": "تٱموم نٱڤابی",
        "userrights-expiry": "خلاس ڤابیڌاْ:",
        "userrights-expiry-othertime": "گات هیٛنی:",
        "userrights-expiry-options": "1 رۊز:1 رۊز،1 هٱفتاْ:1 هٱفتاْ،1 ما:1 ،ما،3 مایٱل:3 مایٱل،6 مایٱل:6 مایٱل،1 year:1 سال",
+       "userrights-invalid-expiry": "گات تٱموم ڤابیڌن سی جٱرغٱ\"$1\" لیشاْ.",
+       "userrights-expiry-in-past": "گات تٱموم ڤابیڌن سی جٱرغٱ\"$1\" رٱڌ ڤابیڌاْ.",
        "group": "جٱرغاْ:",
        "group-user": "کاریارٱل",
        "group-autoconfirmed": "کاریارٱل خودپوشت راسد ڤابیڌاْ.",
        "right-upload_by_url": "سوڤار کرد جانیایٱل ز یٱ یۊ آر اْل",
        "right-writeapi": "سي نڤشدن اْی پی آی ڤٱنين ڤاکار",
        "right-delete": "پاکسا کردن بٱلگاْیٱل",
+       "right-bigdelete": "بٱلگاْیٱلی ناْ کاْ ڤیرگار گٱپ دارن پاکسا کونین.",
+       "right-browsearchive": "پاٛی جۊری میٛن بٱلگاْیٱل پاکسا ڤابیڌاْ.",
+       "right-undelete": "بٱلگاْ ناْ پاکسا نٱکونین",
+       "right-block": "نیا کاریارٱل دیٱر ناْ ز آلشدکاری بگرین.",
+       "right-blockemail": "نیا کاریار ناْ سی بیٛسی کردن ٱنجوماناماْ بگرین",
+       "right-hideuser": "نیاگری یٱ نوم کاریاری، قام کردنس ز ڤٱر تی خٱلک",
+       "right-unblockself": "خوساْ قولف نٱکونین",
+       "right-editinterface": "رابت کاریار ناْ آلشد کو.",
+       "right-editusercss": "آلشدکاری جانیایٱل CSS کاریارٱل دیٱر.",
+       "right-edituserjson": "آلشدکاری جانیایٱل JSON کاریارٱل دیٱر.",
+       "right-edituserjs": "آلشدکاری جانیایٱل JavaScript کاریارٱل دیٱر.",
+       "right-import": "ڤارڌ کردن بٱلگاْیٱل ز ڤیکیٱل دیٱ",
+       "right-importupload": "ڤارڌ کردن بٱگاْیٱل ز جانیا سوڤار ڤابیڌاْ.",
+       "right-userrights": "هوقۊق تٱموم کاریارٱل ناْ آلشد کونین",
+       "right-userrights-interwiki": "هوقۊق کاریاری تٱموم کاریارٱل میٛن ڤیکیٱل دیٱری ناْ آلشد کونین.",
+       "right-siteadmin": "رسیناْجا ناْ یا قولف کونین یا قولف نٱکونین",
        "right-sendemail": "بیٛسی کردن ٱنجوماناماْ سی کاریارٱل دیٱر",
        "grant-group-email": "ٱنجوماناماْ باْسی ڤابیڌاْ.",
+       "grant-blockusers": "قولف کردن یا نٱکردن کاریارٱل",
        "grant-createaccount": "راسد کردن هساو کاریاری",
+       "grant-createeditmovepage": "راسد کردن، آلشدکاری و جا ب جا کردن بٱلگاْیٱل",
+       "grant-editmycssjs": " CSS/JSON/JavaScript کاریاری خوتوناْ آلشد کونین",
        "grant-editmywatchlist": "ساٛیل بٱرگ خوتوݩ ناْ آلشد کونین",
        "grant-editprotected": "آلشدکاری بٱلگاْیٱل پٱر و پیم ڤابیڌاْ",
        "grant-uploadeditmovefile": "سوڤار کردن، جانشین کردن، و جا ب جا کردن جانیایٱل",
        "grant-uploadfile": "سوڤار کردن جانیایٱل تازاْ.",
+       "grant-basic": "هوقۊق ٱسلی",
        "grant-viewmywatchlist": "ڤیر ڤٱنین ڤا ساٛیل بٱرگ خوتوݩ",
        "newuserlogpage": "راسد ڤابیاْ ڤا کاریار",
        "rightslog": "پهرستنۊماْ حقوق کاریار",
        "action-read": "ای بٱلگاْ بخون",
        "action-edit": "ای بلگٱ نٱ آلشدکاری کو",
        "action-createpage": "ای بٱلگاْ ناْ راسد کو",
-       "action-createaccount": "ڤاکل ای هساْو مؽنتوری",
+       "action-createaccount": "ڤاکل ای هساو مؽنتوری",
+       "action-history": "دیڌن ڤیرگار ای بٱلگاْ",
+       "action-minoredit": "ای آلشدکاری ناْ چی یٱ هیرداْ ڤیرایشت نشوݩ دیار کو",
        "action-move": "جابجا کردن ای بٱلگاْ",
-       "action-movefile": "جا ب جا کردن ای بٱلگاْ",
+       "action-move-subpages": "ای بٱلگاْ و زیربٱلگاْیٱلساْ جا ب جا کو",
+       "action-move-rootuserpages": "جا ب جا کردن ریشاْ بٱلگاْیٱل کاریار",
+       "action-move-categorypages": "جا ب جا کردن دٱسداْ بٱلگاْیٱل",
+       "action-movefile": "جا ب جا کردن ای جانیا",
        "action-upload": "ای جانیا ناْ سوڤار کونین",
+       "action-writeapi": "سي نڤشدن اْی پی آی ڤٱنين ڤاکار",
        "action-delete": "ای بٱلگاْ ناْ پاکسا کو",
        "action-deleterevision": "پاکسا کردن ڤانیاریٱل",
+       "action-undelete": "پاکسا نٱکردن بٱلگاْیٱل",
+       "action-userrights": "هوقۊق تٱموم کاریارٱل ناْ آلشد کونین",
+       "action-siteadmin": "رسیناْجا ناْ یا قولف کونین یا قولف نٱکونین",
        "action-sendemail": "ٱنجوماناماْ باْسی ڤابیڌاْ.",
        "action-editmywatchlist": "ساٛیل بٱرگ خوتوݩ ناْ آلشد کونین",
        "action-viewmywatchlist": "ڤیر ڤٱنین ڤا ساٛیل بٱرگ خوتوݩ",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (هٱچونوݩ ڤاْ[[Special:NewPages|نومگٱ بٱلٛگیٱل نۊ]] ساٛل ؤوٱنین)",
        "recentchanges-submit": "دیاری کردن",
        "rcfilters-tag-remove": "ڤورداشتن '$1'",
+       "rcfilters-activefilters": "فیلترٱل کونشتکار",
        "rcfilters-activefilters-hide": "قام کردن",
        "rcfilters-activefilters-show": "دیاری کردن",
+       "rcfilters-advancedfilters": "فیلترٱل پیشکرداْ",
+       "rcfilters-limit-title": "نتیجاْیٱل سی دیاری کردن",
+       "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|آلشدکاری|آلشدکاریٱل}}, $2",
+       "rcfilters-days-title": "رۊزٱل ایسنی",
        "rcfilters-days-show-days": "$1 {{PLURAL:$1|رۊز|رۊزٱل}}",
+       "rcfilters-highlighted-filters-list": "پورٱنڳ ڤابیڌاْ:$1",
        "rcfilters-quickfilters": "فیلترٱل کۊ ڤابیڌاْ",
        "rcfilters-quickfilters-placeholder-title": "هیژ فیلتری کۊ نٱڤابیڌاْ",
        "rcfilters-savedqueries-defaultlabel": "فیلترٱل کۊ ڤابیڌاْ",
        "rcfilters-savedqueries-new-name-label": "نوم",
        "rcfilters-savedqueries-apply-label": "راسد کردن فیلتر",
        "rcfilters-savedqueries-cancel-label": "ٱنجومشیڤ کردن",
+       "rcfilters-clear-all-filters": "پاک کردن تٱموم فیلترٱل",
+       "rcfilters-show-new-changes": "ساٛیل کردن تازاْترین آلشدکاریٱل",
        "rcfilters-invalid-filter": "فیلتر نادیار",
        "rcfilters-filterlist-title": "فیلترٱل",
+       "rcfilters-filterlist-whatsthis": "یونو چ جۊر کار اْکونن؟",
+       "rcfilters-highlightmenu-title": "یٱ رٱنڳ گولاْڤورچین کونین",
+       "rcfilters-filterlist-noresults": "هیچ فیلتری دیاری نکرد.",
        "rcfilters-filter-editsbyself-label": "ایسا آلشدس کردین",
+       "rcfilters-filter-editsbyother-label": "آلشدکاریٱل دیٱرون",
        "rcfilters-filter-user-experience-level-registered-label": "سٱڤت نام ڤابیڌاْ",
        "rcfilters-filter-user-experience-level-unregistered-label": "سٱڤت نام نٱڤابیڌاْ",
+       "rcfilters-filter-user-experience-level-newcomer-label": "تازاْ ڤٱرڌٱل",
        "rcfilters-filter-bots-label": "بوت",
        "rcfilters-filter-humans-label": "آئم(بوت نٱ)",
        "rcfilters-filter-minor-label": "هیرداْ ڤیرایشت",
        "rcfilters-filter-watchlist-watched-label": "میٛن ساٛیل بٱرگ",
        "rcfilters-filter-watchlist-watched-description": "آلشدکاریٱل میٛن بٱلگاْیٱلی کاْ میٛن ساٛیل بٱرگتونن",
+       "rcfilters-filter-watchlistactivity-unseen-label": "آلشدکاریٱل دیاری نٱکرداْ",
        "rcfilters-filter-watchlistactivity-seen-label": "آلشدکاریٱل دیاری کرداْ",
        "rcfilters-filtergroup-changetype": "جۊر آلشدکاری",
        "rcfilters-filter-pageedits-label": "آلشدکاریٱل بٱلگاْ",
        "rcfilters-filtergroup-lastRevision": "آخری ڤانیٱریٱل",
        "rcfilters-filter-lastrevision-label": "آخری ڤانیٱری",
        "rcfilters-tag-prefix-namespace-inverted": "<strong>:نیڌ</strong> $1",
+       "rcfilters-target-page-placeholder": "نوم یٱ بٱلگاْ(یا دٱسداْ) ناْ بزنین",
        "rcnotefrom": "ڤازیر {{PLURAL:$5|آلشدکاری|آلشدکاریٱل}}ز ڤیرگار strong>$3, $4</strong> تا ڤیرگار <strong>$1</strong>  دیاری اْکونن .",
        "rclistfrom": "دیار کردن آلشدکاریٱل ز $3 $2",
        "rcshowhideminor": "آلشدکاری کۊچیر $1",
        "rcshowhidemine": "$1 آلشدکاریٱل مو",
        "rcshowhidemine-show": "نشوݩ دائن",
        "rcshowhidemine-hide": "قام کردن",
+       "rcshowhidecategorization": "دٱسداْ بٱندی بٱلگاْ $1",
        "rcshowhidecategorization-show": "دیاری کردن",
        "rcshowhidecategorization-hide": "قام کردن",
        "rclinks": "دیاری کردن دینائی $1 آلشڌ مؽن $2 رۊز دیندایی",
        "boteditletter": "ب",
        "rc-change-size-new": "$1 {{PLURAL:$1|بایت|بایتٱل}} نیا آلشدکاری",
        "newsectionsummary": "/* $1 */ بٱئرجا تازاْ",
+       "rc-enhanced-expand": "دیاری کردن جوزئیات",
+       "rc-enhanced-hide": "قام کردن جوزئیات",
        "rc-old-title": "زاتٱ چی \"$1\" راس ڤابیڌاْ",
        "recentchangeslinked": "آلشدکاریٱل تاْ یٱک",
        "recentchangeslinked-feed": "تغییرات مرتبط",
        "uploadlogpage": "پهرستنۊماْ سوڤارکرد",
        "filename": "نوم جانیا",
        "filedesc": "چكستٱ",
+       "fileuploadsummary": "چکستٱ:",
        "filereuploadsummary": "آلشدکاریٱل جانیا:",
+       "filestatus": "هال و بال کوپی رایت:",
        "filesource": "سرچشمٱ:",
        "empty-file": "جانیایی کاْ داڌینساْ هالیاْ.",
        "file-too-large": "جانیایی کاْ داڌینساْ غٱلٱڤاْ گٱپاْ",
        "upload-source": "سرچشماْ جانیا",
        "sourcefilename": "سرچشماْ نوم جانیا:",
        "sourceurl": "سرچشماْ يۊ آر ال:",
+       "destfilename": "نوم جانیا مٱقسٱڌ:",
+       "upload-description": "تۉزی جانیا",
        "watchthisupload": "ساٛیل ای جانیا کونین",
        "upload-proto-error": "پورتوکول نادوروسد",
        "upload-file-error": "خٱتا میٛنجقایی",
+       "upload-misc-error": "خٱتا سوڤارکرد نادیار",
+       "upload-dialog-title": "سوڤار کردن جانیا",
        "upload-dialog-button-cancel": "ٱنجومشیڤ کردن",
        "upload-dialog-button-back": "دیندا",
        "upload-dialog-button-done": "ٱنجوم ڤابی",
        "upload-dialog-button-upload": "سوڤارکرد",
        "upload-form-label-infoform-title": "جوزئیات",
        "upload-form-label-infoform-name": "نوم",
+       "upload-form-label-infoform-description": "تۉزی",
        "upload-form-label-usage-title": "ڤا کار ڤٱندن",
        "upload-form-label-usage-filename": "نوم جانيا",
        "upload-form-label-own-work": "یو کار موناْ.",
        "upload-form-label-infoform-categories": "دٱسداْیٱل",
        "upload-form-label-infoform-date": "ڤیرگار",
+       "http-invalid-url": "یۊ آر اْل لیش:$1",
+       "http-read-error": "خٱتا خوندن اْچ تی تی پی.",
+       "http-internal-error": "خٱتا میٛنجقایی اْچ تی تی پی",
        "license": "میٛن هال و بال لیسانس دار ڤابیڌن",
        "license-header": "میٛن هال و بال ليسانس دار ڤابيڌن",
        "listfiles-delete": "پاکسا کردن",
        "linkstoimage-more": "More than $1 {{PLURAL:$1|page uses|pages use}} this file.\nThe following list shows the {{PLURAL:$1|first page|first $1 pages}} that use this file only.\nA [[Special:WhatLinksHere/$2|full list]] is available.",
        "nolinkstoimage": "ای پٱرڤٱناْ مؽن هیچ بٱلٛیاْ نؽڌا",
        "linkstoimage-redirect": "$1 (ڤاگٱردۊنی جانیا) $2",
-       "sharedupload": "ای فایل یک آپلود اشتراکی هده و ممکنه زه طریق  پروژه‌های دیگه  هم قابل دسترسی بوه",
+       "sharedupload": "ای جانیا کاْ ز  $1 گاشا میٛن پوروجاْیٱل دیٱ ڤٱسداْ بۊ ڤاکار",
        "sharedupload-desc-here": "جانیایی کاْ میٛن $1 گاشا میٛن پوروجٱیٱل هٱنی ٱم ب کار گرهڌاْ ڤابیڌاْ بۊ.\nتۉزی سی [$2 file description page] میٛن دڤۊن دیاراْ",
        "filepage-nofile": "چونو جانیایی ڤا چونڤ اْسمی نیڌس.",
-       "uploadnewversion-linktext": "آپلود کردن یه نسخه تازه زه ای فایل",
+       "uploadnewversion-linktext": "یٱ نوسقاْ تازاْ زی جانیا سوڤار کونین",
        "shared-repo-from": "ز $1",
        "upload-disallowed-here": "ايسا ناْترین ای جانیا نٱ ز نۉ سوڤار کونین",
+       "filerevert": "ز سرگرهڌن سی $1",
+       "filerevert-legend": "ز سرگرهڌن جانیا",
        "filerevert-comment": "دلیل:",
+       "filerevert-submit": "لرنیڌن",
        "filedelete": "$1 ناْ پاکسا کو",
        "filedelete-legend": "پاکسا کردن جانیا",
        "filedelete-comment": "دلیل:",
        "filedelete-submit": "پاکسا کردن",
+       "filedelete-success": "<strong>$1</strong> پاکسا ڤابیڌاْ.",
+       "filedelete-otherreason": "دیٱری/دلیل اْزافی:",
        "filedelete-reason-otherlist": "دلیل هیٛنی",
+       "filedelete-reason-dropdown": "*دلیل جاڤٱسداْ سی پاکسا کردن\n*تی پۊشنیڌن ز کوپی رایت\n*جانیا تکراری",
+       "filedelete-edit-reasonlist": "دلیل پاکسا کردن ناْ آلشد کونین",
+       "filedelete-maintenance-title": "نیبۊ جانیا ناْ پاکسا کونین",
        "mimesearch": "MIME جستجو رو پایه",
+       "mimetype": "جۊر MIME:",
        "download": "گرهڌن",
-       "listredirects": "لیست تغییر مسیرها",
-       "unusedtemplates": "قالبها یا الگوهای استفاده نوابیده",
+       "listredirects": "نومگاْ ڤاگٱردونیٱل",
+       "unusedtemplates": "چۊئاْیٱل ڤا کار نٱڤٱسداْ",
+       "unusedtemplateswlh": "هومپاٛیڤٱندٱل هیٛنی",
        "randompage": "بٱلگاْ شامسٱکی",
        "randomincategory-category": "دٱسداْ:",
        "randomincategory-submit": "رۉ",
-       "randomredirect": "تغییر مسیر اتفاقی",
+       "randomredirect": "ڤاگٱردونی بٱختٱکی",
        "statistics": "آمار",
+       "statistics-header-pages": "آمار بٱلگاْ",
+       "statistics-header-edits": "آمار آلشدکاریٱل",
+       "statistics-header-users": "آمار کاریارٱل",
+       "statistics-articles": "بٱلگاْیٱل مینۊناْ دار",
        "statistics-pages": "بٱگاْیٱل",
+       "statistics-files": "جانیایٱل سوڤار ڤابیڌاْ",
+       "statistics-users": "کاریارٱل سٱڤت نام کرداْ",
+       "statistics-users-active": "کاریارٱل کونشتکار",
+       "pageswithprop-prop": "نوم خاسیٱت:",
        "pageswithprop-submit": "رۉ",
-       "doubleredirects": "تغییر مسیر دوبله",
+       "doubleredirects": "ڤاگٱردونی دۊبلاْ",
        "double-redirect-fixer": "ساموݩکار آلشڌتورٱل",
-       "brokenredirects": "تغییرمسیرهای اشکسته وخراو",
+       "brokenredirects": "ڤاگٱردونیٱل بی سرٱنجوم",
        "brokenredirects-edit": "آلشدکاری کردن",
        "brokenredirects-delete": "پاکسا کردن",
-       "withoutinterwiki": "صÙ\81حات Ø¨Ø¯Ù\88Ù\86 Ù\84Û\8cÙ\86Ú© Ù\87اÛ\8c Ø²Ø¨Ø§Ù\86Û\8c Ù\85Û\8cاÙ\86 Ù\88Û\8cÚ©Û\8c",
+       "withoutinterwiki": "بٱÙ\84گاÙ\92Û\8cÙ±Ù\84Û\8c Ú©Ø§Ù\92 Ù\87Ù\88Ù\85پاÙ\9bÛ\8cÚ¤Ù±Ù\86د Ø²Ú¤Ù\88Ù\86 Ù\86ارÙ\86",
        "withoutinterwiki-legend": "دیندادیس",
        "withoutinterwiki-submit": "دیاری کردن",
-       "fewestrevisions": "صÙ\81حات Ø¨Ø§ Ú©Ù\85ترÛ\8cÙ\86 ØªØ¹Ø¯Ø§Ø¯Ø§ØµÙ\84احات Ù\88تجدÛ\8cدÙ\86ظرÙ\87ا",
+       "fewestrevisions": "بٱÙ\84گاÙ\92Û\8cÙ±Ù\84Û\8c Ú©Ø§Ù\92 Ú©Ù\85ترÛ\8cÙ\86 Ú¤Ø§Ù\86Û\8cٱرÛ\8c Ù\86اÙ\92 Ø¯Ø§Ø±Ù\86",
        "nbytes": "$1 {{PLURAL:$1|بایت|بایت}}",
        "ncategories": "{{PLURAL:$1|دٱسداْ|دٱسداْیٱل}}",
        "ninterwikis": "$1 {{PLURAL:$1|میٛن ڤیکی|میٛن ڤیکی یٱل}}",
        "nmembers": "$1 {{PLURAL:$1|ٱندوم|ٱندومٱل}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|ٱندوم|ٱندومٱل}}",
        "nrevisions": "$1 {{PLURAL:$1|ڤانیٱری|ڤانیٱریٱل}}",
-       "lonelypages": "صفحات یتیم وابیده",
-       "uncategorizedpages": "صفحات دسته بندی نوابیده",
-       "uncategorizedcategories": "دسته های دسته بندی نوابیده",
-       "uncategorizedimages": "فایلهای تصویری دسته بندی نوابیده",
-       "uncategorizedtemplates": "قالبها یا الگوهای دسته بندی نوابیده",
-       "unusedcategories": "دسته های استفاده نوابیده",
-       "unusedimages": "فایلهای استفاده نوابیده",
-       "wantedcategories": "دسته های  درخواستی",
-       "wantedpages": "صفحات درخواستی",
-       "mostlinked": "صفحاتی که بیشتر زه همه به هونو لینک داده وابیده",
-       "mostlinkedcategories": "دسته هایی که بیشتر زه همه به هونو لینک داده وابیده",
-       "mostlinkedtemplates": "قالبها یا الگوهایی که بیشتر زه همه به هونو لینک داده وابیده",
-       "mostcategories": "صفحات با بیشترین تعداد دسته بندی",
-       "mostimages": "تصاویری که بیشتر زه همه به هونو لینک داده وابیده",
-       "mostrevisions": "صفحات با تعداد اصلاحات زیاد",
+       "nimagelinks": "ڤا کار ڤٱسداْ میٛن $1 {{PLURAL:$1|بٱلگاْ|بٱلگاْیٱل}}",
+       "ntransclusions": "ڤا کار ڤٱسداْ میٛن $1 {{PLURAL:$1|بٱلگاْ|بٱلگاْیٱل}}",
+       "specialpage-empty": "نتیجاْیی سی ای گوزارشت نی.",
+       "lonelypages": "بٱلگاْیٱل ییٛتیم",
+       "uncategorizedpages": "بٱلگاْیٱل دٱسداْ بٱندی نٱڤابیڌاْ",
+       "uncategorizedcategories": "دٱسداْیٱل دٱسداْ بٱندی نٱڤابیڌاْ",
+       "uncategorizedimages": "جانیایٱل دٱسداْ بٱندی نٱڤابیڌاْ",
+       "uncategorizedtemplates": "چۊئاْیٱل دٱسداْ بٱندی نٱڤابیڌاْ",
+       "unusedcategories": "دٱسداْیٱل ڤا کار نٱڤٱسداْ",
+       "unusedimages": "جانیایٱل ڤا کار نٱڤٱسداْ",
+       "wantedcategories": "دٱسداْیٱل خاستنی",
+       "wantedpages": "بٱلگاْیٱل خاستنی",
+       "wantedfiles": "جانیایٱل خاستنی",
+       "wantedtemplates": "چۊئاْیٱل خاستنی",
+       "mostlinked": "بٱلگاْیٱلی کاْ بیشترین هومپاٛیڤٱند ناْ دارن",
+       "mostlinkedcategories": "دٱسداْیٱلی کاْ بیشترین هومپاٛیڤٱند ناْ دارن",
+       "mostlinkedtemplates": "چۊئاْیٱلی کاْ بیشترین هومپاٛیڤٱند ناْ دارن",
+       "mostcategories": "بٱلگاْیٱلی کاْ بیشترین دٱسداْبندی ناْ دارن",
+       "mostimages": "عسگایی کاْ بیشترین هومپاٛیڤٱند ناْ دارن",
+       "mostrevisions": "بٱلگاْیٱلی کاْ بیشترین ڤانیٱری ناْ دارن",
        "prefixindex": "نماواٛ نهاڤٱنڌ",
        "prefixindex-submit": "دیاری کردن",
-       "shortpages": "صفحات کوتاه",
-       "longpages": "صفحات بلند",
-       "deadendpages": "صفحات بن بست ولاینحل",
-       "protectedpages": "صفحات حفاظت وحمایت وابیده",
+       "prefixindex-strip": "دیندادیس ناْ میٛن نتیچاْیٱل قام کو",
+       "shortpages": "بٱلگاْیٱل کۊچیر",
+       "longpages": "بٱلگاْیٱل بولوند",
+       "deadendpages": "بٱلگاْیٱل بون بٱست",
+       "protectedpages": "بٱلگاْیٱل پٱر و پیم ڤابیڌاْ",
        "protectedpages-filters": "فيلترٱل",
        "protectedpages-page": "بٱلگاْ",
        "protectedpages-expiry": "خلاس ڤابیڌاْ:",
        "protectedpages-performer": "کاریار پٱر و پیم ڤابیڌاْ.",
        "protectedpages-params": "پینیارٱل پٱر و پیم کاری",
        "protectedpages-reason": "دلیل",
+       "protectedpages-submit": "نشوݩ داڌن بٱلگاْیٱل",
        "protectedpages-unknown-timestamp": "نادیار",
        "protectedpages-unknown-performer": "کاریار نادیار",
        "listusers": "نومگاْ کاریار",
+       "listusers-creationsort": "میزونکاری ز ری گات راست ڤابیڌن",
+       "listusers-desc": "میزونکاری ز ری گٱپ کۊچیری",
        "usereditcount": "$1 {{PLURAL:$1|آلشدکاری|آلشدکاریٱل}}",
        "usercreated": "{{GENDER:$3|راسد ڤابیڌاْ}} سی $1 تا $2",
        "newpages": "بٱلگاْیٱل نۏ",
        "pager-older-n": "{{PLURAL:$1|گٱپسالتر 1|گٱپسالتر $1}}",
        "apihelp": "هومیاری اْی پی آی",
        "apihelp-no-such-module": "ماجۊل \"$1\" دیاری نٱکرد.",
+       "apisandbox-submit": "خاستن",
+       "apisandbox-reset": "پاکسا کردن",
+       "apisandbox-retry": "ز نۉ تلاش کردن",
+       "apisandbox-helpurls": "هومپاٛیڤٱند هومیاری",
+       "apisandbox-examples": "نموناْیٱل",
+       "apisandbox-dynamic-parameters": "پینیارٱل اْزافی",
+       "apisandbox-dynamic-parameters-add-label": "اْزاف کردن پینیار:",
+       "apisandbox-dynamic-parameters-add-placeholder": "نوم پینیار.",
+       "apisandbox-add-multi": "اْزاف کردن",
+       "apisandbox-results": "نتیجاْیٱل",
+       "apisandbox-request-url-label": "درخاست یۊ آر اْل:",
+       "apisandbox-request-json-label": "درخاست JSON:",
+       "apisandbox-continue": "ديندا گرهڌن",
+       "apisandbox-continue-clear": "پاکسا کردن",
+       "apisandbox-multivalue-all-values": "$1 (تٱموم ٱرزایشتٱل)",
        "booksources": "سرچشماْیٱل کتاو",
        "booksources-search-legend": "پاٛ جۊری سی سٱرچٱشمٱیٱل کتاو",
        "booksources-search": "پاٛی جۊری",
        "specialloguserlabel": "مؽنتور:",
        "speciallogtitlelabel": "دال(داسۊن یا {{ns:user}}:نوم کاریاری سی کاریار):",
        "log": "پاْرستنوماْیٱل",
+       "logeventslist-submit": "نشوݩ دائن",
        "all-logs-page": "گشڌنمائیٱل",
        "alllogstext": "نمایشت یٱ جا کاْ تٱموم پهرستنۊماْیٱل میٛن {{SITENAME}}.\nایسا تاْرین ڤا گولاْڤورچین کردن جۊر پهرستنۊماْ ، نوم کاریاری(هساس ب کۊچیری و گٱپی هٱرفا) و بٱلگاْیٱل آلشت کرداْ(هساس ب گٱپی و کۊچیری هٱرفا) نمایشت نٱ دیر ز ڤیر کونین.",
        "logempty": "چونو چی کاْ ایسا خاسدین میٛن پهرستنۊماْ نیڌس",
+       "checkbox-select": "گولاْڤورچین کردن: $1",
+       "checkbox-all": "هٱماْ",
+       "checkbox-none": "هيش کوم",
        "allpages": "تٱموم بٱلگاْیٱل",
-       "nextpage": "صÙ\81Ø­Ù\87 Ø¨Ø¹Ø¯ی ($1)",
-       "prevpage": "صÙ\81Ø­Ù\87 Ù\82بÙ\84Û\8c($1)",
-       "allpagesfrom": "نمایش دادن صفحات با شروع زه:",
+       "nextpage": "بٱÙ\84گاÙ\92 Ù\86Û\8cاÛ\8cی ($1)",
+       "prevpage": "بٱÙ\84گاÙ\92 Ø¯Û\8cÙ\86داÛ\8cÛ\8c ($1)",
+       "allpagesfrom": "بٱلگاْیٱلی کاْ ز شورۊ ڤابیڌاْ ناْ دیاری کو:",
        "allarticles": "تٱموم بٱلگاْیٱل",
        "allpagessubmit": "رۉ",
-       "allpagesprefix": "نشو دادن صفحات همراه با پیشوند:",
+       "allpagesprefix": "دیاری کردن بٱلگاْیٱل ڤا پیشڤٱند:",
        "allpages-hide-redirects": "بؽ دیارنیڌن آلشڌتورٱل",
        "categories": "دٱسداْیٱل",
+       "categories-submit": "دیاری کردن",
+       "sp-deletedcontributions-contribs": "هومياریٱل",
+       "linksearch": "هومپاٛیڤٱند پاٛی جۊری خارجی",
+       "linksearch-pat": "سازاْیار پاٛی جۊری:",
+       "linksearch-ns": "نوم جا:",
+       "linksearch-ok": "پاٛی جۊری",
+       "listusers-submit": "نشوݩ دائن",
+       "listusers-noresult": "چونو کاریاری ڤوجۊڌ ناراْ.",
+       "listusers-blocked": "(نیاگری ڤابیڌاْ)",
+       "activeusers": "نومگٱ کاریارٱل کونشتکار",
+       "activeusers-noresult": "چونو کاریارٱلی ڤوجۊڌ نارن.",
+       "activeusers-submit": "دیاری کردن کاریارٱل کونتشکار",
+       "listgrouprights-group": "جٱرغاْ",
+       "listgrouprights-rights": "هوقۊق",
+       "listgrouprights-helppage": "هومیاری:هوقۊق جٱرغاْ",
        "listgrouprights-members": "(نومگاْ ٱندومٱل)",
+       "listgrouprights-addgroup": "{{PLURAL:$2|جٱرغاْ|جٱرغاْیٱل}} ناْ اْزاف کونین: $1",
+       "listgrouprights-removegroup": "{{PLURAL:$2|جٱرغاْ|جٱرغاْیٱل}} ناْ ڤوردارین: $1",
+       "listgrouprights-addgroup-all": "اْزاف کردن تٱموم جٱرغاْیٱل",
+       "listgrouprights-removegroup-all": "ڤورداشتن تٱموم جٱرغاْیٱل",
+       "listgrants-rights": "هوقۊق",
+       "trackingcategories-name": "نوم پاٛیغوم",
        "emailuser": "ٱنجوماناماْ کاریار",
-       "usermessage-editor": "پاٛیغوم فرشن سامۊناْیی",
+       "emailuser-title-notarget": "ٱنجوماناماْ کاریار",
+       "defemailsubject": "{{SITENAME}} ٱنجوماناماْ ز کاریار \"$1\"",
+       "emailusername": "نوم کاریاری:",
+       "emailusernamesubmit": "داڌن",
+       "email-legend": "یٱ ٱنجومانٱماْ سی کاریار دیٱری {{SITENAME}} بیٛسی کو",
+       "emailfrom": "ز:",
+       "emailto": "سی:",
+       "emailsubject": "داسوݩ:",
+       "emailmessage": "پاٛیغوم",
+       "emailsend": "بیٛسی کردن",
+       "emailccme": "یٱ کوپی ز پاٛیغوموم سیم بیٛسی کو",
+       "emailsent": "ٱنجوماناماْ بیٛسی ڤابیڌاْ",
+       "emailsenttext": "پاٛیغومتوݩ ٱنجوماناماْیی بیٛسی ڤابیڌاْ.",
+       "usermessage-summary": "لاهاڌن پاٛیغوم سیستمی.",
+       "usermessage-editor": "پاٛیغوم فرشن ساموناْیی",
        "watchlist": "لیسڌ دیناگریٱل مو",
-       "mywatchlist": "سئیل بٱرگ",
+       "mywatchlist": "ساÙ\9bیل بٱرگ",
        "watchlistfor2": "سی $1 $2",
-       "addedwatchtext": "صفحه «<nowiki>$1</nowiki>» به [[Special:Watchlist|لیست پی‌گیری‌های ]] ایسا\nاضاف وابید.\nتغییرات این صفحه و صفحه صحبت مر بوطه اش در آینده ایچو لیست ابوه. به‌علاوه، ای صفحه، سی واضح‌تر دیده وابیدن در [[Special:RecentChanges|فهرست تغییرات اخیر]] به شکل <b>سیاه</b> ایا.\n\nایر بعدا خواستین ای  صفحه زه لیست پی‌گیریهاتو ورداشته بوه، رو «'''عدم پی‌گیری'''» در بالای صفحه کلیک کنین.",
-       "removedwatchtext": "آن صفحه\"[[:$1]]\" جابجا وابیده زه[[Special:لیست پیگیری|لیست پیگیری ایسا]].",
+       "watchnologin": "هٱنی نٱڤۊڌیناْ ڤامیٛن",
+       "addwatch": "اْزاف کردن ب ساٛیل بٱرگ",
+       "addedwatchtext": "\"[[:$1]]\" و بٱلگاْ چٱک چناْس  اْزاف ڤابی ب [[Special:ساٛیل بٱرگ|ساٛیل بٱرگ]]توݩ .",
+       "removewatch": "ڤورداشتن ز ساٛیل بٱرگ",
+       "removedwatchtext": "\"[[:$1]]\" و بٱلگاْ چٱک چناْس  ز [[Special:نومگاْ ساٛیل بٱرگ|نومگٱ ساٛیل بٱرگ]]ایسا ڤورداشتاْ ڤابی.",
+       "removedwatchtext-talk": "\"[[:$1]]\" و بٱلگاْ هومیاریس  ز [[Special:نومگاْ ساٛیل بٱرگ|نومگٱ ساٛیل بٱرگ]]ایسا ڤورداشتاْ ڤابی.",
        "watch": "پاٛیگری",
-       "watchthispage": "پیگیری ای صفحه",
+       "watchthispage": "پاٛگری ای بٱلگاْ",
        "unwatch": "پاٛیگری نٱڤابیڌاْ",
        "watchlist-details": "{{PLURAL:$1|$1 بٱلٛگاْ|$1 بٱلٛگیٱل}} مؽن لیست دیناگری ایسا,هؽڌا",
        "wlheader-showupdated": "بٱلٛگیٱلؽ کاْ دیناتٱر زاْ آخرین ساٛل اؽسا آلشڌ آڤیڌ ناْ<strong>پورٱنڳ</strong> نماونیڌاْ آڤیڌناْ",
        "wlnote": "ڤاْ لٱم {{PLURAL:$1|آلشڌؽ|<strong>$1</strong> آلشڌؽ}} کاْ ڤاْ {{PLURAL:$2|سات|<strong>$2</strong> سات}} رٱئڌاْ انجوم آڤؽڌ مۉجۊڌ هؽڌا،ؤرگار دوکرٱت ڤینی دینائی: $3، $4",
        "wlshowlast": "نماونیڌن ٱخیری $1 سات $2 رۊز",
+       "watchlist-hide": "قام کردن",
+       "watchlist-submit": "نشوݩ دائن",
+       "wlshowhideminor": "هیرداْ ڤیرایشت",
+       "wlshowhidebots": "روڤاتٱل",
+       "wlshowhideliu": "کاریارٱل سٱڤت نام کرداْ",
+       "wlshowhideanons": "کاریارٱل نادیار",
+       "wlshowhidemine": "آلشدکاریٱل مو",
+       "wlshowhidecategorization": "دٱسداْ بٱندی بٱلگاْ",
        "watchlist-options": "دزاٛیٱل دیناگری",
-       "watching": "مئن حالت پي جوري",
-       "unwatching": "درحالت عدم پیگیری...",
+       "watching": "میٛن هال و بال پاٛیگری",
+       "unwatching": "میٛن هال و بال پاٛیگری نٱکردن...",
        "enotif_reset": "دزاٛکرڌن گشڌ بٱلٛگیٱل ڤاْ اوڌڤان نیٱشڌ آڤیڌاْ",
-       "deletepage": "حذف صفحه",
-       "historywarning": "توجه: آن صفحه ای که ایسا اخوین حذف کنین گزارش تاریخی داره:",
-       "confirmdeletetext": "ایسا اخوین یه صفحه بلند با همه گزارش تاریخی هونه حذف کنین.\nلطفا کانفیرم یا تائید کنین که تمایل وقصد ای کار را دارین, وایسا دوین یا می دانید نتایج وآثار ای کار را, و ایسا انجام ادین ای کار را مطابق با [[{{MediaWiki:Policy-url}}|سیاست‌ها]].",
-       "actioncomplete": "عمل  مربوطه راکامل کن",
-       "deletedtext": "\"$1\" حذف وابیده.\nبوین $2 سی ثبت حذف آخر.",
+       "enotif_impersonal_salutation": "{{SITENAME}} کاریار",
+       "enotif_minoredit": "یو یٱ هیرداْ ڤیرایشداْ",
+       "deletepage": "پاکسا کردن بٱلگاْ",
+       "confirm": "پوشت راست کاری کردن",
+       "excontent": "میٛنوناْ: \"$1\" بی",
+       "delete-confirm": "پاکسا کردن \"$1\"",
+       "delete-legend": "پاکسا کردن",
+       "historywarning": "ب ڤیرتوݩ بۊ:بٱلگاْیی کاْ ایسا خاین پاکساس کونین یٱ ڤیرگار $1 ڤا{{PLURAL:$1|ڤانیٱری|ڤانیٱریٱل}} داراْ:",
+       "historyaction-submit": "نشوݩ دائن",
+       "confirmdeletetext": "ایسا اْخاین یٱ بٱلگاْ بولوند ناْ ڤا تٱموم ڤیرگارس پاکسا کونن.\nلوتف کونین پوشت راستکاری کونین کاْ چونو کاری ناْ اْخاین ٱنجوم بڌین، ایسا دونین کاْ نتیجاْ و آریٛنگ کاری کاْ خاین ٱنجوم بڌین ڤا زی ری  [[{{MediaWiki:Policy-url}}|سیاستٱل]] بۊ.",
+       "actioncomplete": "کار کاْ خلاس ڤابی",
+       "actionfailed": "کار کاْ ناخوش سرٱنجوم بی",
+       "deletedtext": "\"$1\" پاکسا ڤابیڌاْ.\nبیٛنیٱر ب $2 سی سٱڤت آخری پاکسا کاریٱل.",
        "dellogpage": "پهرستنۊماْ پاکسا کردن",
+       "deletionlog": "پهرستنۊماْ پاکسا کردن",
        "deletecomment": "دلیل:",
-       "deleteotherreason": "دÛ\8cÙ\87/دÙ\84Û\8cÙ\84 Ø§Ø¶افی:",
-       "deletereasonotherlist": "دÙ\84Û\8cÙ\84 Ø¯Û\8cÙ\87",
+       "deleteotherreason": "دÛ\8cٱر/دÙ\84Û\8cÙ\84 Ø§Ù\92زافی:",
+       "deletereasonotherlist": "دÙ\84Û\8cÙ\84 Ø¯Û\8cٱر",
        "rollbacklink": "ڤورگٱشتن",
        "rollbacklinkcount": "چٱڤاساْ کردن $1 {{PLURAL:$1|آلشدکاری|آلشدکاریٱل}}",
+       "changecontentmodel-title-label": "داسوݩ بٱلگاْ",
+       "changecontentmodel-model-label": "مودل میٛنوناْ تازاْ",
+       "changecontentmodel-reason-label": "دلیل:",
+       "changecontentmodel-submit": "آلشد کردن",
        "protectlogpage": "پهرستنۊماْ پٱر و پیم کاری",
        "protectedarticle": "پٱر و پیم ڤابیڌاٛ \"[[$1]]\"",
        "modifiedarticleprotection": "بارت هناگری«[[$1]]» ناْ آلشڌنیڌ",
-       "prot_1movedto2": "[[$1]] جابجا وابید به[[$2]]",
+       "prot_1movedto2": "[[$1]] جا ب جا ڤابی سی [[$2]]",
        "protectcomment": "دلیل:",
-       "protectexpiry": "سپرÛ\8c Ù\88ابÛ\8cÚ\8eÙ\87 Ø§:",
-       "protect_expiry_invalid": "با سپری وابیدن وقت غیر معتبره.",
-       "protect_expiry_old": "سپری وابیدن وقت مربوط به گذشته.",
-       "protect-text": "ایسا ممکنه بوینین وتغییر بدین سطح حمایت زه ای صفحه'''$1'''.",
-       "protect-locked-access": "حساب کاربری ایسا اجازه تغییر سطح حمایت ای صفحه را نداره.\nای چونه تنظیمات جاری سی آن صفحه '''$1''':",
-       "protect-cascadeon": "ای صفحه  در حال حاضر حفاظت وحمایت وابیده چون که در {{PLURAL:$1|صفحه|صفحات}}\nزیر که گزینه حفاظت وحمایت موجی {{PLURAL:$1|آن|آن‌ها}} فعال هده ،\nایسا ترین سطح حفاظت ای صفحه را تغییر بدین اما ای کارنتره تاثیری رو\nحفاظت وحمایت موجی صفحه داشته بوه.",
+       "protectexpiry": "Ø®Ù\84اس Ú¤Ø§Ø¨Û\8cÚ\8cاÙ\92:",
+       "protect_expiry_invalid": "گات تٱموم ڤابیڌن دوروست نیڌ.",
+       "protect_expiry_old": "گات تٱموم ڤابیڌن ز دینداتراْ.",
+       "protect-text": "گاشا ایسا ریتراز پٱر و پیم کاری بٱلگاْ ناْ بیٛنیٱرین و آلشدس کونین سی '''$1'''.",
+       "protect-locked-access": "هساو کاریاری ایسا سلا آلشدکاری ریتراز پٱر و پیم کاری ناْ ناراْ.\nمیزونکاری ایسنی سی بلگاْ ایچوناْ '''$1''':",
+       "protect-cascadeon": "This page is currently protected because it is transcluded in the following {{PLURAL:$1|page, which has|pages, which have}} cascading protection turned on.\nChanges to this page's protection level will not affect the cascading protection.",
        "protect-default": "هٱماْ کاریارٱل سلادارن",
-       "protect-fallback": "درخواست\"$1\" اجازه",
-       "protect-level-autoconfirmed": "بستن کاربران ثبت نام نوابیده",
-       "protect-level-sysop": "Sysops فقط",
-       "protect-summary-cascade": "موجی کردن",
-       "protect-expiring": "سپری وابیده $1 (UTC)",
+       "protect-fallback": "فٱقٱت کاریارٱلی کاْ ب «$1» دٱسرسی دارن، سلادار ای کارن.",
+       "protect-level-autoconfirmed": "فٱقٱت کاریارٱلی کاْ خودپوشت راست کاری ڤابیڌناْ سلا چونو کاری دارن",
+       "protect-level-sysop": "فٱقٱت سردیڤونکارٱل",
+       "protect-summary-cascade": "مۉجی کردن",
+       "protect-expiring": "گات تٱمو ڤابیڌاْ $1 (UTC)",
+       "protect-expiry-indefinite": "بی گات",
        "protect-cascade": "حمایت صفحات دربرگیرنده در ای صفحه (cascading protection)",
        "protect-cantedit": "ایسا نترین تغییر بدین سطوح حمایتی ای صفحه را, زیرا ایسا اجازه اصلاح آن را ندارین.",
+       "protect-othertime": "گات هیٛنی:",
+       "protect-othertime-op": "گات هیٛنی:",
+       "protect-otherreason-op": "دلیل هیٛنی",
        "protect-expiry-options": "۱ ساعت:1 hour,۱ روز:1 day,۱ هفته:1 week,۲ هفته:2 weeks,۱ ماه:1 month,۳ ماه:3 months,۶ ماه:6 months,۱ سال:1 year,بی‌نهایت:infinite",
        "restriction-type": "اجازه:",
        "restriction-level": "سطح محدودیت:",
-       "restriction-edit": "ڤيرایشت کردن",
+       "pagesize": "(بایتٱل)",
+       "restriction-edit": "آلشدکاری کردن",
        "restriction-move": "جا ڤا جا کردن",
+       "restriction-create": "راس كردن",
+       "restriction-upload": "سوڤارکرد",
        "undeletebtn": "بازیافت",
+       "undeleteviewlink": "ديڌن",
+       "undeletecomment": "دلیل:",
+       "undelete-search-submit": "پاٛی جۊری",
+       "undelete-show-file-submit": "هٱراْ",
        "namespace": "نوم جا:",
        "invert": "گولڤورچین کردن بٱرٱسگ بۊ",
        "tooltip-invert": "ز ری ای جٱڤاْ بپۊرنین و آلشدٱلی ناْ کاْ ماٛنجقا نوم ڤٱرگٱ گولاْڤورچین ڤابیڌن و ٱنجوم داڌاْ ڤابیڌناْ قام کونین.",
        "sp-contributions-blocklog": "پهرستنوماْ قولف ڤابیڌاْ",
        "sp-contributions-uploads": "سوڤارکردٱل",
        "sp-contributions-logs": "پاْرستنۊماْیٱل",
-       "sp-contributions-talk": "Ú\86Ù±Ú© Ú\86Ù\86اÙ\9b",
+       "sp-contributions-talk": "Ú\86Ù±Ú© Ú\86Ù\86اÙ\92",
        "sp-contributions-search": "سی هومیاریٱل پاٛی جۊری ڤابۊ",
        "sp-contributions-username": "نوم ناٛشۊن آی پی یا نوم کاریاری",
        "sp-contributions-toponly": "فقٱت آلشدکاریٱلی کاْ جۏزڤاْ آخریݩ دۉران دیاری کو",
        "whatlinkshere-hidelinks": "هومپاٛیڤٱند سی $1",
        "whatlinkshere-hideimages": "جانیا هومپاٛیڤٱندٱل $1",
        "whatlinkshere-filters": "فيلترٱل",
-       "blockip": "بستن کاربر",
+       "whatlinkshere-submit": "رۉ",
+       "autoblockid": "خود نیاگری #$1",
+       "block": "قولف کردن کاریار",
+       "unblock": "قولف نکردن کاریار",
+       "blockip": "قولف کردن {{GENDER:$1|کاریار}}",
+       "ipaddressorusername": "نوم نشوݩ آی پی یا نوم کاریاری",
+       "ipbreason": "دلیل:",
        "ipbcreateaccount": "راسد کردن هساو کاریاری",
+       "ipbsubmit": "ای کاریار ناْ نیاگری کو",
+       "ipbother": "گات هیٛنی:",
        "ipboptions": "۲ سات:2 hours,۱ رۊز:1 day,۳ رۊز:3 days,۱ هٱفتاْ:1 week,۲ هٱفتاْ:2 weeks,۱ ما:1 month,۳ ما:3 months,۶ ما:6 months,۱ سال:1 year,بی ڤیرگار:infinite",
+       "ipb-pages-label": "بٱگاْیٱل",
+       "ipb-namespaces-label": "نوم ڤارگٱیٱل",
+       "autoblocklist-submit": "پاٛی جۊری",
        "ipblocklist": "آدرسهای  آی پی وکاربران بسته وابیدند",
        "blocklist-userblocks": "قام کردن هساو نیاگری ڤابیڌاْ.",
        "infiniteblock": "بؽ تٱ",
index e2af414..dde20d9 100644 (file)
        "contribsub2": "Per a {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "El compte d'usuari «$1» no està registrat.",
        "nocontribs": "No s’ha trobat cap canvi que encaixés amb aquests criteris.",
-       "uctop": "actual",
+       "uctop": "darrera",
        "month": "Mes (i anteriors):",
        "year": "Any (i anteriors):",
        "sp-contributions-newbies": "Mostra les contribucions dels usuaris novells",
index a79c51c..50ec661 100644 (file)
        "nstab-template": "Skabelon",
        "nstab-help": "Hjælpeside",
        "nstab-category": "Kategori",
-       "mainpage-nstab": "Hovedside",
+       "mainpage-nstab": "Fovedside",
        "nosuchaction": "Funktionen findes ikke",
        "nosuchactiontext": "Handlingen som er angivet i URL'en er ugyldig.\nDu har måske skrevet URL'en forkert eller fulgt et ukorrekt link.\nDet kan også skyldes en fejl i softwaren, som bruges af {{SITENAME}}.",
        "nosuchspecialpage": "En sådan specialside findes ikke",
index 374ab74..c661dba 100644 (file)
        "and": "&#32;u",
        "faq": "PVP",
        "actions": "Hereketi",
-       "namespaces": "Heruna naman",
+       "namespaces": "Heruna nameyan",
        "variants": "Varyanti",
        "navigation-heading": "Menuyê navigasyoni",
        "errorpagetitle": "Xeta",
        "delete": "Bestere",
        "undelete_short": "{{PLURAL:$1|Yew vırnayışi|$1 Vırnayışan}} mestere",
        "viewdeleted_short": "{{PLURAL:$1|Jew vurnayış esternayi|$1 Vurnayışanê esternayan}} bımotne",
-       "protect": "Bısıtarne",
+       "protect": "Bışevekne",
        "protect_change": "bıvırne",
        "unprotect": "Starnayışi bıvurne",
        "newpage": "Perra newi",
        "cascadeprotected": "Ena perre vırnayışan rê akerde niya, çunke a {{PLURAL:$1|perre|perranê}} bınênan de zi yew be yew ravêrdeya, gırweniyena:\n$2",
        "namespaceprotected": "No '''$1''' ca de icazetê şıma çino şıma pel rêz keri.",
        "customcssprotected": "İzına şıma çıniya ke ena perra CSSi bıvırnên, çıke ena perra xısusiye eyaranê karberan gêna xo miyan.",
+       "customjsonprotected": "İzına şıma çıniya ke ena pela JSONi bıvırnên, çıke ena pela xısusiye eyaranê karberan gêna xo miyan.",
        "customjsprotected": "İzına şıma çıniya ke ena perra Java Scripti bıvırnên, çıke ena perra xısusiye eyaranê karberan gêna xo miyan.",
        "mycustomcssprotected": "Desturê şıma çıniyo ke na pela CSSi bıvurnê.",
+       "mycustomjsonprotected": "Desturê şıma çıniyo ke na pela JSONi bıvurnê.",
        "mycustomjsprotected": "Desturê şıma çıniyo ke na pela JavaScripti bıvurnê.",
        "myprivateinfoprotected": "Ğısusi malumatana ğo timar kerdışire icazeta şıma çıniya.",
        "mypreferencesprotected": "Terciha timar kerdışire icazeta şıam çıniya.",
        "virus-unknownscanner": "antiviruso ke nêzanyeno:",
        "logouttext": "'''Henda şıma hesab ra veciyay.'''\n\nDiqat kerê ke tayê perri şenê hewna zey şıma kewtê ra cı bıasê, heta şıma ver-virê şanekerê (browserê) xo besterê.",
        "cannotlogoutnow-title": "Enewke ronıştışo nêracneyêno",
-       "cannotlogoutnow-text": "$1 karkerdışa ronıştış qefılnayış mıkum niyo.",
+       "cannotlogoutnow-text": "Gurenayışê $1i de veciyayış mımkın niyo.",
        "welcomeuser": "Heyr amey, $1!",
        "welcomecreation-msg": "Hesabê şıma abiyo.\n[[Special:Preferences|{{SITENAME}} vurnayişê tercihanê xo]], xo vir ra mekere.",
        "yourname": "Namey karberi:",
        "cannotloginnow-title": "Enewke ronıştışo nêabeno",
        "cannotloginnow-text": "$1 karkerdışa ronıştış akerdış mıkum niyo.",
        "cannotcreateaccount-title": "Nêşenay hesab rakerê",
-       "cannotcreateaccount-text": "Direkt hesab vıraştış na wiki sero mıkum niyo.",
+       "cannotcreateaccount-text": "Direkt hesabvıraştış na wiki sero mımkın niyo.",
        "yourdomainname": "Yewdestê şıma:",
        "password-change-forbidden": "Şıma na wiki de nêşenê parola bıvurnê.",
        "externaldberror": "Ya database de xeta esta ya zi heqê şıma çino şıma no hesab bıvurni.",
        "createacct-realname": "Nameyo raştıkên (mecburi niyo)",
        "createacct-reason": "Sebeb",
        "createacct-reason-ph": "Şımaye çı xo re zewbi hesab vırazeni?",
+       "createacct-reason-help": "Roceka hesabvıraştışi de mesaco asaye",
        "createacct-submit": "Hesabê xo vıraze",
        "createacct-another-submit": "Hesab vıraze",
        "createacct-continue-submit": "Hesab vıraştışi rê devam ke",
        "nocookieslogin": "Semedê akerdışê hesabi çerezê {{SITENAME}}i gurêniyenê.\nŞıma çerezi qapan kerdi.\nRavêri inan akerê u reyna bıcerrebnê.",
        "nocookiesfornew": "Hesabê karberi nêvıraziya, MA nêzana sebebê cı kotirawo.\nAkerdış dê çerezarê xo emel bê uena pela fına barkerê.",
        "nocookiesforlogin": "{{int:nocookieslogin}}",
+       "createacct-loginerror": "Hesabê şıma vıraziya, labelê ronıştışo otomatik anêbiyayo. Kerem ke, şo pela  [[Special:UserLogin|cıkewtışo manuel]].",
        "noname": "Yew nameyo maqbul bınuse.",
        "loginsuccesstitle": "Hesab abıya",
        "loginsuccess": "'''{{SITENAME}} dı name dê \"$1\" şıma hesab akerdo.'''",
        "botpasswords-existing": "Paroleyê botanê mewcudi",
        "botpasswords-createnew": "Newe Paroleyê boti vıraze",
        "botpasswords-editexisting": "Mewcud parolaye boti timar ke",
+       "botpasswords-label-needsreset": "(parola gani ravurriyo)",
        "botpasswords-label-appid": "Nameyê boti:",
        "botpasswords-label-create": "Vıraze",
        "botpasswords-label-update": "Rocane ke",
        "botpasswords-label-cancel": "Bıtexelne",
        "botpasswords-label-delete": "Bestere",
        "botpasswords-label-resetpassword": "Parola raçarne",
-       "botpasswords-label-grants": "İmtiyazê ravêrdey:",
+       "botpasswords-label-grants": "İmtıyazê ravêrdeyi:",
        "botpasswords-label-grants-column": "Dayen",
-       "botpasswords-bad-appid": "Namey Boti \"$1\" ravêrde niyo.",
+       "botpasswords-bad-appid": "Nameyê boti \"$1\" ravêrde niyo.",
        "botpasswords-created-title": "Parolay boti vırazi yê",
        "botpasswords-updated-title": "Parolay boti rocane yê",
        "botpasswords-deleted-title": "Parolay boti esteri yê",
+       "botpasswords-no-provider": "BotPasswordsSessionProvider nêgureniyeno.",
        "resetpass_forbidden": "parolayi nêvuryayi",
+       "resetpass_forbidden-reason": "Parola nêvuriyena: $1",
        "resetpass-no-info": "şıma gani hesab akere u hona bıeşke bırese cı",
        "resetpass-submit-loggedin": "Parola bıvurne",
        "resetpass-submit-cancel": "Bıtexelne",
        "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ê.",
        "passwordreset-emailelement": "Nameyê karberi: \n$1\n\nParolaya vêrdiye: \n$2",
        "passwordreset-emailsentemail": "Eger kı ena e-posta şıma rê se, yew e-posta do bırışiyo eno hesab.",
+       "passwordreset-nocaller": "Yew meyman tedarık kerê",
+       "passwordreset-nosuchcaller": "Meyman çıniyo: $1",
        "passwordreset-invalidemail": "Adresê eposta raşt niya",
        "changeemail": "E-posta adresa xo wedarne",
        "changeemail-header": "E-posta adresa xo vuriyayışi rë ena former pır kerë. Eger kı şıma qayılë kı e postay adresi ra wedarnë se formi rıştış dı heruna e posta veng verdë",
        "changeemail-no-info": "Şıma gani bıkewê pele ke derdest bıresê na pele.",
        "changeemail-oldemail": "E-postay şımawa nıkaêne:",
        "changeemail-newemail": "E-postay şımawa newiye:",
-       "changeemail-none": "(Ã\87ıniyo)",
+       "changeemail-none": "(çıniyo)",
        "changeemail-password": "Parolay şımawa {{SITENAME}}i:",
        "changeemail-submit": "E-postay xo bıvırnên",
        "changeemail-throttled": "Şıma zaf ronıştış akerdış ke.\nKerem ke verdi dekewten $1 bıpawe.",
+       "changeemail-nochange": "Kerem ke, yew adresa e-posteyê newiye cı ke.",
        "resettokens": "Nışanan reset ke",
        "resettokens-text": "Şıma tiya de hesabê şıma ra elaqedar tayê kılitê icazetê cıresayışê melumati şenê sıfır kerê.\n\nŞıma be ğeletiye ra ke nê kerdê vıla ya zi hesabê şıma de xırabiye ke esta, naye bıkerê.",
        "resettokens-no-tokens": "Nışanê reseti çıniyê",
-       "resettokens-tokens": "Nışani:",
+       "resettokens-tokens": "Kıliti:",
        "resettokens-token-label": "$1 (weziyeto nıkaên: $2)",
        "resettokens-watchlist-token": "Web Feed rê nışan (Atom/RSS)ê [[Special:Watchlist|vêreno perranê lista şımawa seyrkerdışi]]",
        "resettokens-done": "Nışanan reset ke",
        "templatesused": "{{PLURAL:$1|Şablon|Şabloni}} ke ena perrer de karneyayê:",
        "templatesusedpreview": "{{PLURAL:$1|Sablon|Sabloni}}  ke na verqayt de xebetnayê:",
        "templatesusedsection": "{{PLURAL:$1|Template|Templateyan}}  ke na qısım de xebetniyenê:",
-       "template-protected": "(sıtarna)",
+       "template-protected": "(şeveknaye)",
        "template-semiprotected": "(nime staryayış)",
        "hiddencategories": "Ena per de {{PLURAL:$1|1 kategoriyo nımıte|$1 kategoriyê nımıtey}} muhtewa benê:",
        "edittools": "<div id=\"specialcharss\" class=\"toccolours specialchars\" style=\"margin-top:.5em; padding: .3em .5em; font-size: 100%; color:#aaa; text-align:left;\" title=\"{{int:bw-edittools-tooltip}}\">\n<p class=\"specialbasic\" id=\"Standard\">\n'''{{int:bw-edittools-lead-in}}''' \n<charinsert>Á á É é Í í Ó ó Ú ú Ý ý</charinsert> –\n<charinsert>À à È è Ì ì Ò ò Ù ù </charinsert> –\n<charinsert> â Ê ê Î î Ô ô Û û </charinsert> –\n<charinsert>Ä ä Ë ë Ï ï Ö ö Ü ü Ÿ ÿ</charinsert> –\n<charinsert>Æ æ Ø ø Œ œ ẞ ß </charinsert> –\n<charinsert>Å å Ů ů </charinsert> –\n<charinsert>àã Ẽ ẽ ɛ̃ Ĩ ĩ Ñ ñ Õ õ ɔ̃ Ũ ũ </charinsert> –\n<charinsert>Рð Þ þ </charinsert> –\n<charinsert>Ç ç Ģ ģ Ķ ķ Ļ ļ Ņ ņ Ŗ ŗ Ş ş Ţ ţ </charinsert> –\n<charinsert>Ć ć Ĺ ĺ Ń ń Ŕ ŕ Ś ś Ý ý Ź ź </charinsert> –\n<charinsert>Č č Ď ď Ľ ľ Ň ň Ř ř Š š Ť ť Ž ž </charinsert> –\n<charinsert>Ǎ ǎ Ě ě Ǐ ǐ Ǒ ǒ Ǔ ǔ </charinsert> –\n<charinsert>Ā ā Ē ē Ī ī Ō ō Ū ū </charinsert> –\n<charinsert>ǖ ǘ ǚ ǜ </charinsert> –\n<charinsert>Ĉ ĉ Ĝ ĝ Ĥ ĥ Ĵ ĵ Ŝ ŝ Ŵ ŵ Ŷ ŷ </charinsert> –\n<charinsert>Ă ă Ğ ğ Ŭ ŭ </charinsert> –\n<charinsert>Ċ ċ Ė ė Ġ ġ Għ għ İ ı Ż ż </charinsert> –\n<charinsert>Ą ą Ę ę Į į Ų ų </charinsert> –\n<charinsert>Ő ő Ű ű </charinsert> –\n<charinsert>Đ đ Ħ ħ Ł ł Ŀ ŀ </charinsert> –\n<charinsert>Ɖ ɖ Ɛ ɛ Ƒ ƒ Ɣ ɣ Ŋ ŋ Ɔ ɔ Ʋ ʋ </charinsert> -\n<charinsert>Ə ə </charinsert> –\n<charinsert>– — ’</charinsert> –\n<charinsert>~ | ° ¹ ² ³ ⅛ ¼ ⅓ ⅜ ½ ⅝ ¾ ⅔ ⅞ € $ ¥ £ † × ← → ↔ ↑ ± ≠ © ® ™ ‰ «+» ‹+› „+“ „+” ‚+‘ ¡ ¿ …</charinsert> –\n<charinsert>&amp;nbsp; &nbsp; [[Category:+]] #REDIRECT[[+]] {{msg-mw|+|notext=1}} &#33;!FUZZY!! ~~~~  &lt;nowiki>+</nowiki></charinsert>\n<charinsert>ڈ ڑ ٹ </charinsert>\n<charinsert>ټ څ ځ ډ ړ ږ ښ ڼ ؤ ي ې ۍ ئ </charinsert>\n<charinsert>{{{+}}} {{+}} {{subst:+}} <noinclude>+</noinclude></charinsert>\n<charinsert>&lt;!--&nbsp;+&nbsp;--> &lt;br&nbsp;/></charinsert>\n</p></div>",
        "search-nonefound-thiswiki": "Ena sita dı zey waşten da şıma theba nêvineya",
        "powersearch-legend": "Cıgeyrayışo hera",
        "powersearch-ns": "Cayanê naman de cıgeyrayış:",
-       "powersearch-togglelabel": "Kontrol ke:",
+       "powersearch-togglelabel": "Weçine:",
        "powersearch-toggleall": "Pêro",
        "powersearch-togglenone": "Çıniyo",
        "powersearch-remember": "Cıgeyrayışanê newe tepyayan de biya xo viri",
        "email-allow-new-users-label": "Karberanê neweyan ra eposte gırotışi rê mısade bıdê",
        "email-blacklist-label": "Wa nê karberi mı rê mesac nêrışê:",
        "prefs-searchoptions": "Cı geyre",
-       "prefs-namespaces": "Heruna naman",
+       "prefs-namespaces": "Heruna nameyan",
        "default": "qısur",
        "prefs-files": "Dosyeyi",
        "prefs-custom-css": "CSSê xasi",
        "prefs-changesrc": "Vuriyayışê ke mocniyê",
        "prefs-changeswatchlist": "Vuriyayışê ke mocniyê",
        "prefs-pageswatchlist": "Pelê ke teqib benê",
-       "prefs-tokenwatchlist": "Morge",
+       "prefs-tokenwatchlist": "Kılit",
        "prefs-diffs": "Ferqi",
        "prefs-help-prefershttps": "Na tercih, fına dekewten dı bena aktiv.",
        "prefswarning-warning": "Şıma tercihanê xo de vurnayışi kerdi ke ney hewna qeyd nêbiyê. \nEke şıma na pele ra bêtıknayışê \"$1\" ra veciyê, tercihê şıma newe nêbenê.",
        "userrights-expiry-current": "$1 de qediyeno",
        "userrights-expiry-none": "Bêdem",
        "userrights-expiry": "Qediyayış:",
-       "userrights-expiry-existing": "wextê qediyayişi yê mewcudi: $3, $2",
+       "userrights-expiry-existing": "Wextê qediyayışiyê mewcudi: $3, $2",
        "userrights-expiry-othertime": "Wexto bin:",
-       "userrights-expiry-options": "1 roc:1 day,1 hefte:1 week,1 aşme:1 month,3 aşmi:3 months,6 aşmi:6 months,1 sere:1 year",
+       "userrights-expiry-options": "1 roce:1 day,1 hefte:1 week,1 aşme:1 month,3 aşmi:3 months,6 aşmi:6 months,1 serre:1 year",
        "userrights-conflict": "Heqan de karberi de dıbare vıcyayo! Kerem ke vurnayışane xo çımser ra ravyarne  u tesdiq keri.",
        "group": "Grube:",
        "group-user": "Karberi",
        "group-autoconfirmed": "Karberê ke otomatikmen biyê araşt",
-       "group-bot": "Roboti",
+       "group-bot": "Boti",
        "group-sysop": "İdarekari",
        "group-interface-admin": "İdarekarê namnişani",
        "group-bureaucrat": "Buroqrati",
        "right-upload_by_url": "Yew URL ra dosyeyan bar ke",
        "right-purge": "Virê sita seba yew pele bêdestur bestere.",
        "right-autoconfirmed": "Perê ke nême kılit biyê, inan bıvurne",
-       "right-bot": "Zey yew kardê otomotiki kar bıvin",
+       "right-bot": "Zey yew karê otomatiki kar bıvêne",
        "right-nominornewtalk": "Pelanê werênayışan rê vurnayışê qıckeki çıniyê, qutiya mesacanê newiyan bıgurene",
        "right-apihighlimits": "Persanê API de sinoranê berzêran bıgurene",
        "right-writeapi": "Xebtnayışê API nusnayışi",
        "grant-group-high-volume": "Performansa aktiviteya vengê berzi",
        "grant-group-customization": "Şexsi kerdış u tercihi",
        "grant-group-administration": "Performans hereketa idarey",
-       "grant-group-private-information": "Derheqê şıma datayanê xısusa resayış",
+       "grant-group-private-information": "Melumatê xısusiyê ke heqa şıma derê, bıresê inan",
        "grant-group-other": "Enwayi babet aktivitey",
        "grant-blockusers": "Karberi men ke u meni wedarne",
        "grant-createaccount": "Hesab vıraze",
        "rcfilters-days-show-hours": "($1 {{PLURAL:$1|saete|saeti}})",
        "rcfilters-quickfilters": "Parzûnê qeydbiyayeyi",
        "rcfilters-quickfilters-placeholder-title": "Qet yew parzûn qeyd nêbiyo",
-       "rcfilters-quickfilters-placeholder-description": "Eyaranê parzûni qeyd kerdış u bahdo zi seba karnayışi rê, cêr de simgeyanecayanê parzûnanê aktiva bıtıknê",
+       "rcfilters-quickfilters-placeholder-description": "Eyaranê parzûni qeydkerdış u bahdo zi seba gurenayışi rê, cêr de simgeyanê cayanê parzûnanê aktifan bıtıknê.",
        "rcfilters-savedqueries-defaultlabel": "Parzûnê qeydbiyayeyi",
        "rcfilters-savedqueries-rename": "Reyna name ke",
        "rcfilters-savedqueries-setdefault": "Wa hesabiyaye bımano",
-       "rcfilters-savedqueries-unsetdefault": "Hesıbyayan ra wedarê",
+       "rcfilters-savedqueries-unsetdefault": "Hesebiyayeyan ra vece",
        "rcfilters-savedqueries-remove": "Bestere",
        "rcfilters-savedqueries-new-name-label": "Name",
-       "rcfilters-savedqueries-new-name-placeholder": "Ğayey parzûni bışınasnê",
+       "rcfilters-savedqueries-new-name-placeholder": "Ğayeyê parzûni bışınasnê",
        "rcfilters-savedqueries-apply-label": "Parzûn vıraze",
        "rcfilters-savedqueries-apply-and-setdefault-label": "Parzûno hesebiyaye vıraze",
        "rcfilters-savedqueries-cancel-label": "Bıtexelne",
        "rcfilters-filter-editsbyself-label": "Vurnayışê şıma",
        "rcfilters-filter-editsbyself-description": "İştırakê şıma.",
        "rcfilters-filter-editsbyother-label": "Ê binan ra vurnayışi",
-       "rcfilters-filter-editsbyother-description": "Bêvurnayışanê şıma vurnayışi pêro",
+       "rcfilters-filter-editsbyother-description": "Bê vurnayışanê şıma vurnayışi pêro.",
        "rcfilters-filtergroup-userExpLevel": "Qeydê karberi u tecrube",
        "rcfilters-filter-user-experience-level-registered-label": "Qeydıni",
        "rcfilters-filter-user-experience-level-registered-description": "İdarekarê cıkewteyi.",
        "rcfilters-filter-user-experience-level-unregistered-label": "Bêqeydıni",
-       "rcfilters-filter-user-experience-level-unregistered-description": "Karberê ke ronıştış nêakerdo.",
+       "rcfilters-filter-user-experience-level-unregistered-description": "Karberê ke nêkewtê cı.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Ameyayeyê neweyi",
        "rcfilters-filter-user-experience-level-newcomer-description": "Karberê qeydınê ke 10 ra kemi vurnayışi ya zi 4 rocan ra fealiyetê xo estê.",
        "rcfilters-filter-user-experience-level-learner-label": "Musayoği",
        "rcfilters-filter-user-experience-level-experienced-label": "Karberê mısayeyi",
-       "rcfilters-filtergroup-automated": "İştirakê otomatiki",
+       "rcfilters-filtergroup-automated": "İştırakê otomatiki",
        "rcfilters-filter-bots-label": "Bot",
+       "rcfilters-filter-bots-description": "Terefê hacetanê otomatikan ra vurnayışi vıraziyayi.",
        "rcfilters-filter-humans-label": "İnsan (bot niyo)",
        "rcfilters-filter-humans-description": "Terefê insanan ra vuriyayışi.",
        "rcfilters-filter-reviewstatus-unpatrolled-label": "Desturê dewriya ra nêvêrdo",
+       "rcfilters-filter-reviewstatus-manual-label": "Lokal dewriya biyo",
        "rcfilters-filter-reviewstatus-auto-label": "Otomatik kontrol bi",
        "rcfilters-filtergroup-significance": "Gıraniye",
        "rcfilters-filter-minor-label": "Vurriyayışê werdiyi",
        "rcfilters-filter-minor-description": "Vurriyayışê ke nuştekari vurnayışo werdi etiket kerdê.",
        "rcfilters-filter-major-label": "Vurriyayışê ke werdi niyê",
+       "rcfilters-filter-major-description": "Vurnayışê etiketanê ke werdi nişan biyê.",
        "rcfilters-filtergroup-watchlist": "Pelê ke seyr benê",
        "rcfilters-filter-watchlist-watched-label": "Lista seyrkerdışi de",
+       "rcfilters-filter-watchlist-watched-description": "Pelanê lista seyrkerdışi de vurnayışi.",
        "rcfilters-filter-watchlist-watchednew-label": "Vurnayışê lista seykerdışiya newiye",
        "rcfilters-filter-watchlist-notwatched-label": "Lista seyrkerdışi de niya",
        "rcfilters-filtergroup-watchlistactivity": "Fealiyetê pela seyrkerdışi",
        "rcfilters-filter-newpages-description": "Vurnayışê ke pelanê newiyab vırazenê.",
        "rcfilters-filter-categorization-label": "Vuriyayışê kategoriyan",
        "rcfilters-filter-categorization-description": "Kategoriyan ra qeydê cıkerdış u wedardışê pelan.",
+       "rcfilters-filter-logactions-label": "Rocekê iştırakan",
        "rcfilters-filtergroup-lastRevision": "Çımraviyarnayışê tewr peyêni",
        "rcfilters-filter-lastrevision-label": "Çımraviyarnayışo peyên",
        "rcfilters-filter-lastrevision-description": "Tenya vurnayışê yew peleyo tewr peyên.",
        "rcfilters-exclude-button-off": "Weçinayeyi ciya bıtepışê",
        "rcfilters-exclude-button-on": "Weçinayeyo ciya",
        "rcfilters-view-tags": "Vurnayışê etiketıni",
-       "rcfilters-view-namespaces-tooltip": "Neticeya gorey nameycayan parzûn kerê",
+       "rcfilters-view-namespaces-tooltip": "Neticeyan goreyê cayê nameyi parzûn kerê",
+       "rcfilters-view-tags-tooltip": "Ebe gurenayışê neticeyanê vurnayışê etikan ra parzûn ke",
        "rcfilters-view-return-to-default-tooltip": "Peyser şo parzûnê menuyê bıngehi",
+       "rcfilters-view-tags-help-icon-tooltip": "Derheqê vurnayışanê etiketınan ra tayêna melumat bıgê",
        "rcfilters-liveupdates-button": "Rocaneyê ganıni",
        "rcfilters-liveupdates-button-title-on": "Rocaneyanê cındeyan ragê",
+       "rcfilters-liveupdates-button-title-off": "Vurnayışanê neweyan ganın bıvêne",
+       "rcfilters-watchlist-markseen-button": "Vurnayışanê pêroyıne asaye nişan kerê",
+       "rcfilters-watchlist-edit-watchlist-button": "Lista pelanê seyrkedışê xo bıvurne",
        "rcfilters-preference-label": "Mabeynrıyê non-JavaScript'i bıkarne",
        "rcfilters-watchlist-preference-label": "Mabeynrıyê non-JavaScript'i bıkarne",
+       "rcfilters-filter-showlinkedfrom-label": "Gıreyê pelan ra vurnayışan bıvêne",
        "rcfilters-target-page-placeholder": "Yew nameyê pele (ya zi kategoriye) cı kerê",
        "rcnotefrom": "Cêr de <strong>$2</strong> ra nata {{PLURAL:$5|vurnayışiyê}} asenê (tewr vêşi <strong>$1</strong> asenê) <strong>$3, $4</strong>",
        "rclistfromreset": "Weçinayışê tarixi ragoze",
        "rcshowhideminor": "Vırnayışê werdiy $1",
        "rcshowhideminor-show": "Bımocne",
        "rcshowhideminor-hide": "Bınımne",
-       "rcshowhidebots": "botan $1",
+       "rcshowhidebots": "boti $1",
        "rcshowhidebots-show": "Bımocne",
        "rcshowhidebots-hide": "Bınımne",
        "rcshowhideliu": "karberê qeydbiyay $1",
        "apihelp": "Peştiya APIyi",
        "apihelp-no-such-module": "Modulê \"$1\" çıniyo.",
        "apisandbox": "API qumdor",
+       "apisandbox-api-disabled": "API na site de dewre ra veciyayo.",
        "apisandbox-submit": "Bıwazê",
        "apisandbox-reset": "Bestere",
        "apisandbox-retry": "Anciya bıcerrebne",
+       "apisandbox-no-parameters": "Nê modulê APIyi de parametreyi çıniyê.",
        "apisandbox-helpurls": "Linkê peşti",
        "apisandbox-examples": "Nımuneyi",
        "apisandbox-dynamic-parameters": "Parametreya debyayi",
        "booksources-search": "Cı geyre",
        "booksources-text": "listeya cêrıni, keyepelê kitap rotoxan o.",
        "booksources-invalid-isbn": "ISBN raşt nêasena bıewnê çımeyê orjinali, raşt kopya biya nê nêbiyaya?",
-       "magiclink-tracking-rfc": "Pelê ke gırey efsunê RFC karnenê",
-       "magiclink-tracking-pmid": "Pelê ke gırey efsunê PMID karnenê",
-       "magiclink-tracking-isbn": "Pelê ke gırey efsunê ISBN karnenê",
+       "magiclink-tracking-rfc": "Pelê ke gıreyê efsunê RFCi gurenenê",
+       "magiclink-tracking-pmid": "Pelê ke gıreyê efsunê PMIDi gurenenê",
+       "magiclink-tracking-isbn": "Pelê ke gıreyê efsunê ISBNi gurenenê",
        "specialloguserlabel": "Kerdoğ:",
        "speciallogtitlelabel": "Meqsed (sername ya zi {{ns:user}}:karberi rê nameyê karberi):",
        "log": "Qeydi",
        "logeventslist-submit": "Bımocne",
-       "logeventslist-more-filters": "Rocekanê dekerdışa bımocne:",
+       "logeventslist-more-filters": "Rocekanê cıkerdışan bımocne:",
        "logeventslist-patrol-log": "Rocekê dewriya",
        "logeventslist-tag-log": "Rocekê etiketan",
        "all-logs-page": "Heme qeydê pêroyi",
        "log-edit-tags": "Etiketanê weçinayê qeydan bıvurnê",
        "checkbox-select": "Weçinaye: $1",
        "checkbox-all": "Pêro",
-       "checkbox-none": "Temam",
+       "checkbox-none": "Çıniyo",
        "checkbox-invert": "Dimlaşt ke",
        "allpages": "Pêro peli",
        "nextpage": "Pela peyco ($1)",
        "sp-deletedcontributions-contribs": "iştiraki",
        "linksearch": "Gıreyê teberi cı geyrê",
        "linksearch-pat": "bıgêr motif:",
-       "linksearch-ns": "Heruna namey:",
+       "linksearch-ns": "Heruna nameyan:",
        "linksearch-ok": "Cı geyre",
        "linksearch-text": "Jokeri ê zey \"*.wikipedia.org\"i benê ke bıgureniyê.\nTewr senık yew sewiya serêna cayê tesiri lazıma, mesela \"*.org\".<br />\nQeydeyê {{PLURAL:$2|protoqol|protoqoli}}:destegbiyayey: $1 (qet yew qeydeyo hesabiyaye http:// ke name nêbiyo).",
        "linksearch-line": "$1, $2 ra link biya",
        "listgrouprights-addgroup-self-all": "şıma eşkeni hesabê xo re heme gruban têare bıkerî",
        "listgrouprights-removegroup-self-all": "şıma hesabê xo ra eşkeni heme gruban bıveci",
        "listgrouprights-namespaceprotection-header": "Kılm kerdena nameyan",
-       "listgrouprights-namespaceprotection-namespace": "Heruna nami",
+       "listgrouprights-namespaceprotection-namespace": "Heruna nameyan",
        "listgrants": "Hibey",
        "listgrants-grant": "Hibe",
        "listgrants-rights": "Heqi",
        "trackingcategories-msg": "Kategoriya teqibi",
        "trackingcategories-name": "Namey mesaci",
        "trackingcategories-desc": "Kriterê definayışê kategoriye",
+       "trackingcategories-nodesc": "Şınasnayış çıniyo.",
        "trackingcategories-disabled": "Kategoriya feal niya",
        "mailnologin": "adresa erşawıtışi/ruşnayişi çina.",
        "mailnologintext": "qey karberanê binan re e-posta erşawıtış de gani şıma [[Special:UserLogin|hesab aker]]ê [[Special:Preferences|pelê tercihani]] de gani yew e-postayo meqbul bıbo.",
        "rollbacklinkcount": "$1 {{PLURAL:$1|vurnayış|vurnayışi}} peyd gıroti",
        "rollbacklinkcount-morethan": "$1 {{PLURAL:$1|vurnayış|vuranyışi}} tewr peyd gırot",
        "rollbackfailed": "Peyserardış nêbi",
+       "rollback-missingrevision": "Melumatê versiyoni bar nêbiyo.",
        "cantrollback": "karbero peyin têna paşt dayo, no semedi ra vuriyayiş tepiya nêgeriyeni.",
        "alreadyrolled": "[[User:$2|$2]] ([[User talk:$2|Talk]]{{int:pipe-separator}} hetê [[Special:Contributions/$2|{{int:contribslink}}]]) ra perrê ıney[[:$1]] de vırnayış biyo u no vırnayiş tepeya nêgêriyeno;\nyewna ten perre de vırnayiş kerdo u perre tepiya nêgeriyeno.\n\noyo ke vırnayışo peyên kerdo: [[User:$3|$3]] ([[User talk:$3|Talk]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Xulasay vurnayışi: <em>$1</em> bi",
        "revertpage": "Hetê [[Special:Contributions/$2|$2]] ([[User talk:$2|Mesac]]) ra vurnayiş biyo u ney vurnayişi tepiya geriyayo u no [[User:$1|$1]] kes o ke cuwa ver revizyon kerdo revizyonê no kesi tepiya anciyayo.",
        "revertpage-nouser": "No keso ke vuriyayiş kerdo vuriyayişé{{GENDER:$1|[[User:$1|$1]]}} ker o",
-       "rollback-success": "vurnayişê no kesi $1 tepiya geriyayo u hetê no\n$2 kesi ra cıwa ver o ke revizyon biyo no revizyon tepiya anciyayo.",
+       "rollback-success": "Terefê {{GENDER:$3|$1}}i ra vuriyayışi peyser gêriyayi; peyser geyriya be revizyonê {{GENDER:$4|$2}}i.",
        "sessionfailure-title": "Seans xeripiya",
        "sessionfailure": "cıkewtışê hesabê şıma de yew problem aseno;\nno kar semedê dızdiyê hesabi ibtal biyo.\nkerem kerê \"tepiya\" şiyerê u pel o ke şıma tera ameyî u o pel newe ra bar kerê , newe ra tesel/cereb kerê.",
        "changecontentmodel": "Modelê zerrekê pele bıvurne",
        "changecontentmodel-reason-label": "Sebeb:",
        "changecontentmodel-submit": "Bıvırne",
        "changecontentmodel-success-title": "Modelê zerreki vurriya",
+       "changecontentmodel-emptymodels-title": "Modelê zerreki mewcud niyo",
        "log-name-contentmodel": "Qeydê vurnayışanê modelê zerreki",
        "logentry-contentmodel-change-revertlink": "peyser biya",
        "logentry-contentmodel-change-revert": "peyser biya",
        "undelete-error-long": "hewn a kerdışê na dosyayi wexta tepiya geriyenê xeta vıraziya:\n\n$1",
        "undelete-show-file-confirm": "\"<nowiki>$1</nowiki>\" şıma emin î dosyaya revizyonê no $2 $3 tarixi bıvini?",
        "undelete-show-file-submit": "Eya",
-       "namespace": "Heruna namey:",
+       "namespace": "Heruna nameyan:",
        "invert": "Weçinayışi dimlaşt ke",
        "tooltip-invert": "nameyo ke nışan biyo (u nameyo elekeyın zi nışanyyayo se) vurnayışan  zerrekan nımtışi re ena dore tesdiqi nışan kerê",
        "namespace_association": "Heruna namanê elaqedaran",
        "export-download": "yewna qaydeyi de qeydker",
        "export-templates": "şablonan daxil ker",
        "export-pagelinks": "behsê xorıniya pelê pêrabesteyani:",
+       "export-manual": "Pelan be dest ra cı ke:",
        "allmessages": "Mesacê sistemi",
        "allmessagesname": "Name",
        "allmessagesdefault": "Metnê mesacê hesabiyayey",
        "allmessages-filter": "goreyê xususi kerdışi re filtre bıker",
        "allmessages-filter-unmodified": "Nivurnaye",
        "allmessages-filter-all": "Pêro",
-       "allmessages-filter-modified": "Vurnaye",
+       "allmessages-filter-modified": "Vurniya",
        "allmessages-prefix": "pê prefiks filtre bıker",
        "allmessages-language": "Zıwan:",
        "allmessages-filter-submit": "Şo",
        "thumbnail-temp-create": "İdare dosyay resimiya nêvırazêna",
        "thumbnail-dest-create": "Resimo werdiyo keyd nêbeno",
        "thumbnail_invalid_params": "Parametreya thumbnailî raşt niyşê",
+       "thumbnail_toobigimagearea": "Ebadê $1 ra gırd dosyeyi",
        "thumbnail_dest_directory": "Nieşkenî direktorê destinasyonî virazî",
        "thumbnail_image-type": "Tipê resimî kebul nibeno",
        "thumbnail_gd-library": "Configurasyonê katalog ê GDî tam niyo:funksiyonê $1î vînî biyo",
        "tooltip-pt-watchlist": "Listey peranê ke to gırotê seyr kerdış",
        "tooltip-pt-mycontris": "Yew lista iştırakanê {{GENDER:|şıma}}",
        "tooltip-pt-login": "Mayê şıma ronıştış akerdışi rê dawet keme; labelê ronıştış mecburi niyo",
+       "tooltip-pt-login-private": "Gurenayışê nê wikiyi rê cıkewtış lazımo",
        "tooltip-pt-logout": "Bıveciye",
        "tooltip-pt-createaccount": "Şıma rê tewsiyey ma xorê jew hesab akerê. Fına zi hesab akerdış mecburi niyo.",
        "tooltip-ca-talk": "Heqa pela zerreki de werênayış",
        "tooltip-feed-atom": "Qe ena pele atom feed",
        "tooltip-t-contributions": "Yew lista iştırakanê {{GENDER:$1|enê karberi}}",
        "tooltip-t-emailuser": "{{GENDER:$1|Enê karberi}} rê yew e-poste bırışe",
+       "tooltip-t-info": "Derheqê ena pele de zêdêr melumat",
        "tooltip-t-upload": "Dosyeyan bar ke",
        "tooltip-t-specialpages": "Listeya peranê hısusiyan hemın",
        "tooltip-t-print": "Versiyono perre ro ke nuşterniyaye.",
        "pageinfo-protect-cascading-yes": "Eya",
        "pageinfo-protect-cascading-from": "Sıtarkerdey cı ra yenê war",
        "pageinfo-category-info": "Melumatê kategori",
+       "pageinfo-category-total": "Amarê ezayan pêro piya",
        "pageinfo-category-pages": "Amarê pelan",
        "pageinfo-category-subcats": "Amarê bınkategoriyan",
        "pageinfo-category-files": "Amarê dosyeyan",
        "confirmrecreate-noreason": "karbero [[User:$1|$1]] ([[User talk:$1|mesac]]) , dest pêkerdışiena pela sero vurnayışiya tepya ena pela {{GENDER:$1|besternê}}. Şıma qayıli ke ena pela fına vırazê se ena pela tesdiq kerê.",
        "recreate": "Werzayne",
        "unit-pixel": "px",
+       "confirm-purge-title": "Na pele pak ke",
        "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-unwatch-button": "TEMAM",
        "confirm-unwatch-top": "Ena pele lista xoya seyirkerdışi ra bıvece?",
        "confirm-rollback-button": "TEMAM",
+       "confirm-mcrrestore-title": "Yew revizyoni peyser biya",
+       "confirm-mcrundo-title": "Yew vurnayışi peyser bıgê",
+       "mcrundofailed": "Peyser nêgêriya",
        "semicolon-separator": "&#32;",
        "comma-separator": ",&#32;",
        "colon-separator": ":&#32;",
        "version-entrypoints-header-url": "URL",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Article path]",
        "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Script path]",
+       "version-libraries": "Kıtabxaneyê barbiyayeyi",
        "version-libraries-library": "Kıtıbxane",
        "version-libraries-version": "Versiyon",
        "version-libraries-license": "Lisans",
        "redirect-file": "Namey dosya",
        "redirect-logid": "Qeydé  ID",
        "redirect-not-exists": "Erc nêvineyê",
+       "redirect-not-numeric": "Erc numerik niyo",
        "fileduplicatesearch": "Dosyayanê zey pêyan cı geyrê",
        "fileduplicatesearch-summary": "Dosyanê çıftan bınê têmiyankewteyan de bıgeyre.",
        "fileduplicatesearch-filename": "Nameyê dosyayi",
        "tag-filter": "Parzûnê [[Special:Tags|etiketi]]:",
        "tag-filter-submit": "Parzûn",
        "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-blank-description": "Vengiya na pele bıvurne",
        "tags-edit-title": "Etiketan bıvurne",
        "tags-edit-manage-link": "Etiketan idare kerê",
        "tags-edit-existing-tags": "Etiketê ke estê:",
-       "tags-edit-existing-tags-none": "<em>Qet yew</em>",
+       "tags-edit-existing-tags-none": "<em>Çıniyo</em>",
        "tags-edit-new-tags": "Etiketê neweyi:",
        "tags-edit-add": "Nê etiketan cı kerê:",
+       "tags-edit-remove": "Nê etiketan wedare:",
+       "tags-edit-remove-all-tags": "(etiketan pêro wedare)",
+       "tags-edit-chosen-placeholder": "Tayê etiketan weçine",
        "tags-edit-reason": "Sebeb:",
        "comparepages": "Pelan têversanê",
        "compare-page1": "Pele 1",
        "revdelete-restricted": "vergırewtışê ke xızmekaran rê biye",
        "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-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-newusers-create2": "Hesabê karberi $1 terefê $3 ra {{GENDER:$2|vıraziya}}",
        "logentry-newusers-byemail": "Karber $1 hesabe $3 {{GENDER:$2|virast}} u parola rist epostadaci",
        "logentry-newusers-autocreate": "Hesabê karberi $1 otomatikmen {{GENDER:$2|vıraşt}}",
+       "logentry-protect-protect": "$1, pela $3 {{GENDER:$2|şeveknê}} $4",
+       "logentry-protect-protect-cascade": "$1, pela $3 {{GENDER:$2|şeveknê}} $4 [qademeyın]",
        "logentry-rights-rights": "$1 qandê {{GENDER:$6|$3}} rê ezayiya grube $4 ra $5 {{GENDER:$2|vuriye}}",
        "logentry-rights-rights-legacy": "$1 qandê $3 rê ezayiya grube {{GENDER:$2|vuriye}}",
        "logentry-rights-autopromote": "$1 otomatikmen $4 ra $5 {{GENDER:$2|terfi bi}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|bar kerd}} $3",
        "logentry-upload-overwrite": "$1 versiyonê $3 {{GENDER:$2|bar kerd}}",
+       "logentry-upload-revert": "$1, {{GENDER:$2|bar kerd}} $3",
        "log-name-managetags": "Qeydê idareyê etiketi",
        "log-name-tag": "Qeydê etiketi",
        "rightsnone": "(çıniyo)",
        "feedback-bugornote": "Jew mersela teferruato teknik esta şıma reca malumatê şıma hazıro se [ $1  jew xırab rapor] bıvinê.Zewbi zi, formê cerê xo rê şenê karfiyê. Vatışê xo pela da \"[ $3  $2 ]\", namey karber dê xoya piya u wasteriya karfiye.",
        "feedback-cancel": "Bıtexelne",
        "feedback-close": "Temam",
+       "feedback-dialog-title": "Cewab bırışe",
        "feedback-error1": "Xeta: APIi ra peyniyê nêşınasiyay",
        "feedback-error2": "Xeta: Timar kerdış nebı",
        "feedback-error3": "Xeta: API ra cewab çıno",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|bayt|bayti}}",
        "limitreport-expansiondepth": "Tewr veşi herayina dergbiyayışi",
        "limitreport-expensivefunctioncount": "Amoriya fonksiyonde vay agozni",
+       "limitreport-unstrip-size-value": "$1/$2 {{PLURAL:$2|bayt|bayti}}",
        "expandtemplates": "Şablonan hera kı",
        "expand_templates_intro": "Na pela xususi metın geno u şablonê ke tedeyê reyna reyna hêra keno.\nU hem zi nê fonksiyonan hêra keno\n<nowiki>{{</nowiki>#language:…}}</code>, u zey nê parametreyan\n<nowiki>{{</nowiki>CURRENTDAY}}</code>\nEneri Medya wiki sera xo keno.",
        "expand_templates_title": "Sernameyê weziyeti, misal qandê {{FULLPAGENAME}}.:",
        "right-pagelang": "Zıwanê pele bıvurne",
        "action-pagelang": "zıwanê pele bıvurne",
        "log-name-pagelang": "Qeydê vurriyayışa zıwani",
+       "mediastatistics": "İstatistikê medya",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 bayt|$1 bayti}} ($2; $3%)",
        "mediastatistics-table-mimetype": "Tewrê MIME",
+       "mediastatistics-table-count": "Amarê dosyeyan",
+       "mediastatistics-table-totalbytes": "Ebad pêro",
        "mediastatistics-header-unknown": "Nêzanaye",
+       "mediastatistics-header-bitmap": "Asayışê Bitmapi",
        "mediastatistics-header-audio": "Veng",
        "mediastatistics-header-video": "Videoyi",
        "mediastatistics-header-multimedia": "Medyaya dewlemende",
        "mediastatistics-header-office": "Ofis",
        "mediastatistics-header-text": "Tewrê metıni",
        "mediastatistics-header-total": "Dosyeyi pêro",
+       "json-error-syntax": "Xetaya rêza qıseyan",
+       "headline-anchor-title": "Enê leteyi rê gıre",
        "special-characters-group-latin": "Latin",
        "special-characters-group-latinextended": "latinkiya hêrabiyaye",
        "special-characters-group-ipa": "IPA",
        "special-characters-title-endash": "tira kılme",
        "special-characters-title-emdash": "tira derge",
        "special-characters-title-minus": "işaretê kemiye",
-       "mw-widgets-abandonedit": "Verdé qeyd kerdışi şıma qayılé peyser şıré verén asayışin?",
-       "mw-widgets-abandonedit-discard": "Timari wa besteriyê",
-       "mw-widgets-abandonedit-keep": "Timari rê devam ke",
+       "mw-widgets-abandonedit": "Qeydkerdışi ra ravêr, şıma qayılê peyser şêrê asayışo vêrên?",
+       "mw-widgets-abandonedit-discard": "Vurnayışan vece",
+       "mw-widgets-abandonedit-keep": "Vurnayışi rê dewam ke",
        "mw-widgets-abandonedit-title": "Vac welay?",
+       "mw-widgets-dateinput-no-date": "Tarix nêweçiniya",
        "mw-widgets-dateinput-placeholder-day": "SSSS-AA-RR",
        "mw-widgets-dateinput-placeholder-month": "SSSS-AA",
+       "mw-widgets-mediasearch-input-placeholder": "Medya cı geyre",
+       "mw-widgets-mediasearch-noresults": "Neticeyi nêvêniyayi.",
+       "mw-widgets-titleinput-description-new-page": "pele hewna çıniya",
        "mw-widgets-titleinput-description-redirect": "berd be $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Yew kategoriye cı ke...",
        "mw-widgets-usersmultiselect-placeholder": "Tayêna cı ke...",
        "mw-widgets-titlesmultiselect-placeholder": "Tayêna cı ke...",
+       "date-range-from": "Nê tarixi ra:",
+       "date-range-to": "Heta nê tarixi:",
        "randomrootpage": "Pela raştameya rıçıkıne",
        "log-action-filter-block": "Tipê kılitkerdışi:",
+       "log-action-filter-delete": "Tewrê esterıtışi:",
+       "log-action-filter-import": "Tewrê zerrenayışi:",
+       "log-action-filter-move": "Tewrê berdışi:",
        "log-action-filter-newusers": "Babetê hesabvıraştışi:",
+       "log-action-filter-patrol": "Tewrê dewriya:",
+       "log-action-filter-protect": "Tewrê sıtarnayışi:",
+       "log-action-filter-rights": "Tewrê vurnayışê heqe:",
+       "log-action-filter-suppress": "Tewrê wedardışi:",
+       "log-action-filter-upload": "Tewrê barkerdışi:",
        "log-action-filter-all": "Pêro",
        "log-action-filter-block-block": "Kılitkerdış",
+       "log-action-filter-block-reblock": "Vurniyayışê kılitkerdışi",
+       "log-action-filter-block-unblock": "Ake",
+       "log-action-filter-contentmodel-change": "Modelê zerreki bıvurne",
+       "log-action-filter-delete-delete": "Esterıtışê pele",
+       "log-action-filter-delete-restore": "Esterıtışê pele peyser bıgê",
+       "log-action-filter-delete-event": "Rocek esterıtış",
        "authprovider-resetpass-skip-label": "Ravêre",
        "authprovider-resetpass-skip-help": "Peysereştışê parola ra bıvêre.",
        "authform-notoken": "Tokeno kemi",
index 81c305f..7416d3f 100644 (file)
        "anoncontribs": "Contributions",
        "contribsub2": "For {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "User account \"$1\" is not registered.",
+       "negative-namespace-not-supported": "Namespaces with negative values are not supported.",
        "nocontribs": "No changes were found matching these criteria.",
        "uctop": "current",
        "month": "From month (and earlier):",
index b97a7cc..941da39 100644 (file)
                        "Theklan",
                        "Laura Ospina",
                        "Pipino-pumuki",
-                       "Carlosmg.dg"
+                       "Carlosmg.dg",
+                       "Mynor Archila"
                ]
        },
        "tog-underline": "Enlaces a subrayar:",
        "edit-gone-missing": "No se ha podido actualizar la página.\nParece haber sido borrada.",
        "edit-conflict": "Conflicto de edición.",
        "edit-no-change": "Se ignoró tu edición porque no se hizo ningún cambio en el texto.",
+       "edit-slots-cannot-add": "{{PLURAL:$1|La siguiente ranura no es soportada|Las siguientes ranuras no son soportadas}} aquí:",
        "edit-slots-missing": "{{PLURAL:$1|Falta el siguiente espacio|Faltan los siguientes espacios}}: $2",
        "postedit-confirmation-created": "Se ha creado la página.",
        "postedit-confirmation-restored": "Se ha restaurado la página.",
        "move": "Trasladar",
        "movethispage": "Trasladar esta página",
        "unusedimagestext": "Los siguientes archivos existen pero no están insertados en ninguna página.\nTen en cuenta que otros sitios web pueden enlazar un archivo directamente por la URL, y por tanto pueden estar listados aquí a pesar de estar siendo usados de forma activa.",
+       "unusedimagestext-categorizedimgisused": "Los siguientes archivos existen, pero no están integrados en ninguna página. Las imágenes categorizadas son consideradas como utilizadas, a pesar de que no están incrustadas en ninguna página. Por favor tómese en cuenta que otros sitios pueden enlazarse a un archivo con una URL directa, y todavía pueden enlistarse aquí a pesar de estar en uso activo.",
        "unusedcategoriestext": "Las siguientes categorías han sido creadas, pero ningún artículo o categoría las utiliza.",
        "notargettitle": "No hay página objetivo",
        "notargettext": "No has especificado sobre qué página deseas llevar a cabo esta acción.",
        "contribsub2": "Para {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "La cuenta de usuario «$1» no está registrada.",
        "nocontribs": "No se encontraron cambios que cumplieran estos criterios.",
-       "uctop": "edición actual",
+       "uctop": "última",
        "month": "Desde el mes (y anteriores):",
        "year": "Desde el año (y anteriores):",
        "date": "Desde el día (y anteriores):",
index 5f5cc2c..655f524 100644 (file)
@@ -31,7 +31,8 @@
                        "Metsavend",
                        "Cumbril",
                        "Ilmarine",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "Mardus"
                ]
        },
        "tog-underline": "Linkide allakriipsutus:",
        "pagecategories": "{{PLURAL:$1|Kategooria|Kategooriad}}",
        "category_header": "Leheküljed kategoorias \"$1\"",
        "subcategories": "Alamkategooriad",
-       "category-media-header": "Meediumifailid kategoorias \"$1\"",
-       "category-empty": "<em>Selles kategoorias pole praegu ühtegi lehekülge ega meediumifaili.</em>",
+       "category-media-header": "Meediafaile kategoorias \"$1\"",
+       "category-empty": "<em>Selles kategoorias pole praegu ühtegi lehekülge ega meediafaili.</em>",
        "hidden-categories": "{{PLURAL:$1|Peidetud kategooria|Peidetud kategooriad}}",
        "hidden-category-category": "Peidetud kategooriad",
        "category-subcat-count": "{{PLURAL:$2|Selles kategoorias on ainult järgmine alamkategooria.|{{PLURAL:$1|Järgmine alamkategooria|Järgmised $1 alamkategooriat}} on selles kategoorias (kokku $2).}}",
        "sort-ascending": "Järjesta tõusvalt",
        "nstab-main": "Artikkel",
        "nstab-user": "Kasutaja leht",
-       "nstab-media": "Meediumileht",
+       "nstab-media": "Meedialeht",
        "nstab-special": "Eri",
        "nstab-project": "Projektileht",
        "nstab-image": "Fail",
        "right-deletechangetags": "Kustutada andmebaasist [[Special:Tags|märgiseid]]",
        "grant-generic": "Volituse \"$1\" õiguste komplekt",
        "grant-group-page-interaction": "Interaktsioon lehekülgedega",
-       "grant-group-file-interaction": "Interaktsioon meediumifailidega",
+       "grant-group-file-interaction": "Käsitle meediafaile",
        "grant-group-watchlist-interaction": "Interaktsioon sinu jälgimisloendiga",
        "grant-group-email": "E-kirja saatmine",
        "grant-group-high-volume": "Suuremahuline tegevus",
        "tooltip-t-permalink": "Püsilink lehekülje sellele redaktsioonile",
        "tooltip-ca-nstab-main": "Vaata sisulehekülge",
        "tooltip-ca-nstab-user": "Näita kasutaja lehte",
-       "tooltip-ca-nstab-media": "Vaata meediumifaili lehekülge",
+       "tooltip-ca-nstab-media": "Vaata meedialehte",
        "tooltip-ca-nstab-special": "See on erilehekülg ja seda ei saa redigeerida.",
        "tooltip-ca-nstab-project": "Näita projekti lehte",
        "tooltip-ca-nstab-image": "Vaata faili lehekülge",
        "version-editors": "Toimetid",
        "version-antispam": "Rämpsposti tõkestus",
        "version-other": "Muu",
-       "version-mediahandlers": "Meediumitöötlejad",
+       "version-mediahandlers": "Meedia käsitlejad",
        "version-hooks": "Haagid",
        "version-parser-extensiontags": "Parseri lisasildid",
        "version-parser-function-hooks": "Parserifunktsioonid",
        "default-skin-not-found-no-skins": "Oih! Sinu viki vaikekujundus, milleks muutuja <code dir=\"ltr\">$wgDefaultSkin</code> järgi on <code>$1</code>, pole saadaval.\n\nÜhtegi kujundust pole paigaldatud.\n\n; Kui oled MediaWiki just paigaldanud või täiendasid seda:\n: Paigaldasid tarkvara ilmselt Giti kaudu või otse lähtekoodist või mõnel muul viisil. See on ootuspärane. MediaWiki 1.24 ja uuemad versioonid ei sisalda peahoidlas ühtegi kujundust. Proovi [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org-i kujunduste kataloogist] mõni kujundus paigaldada. Selleks saad:\n:* laadida alla [https://www.mediawiki.org/wiki/Download lintarhiivi paigaldaja], mis sisaldab mitut kujundust ja tarkvaralisa. Saad sealt kleepimiseks kopeerida kausta <code dir=\"ltr\">skins/</code>;\n:* [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org-ist] kindla kujunduse lintarhiivi alla laadida;\n:* [https://www.mediawiki.org/wiki/Download_from_Git#Using_Git_to_download_MediaWiki_skins kasutada Giti, et kujundusi alla laadida].\n: Selle tegemine ei tohiks häirida Giti hoidlat, kui oled MediaWiki arendaja. Vaata [https://www.mediawiki.org/wiki/Manual:Skin_configuration kujunduste häälestusjuhendist], kuidas kujundusi lubada ja kuidas valida vaikekujundus.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (lubatud)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>keelatud</strong>)",
-       "mediastatistics": "Meediumifailide arvandmestik",
+       "mediastatistics": "Meediastatistika",
        "mediastatistics-summary": "Arvandmed üles laaditud failitüüpide kohta. See käib ainult failide viimaste versioonide kohta. Vanu ja kustutatud versioone pole arvesse võetud.",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 bait|$1 baiti}} ($2; $3%)",
        "mediastatistics-bytespertype": "Failide kogusuurus selles alaosas: $1 {{PLURAL:$1|bait|baiti}} ($2; $3%).",
        "mw-widgets-dateinput-no-date": "Kuupäev valimata",
        "mw-widgets-dateinput-placeholder-day": "AAAA-KK-PP",
        "mw-widgets-dateinput-placeholder-month": "AAAA-KK",
-       "mw-widgets-mediasearch-input-placeholder": "Otsi meediumifaile",
+       "mw-widgets-mediasearch-input-placeholder": "Otsi meediat",
        "mw-widgets-mediasearch-noresults": "Tulemusi ei leitud.",
        "mw-widgets-titleinput-description-new-page": "lehekülge pole veel",
        "mw-widgets-titleinput-description-redirect": "ümbersuunamine leheküljele \"$1\"",
index b960391..bc3c797 100644 (file)
        "exif-copyrighted-false": "Status for ophavsret er ikke angivet",
        "exif-photometricinterpretation-0": "Sort-hvid (sort er 0)",
        "exif-photometricinterpretation-1": "Sort-hvid (sort er 0)",
+       "exif-photometricinterpretation-3": "Palet",
        "exif-unknowndate": "Ukendt dato",
        "exif-orientation-1": "Normal",
        "exif-orientation-2": "Horisontalt spejlet",
index e0a7f19..4c9f08d 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Beyronvan",
                        "Bonevarluri",
-                       "Mogoeilor"
+                       "Mogoeilor",
+                       "Lorestani"
                ]
        },
        "exif-imagewidth": "پئنا",
@@ -16,8 +17,8 @@
        "exif-planarconfiguration": "سرجایک کردن رسینه",
        "exif-ycbcrsubsampling": "نسوت زیرنمونه Y وه C",
        "exif-ycbcrpositioning": "جاگری کردن Y و C",
-       "exif-xresolution": "گپ نما کردن د آسو",
-       "exif-yresolution": "Ú¯Ù¾ Ù\86Ù\85ا Ú©Ø±Ø¯Ù\86 Ø¯ Ù\88ارÙ\88",
+       "exif-xresolution": "گٱپ Ù\86Ù\85ا Ú©Ø±Ø¯Ù\86 Ø¯ Ø¢Ø³Ù\88",
+       "exif-yresolution": "گٱپ Ù\86Ù\85ا Ú©Ø±Ø¯Ù\86 Ø¯ Ú¤Ø§Ø±Û\89",
        "exif-stripoffsets": "جاگه رسینه یا عسگ",
        "exif-rowsperstrip": "انازه ردیفیا سی هر نوار",
        "exif-stripbytecounts": "نقطه یا سی هر نوار جمع و جور بیه",
        "exif-primarychromaticities": "رنگ گرتن چیا مهمتر",
        "exif-ycbcrcoefficients": "ضریبا ماتریس جا وه جایی جاگه رئنی",
        "exif-referenceblackwhite": "جفت انازه سرچشمه سیا و اسبئ",
-       "exif-datetime": "Ø¢Ù\84شت Ø¯Ø¦Ù\86 Ù\88خت Ù\88 Ø¯Ù\85Ù\88Ù\86 Ø¬Ø§Ù\86Û\8cا",
+       "exif-datetime": "Ø¢Ù\84شت Ø¯Ø§Ù\9bÛ\8cÙ\86 Ú¤Ù±Ø®Øª Û\89 Ø²Ù\85Ù\88Ý© Ø¬Ø§Ù\86ؽا",
        "exif-imagedescription": "نوم عسگ",
        "exif-make": "سازیار دیربین",
-       "exif-model": "مدل دیربین",
-       "exif-software": "نرم افزار به کار گرتنی",
+       "exif-model": "مودل دیربین",
+       "exif-software": "نٱرم ٱفزار ڤ کار گرتنی",
        "exif-artist": "نیسنه",
        "exif-copyright": "حق تکثیر دار",
-       "exif-exifversion": "نسقه Exif",
+       "exif-exifversion": "نۏسخٱ Exif",
        "exif-flashpixversion": "نسقه حامین داری Flashpix",
-       "exif-colorspace": "رئن ورگه",
+       "exif-colorspace": "رٱنڳ ڤورگٱ",
        "exif-componentsconfiguration": "مئنی هر اندوم",
        "exif-compressedbitsperpixel": "شکل جمع و جیل کردن عسگ",
        "exif-pixelxdimension": "پئنا عسگ",
        "exif-pixelydimension": "درازا عسگ",
        "exif-usercomment": "ویر و باوریا کارور",
        "exif-relatedsoundfile": "جانیا دنگ دار مرتوط",
-       "exif-datetimeoriginal": "دÙ\85Ù\88Ù\86 Ù\88 Ù\88خت Ø±Ø§Ø³ Ø¨Û\8cئن دونسمنیا",
-       "exif-datetimedigitized": "گات و وخت دیجیتالی کردن",
+       "exif-datetimeoriginal": "زÙ\85Ù\88Ý© Û\89 Ú¤Ù±Ø®Øª Ø¯Û\8fرس Ø¨Û\8cÛ\8cن دونسمنیا",
+       "exif-datetimedigitized": "گات ۉ ڤٱخت دیجیتالی کردن",
        "exif-subsectime": "کم کردن ثانیه گات و وخت",
        "exif-subsectimeoriginal": "کم کردن ثانیه گات اصلی",
        "exif-subsectimedigitized": "کم کردن ثانیه گات دیجیتالی",
        "exif-copyrighted-true": "کپی رایت بیه",
        "exif-copyrighted-false": "حال و بال کپی رایت میزوکاری نبیه",
        "exif-unknowndate": "گات نادیار",
-       "exif-orientation-1": "Ø¢دی",
+       "exif-orientation-1": "عادی",
        "exif-orientation-2": "پشت ری بیه افقی",
        "exif-orientation-3": "180 گرینج لر دئه",
        "exif-orientation-4": "پشت ری بیه عمودی",
index 50b0735..2eb4efa 100644 (file)
        "prefs-advancedwatchlist": "گزینه‌های پیشرفته",
        "prefs-displayrc": "گزینه‌های نمایش",
        "prefs-displaywatchlist": "گزینه‌های نمایش",
+       "prefs-pageswatchlist": "صفحه‌های پی‌گیری‌شده",
        "prefs-tokenwatchlist": "بلیط",
        "prefs-diffs": "تفاوت‌ها",
        "prefs-help-prefershttps": "تأثیر این ترجیح بعد از ورود بعدی شما اعمال خواهد شد.",
        "rcfilters-watchlist-showupdated": "تغییرات صفحاتی که شما از زمانی که تغییر بازدیدشان نکرده‌اید به صورت <strong>پررنگ</strong> و با نشانگر توپر نمایش می‌یابد.",
        "rcfilters-preference-label": "مخفی کردن نسخه بهبود یافته تغییرات اخیر",
        "rcfilters-preference-help": "تغییرات رابط کاربری که در سال ۲۰۱۷ اضافه شده است را بر می‌گرداند.",
-       "rcfilters-watchlist-preference-label": "نمایش نسخهٔ بهبودیافتهٔ فهرست پیگیری",
+       "rcfilters-watchlist-preference-label": "استفاده واسط بدون جاوااسکریپت",
        "rcfilters-watchlist-preference-help": "واگردان در سال ۲۰۱۷ دوباره طراحی شد و تمام ابزارها اضافه و از آن زمان به بعد اضافه شدند.",
        "rcfilters-filter-showlinkedfrom-label": "نمایش تغییرات صفحاتی که پیوند شده‌اند",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>صفحات پیوند به</strong> صفحهٔ انتخاب شده",
        "confirmrecreate": "کاربر [[User:$1|$1]] ([[User talk:$1|بحث]]) این مقاله را پس از اینکه شما آغاز به ویرایش آن نموده‌اید به دلیل زیر حذف کرده است :\n: ''$2'' \nلطفاً تأیید کنید که مجدداً می‌خواهید این مقاله را بسازید.",
        "confirmrecreate-noreason": "کاربر [[User:$1|$1]] ([[User talk:$1|بحث]]) این صفحه را پس از شروع ویرایش‌تان {{GENDER:$1|پاک}} کرده‌است.  لطفاً تأیید کنید که شما واقعاً می‌خواهید آن را دوباره ایجاد کنید.",
        "recreate": "باز ایجاد",
-       "confirm-purge-title": "خالی کردن کاشه این صفحه",
+       "confirm-purge-title": "خالی‌کردن حافظهٔ نهان این صفحه",
        "confirm_purge_button": "تأیید",
        "confirm-purge-top": "پاک کردن نسخهٔ حافظهٔ نهانی (Cache) این صفحه را تأیید می‌کنید؟",
        "confirm-purge-bottom": "خالی کردن میانگیر یک صفحه باعث می‌شود که آخرین نسخهٔ آن نمایش یابد.",
index 25eae75..f82b638 100644 (file)
        "blocklist-nousertalk": "oman keskustelusivun muokkaaminen estetty",
        "blocklist-editing": "muokkaaminen",
        "blocklist-editing-sitewide": "muokkaaminen (sivuston laajuisesti)",
+       "blocklist-editing-page": "лопат",
+       "blocklist-editing-ns": "лемпотмот",
        "ipblocklist-empty": "Estolista on tyhjä.",
        "ipblocklist-no-results": "Pyydettyä IP-osoitetta tai käyttäjätunnusta ei ole estetty.",
        "blocklink": "estä",
        "ipb_expiry_old": "Vanhentumisaika on menneisyyttä.",
        "ipb_expiry_temp": "Piilotettujen käyttäjätunnusten estojen tulee olla pysyviä.",
        "ipb_hide_invalid": "Tämän tunnuksen piilottaminen ei onnistu; sillä on enemmän kuin {{PLURAL:$1|yksi muokkaus|$1 muokkausta}}.",
+       "ipb_hide_partial": "Кекшезь совамолемень саймес саематне эрявить теемс сайтань келес.",
        "ipb_already_blocked": "”$1” on jo estetty.",
        "ipb-needreblock": "$1 on jo estetty. Haluatko muuttaa eston asetuksia?",
        "ipb-otherblocks-header": "{{PLURAL:$1|Muu esto|Muut estot}}",
        "logentry-block-block": "$1 {{GENDER:$2|esti}} käyttäjän {{GENDER:$4|$3}}. Eston kesto on $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|poisti muokkauseston}} käyttäjältä {{GENDER:$4|$3}}",
        "logentry-block-reblock": "$1 {{GENDER:$2|muutti}} eston asetuksia kohteessa {{GENDER:$4|$3}}. Eston kesto on $5 $6",
-       "logentry-partialblock-block": "$1 {{GENDER:$2|esti}} käyttäjää {{GENDER:$4|$3}} muokkaamasta {{PLURAL:$8||sivuja}} $7. Eston kesto on $5 $6",
+       "logentry-partialblock-block-page": "{{PLURAL:$1|лопа|лопат}} $2",
+       "logentry-partialblock-block-ns": "{{PLURAL:$1|лемпотмо|лемпотмот}} $2",
+       "logentry-partialblock-block": "$1 {{GENDER:$2|саймас саизе}} {{GENDER:$4|$3}}-нь, илязо витне-петне $7, зярдо витнема-петнема шказо $5 $6",
        "logentry-partialblock-reblock": "$1 {{GENDER:$2|muutti}} käyttäjän {{GENDER:$4|$3}} muokkauseston asetuksia estäen muokkausten tekemisen {{PLURAL:$8||sivuihin}} $7. Eston kesto on $5 $6",
        "logentry-non-editing-block-block": "$1 {{GENDER:$2|esti}} käyttäjää {{GENDER:$4|$3}} suorittamasta määrättyjä toimenpiteitä (lukuun ottamatta muokkaamista). Eston kesto on $5 $6",
        "logentry-non-editing-block-reblock": "$1 {{GENDER:$2|muutti}} käyttäjän {{GENDER:$4|$3}} toimintaeston asetuksia, jotka koskevat määrättyjä toimenpiteitä. Eston kesto on $5 $6",
index 257b818..52599fe 100644 (file)
        "ipb_expiry_old": "O tempo de expiración é no pasado.",
        "ipb_expiry_temp": "Os bloqueos a nomes de usuario agochados deberían ser permanentes.",
        "ipb_hide_invalid": "Non se pode suprimir esta conta; ten máis {{PLURAL:$1|dunha edición|de $1 edicións}}.",
+       "ipb_hide_partial": "Os bloqueos con nome de usuario oculto deben ser para todo o sitio.",
        "ipb_already_blocked": "\"$1\" xa está bloqueado",
        "ipb-needreblock": "$1 xa está bloqueado. Quere cambiar as configuracións?",
        "ipb-otherblocks-header": "{{PLURAL:$1|Outro bloqueo|Outros bloqueos}}",
index ce64a0a..1729226 100644 (file)
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|uloi]])",
        "duplicate-defaultsort": "'''Chotrai:''' Default arin manddunk chavi ''$2'' rodd korta adhlem default arin manddunk chavi ''$1'', haka.",
        "redirect": "Fayl, vaporpi, pan, uzollnni vo sotr ank‎ vorvim punornirdexon kor",
-       "redirect-summary": "Hem vixex pan punornirdexit korta eka faylik (faylichem nanv dilear), eke panak (uziollnecho ank vo panacho ank dilear), ek vaporpeachem panak (eke vaporpeache ank dilear), vo ek sotr provishtt (sotrachem ank dilear). Vapor: [[{{#Special:Redirect}}/file/Dekhik.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], vo [[{{#Special:Redirect}}/logid/186]].",
+       "redirect-summary": "Hem vixex pan punornirdexit korta eka faylik (faylichem nanv dilear), eke panak (uziollnecho ank vo panacho ank dilear), ek vaporpeachem panak (eke vaporpeache ank dilear), vo ek sotr nond (sotrachem ank dilear). Vapor: [[{{#Special:Redirect}}/file/Dekhik.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], vo [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "Voch‎",
        "redirect-lookup": "Suchien polloi:",
        "redirect-value": "Mol:",
index 41842e4..1f0d32e 100644 (file)
        "anoncontribs": "תרומות",
        "contribsub2": "עבור {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "חשבון המשתמש \"$1\" אינו רשום.",
+       "negative-namespace-not-supported": "אין תמיכה במרחבי שם בעלי ערך שלילי.",
        "nocontribs": "לא נמצאו שינויים המתאימים לקריטריונים אלו.",
        "uctop": "נוכחי",
        "month": "עד החודש:",
index 501a4b0..1692f47 100644 (file)
        "grant-delete": "Eyða síðum, yfirferðum og annálsfærslum",
        "grant-editinterface": "Breyta nafnrými MediaWiki og JSON notanda/vefsvæðis",
        "grant-editmycssjs": "Breyta þínum eigin CSS/JSON/JavaScript",
-       "grant-editmyoptions": "Breyta notandastillingunum þínum",
+       "grant-editmyoptions": "Breyta notandastillingunum þínum og JSON-uppsetningu",
        "grant-editmywatchlist": "Breyta vaktlistanum þínum",
        "grant-editpage": "Breyta fyrirliggjandi síðum",
        "grant-editprotected": "Breyta vernduðum síðum",
        "uploadstash-zero-length": "Lengd skráar er núll.",
        "invalid-chunk-offset": "Ógild raðbreyting bunka",
        "img-auth-accessdenied": "Aðgangur óheimill",
-       "img-auth-nopathinfo": "PATH_INFO vantar.\nBiðlarinn þínn er ekki stilltur til að gefa upp þessar upplýsingar.\nÞær mega vera CGI-byggðar og mega ekki styðja img_auth.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization",
+       "img-auth-nopathinfo": "Vantar upplýsingar um slóð.\nÞjónninn þinn er ekki stilltur til að senda REQUEST_URI og/eða PATH_INFO breyturnar.\nEf svo er, prófaðu að virkja $wgUsePathInfo.\nSkoðaðu https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Umbeðin slóð var ekki í stilltri innhleðslumöppu.",
        "img-auth-badtitle": "Mistókst að búa til gildan titil útfrá „$1”.",
        "img-auth-nologinnWL": "Þú ert ekki skráð(ur) inn og „$1“ er ekki á hvítlista.",
        "ipbreason": "Ástæða:",
        "ipbreason-dropdown": "* Algengar bannástæður\n** Setur inn rangar upplýsingar\n** Fjarlægir efni af síðum\n** Setur inn rusltengla á utanaðkomandi síður\n** Setur inn vitleysu/þvaður á síður\n** Yfirþyrmandi framkoma/áreitni\n** Misnotkun á fjölda notandanafna\n** Óásættanlegt notandanafn",
        "ipb-hardblock": "Banna innskráðum notendum að breyta frá þessu IP-vistfangi.",
-       "ipbcreateaccount": "Banna nýskráningu notandanafns",
-       "ipbemailban": "Banna notanda að senda tölvupóst",
+       "ipbcreateaccount": "Gerð notandaaðgangs",
+       "ipbemailban": "Senda tölvupóst",
        "ipbenableautoblock": "Banna síðasta vistfang notanda sjálfkrafa; og þau vistföng sem viðkomandi notar til að breyta síðum",
        "ipbsubmit": "Banna notanda",
        "ipbother": "Annar tími:",
        "ipboptions": "2 tíma:2 hours,1 dag:1 day,3 daga:3 days,1 viku:1 week,2 vikur:2 weeks,1 mánuð:1 month,3 mánuði:3 months,6 mánuði:6 months,1 ár:1 year,aldrei:infinite",
        "ipbhidename": "Fela notandanafn úr breytingaskrá og listum",
        "ipbwatchuser": "Vakta notanda- og spjallsíður þessa notanda",
-       "ipb-disableusertalk": "Banna þessum notanda að breyta eigin spjallsíðu",
+       "ipb-disableusertalk": "Breyta eigin spjallsíðu",
        "ipb-change-block": "Endurbanna notanda með þessum stillingum",
        "ipb-confirm": "Staðfesta bann",
        "ipb-sitewide": "Á öllum vefnum",
index cf7e65e..aec8a3c 100644 (file)
        "sun": "یاٛشٱمٱ",
        "mon": "دۏشٱمٱ",
        "tue": "ساْ شٱمٱ",
-       "wed": "چارشمٱ",
-       "thu": "پٱن شمٱ",
-       "fri": "جومە",
-       "sat": "شأمە",
+       "wed": "Ú\86ارشٱÙ\85Ù±",
+       "thu": "پٱÙ\86 Ø´Ù±Ù\85Ù±",
+       "fri": "جۏمٱ",
+       "sat": "شٱمٱ",
        "january": "جانڤیٱ",
        "february": "فڤریٱ",
        "march": "مارس",
        "december-date": "دئسامر $1",
        "pagecategories": "{{PLURAL:$1|}}{{PLURAL:$1|دٱسٱ|دٱسٱيا}}",
        "category_header": "بٱلگٱیا مؽن دٱسٱ \"$1\"",
-       "subcategories": "زيردأسە یا",
+       "subcategories": "زؽر دٱسٱیا",
        "category-media-header": "ڤارسگٱر د دٱسٱ \"$1\"",
        "category-empty": "ای دٱسٱ د راستٱکی د ڤٱرگرتٱ هیچ بٱلگٱ یا ڤارسگٱری نی",
        "hidden-categories": "{{PLURAL:$1|دٱسٱ قایم بیٱ|دٱسٱیا قایم بیٱ}}",
        "categoryviewer-pagedlinks": "($1) ($2)",
        "about": "دئبارە",
        "article": "مینوٙنە یا بألگە",
-       "newwindow": "(د Û\8cئ Ú¯Ø¦Ù\84 Ù\86Û\8cÙ\85دأرÛ\8c ØªØ§Ø²Û\95 Ú¤Ø§ش کو)",
+       "newwindow": "(د Û\8cاÙ\9b Ù\86Û\8cÙ\85درÛ\8c ØªØ§Ø²Ù± Ú¤Ø§Ø²ش کو)",
        "cancel": "ٱنجوم شیڤسن",
        "moredotdotdot": "بیشتئر",
        "morenotlisted": "ئی نومگە کامئل بییە.",
        "variants": "آلشتگریٛا",
        "navigation-heading": "نوم جاگٱ ناڤگردی",
        "errorpagetitle": "غألأط",
-       "returnto": "ڤورگأشتئن د $1.",
+       "returnto": "ڤرگٱشتن د $1.",
        "tagline": "د {{SITENAME}}",
        "help": "هومياری",
        "search": "پاٛ جۊری",
        "edit": "ڤیرایش",
        "edit-local": "توضی ڤولات نئشینی نە ڤیرایئشت بأکیت",
        "create": "راس كئردئن",
-       "create-local": "بئ گئل توضی ڤولات نئشینی ئضاف بأکیت",
+       "create-local": "یاٛ تۉزی ڤلات نشینی اْزاف بٱکؽت",
        "delete": "پاکسا کئردئن",
        "undelete_short": "ناپاکسا کئردئن {{PLURAL:$1|یئ گئل ڤیرایئشت|$1 ڤیرایئشتیا}}",
        "viewdeleted_short": "{{PLURAL:$1|}}سئیل بأکیت{{[PLURAL:$1|یئ گئل ڤیرایئشت پاکسا بییە|$1ڤیرایئشتیا پاکسا بیینە}}",
        "protect": "پأر و پیم بأکیت",
        "protect_change": "آلئشت بأکیت",
        "unprotect": "آلئشت دأئن پأر و پیم کاری",
-       "newpage": "بألگە نۊ",
+       "newpage": "بٱلگٱ نۊ",
        "talkpagelinktext": "چٱک چنٱ",
        "specialpage": "بألگە ڤیجە",
        "personaltools": "ٱڤزارؽا شٱخسی",
        "sort-descending": "کأم بییئن سأرجاخود",
        "sort-ascending": "زياد بيیئن سأرجادخود",
        "nstab-main": "بٱلگٱ",
-       "nstab-user": "بلگٱ کاریار",
+       "nstab-user": "بٱÙ\84Ú¯Ù± Ú©Ø§Ø±Û\8cار",
        "nstab-media": "بألگە ڤارئسگأر",
        "nstab-special": "بٱلگٱیا ڤیژٱ",
        "nstab-project": "بألگە پوروجە",
        "welcomecreation-msg": "حئساڤتوٙ دوروس بییە.\nد ڤیرئتوٙ نأروە کئ {{نوم دیارگە}} [[Special:Preferences|preferences]]  خوتوٙنە آلئشت بأکیت.",
        "yourname": "نوم کاریاری:",
        "userlogin-yourname": "نوم کاریاری",
-       "userlogin-yourname-ph": "Ù\86Ù\88Ù\85 Ú©Ø§Ø±Û\8cارÛ\8c ØªÙ\88Ù\99Ù\86Û\95 Ø¨Ø£Ø²Ø¦Ù\86Û\8cت",
+       "userlogin-yourname-ph": "Ù\86Ù\88Ù\85 Ú©Ø§Ø±Û\8cارÛ\8c ØªÙ\88Ù\86اÙ\92 Ø¨Ù±Ø²Ù\86ؽت",
        "createacct-another-username-ph": "نوم کاریاری توٙنە بأزئنیت",
        "yourpassword": "رازینە گوڤاردئن:",
-       "userlogin-yourpassword": "رازینە گوڤاردئن",
+       "userlogin-yourpassword": "رازینٱ گوڤاردن",
        "userlogin-yourpassword-ph": "رازینٱ گوئارسناْ بٱزاْ",
        "createacct-yourpassword-ph": "رازینە گوڤاردئن نە بأزە",
        "yourpasswordagain": "یئ گئل هأنی رازینە گوڤاردئن نە بأزە",
        "yourdomainname": "پوشگئر شوما:",
        "password-change-forbidden": "شوما نئمی توٙنیت رازینە گوڤاردئن خوتوٙنە د ئی ڤیکی آلئشت بأکیت.",
        "externaldberror": "ئشتئڤایی د ئرتئڤاط ڤا رئسینە گا پیش ئوٙماە یا شوما صئلا یأنە کئ یئ گئل حئساڤ خارجی خوتوٙنە ڤئ هئنگوم سازی بأکیت ناریت.",
-       "login": "ڤامین اۊمائن",
+       "login": "ڤامؽن اوماین",
        "nav-login-createaccount": " ڤامین ئوٙمائن/راس کئردئن حئساڤ",
        "logout": "د ساموٙنە دئرئوٙمائن",
        "userlogout": "د ساموٙنە دئرئوٙمائن",
        "login-throttled": "شوما تا ئیسئ سی ڤامین ئوٙمائن فئرە تئلاش کئردیتە.\n$1 لوطف بأکیت سی تئلاش هأنی گوری بئسیت.",
        "login-abort-generic": "ڤامین ئوٙمائن توٙ ناخوش سأرنجوم بی- گأن بی",
        "login-migrated-generic": "حئساڤ کاریاری شوما جا ڤئ جا بییە، و نوم کاریاری شوما دە د ئی ڤیکی نیئش.",
-       "loginlanguagelabel": "زۊن:$1",
+       "loginlanguagelabel": "زڤون:$1",
        "suspicious-userlogout": "د حاست ڤئ دأر رأتئن شوما تیە پوشی بییە سی یە کئ ڤئ نأظأر یما کئ ڤئ سی یئ گئل دوڤارتە نیأر گأن یا یئ گئل پوروکسی کئ ها د ڤیرگە کأش کئل بییە.",
        "createacct-another-realname-tip": "نوم راستأکی دئل ڤئ حاییە.\nأر شوما ڤئنە نئها ئمایە بأکیت، یە سی هوم نئسبأت دأئن کاریاری سی کاریاش ڤئ کار گئرئتئ بوٙە.",
        "pt-login": "ڤا مؽن اوماین",
        "resettokens-watchlist-token": "دیارگأر سی حوڤال حوٙن تورگە(أتوم/آر ئس ئس) سی [[Special:سئیل بأرگ|آلئشت دأئن بألگە یا د سئیل بأرگئتوٙ]]",
        "resettokens-done": "نئشوٙنە یا تازه بیینە",
        "resettokens-resetbutton": "نئشوٙنە گولئ ڤورچیە د نوٙ زئنە بینە",
-       "bold_sample": "نیسسٱ مین پور",
-       "bold_tip": "نیسسٱ مین پور",
-       "italic_sample": "Ù\86Û\8cسئسÛ\95 Ú©Ø£Ø¬ Ù\88 Ú©Ù\88Ù\84Û\95",
-       "italic_tip": "Ù\86Û\8cسئسÛ\95 Û\8cا Ú©Ø£Ø¬ Ù\88 Ú©Ù\88Ù\84Û\95",
-       "link_sample": "داسÙ\88Ù\99Ù\86 Ù\87Ù\88Ù\85 Ù¾Û\8cÚ¤Ù\86د",
-       "link_tip": "هوم پیڤند مینجایی",
-       "extlink_sample": "http://www.example.com Ø¯Ø§Ø³Ù\88Ù\99Ù\86 Ù\87Ù\88Ù\85 Ù¾Ø¦Û\8cڤأÙ\86د",
-       "extlink_tip": "Ù\87Ù\88Ù\85 Ù¾Ø¦Û\8cڤأÙ\86د Ø®Ø§Ø±Ø¦Ø¬Û\8c(د Ú¤Û\8cر Ø¯Ø§Ø´ØªÙ\88Ù\99ئیت)",
-       "headline_sample": "سأرخأط نیسئسە",
-       "headline_tip": "رÛ\8cتئراز 2 Ø®Ø£Ø· Ø³Ø£Ø±Ú¤Ø£ن",
-       "nowiki_sample": "د Ø§Û\8cÚ\86اÙ\9b Û\8cاÙ\9b Ú¯Ø§Ù\9bÙ\84 Ù\86Û\8cسسٱ Ú¤Ø§Ø±Ø¯ Ø¨Ù±Ú©Û\8cت",
+       "bold_sample": "نیسسٱ مؽن پور",
+       "bold_tip": "نیسسٱ مؽن پور",
+       "italic_sample": "Ù\86Û\8cسسٱ Ú©Ù±Ø¬ Û\89 Ù\87ار",
+       "italic_tip": "Ù\86Û\8cسسٱÛ\8cا Ú©Ù±Ø¬ Û\89 Ú©Ù\88Ù\84Ù±",
+       "link_sample": "داسÙ\88Ù\86 Ù\87Ù\88Ù\85 Ù¾Ø§Ù\9bÚ¤Ù±Ù\86",
+       "link_tip": "هوم پاٛڤٱن مؽنجایی",
+       "extlink_sample": "http://www.example.com Ø¯Ø§Ø³Ù\88Ù\86 Ù\87Ù\88Ù\85 Ù¾Ø§Ù\9bÚ¤Ù±Ù\86",
+       "extlink_tip": "Ù\87Ù\88Ù\85 Ù¾Ø§Ù\9bÚ¤Ù±Ù\86 Ø®Ø§Ø±Ø¬Û\8c(د Ú¤Û\8cر Ø¯Ø§Ø´ØªÛ\8aیت)",
+       "headline_sample": "سٱرخٱت نیسسٱ",
+       "headline_tip": "رÛ\8cتراز 2 Ø®Ù±Øª Ø³Ù±Ø±Ú¤Ù±ن",
+       "nowiki_sample": "د Ø§Û\8cÚ\86اÙ\92 Û\8cاÙ\9b Ù\86Û\8cسسٱ Ú¤Ø§Ø±Ø¯ Ø¨Ù±Ú©Ø½ت",
        "nowiki_tip": "د شکل ڤیکی تیٱپۊشی بٱک",
        "image_sample": "Example.jpg",
-       "image_tip": "جانیا چار قئر گئرئتە",
+       "image_tip": "جانؽا چار قر گرتٱ",
        "media_sample": "Example.ogg",
-       "media_tip": "جانیا هوم پیڤند",
-       "sig_tip": "اÙ\9bÙ\85زا Ø´Ù\88ما ڤا گاتدیس",
-       "hr_tip": "خأط آسوٙ ڤأنە(جئگا جئگا ڤئ کار گئرئتئن)",
+       "media_tip": "جانؽا هوم پاٛڤٱن",
+       "sig_tip": "اÙ\92Ù\85زا Ø´ما ڤا گاتدیس",
+       "hr_tip": "خٱت آسو ڤٱنٱ(جگا جگا ڤ کار گرتن)",
        "summary": "چکسٱ",
        "subject": "ذاسوٙن/سأرتال:",
        "minoredit": "یٱ یاٛ گاٛل ڤیرایشت کوچکٱ",
        "showpreview": "نشوݩ داٛین پیش ساٛلٛ",
        "showdiff": "نشوݩ داٛین آلشتکاریا",
        "blankarticle": "<strong>زنئار:</strong> بلگه ای که شما دروس کردیته حالیه.\nار شما د نو ری \"$1\" بپورنیت, بلگه وه شکل که هیچ مینونه ای دش نبا دروس بوئه.",
-       "anoneditwarning": "<strong>زاٛنار:</strong> شوما هٱنی نیۊمایتٱ ڤامین. تیرنشۊن آی پی شوما سی هر گاتی کاٛ آلشتکاری بٱکیت سی کول خٱلک دیاری می کٱ. ٱر <strong>[$1 روئیت ڤامین]</strong> یا <strong>[$2 یاٛ گاٛل هساڤ کاریاری راس بٱکیت]</strong>، ڤیرایشتیا شوما ڤ نوم کاریاری خوتۊ دیاری می کٱ و سی شوما بیترٱ.",
+       "anoneditwarning": "<strong>زٱنڳیار:</strong> شما هنی نۏمایتٱ ڤامؽن. تیرنشوݩ آی پی شما سی هٱر گاتؽ کاْ آلشتکاری بٱکؽت سی کولٛ خٱلک دؽاری مؽکٱ. ٱر <strong>[$1 رۉییت ڤامؽن]</strong> یا <strong>[$2 یاٛ هساو کاریاری دۏرس بٱکؽت]</strong>، ڤیرایشتؽا شما ڤ نوم کاریاری خوتو دیاری مؽکٱ ۉ سی شما بؽترٱ.",
        "anonpreviewwarning": "<em>شوما نیوٙمایتە ڤامین. تیرنئشوٙن آی پی شوما د ڤیرگار ڤیرایئشت ئی بألگە ئمایە بوٙە.</em>",
        "missingsummary": "<strong>ڤیر دیارکو:</strong> شوما هأنی یئ گئل چئکئسە ڤیرایئشتی نە نئها ئمایە کاری نأکئردیتە.\nأر شوما د نۊ د ری \"$1\" بأپوٙرنیت، ڤیرایئشت کاری شوما حالی ئمایە بوٙە.",
        "selfredirect": "<strong>هوشدار:</strong> شوما د حال و بال ڤاگأردوٙنی ئی بألگە د خوش هیین.\nگاسی دال ئشتئڤایی سی ڤاگأردوٙنی ئنتئخاڤ کئردیتە، یا گاسی بألگە نە ئشتئڤایی ڤیرایئشت کاری می کیت.\nأر ری \"$1\" دۊ گئل بأپوٙرنیت، ڤاگأردوٙنی راس موٙە.",
        "shown-title": "نشوݩ داٛین $1 {{PLURAL:$1|نتیجٱ|نتیجٱیا}} سی هار بٱلگٱ",
        "viewprevnext": "ديین ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''ایچه بلگه ای هئ وه نوم\"[[:$1]]\" که ها د ای ویکی'''",
-       "searchmenu-new": "'''ای بلگه نه راس كو \"[[:$1]]\" د ای  ويكي!'''",
+       "searchmenu-new": "'''اؽ بٱلگٱ ناْ دۏرس كو \"[[:$1]]\" د اؽ ڤیکی!'''",
        "searchprofile-articles": "بٱلگٱيا مؽنونٱ دار",
        "searchprofile-images": "ڤارسگرؽا خلکمن",
        "searchprofile-everything": "همٱ چی",
        "search-interwiki-more": "(بیشتر)",
        "search-relatedarticle": "مرتوط",
        "searchrelated": "مرتوط",
-       "searchall": "همٱ",
+       "searchall": "Ù\87Ù±Ù\85Ù±",
        "showingresults": "نمائشت بیشترونه {{PLURAL:$1|'''۱''' نتیجه|'''$1''' نتیجه}} د هار، شرو د شماره'''$2'''.",
        "showingresultsinrange": "نمائشت بیشترونه {{PLURAL:$1|'''۱''' نتیجه|'''$1''' نتیجه}} د هار، شرو د شماره'''$2''' تا شماره '''$3'''.",
-       "search-showingresults": "{{PLURAL:$4|نتیجه یا<strong>$1</strong> د <strong>$3</strong>|نتیجه یا<strong>$1 - $2</strong د <strong>$3</strong>}}",
+       "search-showingresults": "{{PLURAL:$4|نٱتیجٱیا<strong>$1</strong> د <strong>$3</strong>|نٱتیجٱیا<strong>$1 - $2</strong د <strong>$3</strong>}}",
        "search-nonefound": "هیچ نتیجاٛیؽ ڤا پاٛجۊری تو یٱکؽ نؽ.",
        "powersearch-legend": "پی جوری پیشکرده",
        "powersearch-ns": "د نوم جايا نوم ديار پی جوری بک:",
        "searchdisabled": "مئن جوری د {{SITENAME}} کنشتگر نئ.\nموقتاً می تونیت مئن جوری Google نه بونیت وه کار.\nد ویرتو با که نتیجه یایی که د مئن جوری وا او روشت وه دست میان شایت وه روز نبان.",
        "search-error": "یه گل خطا سی اوسنی که پی جوری می کردیت اتفاق افتائه:$1",
        "preferences": "خوصوٙیات هأنی",
-       "mypreferences": "Ú\86Û\8cا Ù\87Ù±Ù\86Û\8c",
+       "mypreferences": "چیا هنی",
        "prefs-edits": "شومارە ڤیرایئشتیا:",
        "prefsnologintext2": "لطف بکیت بیایت وامین و ترجیحات خوتونه آلشت بئیت.",
        "prefs-skin": "پوس",
        "enhancedrc-history": "ڤیرگار",
        "recentchanges": "آلشتؽا ایسنی",
        "recentchanges-legend": "گوزینٱیا آلشتؽا ایسنی",
-       "recentchanges-summary": "دو بیشتر آلشتیا تازباو نه د ویکی نه د ای بلگه پیگری کو.",
+       "recentchanges-summary": "دۏ بؽشتر آلشتؽا تازباو ناْ د ڤیکی ناْ د اؽ بٱلگٱ پاٛجۊری کو.",
        "recentchanges-noresult": "هیژ آلشتی د درازا دوره دیار بیه وا ای معیاریا یکی نبی.",
        "recentchanges-feed-description": "دو بیشتر آلشتیا تازباو نه د ویکی که ها د هوال حون پیگری کو.",
        "recentchanges-label-newpage": "اؽ ڤیرایش یاٛ بٱلگٱ تازٱ دۏرس کردٱ.",
        "rclinks": "آخرین آلشتؽا $1 د آخرین رۊزؽا دؽاری بٱک $2",
        "diff": "فٱرق",
        "hist": "ڤیرگار",
-       "hide": "قام کردن",
-       "show": "نشۊ دٱئن",
+       "hide": "قایم کردن",
+       "show": "نشوݩ داٛین",
        "minoreditletter": "م",
        "newpageletter": "ن",
        "boteditletter": "ب",
        "rc-enhanced-expand": "جزيات نشون بيئه",
        "rc-enhanced-hide": "جزياته قام كو",
        "rc-old-title": "ذاتا چی \"$1\" راس بیه",
-       "recentchangeslinked": "آلشتیا تی یٱکی",
+       "recentchangeslinked": "آلشتؽا تاٛ یٱکؽ",
        "recentchangeslinked-feed": "آلشتیا تی یکی",
        "recentchangeslinked-toolbox": "آلشتؽا تاٛ یٱک",
        "recentchangeslinked-title": "آلشتؽا تاٛ یٱکؽ د $1",
        "recentchangeslinked-summary": "اؽ نوم بٱلگٱ تازٱ د بٱلگٱیایی کاْ ڤا بٱلگٱیا ڤیژٱ هوم پاٛڤٱن بینٱ آلشت بیٱ(یا سی ٱندومؽا دٱسٱ بٱنی بیٱ)\nبٱلگٱیایی کاْ هان د [[Special:Watchlist|your watchlist]]ۉ گٱپ بینٱ",
-       "recentchangeslinked-page": "نوم بلگٱ:",
-       "recentchangeslinked-to": "آلشتیایی که د بلگه یا هوم پیوند بینه وه جا بلگه دئیه بیه نشو بیه",
+       "recentchangeslinked-page": "Ù\86Ù\88Ù\85 Ø¨Ù±Ù\84Ú¯Ù±:",
+       "recentchangeslinked-to": "آلشتؽایؽ کاْ د بٱلگٱیا هوم پاٛڤٱن بینٱ ڤ جا بٱلگٱ داٛیٱ بیٱ نشوݩ باٛیٱ",
        "recentchanges-page-added-to-category": "[[:$1]]د دأسە ئضاف بی",
        "recentchanges-page-added-to-category-bundled": "[[:$1]] و {{PLURAL:$2|بألگە تأکی|$2 بألگە یا}} د دأسە ئضاف بییئن",
        "recentchanges-page-removed-from-category": "[[:$1]] د دٱسٱ جگا بی",
        "upload-curl-error28": "تموم بیئن مئلت سی سوار کرد",
        "upload-curl-error28-text": "ای دیارگه فره دیر دتو واکنشت نشو دئه.\nلطف بکیت سی یه که دیارگه کنشگتر و ری خطه یه گل وارسی بکیت، اوسه یه گر واستید و هنی تلاش بکیت.\nشایت بیتر با که د گات خلوتری هنی تلاش بکیت.",
        "license": "ليانس دار بيئن",
-       "license-header": "د حال وبال ليسانس دار بيئن",
+       "license-header": "د هال ۉ بال للیسانس دار بیین",
        "nolicense": "هیچی انتخاو نبیه",
        "licenses-edit": "گزینه یا مجوز ویرایشت",
        "license-nopreview": "(پیش سیل د دسرس نئ)",
        "booksources-invalid-isbn": "شازک که دئه بیه معتور نئ؛ وارسی خطایا د گات ؤرداشتن د سرچشمه اولی وه کار گرته بوئه.",
        "specialloguserlabel": "انجومکار:",
        "speciallogtitlelabel": "حاستئنی(داسوٙن یا نوم کاریاری سی کاریار):",
-       "log": "Ù¾Ù\87رستÙ\86Ù\88Ù\85Ù\87 یا",
+       "log": "Ù¾Ù\87رستÙ\86Ù\88Ù\85Ù±یا",
        "all-logs-page": "همه پهرستنومه یا عمومی",
        "alllogstext": "نماشت یه جا همه پهرستنومه یا که هان د{{SITENAME}}.\nمی تونید وا انتخاو نوع پهرستنومه، نوم کاریاری(حساس وه کؤچکی و گپی حرفیا) و بلگه یا آلشت کرده(حساس و گپی و کؤچکی حرنیا) نمایشت نه دیر د ویرتر بکیت.\n\n{{SITENAME}}.",
        "logempty": "او چی ای که شما میهایت د پهرستنومه نیئش.",
        "sp-contributions-newonly": "فقٱت ڤیرایشؽایؽ کاْ هؽن دۏرس کردن بٱلگان نشوݩ باٛیٱ.",
        "sp-contributions-submit": "پاٛ جۊری",
        "whatlinkshere": "کوم هوم پاٛڤٱنؽا هان ایچاْ",
-       "whatlinkshere-title": "بÙ\84Ú¯Ù\87 Ø§Û\8c Ú©Ù\87 Ø¯ $1 Ù\87Ù\88Ù\85 Ù¾Û\8cÙ\88Ù\86د Ø¨Û\8cÙ\87",
-       "whatlinkshere-page": "بلگٱ",
+       "whatlinkshere-title": "بٱÙ\84گاÙ\9bؽ Ú©Ø§Ù\92 Ø¯ $1 Ù\87Ù\88Ù\85 Ù¾Ø§Ù\9bÚ¤Ù±Ù\86 Ø¨Û\8cÙ±",
+       "whatlinkshere-page": "بٱÙ\84Ú¯Ù±",
        "linkshere": "بلگیا نهایی د '''$2''' هوم پیوند بیه",
        "nolinkshere": "هیژ بگله ای د  '''$2''' هوم پیوند نبیه",
        "nolinkshere-ns": "هیچ بلگه ای د نومجا انتخاو بیه وه'''$2''' هوم پیوند ناره.",
        "whatlinkshere-prev": "{{PLURAL:$1|دمایی|دمایی $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|نهایی|نهایی $1}}",
        "whatlinkshere-links": "هوم پیوندیا",
-       "whatlinkshere-hideredirs": "$1 Ú¤Ø§Ø±Ú¯Ø±Ø¯Û\8aنیا",
-       "whatlinkshere-hidetrans": "$1 چٱن نتیجٱیی",
-       "whatlinkshere-hidelinks": "هوم پیڤندیا $1",
+       "whatlinkshere-hideredirs": "$1 Ú¤Ø±Ú¯Ù±Ø±Ø¯Ù\88نیا",
+       "whatlinkshere-hidetrans": "$1 چٱن نتیجاٛیی",
+       "whatlinkshere-hidelinks": "هوم پاٛڤٱنؽا $1",
        "whatlinkshere-hideimages": "جانیا هوم پیۋندیا $1",
-       "whatlinkshere-filters": "فيلتريا",
+       "whatlinkshere-filters": "فيلٛترؽا",
        "autoblockid": "خود نهاگری #$1",
        "block": "منع کارور",
        "unblock": "کاریار نهاگری نبیه",
        "semiprotectedpagemovewarning": "<strong>د ویر داشتویت:</strong> ای بلگه سی یه که فقط کاریاریا ثوت نام کرده تونستون دش ویرایشت بکه ن پر و پیم بیه.\nآخرین پهرستنومه دئه بیه سی سرچشمه هار نها اماییه بیه:",
        "move-over-sharedrepo": "== جانیا هئیش ==\n[[:$1]] ها د یه گل اماییه جا بهربیه. جا وه جاکاری یه گل جانیا وه ای نوم باعث موئه که یه گل جانیا بهربیه باطل با.",
        "file-exists-sharedrepo": "نوم جانیا انتخاو بیه و ایسنی د یه گل اماییه جا بهربیه وه کار گرته بیه.\nلطف بکیت یه گل نوم هنی نه انتخاو بکیت.",
-       "export": "وه صحرا ديئن بلگيا",
+       "export": "ڤ سٱرا داٛین بٱلگٱیا",
        "exporttext": "شما می تونیت نیسسه و ویرگارچه ویرایشت یه بلگه جادیار بیه یا یه گل کوملوس د بلگه یا نه وه حال و بار پوشیه د ایکس ام ال برویت وه در.\nای دونسمنیا نه بوئه د یه گل ویکی هنی که نرم افزار «ویکی وارسگر» نه انجومکاری می که د طریق [[Special:Import|بلگه وامین اوردن]] وامین اورد.\n\nسی وه در دئن بلگه یا، داسون ونونه بیاریت د جعوه هاری(د هر خط فقط یه گل داسون) و مشخص بکیت که آیا نسقه ایسنی بلگه واگرد نسقه یا دمادار و ویرگارچه بلگه نه میهایت، یا تینا نسقه ایسنی بلگه و دونسمنیا آخری ویرایشت نه میهایت .\n\nد حال و بار دوئم، شما می تونیت یه گل هوم پیوند نه وه کار بئیرت چی [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] سی بلگه «[[{{MediaWiki:Mainpage}}]]».",
        "exportall": "وه صحرا ديئن همه بلگيا",
        "exportcuronly": "فقط مینونه دار وانئری ایسنی با،نه همه ویرگار نه",
        "tooltip-t-recentchangeslinked": "آلشتؽا تازٱ مؽن بٱلگٱیایی کاْ د اؽ بٱلگٱ هوم پاٛڤٱن بینٱ",
        "tooltip-feed-rss": "هوال حون آر اس اس سی ای بلگه",
        "tooltip-feed-atom": "هڤال هۊن ٱتومی سی اؽ بٱلگٱ",
-       "tooltip-t-contributions": "یاٛ گاٛل سیائٱ هومیاری سی {{GENDER:$1|ای کاریار}}",
+       "tooltip-t-contributions": "یاٛ سیائٱ هومیاری سی {{GENDER:$1|اؽ کاریار}}",
        "tooltip-t-emailuser": "سی اؽ كاریار ايماٛیل کلٛ كو",
        "tooltip-t-info": "دونسمنیا بیشتر دباره ای بلگه",
        "tooltip-t-upload": "سڤار کردن جانؽایا",
        "tooltip-t-print": "نۏسخٱ پاٛلا بی ینی سی اؽ بٱلگٱ",
        "tooltip-t-permalink": "هوم پاٛڤٱن همیشاٛیی سی دوئارٱ دیین اؽ بٱلگٱ",
        "tooltip-ca-nstab-main": "ديین مؽنونٱ بٱلگٱ",
-       "tooltip-ca-nstab-user": "دياٛن بلگٱ کاریار",
+       "tooltip-ca-nstab-user": "دیین بٱلگٱ کاریار",
        "tooltip-ca-nstab-media": "دیئن بلگه وارسگر",
        "tooltip-ca-nstab-special": "یٱ یاٛ بٱلگٱ ڤیژٱ آ؛ نمۊئٱ ڤیرایشش بٱکؽت",
        "tooltip-ca-nstab-project": "ديئن بلگه پروجه",
        "tooltip-minoredit": "یه نه د عنوان حیرده ویرایشت ثوت کو",
        "tooltip-save": "آلشتؽا توناْ آمادٱ بٱکؽت",
        "tooltip-preview": "پیش ساٛلٛ آلشتؽاتو، لوتف بٱکؽت ڤنوناْ دما د آمایٱ کاریشو ڤ کار باٛیرؽت!",
-       "tooltip-diff": "آلشتیا نه که شما د ای متن راس کردیته نشو بیئه",
+       "tooltip-diff": "آلشتؽا ناْ کاْ شما د ای مٱتن دۏرس کردؽتٱ نشوݩ باٛیٱ",
        "tooltip-compareselectedversions": "فرخیا مینجا د تا د دو بار دیاٛن ای بلگٱ نٱ بۉنیت",
        "tooltip-watch": "ای بلگه نه د سیل برگتو اضاف بکید",
        "tooltip-watchlistedit-normal-submit": "ؤرداشتن سرونیا",
        "spam_reverting": "واگردونی وه آخری نسقه ای که هوم پیوندی وه $1 ناره.",
        "spam_blanking": "همه وانئریایی که مینونه دار هوم پیوند $1 هئن، دارن حالی بوئن",
        "spam_deleting": "همه وانئریایی که مینونه دار هوم پیوند $1 هئن، دارن پاکساگری بوئن",
-       "simpleantispam-label": "ۋارسی ری ۋ ری کاری اٛسپم.\nای \"جاگٱ\" نٱ پور نٱکیت!",
+       "simpleantispam-label": "ڤارسی ری ڤ ری کاری اْسپٱم.\nاؽ \"جاگٱ\" ناْ پور نٱکؽت!",
        "pageinfo-title": "دونسمنیا سی \"$1\"",
        "pageinfo-not-current": "د بدبختی،نبوئه که ای دونسمنیا نه سی وانئریا دماتری نهااماییه بکیت.",
        "pageinfo-header-basic": "دونسمنیا پایه",
        "hijri-calendar-m2": "صفر",
        "hijri-calendar-m3": "ربیع الاول",
        "hijri-calendar-m4": "رجو",
-       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|چک چنه]])",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|چٱک چنٱ]])",
        "timezone-utc": "UTC",
        "duplicate-defaultsort": "زنهار کلیت پیش فرض جور بیه $2 تازه ای یا کلید پیش فرض جوربیه $1 رد بیه.",
        "duplicate-displaytitle": "<strong>هشدار:</strong> نشو دئن داسون\" $2 \"باعث باطل بیین نشو دئن داسون \" $1 \" موئه.",
        "htmlform-cloner-create": "هنی اضاف بکیت",
        "htmlform-cloner-delete": "ؤرداشتن",
        "htmlform-cloner-required": "سی کمترونه یه گل ارزایشت لازمه",
-       "logentry-delete-delete": "$1 Ø¨Ù\84Ú¯Ù\87 {{GENDER:$2|پاکسا Ø¨Û\8cÙ\87}} $3",
+       "logentry-delete-delete": "$1 Ø¨Ù±Ù\84Ú¯Ù± {{GENDER:$2|پاکسا Ø¨Û\8cÙ±}} $3",
        "logentry-delete-restore": "$1 {{GENDER:$2|}} بلگٱ $3 د نۏ زاٛنٱ بیٱ",
        "logentry-delete-event": "$1 دیاری {{PLURAL:$5|یه گل رخ ون د پهرستنومه|$5 رخ ونیا د پهرستنومه}} نه $3 {{GENDER:$2|آلشتکاری کرد}}: $4",
        "logentry-delete-revision": "$1 دیاری {{PLURAL:$5|یه گل وانئری|$5 وانئریا}} نه $3 {{GENDER:$2|آلشتکاری کرد}}: $4",
index 62785e1..3502c47 100644 (file)
        "feedback-external-bug-report-button": "Поднеси техничка задача",
        "feedback-dialog-title": "Поднеси мислење",
        "feedback-dialog-intro": "Послужете се со едноставниот образец подолу за да го поднесете вашето мислење. Коментарот ќе ви биде додаден на страницата „$1“, заедно со вашето корисничко име.",
-       "feedback-error1": "Грешка: Непрепознаен исход од извршникот",
+       "feedback-error1": "Грешка: Непрепознаен исход од API",
        "feedback-error2": "Грешка: Уредувањето не успеа",
        "feedback-error3": "Грешка: Извршникот не одговара",
        "feedback-error4": "Грешка: Не можам да објавам под дадениот наслов",
index b59a20e..0333212 100644 (file)
@@ -31,6 +31,8 @@
        "tog-watchdefault": "Совавтомс монь витевть лопатнень ванома лемрисьмезэнь",
        "tog-watchmoves": "Совавтомс монь одов лемдявт лопатнень-керьмазтнэнь ванома лемрисьмезэнь",
        "tog-watchdeletion": "Совавтомс монь нардавт лопатнень-керьмазтнэнь ванома лемрисьмезэнь",
+       "tog-watchuploads": "Поладомс од файлат ваннома лемрисьмезэнь тонгомстост",
+       "tog-watchrollback": "Поладомс ваннома лемрисьмезэнь лопат, конатнень потмост велявтокшнынь мекев",
        "tog-minordefault": "Тешкстамс витевкстнэнь апокшкэкс, бути лиякс апак ёвта",
        "tog-previewontop": "Невтемс сёрмадовксонть васнянь невтевксэнь вальманть витеманьседенть икеле",
        "tog-previewonfirst": "Васнянь невтевкс васенцеде витнемстэ-петнемстэ",
@@ -53,6 +55,7 @@
        "tog-ccmeonemails": "Кучт монень копия е-сёрматнеде, конатнень кучан лия теицянень",
        "tog-diffonly": "Иляк невтне лопапотмоксонть diffs ало",
        "tog-showhiddencats": "Невтемс кекшень категориятнень",
+       "tog-norollbackdiff": "А невтемс явовоманзо лопапотмонть велявтомадо мейле",
        "underline-always": "Свал",
        "underline-never": "Зярдояк",
        "underline-default": "Браузерэнь ушодкс ладсематне",
        "right-mergehistory": "Вейсэндямс лопатнень юрост-путовксост",
        "right-userrights": "Витнемс-петнемс совицянь весе видечитнень",
        "right-siteadmin": "Сёлгомс ды панжомс датаюртонть",
+       "grant-createaccount": "Шкамс совамо таркат",
+       "grant-createeditmovepage": "Шкамс, витнемс-петнемс ды печтевтемс лопат",
+       "grant-editmywatchlist": "Витнемс-петнемс ваннома лемрисьменть",
+       "grant-rollback": "Велявтомс мекев лопатнес полавтоматнень",
+       "grant-uploadfile": "Тонгомс од файлат",
+       "grant-viewmywatchlist": "Ваномс ваннома лемрисьменть",
        "newuserlogpage": "Теицянь шкамодо-теемадо конёв",
        "newuserlogpagetext": "Те теицянь шкавксто журнал",
        "rightslog": "Уськетеицянть видечинть кемекстома",
        "empty-file": "Тонь максовт файлась чаво.",
        "filename-tooshort": "Файлань лементь а саты кувалмозо.",
        "unknown-error": "А содавикс манявкс лиссь.",
-       "file-thumbnail-no": "Файланть лемезэ ушодови  <strong>$1</strong>.\nСонсь маряви вишкалгавтозь фотокуво, покшолмазо ''(кенжешка)''.\nУлиндеряй файланть покш верзиязо, йовкстыка сонзэ  - арась, полавтыка тетень лемензэ.",
+       "file-thumbnail-no": "Файланть лемезэ ушодови  <strong>$1</strong>.\nСонсь маряви вишкалгавтозь фотокуво, покшолмазо ''(кенжешка)''.\nУлиндеряй файланть покш верзиязо, тонгика сонзэ  - арась, полавтыка тетень лемензэ.",
        "file-exists-duplicate": "Те кавонзавкс файла вана {{PLURAL:$1|те файланть|неть файлатнень}} эйстэ:",
        "uploadwarning": "Совавтомадо кардамонь пачтямо",
        "savefile": "Ванстомс файланть",
        "destfilename": "Теевиця файланть лемезэ",
        "upload-maxfilesize": "Файлань покшолмазо иляссо юта: $1",
        "upload-description": "Файланть йовтамозо",
-       "upload-options": "Ð\99овкÑ\81Ñ\82амонь параметрат",
+       "upload-options": "Тонгомань параметрат",
        "watchthisupload": "Ваномс те лопанть мельга",
        "upload-proto-error": "Аволь истямо протокол",
        "upload-file-error": "Потмонь ильведькс",
        "sharedupload": "Те файлась саезь \"$1\" файлань пусмосто, сон нолдави тевс лия проектсэяк.",
        "sharedupload-desc-here": "Те файлась сась истямо $1 таркасто, паряк сон нолдави тевс лия проектсэ.\nКувалманзо сёрмадовксось [$2 файладонть ёвтнема лопазо] невтезь ало.",
        "filepage-nofile": "Истямо лем марто файла арась.",
-       "uploadnewversion-linktext": "Ð\99овкÑ\81Ñ\82ак од версия те файластонть",
+       "uploadnewversion-linktext": "ТонгÑ\82 од версия те файластонть",
        "shared-repo-from": "вана теньстэ $1",
        "shared-repo": "вейсэнь ванстома тарка",
        "upload-disallowed-here": "Те файланть лангс од а сёрмадови.",
        "statistics-header-hooks": "Лия статистика",
        "statistics-articles": "Потмо марто лопат",
        "statistics-pages": "Лопат",
-       "statistics-files": "Ð\99овкÑ\81Ñ\82ань файлат",
+       "statistics-files": "Тонгозь файлат",
        "statistics-users-active": "Чистэ лисийть-совийть",
        "doubleredirects": "Кавксть ютавтозь",
        "double-redirect-fixer": "Печтевтемс витнема-петнема пель",
        "deletereasonotherlist": "Лия тувтал",
        "deletereason-dropdown": "*Нардамонь сех вастневиця тувталтнэ\n** Теицянть вешемазо\n** Теицянь видечинть коламозо\n** Вандализма",
        "delete-edit-reasonlist": "Витнемс-петнемс нардамонь тувталтнэнь",
-       "rollback": "Ð\9aевеÑ\80демÑ\81 Ð²Ð¸Ñ\82немаÑ\82ненÑ\8c-пеÑ\82немаÑ\82ненÑ\8c Ð¼ÐµÐºÐµÐ²",
+       "rollback": "Ð\92елÑ\8fвÑ\82омÑ\81 Ð¼ÐµÐºÐµÐ² Ð²Ð¸Ñ\82немаÑ\82ненÑ\8c-пеÑ\82немаÑ\82ненÑ\8c",
        "rollbacklink": "кевердемс",
-       "rollbackfailed": "Ð\9cекев ÐºÐµÐ²ÐµÑ\80демась эзь лисе",
+       "rollbackfailed": "Ð\9cекев Ð²ÐµÐ»Ñ\8fвÑ\82омась эзь лисе",
        "rollback-missingrevision": "Ревизиядатась а тонгови.",
        "protectlogpage": "Ванстомань совамо-кемекстамо",
        "protectedarticle": "ванстозь \"[[$1]]\"",
        "importcantopen": "Совавтозь файлась эзь панжово",
        "importbadinterwiki": "Амаштовикс интервики сюлмавома пе",
        "importsuccess": "Совавтомась прядовсь!",
-       "importnofile": "Кодамояк совавтома файла эзь йовкставо.",
+       "importnofile": "Кодамояк совавтома файла эзь тонгово.",
        "import-noarticle": "Совавтомс лопат арасть!",
        "import-upload": "Ёвкстамс XML датанть",
        "importlogpage": "Импортонть журналось",
        "tooltip-feed-atom": "Атом лезкс те лопантень",
        "tooltip-t-contributions": "Невтть мезе {{GENDER:$1|те теицясь}} полавтсь",
        "tooltip-t-emailuser": "Кучомс е-сёрма {{GENDER:$1|те теицянтень}}",
-       "tooltip-t-upload": "Ð\99овкÑ\81Ñ\82амс файлат",
+       "tooltip-t-upload": "Тонгомс файлат",
        "tooltip-t-specialpages": "Башка тевень лопатне мельга-мельцек",
        "tooltip-t-print": "Лопанть конёв лангс нолдавома версиязо",
        "tooltip-t-permalink": "Свал шкань сюлмавома пе лопань те верзиянтень",
        "tooltip-diff": "Невтемс мейсэ лиякстомтыть текстэнть.",
        "tooltip-compareselectedversions": "Вант явовкст кавто саезь версиятнень те лопанть.",
        "tooltip-watch": "Топавтомс те лопанть тынк ваномалопаньте",
-       "tooltip-upload": "Ушодомс йовкстамонть",
+       "tooltip-upload": "Ушодомс тонгоманть",
        "tooltip-rollback": "\"Мекев кевердема\" повнэнть весть лепштямось велявтсынзе те лопасонть меельцекс теезь витнематнень-петнематнень",
        "tooltip-undo": "\"Велявтомс мекев\" велявтсы витнемань-петнемань тевенть ды панжсы васнянь невтемань формасо.\nСонзэ вельде маштови поладомс полавтомадо тувтал.",
        "tooltip-preferences-save": "Ванстомс эсень аравтоматнень",
        "intentionallyblankpage": "Те лопась арьсезь-содазь чавосто кадозь",
        "tag-filter": "[[Special:Tags|Tag]] сувтемесь:",
        "tag-filter-submit": "Сувтемень пачк нолдамс",
+       "tag-mw-rollback": "Мекев велявтома",
        "tags-active-yes": "Истя",
        "tags-active-no": "Аволь",
        "tags-source-extension": "Программакерькссэ вешема",
index a98909e..ecd9c70 100644 (file)
@@ -33,7 +33,8 @@
                        "ديفيد",
                        "Haribanshi",
                        "Parbat subedi",
-                       "पर्वत सुबेदी"
+                       "पर्वत सुबेदी",
+                       "हिमाल सुबेदी"
                ]
        },
        "tog-underline": "रेखाङ्कित लिङ्क:",
        "authmanager-email-label": "ईमेल",
        "authmanager-email-help": "इमेल ठेगाना",
        "authprovider-resetpass-skip-label": "छोड्नुहोस्",
-       "edit-error-short": "त्रुटि: $1"
+       "edit-error-short": "त्रुटि: $1",
+       "passwordpolicies": "पासवोर्ड नितिहरू"
 }
index 23c8a51..8c49771 100644 (file)
        "enterlockreason": "ਤਾਲਾ-ਬੰਦੀ ਲਈ ਕਾਰਨ ਦਾਖ਼ਲ ਕਰੋ, ਨਾਲ਼ ਹੀ ਤਾਲਾ-ਬੰਦੀ ਦੇ ਰਿਲੀਜ਼ ਹੋਣ ਦਾ ਅੰਦਾਜ਼ਨ ਵਕਤ",
        "readonlytext": "ਡੈਟਾਬੇਸ ਨੂੰ ਇਸ ਵੇਲ਼ੇ ਤਾਲਾ ਲੱਗਾ ਹੋਇਆ ਹੈ, ਸ਼ਾਇਦ ਆਮ ਰੱਖ-ਰਖਾਵ ਲਈ, ਇਸਤੋਂ ਬਾਅਦ ਇਹ ਆਮ ਵਾਂਗ ਉਪਲੱਬਧ ਹੋਵੇਗਾ।\nਜਿਸ ਪ੍ਰਬੰਧਕ ਨੇ ਇਸਨੂੰ ਤਾਲਾ ਲਾਇਆ ਹੈ ਉਸਦਾ ਕਹਿਣਾ ਹੈ ਕਿ: $1",
        "missing-article": "ਡਾਟਾਬੇਸ ਨੂੰ ''$1'' $2 ਨਾਮ ਦਾ ਕੋਈ ਸਫ਼ਾ ਨਹੀਂ ਮਿਲਿਆ।\nਆਮ ਤੌਰ ਤੇ ਹਟਾਏ ਜਾ ਚੁੱਕੇ ਸਫ਼ੇ ਦੀ ਅਤੀਤ ਕੜੀ ਦੀ ਵਰਤੋਂ ਕਰਨ ਨਾਲ ਇੰਝ ਹੁੰਦਾ ਹੈ।\nਜੇ ਇਹ ਗੱਲ ਨਹੀਂ ਤਾਂ ਹੋ ਸਕਦਾ ਹੈ ਤੁਹਾਨੂੰ ਸਾਫ਼ਟਵੇਅਰ ਵਿਚ ਖਾਮੀ ਮਿਲ ਗਈ ਹੈ। ਕਿਰਪਾ ਕਰਕੇ ਸਫ਼ੇ ਦੇ ਪਤੇ ਸਮੇਤ [[Special:ListUsers/sysop|ਪ੍ਰਸ਼ਾਸਕ]] ਨੂੰ ਇਤਲਾਹ ਦਿਓ।",
-       "missingarticle-rev": "(ਰà©\80ਵਿà¨\9c਼ਨ#: $1)",
+       "missingarticle-rev": "(ਦà©\81ਹਰਾà¨\85#: $1)",
        "missingarticle-diff": "(ਅੰਤਰ: $1, $2)",
        "readonly_lag": "ਜਦੌਂ ਤਕ ਅਧੀਨ ਡੇਟਾਬੇਸ ਸਰਵਰ ਸੁਤੰਤਰ ਡੈਟਾਬੇਸ ਸਰਵਰ ਦੀ ਪਕੜ ਵਿਚ ਨਹੀਂ ਆ ਜਾਂਦੇ ਡੈਟਾਬੇਸ ਸਵੈ ਜਕੜਿਆ ਗਿਆ ਹੈ।",
        "internalerror": "ਅੰਦਰੂਨੀ ਗ਼ਲਤੀ",
        "cantcreateaccount-text": "[[User:$3|$3]] ਨੇ ਇਸ IP ਪਤੇ ('''$1''') ਤੋਂ ਖਾਤਾ ਬਣਾਉਣ ਤੇ ਪਾਬੰਦੀ ਲਾਈ ਹੈ।\n\n$3 ਨੇ ਕਾਰਨ ਇਹ ਦੱਸਿਆ ਹੈ, ''$2''",
        "viewpagelogs": "ਇਹ ਸਫ਼ੇ ਲਈ ਇੰਦਰਾਜ ਵੇਖੋ",
        "nohistory": "ਇਸ ਸਫ਼ੇ ਲਈ ਕੋਈ ਸੋਧ ਅਤੀਤ ਨਹੀਂ ਹੈ।",
-       "currentrev": "ਮà©\8cà¨\9cà©\82ਦਾ à¨°à©\80ਵਿà¨\9c਼ਨ",
+       "currentrev": "ਮà©\8cà¨\9cà©\82ਦਾ à¨¦à©\81ਹਰਾà¨\85",
        "currentrev-asof": "$1 ਮੁਤਾਬਕ ਸਭ ਤੋਂ ਨਵਾਂ ਦੁਹਰਾਅ",
        "revisionasof": "$1 ਦਾ ਦੁਹਰਾਅ",
-       "revision-info": "{{GENDER:$6|$2}}$7 à¨¦à¨¾ à¨¬à¨£à¨¾à¨\87à¨\86 $1 à¨¦à¨¾ à¨°à©\80ਵਿà¨\9cà©\8dਹਨ",
+       "revision-info": "{{GENDER:$6|$2}}$7 à¨¦à©\81à¨\86ਰਾ à¨\95à©\80ਤਾ à¨\97ਿà¨\86 $1 à¨¦à¨¾ à¨¦à©\81ਹਰਾà¨\85",
        "previousrevision": "←ਪੁਰਾਣਾ ਦੁਹਰਾਅ",
        "nextrevision": "ਨਵਾਂ ਦੁਹਰਾਅ →",
-       "currentrevisionlink": "ਸਭ à¨¤à©\8b à¨¨à¨µà¨¾à¨\82 à¨¦à©\81ਹਰਾà¨\87à¨\86",
+       "currentrevisionlink": "ਸਭ à¨¤à©\8b à¨¨à¨µà¨¾à¨\82 à¨¦à©\81ਹਰਾà¨\85",
        "cur": "ਮੌਜੂਦਾ",
        "next": "ਅੱਗੇ",
        "last": "ਪਿਛਲਾ",
        "histlast": "ਸਭ ਤੋਂ ਨਵੇਂ",
        "historysize": "({{PLURAL:$1|1 ਬਾਈਟ|$1 ਬਾਈਟ}})",
        "historyempty": "(ਖ਼ਾਲੀ)",
-       "history-feed-title": "ਰà©\80ਵਿà¨\9c਼ਨ ਦਾ ਅਤੀਤ",
-       "history-feed-description": "ਵਿਕੀ ’ਤੇ ਇਸ ਸਫ਼ੇ ਦਾ ਰੀਵਿਜ਼ਨ ਅਤੀਤ",
+       "history-feed-title": "ਦà©\81ਹਰਾà¨\85 ਦਾ ਅਤੀਤ",
+       "history-feed-description": "ਵਿਕੀ ਉੱਤੇ ਇਸ ਸਫ਼ੇ ਦਾ ਦੁਹਰਾਅ ਅਤੀਤ",
        "history-feed-item-nocomment": "$1 ਤੋਂ $2 ’ਤੇ",
        "history-feed-empty": "ਦਰਖ਼ਾਸਤਸ਼ੁਦਾ ਸਫ਼ਾ ਮੌਜੂਦ ਨਹੀਂ ਹੈ।\nਸ਼ਾਇਦ ਇਸਨੂੰ ਵਿਕੀ ਤੋਂ ਮਿਟਾ ਦਿੱਤਾ ਗਿਆ ਹੈ ਜਾਂ ਨਾਮ ਬਦਲ ਦਿੱਤਾ ਗਿਆ ਹੈ।\nਵਿਕੀ ਦੇ ਨਵੇਂ ਮੁਨਾਸਿਬ ਸਫ਼ਿਆਂ ਵਿਚ [[Special:Search|ਲੱਭਣ]] ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ।",
        "rev-deleted-comment": "(ਸੋਧ ਸਾਰ ਹਟਾਇਆ)",
        "rev-deleted-text-permission": "ਸਫ਼ੇ ਦੀ ਇਹ ਰੀਵਿਜ਼ਨ '''ਮਿਟਾਈ''' ਜਾ ਚੁੱਕੀ ਹੈ।\nਤਫ਼ਸੀਲ [{{fullurl:{{#Special:Log}}/delete|\npage={{FULLPAGENAMEE}}}} ਮਿਟਾਉਣ ਦੇ ਚਿੱਠੇ] ਵਿਚ ਵੇਖੀ ਜਾ ਸਕਦੀ ਹੈ।",
        "rev-deleted-text-unhide": "ਸਫ਼ੇ ਦੀ ਇਹ ਰੀਵਿਜ਼ਨ '''ਮਿਟਾਈ''' ਜਾ ਚੁੱਕੀ ਹੈ।\nਤਫ਼ਸੀਲ [{{fullurl:{{#Special:Log}}/delete|\npage={{FULLPAGENAMEE}}}} ਮਿਟਾਉਣ ਦੇ ਚਿੱਠੇ] ਵਿਚ ਵੇਖੀ ਜਾ ਸਕਦੀ ਹੈ।\nਜੇ ਤੁਸੀਂ ਅੱਗੇ ਵਧਣਾ ਚਾਹੋ ਤਾਂ ਹਾਲੇ ਵੀ [$1 ਇਹ ਰੀਵਿਜ਼ਨ ਵੇਖ] ਸਕਦੇ ਹੋ।",
        "rev-deleted-no-diff": "ਤੁਸੀਂ ਇਹ ਫ਼ਰਕ ਨਹੀਂ ਵੇਖ ਸਕਦੇ ਕਿਉਂਕਿ ਇਹਨਾਂ ਵਿੱਚੋਂ ਇੱਕ ਰੀਵਿਜ਼ਨ '''ਮਿਟਾਈ''' ਜਾ ਚੁੱਕੀ ਹੈ।\nਤਫ਼ਸੀਲ [{{fullurl:{{#Special:Log}}/delete|\npage={{FULLPAGENAMEE}}}} ਮਿਟਾਉਣ ਦੇ ਚਿੱਠੇ] ਵਿਚ ਵੇਖੀ ਜਾ ਸਕਦੀ ਹੈ।",
-       "rev-suppressed-no-diff": "ਤà©\81ਸà©\80à¨\82 à¨\87ਹ à¨«à¨¼à¨°à¨\95 à¨¨à¨¹à©\80à¨\82 à¨µà©\87à¨\96 à¨¸à¨\95ਦà©\87 à¨\95ਿà¨\89à¨\82à¨\95ਿ à¨\87ਹਨਾà¨\82 à¨µà¨¿à©±à¨\9aà©\8bà¨\82 à¨\87ੱà¨\95 à¨°à©\80ਵਿà¨\9c਼ਨ '''ਮਿਟਾਈ''' ਜਾ ਚੁੱਕੀ ਹੈ।",
+       "rev-suppressed-no-diff": "ਤà©\81ਸà©\80à¨\82 à¨\87ਹ à¨«à¨¼à¨°à¨\95 à¨¨à¨¹à©\80à¨\82 à¨µà©\87à¨\96 à¨¸à¨\95ਦà©\87 à¨\95ਿà¨\89à¨\82à¨\95ਿ à¨\87ਹਨਾà¨\82 à¨µà¨¿à©±à¨\9aà©\8bà¨\82 à¨\87ੱà¨\95 à¨¦à©\81ਹਰਾà¨\85 '''ਮਿਟਾਈ''' ਜਾ ਚੁੱਕੀ ਹੈ।",
        "rev-deleted-unhide-diff": "ਇਸ ਫ਼ਰਕ ਵਿੱਚੋਂ ਇੱਕ ਰੀਵਿਜ਼ਨ '''ਮਿਟਾਈ''' ਜਾ ਚੁੱਕੀ ਹੈ।\nਤਫ਼ਸੀਲ [{{fullurl:{{#Special:Log}}/delete|\npage={{FULLPAGENAMEE}}}} ਮਿਟਾਉਣ ਦੇ ਚਿੱਠੇ] ਵਿਚ ਵੇਖੀ ਜਾ ਸਕਦੀ ਹੈ।\nਜੇ ਤੁਸੀਂ ਅੱਗੇ ਵਧਣਾ ਚਾਹੋ ਤਾਂ ਹਾਲੇ ਵੀ [$1 ਇਹ ਰੀਵਿਜ਼ਨ ਵੇਖ] ਸਕਦੇ ਹੋ।",
-       "rev-suppressed-diff-view": "à¨\87ਸ à¨«à¨¼à¨°à¨\95 à¨µà¨¿à©±à¨\9aà©\8bà¨\82 à¨\87ੱà¨\95 à¨°à©\80ਵਿà¨\9c਼ਨ '''à¨\9c਼ਬਤ''' à¨\95à©\80ਤà©\80 à¨\9cਾ à¨\9aà©\81ੱà¨\95à©\80 à¨¹à©\88।\nਤਫ਼ਸà©\80ਲ [{{fullurl:{{#Special:Log}}/delete|\npage={{FULLPAGENAMEE}}}} à¨\9c਼ਬਤà©\80 à¨¦à©\87 à¨\9aਿੱਠà©\87] à¨µà¨¿à¨\9a à¨µà©\87à¨\96à©\80 à¨\9cਾ à¨¸à¨\95ਦà©\80 à¨¹à©\88।",
+       "rev-suppressed-diff-view": "à¨\87ਸ à¨\85ੰਤਰ à¨¦à©\87 à¨¦à©\81ਹਰਾà¨\85 à¨µà¨¿à©±à¨\9aà©\8bà¨\82 à¨\87ੱà¨\95 à¨¨à©\82à©° '''ਦਬਾà¨\85''' à¨¦à¨¿à©±à¨¤à¨¾ à¨\97ਿà¨\86 à¨¹à©\88। à¨¤à©\81ਸà©\80à¨\82 à¨\87ਸ à¨\85ੰਤਰ à¨¨à©\82à©° à¨¦à©\87à¨\96 à¨¸à¨\95ਦà©\87 à¨¹à©\8b; [{{fullurl:{{#Special:Log}}/delete|\npage={{FULLPAGENAMEE}}}} à¨\9c਼ਬਤà©\80 à¨¦à©\87 à¨\9aਿੱਠà©\87] à¨µà¨¿à©±à¨\9a à¨µà©\87ਰਵà©\87 à¨²à©±à¨­à©\87 à¨\9cਾ à¨¸à¨\95ਦà©\87 à¨¹à¨¨।",
        "rev-delundel": "ਵਿਖਾਓ/ਲੁਕਾਓ",
        "rev-showdeleted": "ਵਿਖਾਓ",
-       "revisiondelete": "ਰà©\80ਵਿà¨\9c਼ਨ à¨¹à¨\9fਾà¨\93/ਹà¨\9fਾà¨\87à¨\86-ਵਾਪਸ",
+       "revisiondelete": "ਹà¨\9fਾà¨\93/à¨\85ਣ-ਹà¨\9fਾà¨\93 à¨¦à©\81ਹਰਾà¨\85",
        "revdelete-nooldid-title": "ਕੋਈ ਨਿਸ਼ਾਨੇ ਵਾਲੀ ਰੀਵਿਜ਼ਨ ਨਹੀਂ",
        "revdelete-no-file": "ਦਿੱਤੀ ਗਈ ਫਾਇਲ ਮੌਜੂਦ ਨਹੀਂ ਹੈ।",
-       "revdelete-show-file-confirm": "ਤà©\81ਹਾਨà©\82à©° à¨¯à¨\95à©\80ਨ à¨¹à©\88 à¨¤à©\81ਸà©\80à¨\82 $2 à¨¨à©\82à©° $3 à¨¦à©\80 à¨«à¨¼à¨¾à¨\88ਲ \"<nowiki>$1</nowiki>\" à¨¦à©\80 à¨®à¨¿à¨\9fਾà¨\88 à¨\97à¨\88 à¨°à©\80ਵਿà¨\9c਼ਨ ਵੇਖਣਾ ਚਾਹੁੰਦੇ ਹੋ?",
+       "revdelete-show-file-confirm": "ਤà©\81ਹਾਨà©\82à©° à¨¯à¨\95à©\80ਨ à¨¹à©\88 à¨¤à©\81ਸà©\80à¨\82 $2 à¨¨à©\82à©° $3 à¨¦à©\80 à¨«à¨¼à¨¾à¨\88ਲ \"<nowiki>$1</nowiki>\" à¨¦à©\80 à¨®à¨¿à¨\9fਾà¨\88 à¨\97à¨\88 à¨¦à©\81ਹਰਾà¨\85 ਵੇਖਣਾ ਚਾਹੁੰਦੇ ਹੋ?",
        "revdelete-show-file-submit": "ਹਾਂ",
        "revdelete-legend": "ਵੇਖਣ ਪਾਬੰਦੀਆਂ ਸੈੱਟ ਕਰੋ:",
        "revdelete-hide-text": "ਦੁਹਰਾਈ ਲਿਖਤ",
        "revdelete-otherreason": "ਹੋਰ/ਵਾਧੂ ਕਾਰਨ:",
        "revdelete-reasonotherlist": "ਹੋਰ ਕਾਰਨ",
        "revdelete-edit-reasonlist": "ਮਿਟਾਏ ਜਾਣ ਦੇ ਕਾਰਨ ਸੋਧੋ",
-       "revdelete-offender": "ਰà©\80ਵਿà¨\9c਼ਨ ਲੇਖਕ:",
+       "revdelete-offender": "ਦà©\81ਹਰਾà¨\85 ਲੇਖਕ:",
        "suppressionlog": "ਲੁਕਾਅ ਇੰਦਰਾਜ",
        "mergehistory": "ਸਫ਼ਿਆਂ ਦੇ ਅਤੀਤ ਰਲ਼ਾਓ",
        "mergehistory-box": "ਦੋ ਸਫ਼ਿਆਂ ਦੇ ਸੁਧਾਰ ਮਿਲਾਓ:",
        "mergehistory-list": "ਰਲ਼ਾਉਣਯੋਗ ਸੋਧ ਅਤੀਤ",
        "mergehistory-go": "ਰਲ਼ਾਉਣਯੋਗ ਸੋਧਾਂ ਵਖਾਓ",
        "mergehistory-submit": "ਰੀਵਿਜ਼ਨਾਂ ਰਲ਼ਾਓ",
-       "mergehistory-empty": "à¨\95à©\8bà¨\88 à¨°à©\80ਵਿà¨\9c਼ਨ à¨°à¨²à¨¼à¨¾à¨\88 à¨¨à¨¹à©\80 à¨\9cਾ à¨¸à¨\95ਦà©\80।",
-       "mergehistory-done": "$1 {{PLURAL:|ਦà©\80|ਦà©\80à¨\86à¨\82}} $3 {{PLURAL:$3|ਰà©\80ਵਿà¨\9c਼ਨ|ਰà©\80ਵਿà¨\9c਼ਨਾà¨\82}} ਕਾਮਯਾਬੀ ਨਾਲ਼ [[:$2]] ਵਿਚ {{PLURAL:$3|ਰਲ਼ਾਈ|ਰਲ਼ਾਈਆਂ}}।",
+       "mergehistory-empty": "à¨\95ਿਸà©\87 à¨µà©\80 à¨¦à©\81ਹਰਾà¨\85 à¨¨à©\82à©° à¨®à¨¿à¨²à¨¾à¨\87à¨\86 à¨¨à¨¹à©\80à¨\82 à¨\9cਾ à¨¸à¨\95ਦਾ।",
+       "mergehistory-done": "$1 {{PLURAL:|ਦà©\80|ਦà©\80à¨\86à¨\82}} $3 {{PLURAL:$3|ਦà©\81ਹਰਾà¨\85|ਦà©\81ਹਰਾà¨\87à¨\86}} ਕਾਮਯਾਬੀ ਨਾਲ਼ [[:$2]] ਵਿਚ {{PLURAL:$3|ਰਲ਼ਾਈ|ਰਲ਼ਾਈਆਂ}}।",
        "mergehistory-fail-bad-timestamp": "ਸਮਾੰਮੋਹਰ ਗਲਤ ਹੈ।",
        "mergehistory-fail-invalid-source": "ਸਰੋਤ ਸਫ਼ਾ ਗਲਤ ਹੈ।",
        "mergehistory-no-source": "ਸਰੋਤ ਸਫ਼ਾ $1 ਮੌਜੂਦ ਨਹੀਂ ਹੈ।",
        "action-deletedhistory": "ਇਸ ਸਫ਼ੇ ਦਾ ਮਿਟਾਇਆ ਅਤੀਤ ਵੇਖੋ",
        "action-browsearchive": "ਮਿਟਾਏ ਸਫ਼ੇ ਲੱਭੋ",
        "action-undelete": "ਇਹ ਸਫ਼ਾ ਅਣ-ਮਿਟਿਆ ਕਰੋ",
-       "action-suppressrevision": "à¨\87ਹ à¨²à©\81à¨\95ਵਾà¨\82 à¨°à©\80ਵਿà¨\9c਼ਨ à¨\9cਾà¨\82à¨\9aà©\8b à¨\85ਤà©\87 à¨®à©\81à©\9c-ਸà¨\9fà©\8bਰ ਕਰੋ",
+       "action-suppressrevision": "ਲà©\81à¨\95ਵà©\87à¨\82 à¨¦à©\81ਹਰਾà¨\85 à¨¦à©\80 à¨¸à¨®à©\80à¨\96ਿà¨\86 à¨\85ਤà©\87 à¨«à©\87ਰ-ਭੰਡਾਰ ਕਰੋ",
        "action-suppressionlog": "ਇਹ ਨਿੱਜੀ ਇੰਦਰਾਜ ਵੇਖੋ",
        "action-block": "ਇਸ ਮੈਂਬਰ ਦੇ ਸੋਧ ਕਰਨ ਤੇ ਪਾਬੰਦੀ ਲਾਓ",
        "action-protect": "ਇਸ ਸਫ਼ੇ ਦੀ ਸੁਰੱਖਿਆ ਬਦਲੋ",
        "ncategories": "$1 {{PLURAL:$1|ਕੈਟੇਗਰੀ|ਕੈਟੇਗਰੀਆਂ}}",
        "nlinks": "$1 {{PLURAL:$1|ਲਿੰਕ|ਲਿੰਕ}}",
        "nmembers": "$1 {{PLURAL:$1|ਮੈਂਬਰ|ਮੈਂਬਰਾਂ}}",
-       "nrevisions": "$1 {{PLURAL:$1|ਰà©\80ਵਿà¨\9c਼ਨ|ਰà©\80ਵਿà¨\9c਼ਨਾà¨\82}}",
+       "nrevisions": "$1 {{PLURAL:$1|ਦà©\81ਹਰਾà¨\85|ਦà©\81ਹਰਾà¨\87à¨\86}}",
        "nimagelinks": "$1 {{PLURAL:$1|ਸਫ਼ੇ|ਸਫ਼ਿਆਂ}} ’ਤੇ ਵਰਤਿਆ ਹੋਇਆ",
        "ntransclusions": "$1 {{PLURAL:$1|ਸਫ਼ੇ|ਸਫ਼ਿਆਂ}} ’ਤੇ ਵਰਤਿਆ ਹੋਇਆ",
        "specialpage-empty": "ਇਸ ਰਿਪੋਟ ਦਾ ਕੋਈ ਨਤੀਜਾ ਨਹੀਂ ਹੈ।",
        "unwatch": "ਨਿਗਰਾਨੀ ਹਟਾਓ",
        "unwatchthispage": "ਨਜ਼ਰ ਰੱਖਣੀ ਬੰਦ ਕਰੋ",
        "notanarticle": "ਕੋਈ ਸਮੱਗਰੀ ਸਫ਼ਾ ਨਹੀਂ ਹੈ",
-       "notvisiblerev": "à¨\87ੱà¨\95 à¨µà©±à¨\96ਰà©\87 à¨®à©\88à¨\82ਬਰ à¨¦à©\80 à¨¬à¨£à¨¾à¨\88 à¨\86à¨\96਼ਰà©\80 à¨°à©\80ਵਿà¨\9c਼ਨ ਮਿਟਾਈ ਜਾ ਚੁੱਕੀ ਹੈ",
+       "notvisiblerev": "à¨\87ੱà¨\95 à¨µà©±à¨\96ਰà©\87 à¨®à©\88à¨\82ਬਰ à¨¦à©\80 à¨¬à¨£à¨¾à¨\88 à¨\86à¨\96਼ਰà©\80 à¨¦à©\81ਹਰਾà¨\85 ਮਿਟਾਈ ਜਾ ਚੁੱਕੀ ਹੈ",
        "watchlist-details": "ਗੱਲ-ਬਾਤ ਸਫ਼ੇ ਨਾ ਗਿਣਦੇ ਹੋਏ, ਤੁਹਾਡੀ ਨਿਗਰਾਨੀ-ਸੂਚੀ ਵਿਚ{{PLURAL:$1|$1 ਸਫ਼ਾ ਹੈ|$1 ਸਫ਼ੇ ਹਨ}}।",
        "wlheader-enotif": "ਈਮੇਲ ਸੂਚਨਾ ਚਾਲੂ ਹੈ।",
        "wlnote": "$3, $4 ਮੁਤਾਬਕ ਆਖ਼ਰੀ {{PLURAL:$2|ਘੰਟੇ|<strong>$2</strong> ਘੰਟਿਆਂ}} ਵਿਚ {{PLURAL:\n$1|ਤਬਦੀਲੀ ਹੋਈ|<strong>$1</strong> ਤਬਦੀਲੀਆਂ ਹੋਈਆਂ}}, ਹੇਠਾਂ ਵੇਖੋ।",
        "undeletepage": "ਮਿਟਾਏ ਹੋਏ ਸਫ਼ੇ ਵੇਖੋ ਅਤੇ ਮੁੜ ਬਹਾਲ ਕਰੋ",
        "viewdeletedpage": "ਮਿਟਾਏ ਹੋਏ ਸਫ਼ੇ ਵੇਖੋ",
        "undelete-fieldset-title": "ਰੀਵਿਜ਼ਨਾਂ ਮੁੜ ਬਹਾਲ ਕਰੋ",
-       "undelete-nodiff": "à¨\95à©\8bà¨\88 à¨ªà¨¿à¨\9bਲà©\80 à¨°à©\80ਵਿà¨\9c਼ਨ à¨¨à¨¹à©\80à¨\82 à¨²à©±à¨­à©\80",
+       "undelete-nodiff": "à¨\95à©\8bà¨\88 à¨ªà¨¿à¨\9bਲਾ à¨¦à©\81ਹਰਾà¨\85 à¨¨à¨¹à©\80à¨\82 à¨²à©±à¨­à¨¿à¨\86।",
        "undeletebtn": "ਮੁੜ-ਸਟੋਰ",
        "undeletelink": "ਵੇਖੋ/ਮੁੜ ਬਹਾਲ ਕਰੋ",
        "undeleteviewlink": "ਵੇਖੋ",
        "move-leave-redirect": "ਪਿੱਛੇ ਇਕ ਰੀਡਿਰੈਕਟ ਛੱਡੋ",
        "export": "ਜੁਗਤਾਂ ਦੀ ਬਰਾਮਦ",
        "exportall": "ਸਾਰੇ ਸਫ਼ਿਆਂ ਦੀ ਬਰਾਮਦ",
-       "exportcuronly": "ਸਿਰਫ਼ à¨®à©\8cà¨\9cà©\82ਦਾ à¨°à©\80ਵਿà¨\9c਼ਨ ਸ਼ਾਮਲ ਕਰੋ, ਸਾਰਾ ਅਤੀਤ ਨਹੀਂ",
+       "exportcuronly": "ਸਿਰਫ਼ à¨®à©\8cà¨\9cà©\82ਦਾ à¨¦à©\81ਹਰਾà¨\85 ਸ਼ਾਮਲ ਕਰੋ, ਸਾਰਾ ਅਤੀਤ ਨਹੀਂ",
        "export-submit": "ਐਕਸਪੋਰਟ",
        "export-addcattext": "ਇਸ ਸ਼੍ਰੇਣੀ ਤੋਂ ਸਫ਼ੇ ਜੋੜੋ",
        "export-addcat": "ਜੋੜੋ",
        "import-upload-filename": "ਫ਼ਾਈਲ ਦਾ ਨਾਂ:",
        "import-comment": "ਟਿੱਪਣੀ:",
        "importstart": "ਪੇਜ ਇੰਪੋਰਟ ਕੀਤੇ ਜਾ ਰਹੇ ਹਨ...",
-       "import-revision-count": "$1 {{PLURAL:$1|ਰà©\80ਵਿà¨\9c਼ਨ|ਰà©\80ਵਿà¨\9c਼ਨਾà¨\82}}",
+       "import-revision-count": "$1 {{PLURAL:$1|ਦà©\81ਹਰਾà¨\85|ਦà©\81ਹਰਾà¨\85}}",
        "importnopages": "ਮੰਗਾਉਣ ਲਈ ਕੋਈ ਸਫ਼ੇ ਨਹੀਂ ਹਨ।",
        "importfailed": "ਇੰਪੋਰਟ ਫੇਲ੍ਹ: $1",
        "importunknownsource": "ਮੰਗਾਉਣ ਦੇ ਸਰੋਤ ਦੀ ਅਣਪਛਾਤੀ ਕਿਸਮ",
index 0c43ccc..796d436 100644 (file)
        "anoncontribs": "Same as {{msg-mw|mycontris}} but used for non-logged-in users.\n\nSee also:\n* {{msg-mw|Accesskey-pt-anoncontribs}}\n* {{msg-mw|Tooltip-pt-anoncontribs}}\n{{Identical|Contribution}}",
        "contribsub2": "Contributions for \"user\" (links). Parameters:\n* $1 is an IP address or a username, with a link which points to the user page (if registered user).\n* $2 is list of tool links. The list contains a link which has text {{msg-mw|Sp-contributions-talk}}.\n* $3 is a plain text username used for GENDER.\n{{Identical|For $1}}",
        "contributions-userdoesnotexist": "This message is used in [[Special:Contributions]]. It is used to tell the user that the name he searched for doesn't exist.\n\nParameters:\n* $1 - a username\n{{Identical|Userdoesnotexist}}",
+       "negative-namespace-not-supported": "This message is used in [[Special:Contributions]] to tell users that use namespaces with negative value. It not supported as associated namespace(s) doesn't exist.",
        "nocontribs": "Used in [[Special:Contributions]] and [[Special:DeletedContributions]].\n\nSee examples: [[Special:Contributions/x]] and [[Special:DeletedContributions/x]].\n\nParameters:\n* $1 - (Unused) the user name",
        "uctop": "This message is used in [[Special:Contributions]]. It is used to show that a particular edit was the last made to a page. Example: 09:57, 11 February 2008 (hist) (diff) Pagename‎ (edit summary) (current)\n{{Identical|Current}}",
        "month": "Used in [[Special:Contributions]] and history pages ([{{fullurl:Sandbox|action=history}} example]), as label for a dropdown box to select a specific month to view the edits made in that month, and the earlier months. See also {{msg-mw|year}}.",
index 4e94946..8444e44 100644 (file)
        "ipb_expiry_old": "Utgångstiden har redan passerat.",
        "ipb_expiry_temp": "För att dölja användarnamnet måste blockeringen vara permanent.",
        "ipb_hide_invalid": "Kan inte undanhålla detta konto; det har fler än {{PLURAL:$1|en redigering|$1 redigeringar}}.",
+       "ipb_hide_partial": "Dolda användarnamnsblockeringar måste gälla hela webbplatsen.",
        "ipb_already_blocked": "\"$1\" är redan blockerad",
        "ipb-needreblock": "$1 är redan blockerad. Vill du ändra inställningarna?",
        "ipb-otherblocks-header": "{{PLURAL:$1|Annan blockering|Andra blockeringar}}",
index 0526385..0f09498 100644 (file)
        "resetpass-abort-generic": "ಒಂಜಿ ವಿಸ್ತರಣೆಡ್ ಸಂಕೇತಪದ ಬದಲಾವಣೆ ಪತನ ಆತ್ಂಡ್.",
        "resetpass-expired": "ಇರೆನ ಸಂಕೇತಪದ ಮುಗಿದ್ಂಡ್.ಉಳಗಮನೊಗಾದ್ ಒಂಜಿ ಪೊಸ ಸಂಕೇತಪದ ಗೋಡಿಯಾವುಲೆ.",
        "resetpass-expired-soft": "ಇರೆನ ಸಂಕೇತಪದ ಮುಗಿದಿಂಡ್ ಬೊಕ ಬದಲ್ ಮಲ್ಪೊಡಾಪುಂಡು. ದಯಮಲ್ತ್  ಒಂಜಿ ಪೊಸ ಸಂಕೇತಪದ ಇತ್ತೆನೆ ಆಯಿಲೆ ಇಜಿಂಡ  ಅವೆನ್  ತರೀದ್ ಬದಲಾವರೆ \"{{int:authprovider-resetpass-skip-label}}\"  ಒತ್ತುಲೆ .",
-       "resetpass-validity": "ಉಳಗಮನೊಗು ಒಂಜಿ ಪೊಸ ಸಂಕೇತಪದ ದೀಲೆ.",
+       "resetpass-validity": "ಉಳಗಮನೊಗು ಒಂಜಿ ಪೊಸ ಸಂಕೇತಪದ ದೀಲೆ:$1",
        "resetpass-validity-soft": "ಇರೆನ ಸಂಕೇತಪದ ಮಾನ್ಯ ಆತಿಜಿ:$1\nದಯಮಲ್ತ್ ಒಂಜಿ ಪೊಸ ಸಂಕೇತಪದ ಆಯಿಲೆ ಇಜಿಂಡ ಅವೆನ್ ತರೀದ್ ಬದಲಾವರೆ \n \"{{int:authprovider-resetpass-skip-label}}\" ಒತ್ತುಲೆ.",
        "passwordreset": "ಪ್ರವೇಸೊ ಪದೊನ್ ಪಿರ ಸ್ತಾಪನೆ ಮಲ್ಪುಲೆ",
        "passwordreset-text-one": " ಒಂಜಿ ಹಂಗಾಮಿ ಸಂಕೇತಪದೊನ್, ಇಮೇಲ್ದ  ಮುಖಾಂತರ ಗೆತೊಣರೆ, ಈ ರೂಪತ್ರನ್ ದಿಂಜಾಲೆ.",
        "changeemail-throttled": "ಈರ್ ದಿಂಜ ಸರ್ತಿ ಉಳಗಮನ ಪ್ರಯತ್ನ ಮಲ್ದರ್. ಕುಡಾ ಯತ್ನ ಮಲ್ಪುನ ದುಂಬು ದಯಮಲ್ತ್ $1 ಕಾಪುಲೆ",
        "changeemail-nochange": "ದಯಮಲ್ತ್ ಒಂಜಿ ಬೇತೆ ಪೊಸ ಇಮೇಲ್ ವಿಳಾಸ ಸೇರಾಲೆ.",
        "resettokens": "ಸಂಕೇತೊಲೆನ್ ಜತೆಸೇರಲೆ",
+       "resettokens-text": "ಇರೆನ ಖಾತೆದ ಕೆಲವು ಖಾಸಗಿ ದತ್ತಾಂಶೊಗು ಪ್ರವೇಶ ಕೊರ್ಪಿನ ಸಂಕೇತಬಿಲ್ಲೆಲೆನ್ ಈರ್ ಮುಲ್ಪ ಪಿರತಾಪನೆ ಮಲ್ಪೊಲಿ.\nಈರ್ ಅಕಸ್ಮಾತ್ತಾದ್ ಏರಾಒರಿಯಗ್ ಅವೆನ್ ಪಟ್ಟ್'ದಿತ್ತರ್ಡ ಇಜಿಂಡ ಇರೆನ ಖಾತೆಗ್ ಅಕ್ರಮ ಪ್ರವೇಶ ಆದಿತ್ತ್ಂಡ ಈರ್ ಅವೆನ್ ಪಿರತಾಪನೆ ಮಲ್ಪೊಡು.",
+       "resettokens-no-tokens": "ಅಲ್ಪ ಪಿರತಾಪನೆ ಮಲ್ಪರೆ ಒವ್ವೆ ಸಂಕೇತಬಿಲ್ಲೆಲು ಇಜ್ಜಿ.",
        "resettokens-tokens": "ಸಂಕೇತೊಲು:",
        "resettokens-token-label": "$1(ಇತ್ತೆದ ಮೌಲ್ಯೊ:$2)",
+       "resettokens-watchlist-token": "ಜಾಲ ಆಹಾರದ ಸಂಕೇತಬಿಲ್ಲೆ (ಆಟಂ/ಆರ್.ಎಸ್.ಎಸ್) \n of [[Special:ವೀಕ್ಷಣಪಟ್ಟಿ|ವೀಕ್ಷಣಪಟ್ಟಿದ ಪುಟ ಬದಲಾವಣೆಲು]]",
+       "resettokens-done": "ಸಂಕೇತಬಿಲ್ಲೆಲು ಪಿರತಾಪನೆ ಆತಾ.",
+       "resettokens-resetbutton": "ಜತ್ತಿನ ಸಂಕೇತಬಿಲ್ಲೆಲೆನ್ ಪಿರತಾಪನೆ ಮಲ್ಪುಲೆ",
        "bold_sample": "ದಪ್ಪೊ ಅಕ್ಷರೊ",
        "bold_tip": "ದಪ್ಪೊ ಅಕ್ಷರೊ",
        "italic_sample": "ಓರೆ ಅಕ್ಷರೊಲು",
        "preview": "ಮುನ್ನೋಟ",
        "showpreview": "ಮುನ್ನೋಟೊ ತೋಜಾವು",
        "showdiff": "ಬದಲಾವಣೆಲೆನ್ ತೋಜಾವ್",
+       "blankarticle": "<strong>ಎಚ್ಚರಿಕೆ:</strong> ಈರ್ ರಚಿಸಾವುನ ಪುಟ ಖಾಲಿ ಆದುಂಡು.\nಈರ್ ನನೊರ $1 ಒತ್ತಿಯರ್ಡ, ಒವ್ವೆ ವಿಷಯದಾಂತೆ ಪುಟ ರಚನೆ ಆಪುಂಡು",
        "anoneditwarning": "<strong>ಜಾಗ್‍ರ್ತೆ:</strong> ಈರ್ ಇತ್ತೆ ಲಾಗ್ ಇನ್ ಆತಿಜರ್. ಈರ್ ಸಂಪೊಲಿತರ್ಂಡ ಈರೆನ ಐ.ಪಿ. ಎಡ್ರೆಸ್ ಮಾಂತೆರೆಗ್ಲಾ ತೆರಿವುಂಡು. ಒಂಜೇಲೆ <strong>[$1 ಲಾಗಿನ್ ಆಯರ್ಂದಾಂಡ]</strong> ಅತ್ತಂಡ <strong>[$2 ಒಂಜಿ ಅಕೌಂಟ್ ಮಲ್ತರ್ಂಡ]</strong>, ಈರ್ ಸಂಪೊಲ್ತಿನೆತ್ತ ಶ್ರೇಯೊ (ಕ್ರೆಡಿಟ್) ಬೊಕ್ಕ ಬೇತೆ ಲಾಬೊಲು ಇರೆನ ಸದಸ್ಯೆರೆ ಪುದರ್‍ಗ್ ಸೇರುಂಡು.",
        "anonpreviewwarning": "ಈರ್ ಇತ್ತೆ ಲಾಗ್ ಇನ್ ಆತಿಜರ್. ಈರ್ನ ಐ.ಪಿ ಎಡ್ರೆಸ್ ಈ ಪುಟೊತ ಬದಲಾವಣೆ ಇತಿಹಾಸೊಡು ದಾಖಲಾಪು೦ಡು",
        "missingsummary": "'''ಗಮನಿಸಾಲೆ:''' ಈರ್ ಬದಲಾವಣೆದ ಸಾರಾ೦ಶನ್ ಕೊರ್ತಿಜರ್.\nಈರ್ ಪಿರ 'ಒರಿಪಾಲೆ' ಬಟನ್ ನ್ ಒತ್ತ್೦ಡ ಸಾರಾ೦ಶ ಇಜ್ಜ೦ದೆನೇ ಈರ್ನ ಬದಲಾವಣೆ ದಾಖಲಾಪು೦ಡು.",
+       "selfredirect": "<strong>ಎಚ್ಚರಿಕೆ:</strong> ಈರ್ ಈ ಪುಟೊನು ಅಯಿಕೇ ಪಿರರವಾನೆ ಮಲ್ತೊಂದುಲ್ಲರ್.\nಈರ್ ಪಿರರವಾನೆಗ್ ತಪ್ಪು ಗುರಿ ಕೊರ್ದಿಪ್ಪರ್ ಇಜಿಂಡ ಈರ್ ತಪ್ಪು ಪುಟೊನು ಸಂಪಾದಿಸೊಂದುಲ್ಲರ್.\nಈರ್ ನನೊರ $1 ಒತ್ತಿಯರ್ಡ, ಎಂಚಲಾ ಪಿರರವಾನೆ ರಚನೆ ಆಪುಂಡು.",
        "missingcommenttext": "ದಯ ಮಲ್ತ್ ದ ಈರ್ನ ಅಭಿಪ್ರಾಯನ್ ಕೊರ್ಲೆ",
        "missingcommentheader": "'''ಗಮನಿಸಾಲೆ:''' ಈರ್ ಈ ಅಭಿಪ್ರಾಯಗ್ \"ವಿಷಯ/ಮುಖ್ಯಾ೦ಶ\" ದಾಲ ಕೊರ್ತಿಜರ್. ಈರ್ ಪಿರ ’ಒರಿಪಾಲೆ’ ಬಟನ್ ನ್ ಒತ್ತ್೦ಡ ಈರ್ನ ಬದಲಾವಣೆ ವಿಷಯ/ಮುಖ್ಯಾ೦ಶ ಇಜ್ಜ೦ದನೇ ಒರಿಪ್ಪಾವು೦ಡು.",
        "summary-preview": "ಸಾರಾ೦ಶ ಮುನ್ನೋಟ:",
        "subject-preview": "ವಿಷಯ/ಮುಖ್ಯಾ೦ಶದ ಮುನ್ನೋಟ:",
+       "previewerrortext": "ಇರೆನ ಬದಲಾವಣೆಲನ ಮುನ್ನೋಟ ತೂವನಗ ಒಂಜಿ ದೋಷ ಉಂಡಾಂಡ್.",
        "blockedtitle": "ಈ ಸದಸ್ಯೆರೆನ್ ತಡೆ ಮಲ್ತ್ ದ್೦ಡ್.",
+       "blocked-email-user": "<strong>  ಇಮೇಲ್ ಕಡಪುಡಂದಿಲೆಕ್ಕ ಇರೆನ ಬಳಕೆಪುದರುನ್ ತಡೆತುದುಂಡು. ಆಂಡಲಾ,\nಈರ್ ಈ ವಿಕಿಟ್ ಬೇತೆ ಪುಟೊಕುಲೆನ್ ಸಂಪಾದಿಸಾವೊಲಿ.</strong>\nತಡೆತ ಪೂರ್ಣ ವಿವರೊನು ಈರ್ ಮೂಲು ತೂವೊಲಿ:   [[Special:MyContributions|account contributions]].\nತಡೆಮಲ್ತಿನಾರ್  $1.\nಕೊರಿನ ಕಾರಣ <em>$2</em>.\n*ತಡೆ ಆರಂಭ: $8\n* ತಡೆ ಮುಗಿಪುನಿ: $6\n* ತಡೆ ಆತಿನಾರ್: $7\n* ತಡೆ ಗುರುತುಸಂಖ್ಯೆ ID #$5",
+       "blockedtext-partial": "<strong>  ಈ ಪುಟ ಬದಲಾವಂದಿ ಲೆಕ್ಕ ಇರೆನ ಬಳಕೆಪುದರು ಇಜಿಂಡ ಐಪಿ ವಿಳಾಸನ್ ತಡೆತುದುಂಡು. ಆಂಡಲಾ, ಈರ್ ಈ ವಿಕಿಟ್ ಬೇತೆ ಪುಟೊಕುಲೆನ್ ಸಂಪಾದಿಸಾವೊಲಿ.</strong>\nತಡೆತ ಪೂರ್ಣ ವಿವರೊನು ಈರ್ ಮೂಲು ತೂವೊಲಿ:   [[Special:MyContributions|account contributions]].\n*ತಡೆಮಲ್ತಿನಾರ್  $1.\n*ಕೊರಿನ ಕಾರಣ <em>$2</em>.\n*ತಡೆ ಆರಂಭ: $8\n* ತಡೆ ಮುಗಿಪುನಿ: $6\n* ತಡೆ ಆತಿನಾರ್: $7\n* ತಡೆ ಗುರುತುಸಂಖ್ಯೆ ID #$5",
        "blockedtext": "<strong>ಇರೆನ ಸದಸ್ಯ ಪುದರ್ ಅತ್ತ್‌ಡ ಐ.ಪಿ. ವಿಲಾಸೊ ತಡೆ ಆತ್‌ಂಡ್.</strong>\n\nಈ ತಡೆನ್ ಮಲ್ತಿನಾರ್ $1.\nಇಂದೆಕ್ ಕೊರಿನ ಕಾರಣೊ <em>$2</em>.\n\n* ತಡೆ ಸುರುವಾಯಿನಿ: $8\n* ತಡೆ ಕೈದಾಪಿನಿ: $6\n* ತಡೆ ಆತಿನಾರ್: $7\n\nಈರ್ ಈ ತಡೆತ ಬಗ್ಗೆ ಚರ್ಚೆ ಮಲ್ಪೆರೆ $1 ನ್ ಅತ್ತ್‌ಡ ಕುಡೊರಿ [[{{MediaWiki:Grouppage-sysop}}|ನಿರ್ವಾಹಕೆರೆನ್]] ಸಂಪರ್ಕೊ ಆವೊಲಿ.\nಈರ್ [[Special:Preferences|ಖಾತೆ ಪ್ರಾಶಸ್ತ್ಯೊಲೆಡ್]] ಸರಿ ಆಯಿನ ಈ-ಮೈಲ್ ವಿಲಾಸೊನು ಕೊರ್ದಿತ್ತ್ಂಡ ಬೊಕ್ಕ \"ಈ ಸದಸ್ಯೆರೆಗ್ ಈ-ಮೈಲ್ ಕಡಪುಡ್ಲೆ\" ಪನ್ಪಿ ಸೌಲಭ್ಯೊಡ್ದ್ ತಡೆ ಆತಿಜರ್‌ಡ, ಈ ಸೌಲಭ್ಯೊನು ಗಲಸ್‌ದ್ ಈ-ಮೈಲ್ ಮೂಲಕ ಸಂಪರ್ಕ ಆವೊಲಿ.   \n\nಈರೆನ ಇತ್ತೆದ ಐ.ಪಿ. ವಿಲಾಸೊ $3, ಬೊಕ್ಕ ತಡೆತ ಐ.ಡಿ. #$5.\nಒವ್ವೇ ಪ್ರಶ್ನೆ ಇತ್ತ್ಂಡ ಮಿತ್ತ್ ಉಪ್ಪುನ ಮಾತಾ ಮಾಹಿತಿನ್ಲಾ ದಯದೀದ್ ಈರೆನ ಪ್ರಶ್ನೆದೊಟ್ಟುಗು ಸೇರಾಲೆ.",
+       "autoblockedtext": "  ಇಮೇಲ್ ಕಡಪುಡಂದಿಲೆಕ್ಕ ಇರೆನ ಐಪಿ ವಿಳಾಸೊನ್  ಸ್ವಯಂಕೃತವಾದ್ ತಡೆತುದುಂಡು. ಕಾರಣ ಅವೆನ್ ಬೇತೆ ಒರಿ ಬಳಕೆ ಮಲ್ದೆರ್, ಅರೆನ್ ತಡೆಮಲ್ತಿನಾರ್  $1.\nಕೊರಿನ ಕಾರಣ <em>$2</em>.\n* ತಡೆ ಆರಂಭ: $8\n* ತಡೆ ಮುಗಿಪುನಿ: $6\n* ತಡೆ ಆತಿನಾರ್: $7\nಈ ತಡೆತ ಚರ್ಚೆ ಮಲ್ಪರೆ ಈರ್ $1  ಇಜಿಂಡ ಬೇತೆ ಒರಿಯನ್ ಸಂಪರ್ಕಿಸಾವೊಲಿ \n [[{{MediaWiki:Grouppage-sysop}}|ಆಡಳಿತಗಾರೆರ್]] .ಇರೆಗ್\n[[Special:Preferences|ಬಳಕೆದಾರೆ ಆಯ್ಕೆಲು]]ಡು ನೋಂದಾಯಿನ ಬೊಕ ತಡೆ ಆವಂದಿನ  ಸುಮಾನ್ಯ ಇಮೇಲ್ ವಿಳಾಸ ಇಜ್ಜಿಡ  ಈರ್  \"{{int:emailuser}}\"ದ ಗುಣಧರ್ಮೊನು ಬಳಸರೆ ಆಪುಜಿ ಇಂದ್ ತೆರಿಲೆ.\nಇರೆನ ಚಾಲ್ತಿ ಐಪಿ ವಿಳಾಸ $3 ಬೊಕ ತಡೆ ಗುರುತುಸಂಖ್ಯೆ ID $5\nದಯಮಲ್ತ್ ಈ ಮಿತ್ತ್'ದ ಮಾತಾ ವಿವರೊಲೆನ್ ಈರ್ ಮಲ್ಪುನ ಒವ್ವೆ ಕೇಣಿಲೆಡ್ ಸೇರಾಲೆ.",
+       "systemblockedtext": "  ಇರೆನ ಬಳಕೆಪುದರ್ ಇಜಿಂಡ ಐಪಿ ವಿಳಾಸೊನ್  ಮೀಡಿಯಾವಿಕಿ  ಸ್ವಯಂಕೃತವಾದ್ ತಡೆತುದುಂಡು. \nಕೊರಿನ ಕಾರಣ <em>$2</em>.\n* ತಡೆ ಆರಂಭ: $8\n* ತಡೆ ಮುಗಿಪುನಿ: $6\n* ತಡೆ ಆತಿನಾರ್: $7\nಇರೆನ ಚಾಲ್ತಿ ಐಪಿ ವಿಳಾಸ $3 \nದಯಮಲ್ತ್ ಈ ಮಿತ್ತ್'ದ ಮಾತಾ ವಿವರೊಲೆನ್ ಈರ್ ಮಲ್ಪುನ ಒವ್ವೆ ಕೇಣಿಲೆಡ್ ಸೇರಾಲೆ.",
+       "actionblockedtext": "ಈರ್ ಈ ಕ್ರಿಯೆನ್ ಮಲ್ಪಂದಿಲೆಕ್ಕ ತಡೆತುದುಂಡು.",
        "blockednoreason": "ವಾ ಕಾರಣೊಲಾ ಕೊರ್ತ್‍ಜಿ",
+       "whitelistedittext": "ಪುಟೊ ಸಂಪಾದಿಸಾವರೆ ದಯಮಲ್ತ್  $1 .",
+       "confirmedittext": "ಪುಟೊಲೆನ್ ಸಂಪಾದಿಸಾವುನ ದುಂಬು ಈರ್ ಇರೆನ ಇಮೇಲ್ ವಿಳಾಸೊನು ದೃಡೀಕರಿಸೊಡು.\nದಯಮಲ್ತ್ ಇರೆನ  [[Special:Preferences|ಬಳಕೆದಾರೆ ಆಯ್ಕೆಲು]].ಡು ಇಮೇಲ್ ವಿಳಾಸ ತಾಪಿಸಾದ್ ಮಾನ್ಯಮಲ್ಪುಲೆ.",
        "nosuchsectiontitle": "ಈ ಪುದರ್‍ದ ವಾ ವಿಭಾಗಲಾ ಇಜ್ಜಿ",
+       "nosuchsectiontext": "ಈರ್ ಉಪ್ಪಂದಿನ ಒಂಜಿ ವಿಭಾಗೊನು ಸಂಪಾದಿಸಾರೆ ಯತ್ನ ಮಲ್ತರ್.\nಈರ್ ಪುಟೊನು ತೂವನಗ ಅವು ಸ್ಥಳಾಂತರ ಆದಿಪ್ಪು ಇಜಿಂಡ ಮಾಜಿದಿಪ್ಪು.",
        "loginreqtitle": "ಲಾಗಿನ್ ಆವೊಡು",
        "loginreqlink": "ಲಾಗಿನ್ ಆಲೆ",
+       "loginreqpagetext": "ಬೇತೆ ಪುಟೊಲೆನ್ ತೂವರೆ ದಯಮಲ್ತ್ $1",
        "accmailtitle": "ಪ್ರವೇಶಪದ ಕಡಪುಡ್‘ದುಂಡು",
+       "accmailtext": "[[User talk:$1|$1]] ಅರೆನ ವಿನಾಕ್ರಮ ರಚಿತ ಪ್ರವೇಶಪದ $2 ಗು ಕಡಪುಡುದುಂಡು .ಉಳಗಮನದ ನಂತರ ಅವೆನ್ <em>[[Special:ChangePassword|ಪ್ರವೇಶಪದ ಬದಲ್]]</em> ಪುಟೊಟು ಬದಲಾವೊಲಿ.",
        "newarticle": "(ಪೊಸತ್)",
        "newarticletext": "ನನಲ ಅಸ್ಥಿತ್ವಡ್ ಉಪ್ಪಂದಿನ ಪುಟೊಕು ಈರ್ ಬೈದರ್.\nಈ ಪುಟೊನು ಉಂಡುಮಲ್ಪೆರೆ ತಿರ್ತ್‍ದ ಚೌಕೊಡು ಬರೆಯೆರೆ ಸುರು ಮಲ್ಪುಲೆ.\n(ಜಾಸ್ತಿ ಮಾಹಿತಿಗ್ [$1 ಸಹಾಯ ಪುಟೊನು] ತೂಲೆ).\nಈ ಪುಟೊಕು ಈರ್ ತತ್ತ್‌ದ್ ಬತ್ತಿತ್ತ್ಂಡ, ಇರೆನ ಬ್ರೌಸರ್‍ದ '''back''' ಬಟನ್ ಒತ್ತ್‌ಲೆ.",
        "anontalkpagetext": "----\n<em>ಉಂದು ಖಾತೆ ಇಜ್ಜಾಂದಿನ ಅತ್ತ್‌ಡ ಇತ್ತ್‌ದ್ಲಾ ಗಲಸಂದಿನ ಒಂಜಿ ಪುದರ್‌ದಾಂತಿ ಗಲಸುನಾರೆಗಾದ್ ಉಪ್ಪುನ ಚರ್ಚೆ ಪುಟೊ.</em>\nಅಂಚಾದ್, ಎಂಕುಲು ಅರೆನ್ ಗುರ್ತ ಮಲ್ಪೆರೆ ಅರೆನ ಐ.ಪಿ. ವಿಲಾಸೊನು ಗಲಸೊಡಾಪುಂಡು.\nಇಂಚಿತ್ತಿ ಐ.ಪಿ. ವಿಲಾಸೊನು ಮಸ್ತ್ ಜನೊ ಗಲಸೊಂದುಪ್ಪೆರ್.\nಈರ್ ಒರಿ ಪುದರ್‌ದಾಂತಿ ಗಲಸುನಾರ್ ಆದಿತ್ತ್ಂಡ ಬೊಕ್ಕ ಇರೆಗ್ ಸಂಬಂದೊ ದಾಂತಿನ ಸಂದೇಶೊಲು ಬರೊಂದುಂಡು ಪಂದ್ ಎನ್ನುವರ್‌ಡ, ನನ ದುಂಬಗ್ ಬೇತೆ ಪುದರ್‌ದಾಂತಿ ಗಲಸುನಾಕ್ಲೆನೊಟ್ಟುಗು ಅಂಬರಪ್ಪು ಆವಂದಿಲೆಕ ಉಪ್ಪೆರೆ, ದಯದೀದ್ [[Special:CreateAccount|ಒಂಜಿ ಸದಸ್ಯೆರೆ ಖಾತೆನ್ ಉಂಡುಮಲ್ಪುಲೆ]] ಅತ್ತ್‌ಡ [[Special:UserLogin|ಲಾಗ್ ಇನ್ ಆಲೆ]]",
index dc1a22a..34d6d38 100644 (file)
        "pageinfo-display-title": "عنوان",
        "pageinfo-default-sort": "کلید برائے ابتدائی ترتیب",
        "pageinfo-length": "صفحہ کا حجم (بائٹ میں)",
+       "pageinfo-namespace": "نام فضا",
        "pageinfo-article-id": "صفحہ کی شناخت",
        "pageinfo-language": "زبان",
        "pageinfo-language-change": "تبدیلی",
index b57cdd2..5a67ffb 100644 (file)
        "index-category": "Indekslanadigan sahifalar",
        "noindex-category": "Indekslanmaydigan sahifalar",
        "broken-file-category": "Ishlamaydigan fayl havolalari bor sahifalar",
+       "category-header-numerals": "$1–$2",
        "about": "Haqida",
        "article": "Sahifa",
        "newwindow": "(yangi oynada ochiladi)",
        "group-autoconfirmed": "Tasdiqlangan foydalanuvchilar",
        "group-bot": "Botlar",
        "group-sysop": "Administratorlar",
+       "group-interface-admin": "Interfeys administratorlar",
        "group-bureaucrat": "Rasmiyatchilar",
        "group-suppress": "Tekshiruvchilar",
        "group-all": "(hamma)",
        "statistics-header-pages": "Sahifalar statistikasi",
        "statistics-header-edits": "Tahrirlar statistikasi",
        "statistics-header-users": "Foydalanuvchilar statistikasi",
+       "statistics-header-hooks": "Boshqa statistikalar",
        "statistics-articles": "Maqolalar",
        "statistics-pages": "Sahifalar",
        "statistics-pages-desc": "Ushbu vikidagi barcha sahifalar, shu jumladan munozara sahifalari, qayta yoʻnaltiruvchi va boshqa sahifalar",
diff --git a/languages/i18n/xsy.json b/languages/i18n/xsy.json
new file mode 100644 (file)
index 0000000..304e56b
--- /dev/null
@@ -0,0 +1,673 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Lalotahes"
+               ]
+       },
+       "sunday": "kaSangayan",
+       "monday": "ray ’aehae’ Sinangayan",
+       "tuesday": "ray roSa’ Sinangyan",
+       "wednesday": "to:o’ Sinangayan",
+       "thursday": "Sopat Sinangayan",
+       "friday": "haseb Sinangayan",
+       "saturday": "SayboSi: ka Sinangayan",
+       "sun": "kaSangayan",
+       "tue": "roSa’ Sinangayan",
+       "wed": "to:o’ Sinangayan",
+       "thu": "Sopat Sinangayan",
+       "fri": "haseb Sinangayan",
+       "sat": "SayboSi: Sinangayan",
+       "january": "’aehae’ ’ilaS",
+       "february": "roSa’ ilaS",
+       "march": "to:o’ ’ilaS",
+       "april": "Sopt ’ilaS",
+       "may_long": "haseb ’ilaS",
+       "june": "SayboSi’ ’ilaS",
+       "july": "SayboSi: o ’aehae’ ’ilaS",
+       "august": "maykaSpat ’ilaS",
+       "september": "hae’hae’ ’ilaS",
+       "october": "langpez ’ilaS",
+       "november": "langpez o ’aehae’ ’ilaS",
+       "december": "langpez o roSa’ ’ilaS",
+       "january-gen": "’aehae’ ’ilaS",
+       "february-gen": "roSa’ ilaS",
+       "march-gen": "to:o’ ’ilaS",
+       "april-gen": "Sopt ’ilaS",
+       "may-gen": "haseb ’ilaS",
+       "june-gen": "SayboSi’ ’ilaS",
+       "july-gen": "SayboSi: o ’aehae’ ’ilaS",
+       "august-gen": "maykaSpat ’ilaS",
+       "september-gen": "hae’hae’ ’ilaS",
+       "october-gen": "langpez ’ilaS",
+       "november-gen": "langpez o ’aehae’ ’ilaS",
+       "december-gen": "langpez o roSa’ ’ilaS",
+       "jan": "’aehae’ ’ilaS",
+       "feb": "roSa’ ilaS",
+       "mar": "to:o’ ’ilaS",
+       "apr": "Sopat ’ilaS",
+       "may": "haseb ’ilaS",
+       "jun": "SayboSi: ’ilaS",
+       "jul": "SayboSi:o ’aehae’ ’ilaS",
+       "aug": "maykaSpat ’ilaS",
+       "sep": "hae’hae’ ’ilaS",
+       "oct": "langpez ’ilaS",
+       "nov": "langpez o ’aehae’ ’ilaS",
+       "dec": "langpez o roSa’ ’ilaS",
+       "january-date": "’aehae’ ’ilaS $1",
+       "february-date": "roSa’ ilaS $1",
+       "march-date": "to:o’ ’ilaS $1",
+       "april-date": "Sopt ’ilaS $1",
+       "may-date": "haseb ’ilaS $1",
+       "june-date": "SayboSi’ ’ilaS $1",
+       "july-date": "SayboSi: o ’aehae’ ’ilaS $1",
+       "august-date": "maykaSpat ’ilaS $1",
+       "september-date": "hae’hae’ ’ilaS $1",
+       "october-date": "langpez ’ilaS $1",
+       "november-date": "langpez o ’aehae’ ’ilaS $1",
+       "december-date": "langpez o roSa’ ’ilaS $1",
+       "pagecategories": "{{PLURAL:$1| ’a’apolen |$1 ka ’a’apolen }}",
+       "category_header": " ’a’apolen ray \"$1\" ’izo’ ka ye:myen",
+       "subcategories": "’ima ’ol’olae’an ka’a’apolan",
+       "category-media-header": " ka’a’apolen \"$1\" ’izo’ ka me:ti:",
+       "category-empty": "<em> hini pin ’a’apol haysani ’i’ini’ ray hani yemien o ka meiti .</em>",
+       "hidden-categories": "{{PLURAL:$1| Sina:il ka pin’a’apol }}",
+       "category-subcat-count": "{{PLURAL:$2|hini ka’a’apolan hani nanaw saeboeh ray wahoer 1 ka ’ima ’ol’olae’an ka’a’apolan .|hini ka’a’apolan hani saeboeh wahoer $1 ka ima ’ol’olae’an ka’a’apolan , saeboeh $2. }}",
+       "category-article-count": "{{PLURAL:$2|hini ka’a’apolan hani ray wahoer saeboeh ’aehae’ ka yemyen.|hini ka’a’apolan hani ray wahoer saeboeh ’ $1 aehae’ ka yemyen, saeboeh $2 .}}",
+       "category-file-count": "{{PLURAL:$2|hini ka’a’apolan hani saeboeh nanaw ’ano ’aehae’ naehan tang’an.|hini ka’a’apolan hani saeboeh waehoer $1 ka tang’an, saeboeh $2.}}",
+       "listingcontinuesabbrev": "lososo:oy",
+       "noindex-category": "’inokay ka:ati kaSa’amoehan kina:at ka yemien",
+       "broken-file-category": " tang’an  lomotor ’aewhay ilaka yemien",
+       "newwindow": "(’anoka ’ima SaSo’ hinohaes haewaeh )",
+       "cancel": "kayni’",
+       "moredotdotdot": "akoy...",
+       "mypage": "ye:myen",
+       "mytalk": " kapaehrahrangan",
+       "navigation": " tawlan",
+       "and": "&#32; ki &#32;",
+       "namespaces": " karo:o’an",
+       "variants": "pyenti:",
+       "navigation-heading": "tawlan kapawhi:ilan",
+       "returnto": " lobih ray $1.",
+       "tagline": "minay-{{SITENAME}}",
+       "help": " kapakSekla’an",
+       "search": "komi:im",
+       "searchbutton": " komi:im",
+       "go": " patawaw",
+       "searcharticle": "patawaw",
+       "history": "ray yemyen kin’i’iyaehan",
+       "history_short": "kakhayza’an kin’i’iyaeh",
+       "history_small": "kakhayza’an kin’i’iyaeh",
+       "printableversion": "kayzaeh mal’oehaez ka kina:at banben",
+       "permalink": "pinakrengreng kalotoran",
+       "view": " komita",
+       "view-foreign": "ray $1 komita’",
+       "edit": " bienji",
+       "create": "paskayzaeh",
+       "create-local": "baba:aw rinpa: hini ray ’asang kapakSekla’an",
+       "newpage": "’ima SaSo’ ye:myen",
+       "talkpagelinktext": " kapaehrahrangan",
+       "specialpage": " ’ima nonak yemyen",
+       "personaltools": " ’in nonak a nom matwaw",
+       "talk": "maehrahrang",
+       "views": " komita",
+       "toolbox": "nom matwaw",
+       "otherlanguages": "’aroma’ ka:i’",
+       "redirectedfrom": "( papanra:anen ila nahan ray $1)",
+       "redirectpagesub": " papanra:an nahan ka ye:myen",
+       "redirectto": " papanra:an nahan ray:",
+       "lastmodifiedat": "hini ye:myen ’ima maybi:il bienji 於 $1 $2.",
+       "jumpto": " rima’",
+       "jumptonavigation": " tawlan",
+       "jumptosearch": "komi:im",
+       "aboutsite": " ’inakhini’an {{SITENAME}}",
+       "aboutpage": "Project: ’inakhini’an",
+       "copyrightpage": "{{ns:project}}: banqyuen",
+       "currentevents": "hinapa: ray Sinbon",
+       "disclaimers": " pinakSekla’ kina:at",
+       "disclaimerpage": "Project: saeboeh SikoSa’ pinakSekla’ kina:at",
+       "edithelp": " bienji kapakSekla’an",
+       "mainpage": "So:ye’",
+       "mainpage-description": "So:ye’",
+       "portal": "kakS’aboe’an noka Se’cyun",
+       "portal-url": "Project: kakS’aboe’an noka Se’cyun",
+       "privacy": " kina:at ka kaspengan",
+       "privacypage": "Project: kina:at ka kaspengan",
+       "retrievedfrom": "’inmari’ ray \"$1\"",
+       "youhavenewmessages": "So’o hayza’ $1 ($2)",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|niSo’}}hayza’ ’inay{{PLURAL:$3|’aroma’ kamamatawaw |$3 ka kamamatawaw }} $1 ($2).",
+       "newmessagesdifflinkplural": "haysani’ {{PLURAL:$1| sinpih }}",
+       "editsection": " bienji",
+       "editold": " bienji",
+       "viewsourceold": " komita’ ka yuensema:",
+       "editlink": " bienji",
+       "viewsourcelink": " komita’ ka yuensema:",
+       "editsectionhint": "bienji zhang jie :$1",
+       "toc": "raro:o’ noka kina:at",
+       "showtoc": "pinakita’",
+       "hidetoc": " Sa:il",
+       "collapsible-expand": "pawSika:",
+       "site-atom-feed": "kawa:i’an ray $1 ka Atom",
+       "page-atom-feed": "$1 ray Atom kawa:i’an",
+       "red-link-title": " ’oka’ ka yemyen",
+       "nstab-main": "ye:myen",
+       "nstab-user": " nom matawaw ye:myen",
+       "nstab-special": " ’ima nonak yemyen",
+       "nstab-project": " zhwan’an ye:myen",
+       "nstab-image": " tang’an",
+       "nstab-template": " kakSaro:olan",
+       "nstab-category": " ’a’apolen",
+       "mainpage-nstab": "So:ye’",
+       "nospecialpagetext": "<strong> niSo’ pina’alo’ ’ima nonak yemien ’inokay paylal’oz .</strong> So: ’iyakina mari’ ’ima kayzaeh ka ’ima nonak yemyen kapakSekla’ kina:at kazaeh maray hini [[Special:SpecialPages|{{int:specialpages}}]].",
+       "missingarticle-diff": "( kin nonak: $1 , $2 )",
+       "badtitle": " ’inokay paylal’oz ka raro:o’",
+       "badtitletext": " tinoroe’ ray ye:myen raro:o’ ’inokay paylal’oz 、’inoka’ ka kano’, a ’oka’i paskayzaeh lomotor nom kaSkoraeh ka:i’ a kaSkoraeh ray Wiki ka raro:o’ .\n raro:o’ raro:o’ ’izo’ ra:amen hani saeboeh ’oka’ nanaw papatawaw ray raro:o’ ka kaka:at ka ka:i’.",
+       "viewsource": " komita’ ka yuensema:",
+       "viewsource-title": " komita  $1 的 yuensema:",
+       "viewsourcetext": "So’o kayzaeh komita o ’alro:ol rini ray yemien ka yuensema:",
+       "yourname": " kamamatawaw raro:o’:",
+       "userlogin-yourname-ph": " koma:at ’inSo’a nom matawaw raro:o’",
+       "yourpassword": " mima:",
+       "userlogin-yourpassword": "mima",
+       "userlogin-yourpassword-ph": " ka:at ka mima: niSo’",
+       "createacct-yourpassword-ph": "koma:at mima:",
+       "createacct-yourpasswordagain": "Sa:hael nahan ka mima:",
+       "createacct-yourpasswordagain-ph": "’onhael nahan koma:at mima:",
+       "userlogin-remembermypassword": "hoehoero: ma’an kakaS’aboe’an",
+       "login": "kaS’aboe’",
+       "logout": "kas’oehaez",
+       "userlogin-noaccount": "’oka’ ka zhanghaw ay?",
+       "userlogin-joinproject": "ropa: {{SITENAME}}",
+       "createaccount": " paskayzaeh zhanghaw",
+       "userlogin-resetpassword-link": "mangowip ka mima?",
+       "userlogin-helplink2": "patilhaehael kaS’aboe’",
+       "createacct-emailoptional": " tyenze: yo:jyen ( pawhi:il ka:at )",
+       "createacct-email-ph": " ka:at ka tyenze: yo:jyen niSo’",
+       "createacct-submit": "paskayzaeh niSo’ ka zhanghaw",
+       "createacct-another-submit": " paskayzaeh zhanghaw",
+       "createacct-benefit-heading": "{{SITENAME}} hini ’inak So’oan hingha’ kamamobay ka pinatawaw ma’iyaeh nasiya pinaskayzaeh.",
+       "createacct-benefit-body1": "{{PLURAL:$1| ’okik miniSa’la’ pinbienji }}",
+       "createacct-benefit-body3": " ray haysani’ ka{{PLURAL:$1| kama mobay }}",
+       "mailmypassword": " ’in’alay naehan paskayzaeh ka mima:",
+       "loginlanguagelabel": " ka:i’ :$1",
+       "pt-login": "kaS’aboe’",
+       "pt-login-button": "kaS’aboe’",
+       "pt-createaccount": " paskayzaeh zhanghaw",
+       "pt-userlogout": "kas’oehaez",
+       "botpasswords-label-create": "paskayzaeh",
+       "botpasswords-label-cancel": "kayni’",
+       "resetpass-submit-cancel": "kayni’",
+       "passwordreset": " ’in’alay naehan paskayzaeh ka mima:",
+       "passwordreset-username": " kamamatawaw raro:o’:",
+       "bold_sample": " pinakrarahoe’ ka kina:at",
+       "bold_tip": " pinakrarahoe’ ka kina:at",
+       "italic_sample": " kina:at pinay’iring",
+       "italic_tip": " kina:at pinay’iring",
+       "link_sample": " kalotoran raro:o’",
+       "link_tip": "izo’ kalotoran",
+       "extlink_sample": "http://www.example.com kalotoran raro:o’",
+       "extlink_tip": " ’oehaez kalotoran ( hoehoero: ’anoka http:// ’on’alay)",
+       "headline_sample": "minayhal ka raro:o’ kina:at",
+       "headline_tip": "minaypoSal ka raro:o’ kina:at",
+       "nowiki_sample": "paksilaeh ’inoki ke:Se’hwa’ ka kina:at",
+       "nowiki_tip": "’itayso: ka wiki pinke:Se’hwa’",
+       "image_tip": "tang’an rinpa:",
+       "media_tip": " tang’an kalotoran",
+       "sig_tip": "’inSo’a kina:at raro:o’ ki hahila: jikang",
+       "hr_tip": "hinoba:ang ’imatatihingha’ (’okik rengreng)",
+       "summary": "zhayaw:",
+       "minoredit": "hini ’aehae’ ka pinaybiil kaponrowa’en",
+       "watchthis": "kitkita’ ka hini ye:myen",
+       "savearticle": "kaSili’an ye:myen",
+       "savearticle-start": "kaSili’an ye:myen...",
+       "showpreview": " pinakita’ ka pinaSawaSak",
+       "showdiff": " pinakita’ ka sinapih",
+       "anoneditwarning": "<strong>pati’azem:</strong> So’o ’i’ini’ kaS’abo’, So: So’o matawaw ’ana kano’ pinbienji niSo’ katnaIPan kapakita’ saeboeh. So: So’o <strong>[$1 kaS’abo’ ]</strong> a <strong>[$2 paskayzaeh ka zhanghaw ]</strong>, niSo’ pinbienji ’am ’anoka ’inSo’a nom matawaw raro:o’ kaSakira:a’an, hayza ka ’aroma’ ’ima kayzaeh.",
+       "blockedtext": "<strong> niSo’ kapatawaw raro:o’ a IP Sina:ang soksoken ila.<strong>So’o soksoken noka $1,\nkomSa noka <em>$2</em>.* kasoksokan ’in’alay ray:$8 * sizaeh ka sinoksok ’in’alay ray :$6 * ’ima hingha’ kasoksoken :$7 So’o kayzaeh pakra:am ka $1 a ka ’aroma’ [[{{MediaWiki:Grouppage-sysop}}| kama malahang ]] paehrahrang noka kasoksokan howaw. So: So’o ray [[Special:Preferences| kin hinowa’an ]] ’izo’ hayza’ ila ka ’ima kayzaeh ka Sina:ang nom maraytyennaw kina:at ,\no ’i’ini’i: hayza’ ka nom soksok, ’isa: So’o kayzaeh maray \"Email pakra:am ka hini kamamatawaw \" ka nom pinakra:am ka ’ima hingha’an kama malahang. niSo’ ’isahini ka\nIP ray $3,hini nom somoksok ka ID ka #$5. So: So’o ray ’am somingozaw ka ka:at ka hani babaw ka pinakSekla’.",
+       "loginreqlink": "kaS’aboe’",
+       "newarticletext": "So’o mam lomotor ray ’aehae’ ’inoka’ ka yemien.\n’am paskayzaeh hiza yemien, paray hini waehoer ka pienji: fangkoway ’izo’ ka:at kapapnabih (’am Sekla’ kita’ [$1 kapatawawan kapakSekla’an yemien ]).\nSo: So’o ’okik ’iya’azem mowa:i’ ray hini yemien, ’isa: pawhi:il kakita’an ka<strong> nom lobih </strong> kakonhootan.",
+       "anontalkpagetext": "<em>hini yemien kapaehraerang nom pakita’ ka ’ima ’i’ini’ paSkira:a’ ka raro:o’ ma’iyaeh kapatwaw.\n</em> ’isa: yami ’am ’anoka IP Sina:ang ma Swkla’ ka raro:o’, ’oka’ ila ’ima hingha’ ka IP Sina:eng ra:amen haeba:an ka ’ima ma’onhael mata:waw rini. So: So’o ’inoka’ ka raro:o’ o So: komSa’ hini pinaehraehrang ’oka’ howaw ki So’on, ’isa: [[Special:CreateAccount|\npakhayza’ ka ’ima SaSo’ zhanghaw ]] a [[Special:UserLogin| kaS’abo’ ]]\n ’aewhay hahamez kil ’aroma’ ka ’ima ’oka’ ka raro:o’.",
+       "noarticletext": "hini ye:myen ’isahini ’ oka’ kapinanabih, So’okayzaeh ray ’aroma’ ye:myen ’izo’[[Special:Search/{{PAGENAME}}| komi:im hini ye:myen ka raro:o’ ]]、<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} komi:im ka ’ima hingha’an pinatawawan] a [{{fullurl:{{FULLPAGENAME}}|action=edit}} paskayzaeh ka hini ye:myen]</span>",
+       "userpage-userdoesnotexist-view": "kamamatawaw zhanghaw \"$1\" ’i’ini’ ka:at ka raro:o’",
+       "clearyourcache": "<strong>bazae’:</strong>kanSo’ ’inaSkan sizaeh So’o boloe’ani ray kakita’an ray katal’amoeh ’isa: Sahoero: ila ka ’ima SaSo’ pyenti: . * <strong>Firefox / Safari:</strong> konhoeoet <em>Shift</em> ’isa: pawhi:il <em> ka tal’izaehan </em>,a konhoeoet <em>Ctrl-F5</em> a <em>Ctrl-R</em> (Mac ’isa: ka <em>⌘-R</em>) * <strong>Google Chrome:</strong>konhoeoet ka<em>Ctrl-Shift-R</em> (Mac ’isa: ka <em>⌘-Shift-R</em>) * <strong>Internet Explorer:</strong> konhoeoet <em>Ctrl</em> ’isa: pawhi:il ka <em> tinal’izaehan </em>,a konhoeoet ka <em>Ctrl-F5</em> * <strong>Opera:</strong> Sa’ila ray <em> kapawhi:ilan → paskayzaeh </em> (ray Mac ’isa: ka <em>Opera → kin hinowa’an </em>) ’isa: Sa’ila nahan ray <em> Sina:il & kakkayzaehan → boloe’ ka kinita’ kina:at → tinal’amoehan ka hinoba:ang ki tang’an </em>.",
+       "previewnote": "</strong>So’o ’isahini ray kaSawaSwaSakan, niSo’ sinapih ’i’ini’i: Sili’i:! </strong>",
+       "editing": "mam bienji $1",
+       "creating": "mam paskayzaeh $1",
+       "editingsection": "mam pienji: $1 ( zhang jie: )",
+       "templatesused": "hini ye:myen matawaw ila hini wahoer ka {{PLURAL:$1| kakSaro:olan }}:",
+       "templatesusedpreview": "hini kaSawaSakan ’anoka hani wahoer ka {{PLURAL:$1| kakSaro:olan }}:",
+       "template-protected": "(kinalahaeng)",
+       "template-semiprotected": "(’inokay kalahaengi saeboeh)",
+       "hiddencategories": "hini ye:myen ’anoka {{PLURAL:$1|1 Sina:il ka’a’apolen |$1 Sina:il ka’a’apolen }}saeboeh ma’iyaeh:",
+       "permissionserrorstext-withaction": "komSa’ hini waehoer {{PLURAL:$1| nak’ino’ ’isa: }}, niSo’ ’oka’ ka qyuenSyen nom ray $2 matawaw :",
+       "recreate-moveddeleted-warn": "<strong> pati’azem :So’o mam boloe’ Sa’la’ pinaskayzaeh ka ymien .</strong> So’o ’az’azem nahan ’am pienji: ay ka hini ’aehae’ biyae’. rini hayza’ kaboloe’an ki kapa’inkoraehan ka kina:at kakita’an:",
+       "moveddeleted-notice": "hini ye:myen boloe’en ila.\nray waehoer binoway ray hini ye:myen ka binoloe’ ki tinilkoraeh ka pinatawaw kayzaeh nom Saro:ol.",
+       "undo-failure": "hini ray pienji: ka pinonrowa’ ’izo’ hayza’ \n’inokik paylal’oz, ’isa: hini pinpienji: ’aewhay ka paklobihin.",
+       "viewpagelogs": " kita’ hini ray ye:myen ka pinatawaw",
+       "currentrev": " ’ima SaSo’ pinonrowa’",
+       "currentrev-asof": "ray $1 ka ’ima SaSo’ pinonrowa’",
+       "revisionasof": "ray $1 ka pinonrowa’",
+       "revision-info": "ray $1 maray {{GENDER:$6|$2}} pinatawaw ka pinonrowa’ $7",
+       "previousrevision": "←Sa’la’ pinonrowa’",
+       "nextrevision": "wahoer ila pinonrowa’ →",
+       "currentrevisionlink": " ’ima SaSo’ pinonrowa’",
+       "cur": " ’isahini",
+       "last": "cyenpi:",
+       "histlegend": "tatihola’ pawhi:il ka kin nonak banben: pawhi:il ka pintatihola’ o pinonrowa’ banben kapawhi:ilan fangkoway o pawhi:il kamaSal k kakonhootan rima’ tatihola’ .<br /> kaka:at kapakSekla’an:<strong>({{int:cur}})</strong> = ki ’ima SaSo’ ka pinonrowa’ banben tatihola’ ,<strong>({{int:last}})</strong> = ki mininSa’la’ ka pinonrowa’ banben tatihola’ ,<strong>{{int:minoreditletter}}</strong> = pinapaybi:il ka pinonrowa’.",
+       "history-feed-description": "hini ray Wiki babaw ’isahini ka yemien pinonrowa’ ka kintatini’an",
+       "history-feed-item-nocomment": "ray $1 o $2 pinawhi:il",
+       "rev-delundel": " somapih kakita’an",
+       "rev-showdeleted": "pinakita’",
+       "revdel-restore": " somapih kakita’an",
+       "pagehist": "ray yemyen kin’i’iyaehan",
+       "history-title": "\"$1\" ’inkakhayza’an ka pinonrowa’",
+       "difference-title": "\"$1\" ponrowa’ ray ’izo’ ka kin nonakan",
+       "lineno": "ra:an $1:",
+       "compareselectedversions": "tatihola’ pawhi:il ka pinonrowa’",
+       "editundo": " paklobih",
+       "diff-multi-sameuser": "(’i’ini’ pinakita’ ’ima hingha’ ka kamamatawaw ray wazwaz pinatawaw $1 ka pinonrowa’ )",
+       "diff-multi-otherusers": "(’i’ini’ ka pinakita’ pak $2 位 kamamatawaw ray wazwaz pinatawaw $1’onhael ponrowa’)",
+       "searchresults": " komi:im ka pinatawawan",
+       "searchresults-title": "ray $1 kini:im ka pinatawawan",
+       "prevn": "ray kati’ae’la’an $1",
+       "nextn": "ray hikor {{PLURAL:$1|$1}}",
+       "prevn-title": "ray mininSa’la’ $1 ka pinatawawan",
+       "nextn-title": "ray hikor $1 ka pinatawawan",
+       "shown-title": "ray sa’sa’ih ye:myen pinakita’ $1 pinatawawan",
+       "viewprevnext": " komita’ ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchmenu-exists": "<strong>hini ka Wiki hayza’ ila ka raro:o’ ray \"[[:$1]]\" ka yemien .</strong> {{PLURAL:$2|0=| o kita’ ’oyeh ka ’aroma’ kini:im ka pinatawawan .}}",
+       "searchmenu-new": "<strong> ray hini Wiki paskayzaeh ka ye:myen \"[[:$1]]\"!</strong>{{PLURAL:$2|0=|a pakita’ ka ’inSo’a kina:at kapaehrahrang tomihoero: ka kini:im, | a pakita’ ka ’aroma’ kini:im pinatawawan.}}",
+       "searchprofile-articles": " kapapnabih ye:myen",
+       "searchprofile-images": "tome:thi:",
+       "searchprofile-everything": "saeboeh",
+       "searchprofile-advanced": "kaS’izo’ nahan",
+       "searchprofile-articles-tooltip": "ray $1 ’ izo’ komi:im",
+       "searchprofile-everything-tooltip": " komi:im saeboeh kapapnabih ( hani saeboeh kapaehrahrangan ye:myen)",
+       "searchprofile-advanced-tooltip": " komi:im nonak karo:o’an",
+       "search-result-size": "$1 ({{PLURAL:$2|1 ka kina:at |$2 ka kina:at}})",
+       "search-result-category-size": ",",
+       "search-redirect": "( papanra:an nahan ray $1)",
+       "search-section": "( zhang jie $1)",
+       "search-category": "( ’a’apolen $1)",
+       "search-file-match": "( maylal’oz ray tang’an kapapnabih )",
+       "search-suggest": "niSo’ SikoSa’ hini ay:$1",
+       "search-interwiki-more": "(akoy)",
+       "searchall": "saeboeh",
+       "search-showingresults": "{{PLURAL:$4| ray <strong>$1</strong> pinatawawan, saeboeh <strong>$3</strong> |ray <strong>$1 - $2</strong> pinatawawan, saeboeh <strong>$3</strong> }}",
+       "search-nonefound": " ’ okay paylal’oz kini:im kapaehrahrang ka pinatawawan.",
+       "powersearch-toggleall": "saeboeh",
+       "preferences": "kin hinowa’an",
+       "mypreferences": "kin hinowa’an",
+       "prefs-user-pages": " nom matawaw ye:myen",
+       "prefs-rc": "haysani’ sinapih",
+       "prefs-watchlist": " jyenSe’ qintan",
+       "prefs-editwatchlist-raw": "pienji: ’inin’alayan kakita’an qintan",
+       "searchresultshead": "komi:im",
+       "prefs-searchoptions": "komi:im",
+       "prefs-namespaces": " karo:o’an",
+       "prefs-files": " tang’an",
+       "prefs-diffs": " kin nonak",
+       "group-user": " kamamatawaw",
+       "group-all": "(saeboeh)",
+       "right-upload": " maray tiyanaw mobay ka kina:at tang’an",
+       "right-writeapi": "ka:at ka API",
+       "grant-createaccount": " paskayzaeh zhanghaw",
+       "newuserlogpage": " paskayzaeh noka kamamatawaw ka pinatawawan",
+       "rightslog": "noka kamamatawaw ka’letan kina:at",
+       "action-edit": " bienji ka hini ye:myen",
+       "action-createaccount": "paskayzaeh ka hini kamamatawaw zhanghaw",
+       "action-move": " tilkoraeh ka hini kina:at",
+       "enhancedrc-history": "kakhayza’an kin’i’iyaeh",
+       "recentchanges": "haysani’ sinapih",
+       "recentchanges-legend": " haysani’ somapih kapawhi:ilan",
+       "recentchanges-summary": "taniSowaw ray Wiki ’izo’ hini ye:myen haysani’ ka sinapih .",
+       "recentchanges-noresult": "tani tinoroe’ hahila: ’izo’ ’inoka’ ka minaylal’oz pinaehrahrang ka pyenti.",
+       "recentchanges-feed-description": "taniSowaw ray Wiki ’izo’ hini zhayaw ray haysani ka pinaSohowih.",
+       "recentchanges-label-newpage": "hiza bienji paskayzaeh ila ka ’ima SaSo’ ye:myen",
+       "recentchanges-label-minor": "hini ’aehae’ ka pinaybiil kaponrowa’en",
+       "recentchanges-label-bot": "hiza bienji ’anoka kikay ma’iyaeh matawaw",
+       "recentchanges-label-unpatrolled": "hiza pinbienji ’i’ini’ ki:imi",
+       "recentchanges-label-plusminus": "hiza ye:myen sinapih ka kinsopaloy ( Sinepe: kaSili’an ka kina:at )",
+       "recentchanges-legend-heading": "<strong>pinakita’ ka hinoba:ang:</strong>",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (pakita’ [[Special:NewPages| ’ima SaSo’ ye:myen]])",
+       "recentchanges-submit": "pinakita’",
+       "rcfilters-tag-remove": "tilkoraeh '$1'",
+       "rcfilters-activefilters-hide": " Sa:il",
+       "rcfilters-activefilters-show": "pinakita’",
+       "rcfilters-days-show-days": "$1 hahila:",
+       "rcfilters-savedqueries-cancel-label": "kayni’",
+       "rcfilters-filtergroup-lastRevision": " ’ima SaSo’ pinonrowa’",
+       "rcnotefrom": "hani wahoer{{PLURAL:$5| ’ima}} ’aring <strong>$3 $4</strong> pinara:an ka pyenti: (kapakita’ <strong>$1</strong> ).",
+       "rclistfrom": "pinakita’ ray $3 $2 ka ’ima SaSo’ sinapih",
+       "rcshowhideminor": "$1 pinaybiil bienji",
+       "rcshowhideminor-show": " pinakita’",
+       "rcshowhideminor-hide": " Sa:il",
+       "rcshowhidebots": "$1 kikay ma’iyaeh",
+       "rcshowhidebots-show": " pinakita’",
+       "rcshowhidebots-hide": " Sa:il",
+       "rcshowhideliu": "$1 pinaSkira:a’ kamamatawaw",
+       "rcshowhideliu-show": " pinakita’",
+       "rcshowhideliu-hide": " Sa:il",
+       "rcshowhideanons": "$1 Sina:il ka raro:o’ kamamatawaw",
+       "rcshowhideanons-show": " pinakita’",
+       "rcshowhideanons-hide": " Sa:il",
+       "rcshowhidepatr": "komi:im ka pinpiyenji:",
+       "rcshowhidepatr-show": " pinakita’",
+       "rcshowhidepatr-hide": " Sa:il",
+       "rcshowhidemine": "$1 ’inma’ana bienji",
+       "rcshowhidemine-show": " pinakita’",
+       "rcshowhidemine-hide": " Sa:il",
+       "rcshowhidecategorization-show": " pinakita’",
+       "rcshowhidecategorization-hide": " Sa:il",
+       "rclinks": "pinakita’ haysani’ ray $2 hahila: ’izo’ $1 monhael somapih",
+       "diff": " kin nonak",
+       "hist": "kakhayza’an kin’i’iyaehan",
+       "hide": " Sa:il",
+       "show": " pinakita’",
+       "rc-change-size-new": "sinapih ila ka $1 Sinepe: kaSili’an ka kina:at",
+       "rc-old-title": " ray ’inin’alay pinaskayzaeh ka raro:o’ {{PLURAL:$1| sinapih }}",
+       "recentchangeslinked": " ’ima hingha’an sinapih",
+       "recentchangeslinked-feed": " ’ima hingha’an sinapih",
+       "recentchangeslinked-toolbox": " ’ima hingha’an sinapih",
+       "recentchangeslinked-title": "ki \"$1\" ’ima hingha’an somapih",
+       "recentchangeslinked-page": "noka ye:myen ka raro:o’ :",
+       "recentchangeslinked-to": "sapih ila ka pinakita’ kalotoran ray tinoroe’ ka ye:myen sinapih",
+       "upload": " maray tiyanaw mobay ka kina:at tang’an",
+       "filedesc": "zhayaw",
+       "fileuploadsummary": "zhayaw:",
+       "filesource": " kawa:i’an:",
+       "upload-dialog-title": " maray tiyanaw mobay ka kina:at tang’an",
+       "upload-dialog-button-cancel": "kayni’",
+       "upload-form-label-infoform-description": " papapnabih",
+       "upload-form-label-infoform-categories": " ’a’apolen",
+       "upload-form-label-infoform-date": " hahila",
+       "license": " kinSiwa’ kina:at:",
+       "license-header": " kinSiwa’ kina:at",
+       "listfiles-userdoesnotexist": "kamamatawaw zhanghaw \"$1\" ’i’ini’ ka:at ka raro:o’",
+       "imgfile": " tang’an",
+       "listfiles_date": " hahila",
+       "listfiles_user": " kamamatawaw",
+       "listfiles_description": " papapnabih",
+       "file-anchor-link": " tang’an",
+       "filehist": " tang’an ’inkakhayza’an",
+       "filehist-help": " pawhi:il ka hahila: / jikang kayzaeh komita’ hiza jikang ka tang’an banben .",
+       "filehist-current": " ’isahini",
+       "filehist-datetime": " hahila: / jikang",
+       "filehist-thumb": " pinak’ol’olae’an",
+       "filehist-thumbtext": "ray $1 banben ka hinoba:ang pinak’ol’olae’an",
+       "filehist-user": " kamamatawaw",
+       "filehist-dimensions": "ce:cun",
+       "filehist-comment": "kina:at ka kakSekla’an",
+       "imagelinks": "nom ray tang’an",
+       "linkstoimage-redirect": "$1 ( tang’an papanra:an nahan ) $2",
+       "sharedupload-desc-here": "hin tang’an minay $1 o kayzaeh noka ’aroma’ zhwan’an patawawen .\nray wahoer pinakita’ ka hini tang’an ray [$2 tang’an pinapanabih ye:myen] ray ’izo’ ka papapnabih",
+       "filepage-nofile": "’inokik rini raro:o’ ka tang’an.",
+       "upload-disallowed-here": "So’o ’am ’oka’ nanaw manehmek ka hini tang’an .",
+       "randompage": " tanikikay ka ye:myen",
+       "randomincategory-submit": " patawaw",
+       "statistics-articles": " kapapnabih ye:myen",
+       "statistics-pages": "ye:myen",
+       "pageswithprop-submit": " patawaw",
+       "double-redirect-fixer": " papanra:an nahan ka kama painrowa’",
+       "brokenredirects-edit": " bienji",
+       "withoutinterwiki-submit": "pinakita’",
+       "nbytes": "$1 ka weyyuenzu:",
+       "ncategories": "$1 {{PLURAL:$1| ’a’apolen |$1 ka ’a’apolen }}",
+       "nmembers": "$1 ka kamamatawaw",
+       "prefixindex": "taniche:to: ki:im ka yemien",
+       "prefixindex-submit": "pinakita’",
+       "protectedpages-filters": " komi:im:",
+       "protectedpages-page": "ye:myen",
+       "usereditcount": "$1 {{PLURAL:$1| ’okik miniSa’la’ pinbienji }}",
+       "newpages": "’ima SaSo’ ye:myen",
+       "newpages-submit": "pinakita’",
+       "newpages-username": " kamamatawaw raro:o’:",
+       "move": " tilkoraeh",
+       "movethispage": " tilkoraeh ka hini kina:at",
+       "pager-newer-n": "{{PLURAL:$1| ’ima SaSo’ ora $1 }}",
+       "pager-older-n": " ’ima tatini’ $1",
+       "apisandbox-add-multi": "baba:aw rinpa:",
+       "booksources": " kina:at kawa:i’an ka kin Sekla’an",
+       "booksources-search-legend": "komi:im ka kina:at kawa:i’an ka kin Sekla’an",
+       "booksources-search": "komi:im",
+       "speciallogtitlelabel": "kalokngoran ( raro:o’ a ’inoka {{ns:user}}: kamamatawaw a koSa’en kamamatawaw ):",
+       "log": "pinatawaw",
+       "logeventslist-submit": "pinakita’",
+       "alllogstext": "patsaeboeh pakita’ saeboeh {{SITENAME}} ’izo’ saeboeh Sinraehoe’ ka kina:at . So’o kayzaeh pawhi:il ray ka’aSo:olan ka kina:at ka Sinraehoe’, Sowatoroe’ ka kamamatawaw raro:o’ (’ae’aeppol ’ima sopaloy ’ima ’ol’olae’an ka kina:at) ki kamapapatalay ka yemien (’ae’aeppol ’ima sopaloy ’ima ’ol’olae’an ka kina:at).",
+       "logempty": "’oka’ ka pinaylal’oz kapaehrahrang kina:at.",
+       "checkbox-all": "saeboeh",
+       "allpages": " saeboeh ye:myen",
+       "allarticles": " saeboeh ye:myen",
+       "allpagessubmit": " patawaw",
+       "categories": " ’a’apolen",
+       "categories-submit": "pinakita’",
+       "sp-deletedcontributions-contribs": " mobay ka pinatawaw",
+       "linksearch-ns": " karo:o’an :",
+       "linksearch-ok": "komi:im",
+       "listusers-submit": "pinakita’",
+       "emailuser": "Email kapakra:am ka hini kamamatawaw",
+       "emailusername": " kamamatawaw raro:o’:",
+       "watchlist": " jyenSe’ qintan",
+       "mywatchlist": " jyenSe’ qintan",
+       "watchlistfor2": "noka $1 ka jienshi qintan $2",
+       "watch": "komitkita’",
+       "watchthispage": "kitkita’ ka hini ye:myen",
+       "watchlist-details": "niSo’ kakita’an ray qintan babaw saeboeh hayza’ $1 yemien ( nom maehraehrang yemien saeboeh).",
+       "wlheader-showupdated": "niSo’ ray ’ima maybi:il monhael komita sizaeh ka pinonrowa’ yemian ’am ’anoka <strong>\npinakrarahoe’ kina:at </strong> Sipinakita’.",
+       "wlnote": "hani wahoer ’ima ’aring $3 $4 kaysa’an <strong>$2</strong> kakita’an hahila: pinaskayzayzaeh <strong>$1</strong> pinapaybi:il ka pyenti:",
+       "wlshowlast": "pinakita’  haysani’  $1 kakita’an ka hahila: $2 hahila:",
+       "watchlist-hide": " Sa:il",
+       "watchlist-submit": "pinakita’",
+       "enotif_reset": "pinSakira:a’ ray yemien kinita’ ila saeboeh",
+       "enotif_minoredit": "hini ’aehae’ ka pinaybiil kaponrowa’en",
+       "historyaction-submit": " pinakita’",
+       "dellogpage": " boloe’ ka pinatawaw",
+       "deletionlog": " boloe’ ka pinatawaw",
+       "rollbacklink": "paklobih",
+       "rollbacklinkcount": " paklobih $1 ka pinbienji",
+       "protectlogpage": "kinalahaeng ka pinatawaw",
+       "protectedarticle": "kinalahaeng ila \"[[$1]]\"",
+       "modifiedarticleprotection": "sinapih ila \"[[$1]]\" nom malahaeng ka kin’ibabaw.",
+       "protect-default": " somiwa’ saeboeh kamamatawaw",
+       "restriction-type": "Somiwa’ ka Siniwa’:",
+       "restriction-edit": " bienji",
+       "restriction-move": " tilkoraeh",
+       "restriction-create": "paskayzaeh",
+       "undeleteinvert": "hin’ohay pawhi:il",
+       "undelete-search-submit": "komi:im",
+       "namespace": " karo:o’an :",
+       "invert": "hin’ohay pawhi:il",
+       "tooltip-invert": "pawhi:il ka hini he:Syuen fangkway ’ano Sina:il pawhi:il ray karo:o’an ’izo’ ka ye:myen sapih (So: pawhi:il ka ’ima hingha’an karo:o’an, ’isa: ’am hoSa:il ka ’ima hingha’an karo:o’an )",
+       "namespace_association": "’ima hingha’an karo:o’an",
+       "tooltip-namespace_association": "pawhi:il ka hini he:Syuen fangkway ’anoka hani saeboeh ki pinawhi:il karo:o’an ka ’ima hinfha’ kapaehrahrang a ka Sapang karo:o’an",
+       "blanknamespace": "(’ima Sapang)",
+       "contributions": "{{GENDER:$1| kamamatawaw }} mobay ka pinatawaw",
+       "contributions-title": "noka $1 ka kamamatawaw binoway ka pinatawaw",
+       "mycontris": " mobay ka pinatawaw",
+       "anoncontribs": " mobay ka pinatawaw",
+       "contribsub2": "{{GENDER:$3|$1}} binoway ka pinatawaw ($2)",
+       "contributions-userdoesnotexist": "kamamatawaw zhanghaw \"$1\" ’i’ini’ ka:at ka raro:o’",
+       "nocontribs": "’okay tihoero: ka pinaylal’oz pinaehrahrang ka pyenti:.",
+       "uctop": " ’isahini",
+       "month": "kalokngoran ka ’ilaS:",
+       "year": "kalokngoran ka tinal’oemaeh:",
+       "sp-contributions-newbies": "pinakita’ nanaw ka ’ima SaSo’ zhanghaw ka pinatawaw",
+       "sp-contributions-blocklog": " soksok ka pinatawaw",
+       "sp-contributions-logs": "pinatawaw",
+       "sp-contributions-talk": " kapaehrahrangan",
+       "sp-contributions-username": "noka IP Sina:engan o noka kamamatawaw raro:o’:",
+       "sp-contributions-toponly": "pinakita’ nanaw ’ima SaSo’ pinonrowa’ ka pinpienji:",
+       "sp-contributions-newonly": "pinakita’ nanaw ka paskayzaeh ray yemien ka pinpienji.",
+       "sp-contributions-submit": "komi:im",
+       "whatlinkshere": " lotor ray hini ye:myen",
+       "whatlinkshere-title": " lomotor ray \"$1\" ka ye:myen",
+       "whatlinkshere-page": "ye:myen:",
+       "linkshere": "’anoka hini wahoer lomotor ray <strong>[[:$2]]</strong>:",
+       "isredirect": " papanra:an nahan ka ye:myen",
+       "istemplate": " Somibae:aeh ka pinayaka:i’  Somibae:aeh ka pinayaka:i’",
+       "isimage": " tang’an kalotoran",
+       "whatlinkshere-prev": "ray kati’aela’an $1",
+       "whatlinkshere-next": "{{PLURAL:$1|| ’aehae’ naehan ray hikor $1 }}",
+       "whatlinkshere-links": "← kalotoran",
+       "whatlinkshere-hideredirs": "$1 papanra:an nahan",
+       "whatlinkshere-hidetrans": "$1  Somibae:aeh ka pinayaka:i’",
+       "whatlinkshere-hidelinks": "$1 kalotoran",
+       "whatlinkshere-hideimages": "$1 tang’an lomotor",
+       "whatlinkshere-filters": " komi:im",
+       "whatlinkshere-submit": " patawaw",
+       "ipaddressorusername": "noka IP Sina:engan o noka kamamatawaw raro:o’:",
+       "ipboptions": "hinroSa’, ’aehae’ hahila:, to:o’ hahila:,’aehae’ Sinangayan, roSa’ Sinangayan, ’aehae’ ’ilaS, to:o’ ’ilsaS, SayboSi: ’ilaS, ‘aehae’ tinal’oemaeh, tabin’inowan",
+       "ipb-pages-label": "ye:myen",
+       "ipb-namespaces-label": " karo:o’an",
+       "autoblocklist-submit": "komi:im",
+       "ipblocklist-submit": "komi:im",
+       "createaccountblock": "paskayzaeh ka ’inlet zhanghaw",
+       "blocklist-editing-page": "ye:myen",
+       "blocklist-editing-ns": " karo:o’an",
+       "blocklink": "soksok",
+       "blocklogpage": " soksok ka pinatawaw",
+       "blocklogentry": " sinoksok ila ka pinahrahrangan hahila: tabin $2 $3",
+       "reblock-logentry": "somapih [[$1]] ka sinoksok pinahrahrangan hahila: tabin $2 $3",
+       "block-log-flags-nocreate": "paskayzaeh ka ’inlet zhanghaw",
+       "proxyblocker": " somapih ka’oSa’an Sefuchi’ kasoksokan",
+       "move-page": " tilkoraeh $1",
+       "movelogpage": " tilkoraeh ka pinatawaw",
+       "export": " pa’al’oehaez ray ye:myen",
+       "allmessages-filter-all": "saeboeh",
+       "thumbnail-more": "paksopaloy",
+       "import-comment": "kina:at ka kakSekla’an",
+       "tooltip-pt-userpage": "{{GENDER:| niSo’ nom matawaw }}ye:myen",
+       "tooltip-pt-mytalk": "{{GENDER:| niSo’}} kapaehrahrangan ye:myen",
+       "tooltip-pt-preferences": "{{GENDER:| niSo’}}kin hinowa’an",
+       "tooltip-pt-watchlist": "So’o mam komitkita’ sinapih ka ye:myen kina:at kapakSekla’",
+       "tooltip-pt-mycontris": "{{GENDER:| niSo’}} bino:ay ka pinatawaw kina:at kapakSekla’",
+       "tooltip-pt-login": "So’o ’inSa’la’ kaS’abo’ ,o So: kayni’ kaS’abo’ ma’ kayzaeh.",
+       "tooltip-pt-logout": "kas’oehaez",
+       "tooltip-pt-createaccount": "yami ’am romokol ’iSo’on pakayzaeh ’aehae’ ka zhanghaw o kaS’aboe’, ’ana komSa’ kayni’ kaS’aboe’ ma’ kayzaeh.",
+       "tooltip-ca-talk": "inakhini’an ye:myen ’izo’ kapaehraehrang",
+       "tooltip-ca-edit": " bienji ka hini ye:myen",
+       "tooltip-ca-addsection": "ka’on’alayan ’ima SaSo’ zhang jie",
+       "tooltip-ca-viewsource": "hini ye:myen kinalahaeng ila. So’o kayzaeh komita’ ka hini yuensema:",
+       "tooltip-ca-history": "hini ye:myen Sa’la’ pinonrowa’an",
+       "tooltip-ca-move": " tilkoraeh ka hini kina:at",
+       "tooltip-ca-watch": "hini ka ye:myen rompa: kanSo’ ray jyenSe’ qintan",
+       "tooltip-ca-unwatch": "hini ray yemien ’in’alay kakita’an qintan ’izo’ tilkoraeh.",
+       "tooltip-search": " komi:im {{SITENAME}}",
+       "tooltip-search-go": "So: ki hini raro:o’ ’ima hingha’ ka yemyen haysaza, ’oSa’ ziza ray yemyen",
+       "tooltip-search-fulltext": "komi:im ’ima matawaw ka hini kina:at ka yemyen",
+       "tooltip-p-logo": " rima’ ray So:ye:",
+       "tooltip-n-mainpage": " rima’ ray So:ye:",
+       "tooltip-n-mainpage-description": " rima’ ray So:ye:",
+       "tooltip-n-portal": "’inkhini’an ka zhwan’an, So’o kayzaeh powa’ ka kano’, hayno’ kayzaeh tomihoero: niSo’ ka kinSarara’ howaw",
+       "tooltip-n-currentevents": "ray Sinbon ’izo’ tomihoero: ’ima hingha’an ka kina:at",
+       "tooltip-n-recentchanges": "lyecu ray Wiki ’izo’ haysani’ sinapih kina:at kapakSekla’",
+       "tooltip-n-randompage": "tanikikay kaS’aboe’ ray ’aehae’ ye:myen",
+       "tooltip-n-help": "komi:im katilhaehaelan",
+       "tooltip-t-whatlinkshere": "lye’in saeboeh ka linotor rayhiniye:myen ka ye:myen",
+       "tooltip-t-recentchangeslinked": "hini ye:myen lotoren ray ’aroma’ ye:myen haysani sinapih",
+       "tooltip-feed-atom": "hini ye:myen ray Atom kawa:i’an",
+       "tooltip-t-contributions": "{{GENDER:$1|hini kamamatawaw }} mobay ka pinatawaw kapakSekla’ kina:at",
+       "tooltip-t-emailuser": "maraytyennaw Somater ka kina:at kaklienlo:an {{GENDER:$1|hini ’aehae’ kamamatawaw }}",
+       "tooltip-t-upload": " maray tiyanaw mobay ka kina:at tang’an",
+       "tooltip-t-specialpages": "saeboeh ’ima nonak yemyen ka kina:at kapakSekla’",
+       "tooltip-t-print": "hini ye:myen hayza’ kaklye’in ka kina:at banben",
+       "tooltip-t-permalink": "hini ye:myen pinonrowa’ ka pinakrengreng kalotoran",
+       "tooltip-ca-nstab-main": " komita ray ye:myen ka kina:at",
+       "tooltip-ca-nstab-user": " komita nom matawaw ka ye:myen",
+       "tooltip-ca-nstab-special": "hini ye:myen ka ’ima nonak yemyen , ’oka’ nanaw bienji",
+       "tooltip-ca-nstab-project": " komita ray zhwan’an ka ye:myen",
+       "tooltip-ca-nstab-image": "komita ray tang’an ka ye:myen",
+       "tooltip-ca-nstab-mediawiki": "komita ray Sitong  pinakSekla’ ka:i’",
+       "tooltip-ca-nstab-template": " komita kakSaro:olan",
+       "tooltip-ca-nstab-category": " komita ’a’apol ka ye:myen",
+       "tooltip-minoredit": "paSkira: ka hini komSa’ pinapaybi:il ka pinpienji:",
+       "tooltip-save": " Somili’ ka ’inSo’a sinapih",
+       "tooltip-preview": "pakray ’i’ini’ Somili’ SawaSak ka ’inSo’a sinapih !",
+       "tooltip-diff": " pinakita’ niSo’ ka kapapnabih sinapih ka pinatawaw",
+       "tooltip-compareselectedversions": "kita’ ka hini yemien roSa’ pinawhi:il ila pinonrowa’ ’izo’ ka kin nonakan.",
+       "tooltip-watch": "hini ka ye:myen rompa: kanSo’ ray jyenSe’ qintan",
+       "tooltip-rollback": "konhoe:oet \" paklobih \" lotor ’isa: kayzaeh paklobih ray kaysa’an ’aehae’ ’ima mobay ray hini ye:myen pinbienji",
+       "tooltip-undo": "\" paklobih \" kayzaeh paklobih ka hini bienji o ’anoka pinaSawaSak mo:Se’ haewaeh bienji pyawtan,So’o kayzaeh ray zhayaw ’izo’ rompa: ka tinak’ino’an.",
+       "tooltip-summary": "ka:at ka ’ima ’itaSan zhayaw",
+       "simpleantispam-label": "nom ’emlet ka saepae’. pak <strong>’izi’</strong> ka:at ka hini lanwey!",
+       "pageinfo-title": "noka \"$1\" ka kakra:aman",
+       "pageinfo-default-sort": "pinyunbi’ ka pinpaySi’ nom.... :",
+       "pageinfo-length": "noka yemien kin’inaro’( weiyenzu)",
+       "pageinfo-robot-policy": "’ anoka kikay ma’iyaeh paskayzaeh kaSa’amoehan kina:at",
+       "pageinfo-few-watchers": "wawalae’ ’aehae’ ka kamamiyalawa’",
+       "pageinfo-redirects-name": "tinoroe’ka hini yemien nom papanra:an ka yemien Sinepe:",
+       "pageinfo-subpages-name": "hini ka yemien ray wahoer yemien Sinepe:",
+       "pageinfo-subpages-value": "$1 ($2 個{{PLURAL:$2| papanra:an nahan }}; $3 個{{PLURAL:$3| ’okik ka papanra:anen nahan }})",
+       "pageinfo-recent-edits": " haysani’ monpilaz pienji: (Saehpi:ih $1 ’izo’)",
+       "pageinfo-magic-words": "pa:se: {{PLURAL:$1|  kina:at }} ($1)",
+       "pageinfo-hidden-categories": "Sa:il  ’a’apolen Sinraehoe’ ($1)",
+       "pageinfo-templates": "Somibae:aeh ka pinayaka:i’ kakSaro:olan ($1)",
+       "pageinfo-toolboxlink": "ray ye:myen kakra:aman",
+       "pageinfo-contentpage": "nom Somepe: ka pinanabih ray yemien",
+       "previousdiff": "’ima tatini’ sowiti’ pinpienji",
+       "nextdiff": "’ima SaSo’ bienji →",
+       "widthheightpage": "$1 × $2,$3 biyae’",
+       "file-info-size": "$1 × $2 kakita’an ka hinoba:ang , tang’an kinsopaloy:$3,MIME Sinrahoe’:$4",
+       "file-info-size-pages": "$1 × $2 kakita’an ka hinoba:ang ,noka tang’an kin sopaloy :$3,MIME Sinraehoe’ :$4,$5 {{PLURAL:$5| biyae’ }}",
+       "file-nohires": " ’ oka’ ila ka ’ima ’ibabaw kin tilka:an ka baboway .",
+       "svg-long-desc": "SVG tang’an, ray ’oehaez kinsopaloy:$1 × $2 kakita’an ka hinoba:ang, tang’an kin sopaloy:$3",
+       "show-big-image": "’a’aringan tang’an",
+       "show-big-image-preview": " pinaSawaSak kinSopaloy:$1.",
+       "show-big-image-other": " ’aroma’ {{PLURAL:$2||}} kin tilka:an :$1.$1",
+       "show-big-image-size": "$1 × $2 kakita’an ka hinoba:ang",
+       "newimages-newbies": "pinakita’ nanaw ka ’ima SaSo’ zhanghaw ka pinatawaw",
+       "ilsubmit": " komi:im",
+       "metadata": " pinqyuanSe’ ka kina:at",
+       "metadata-help": "hini tang’an ’izo’ hani saeboeh ka ’aroma’ kakra:aman, hini saeboeh kakra:aman ra:amen ’inaySu’wey kakSaSing a kikay nom Sawmya ray pinaskayzaeh a Su’weyhwa’ ’izo’ baba:aw rinpa:, So: tang’an ’inay’a’aringan pinonrowa’, pinakita’ kina:at ra:amen ’oka’ nanaw pakita’ ka pinonrowa’ tang’an",
+       "metadata-fields": "ray hini pinakSekla’ ka:i’ ’izo’ pinlye’in ka EXIF qyuanSe’ kina:at ’izo’ ’am hani saeboeh ray SaSing pinakita’ ye:myen,So: pinqyuanSe’ ka kina:at ’aewhay ila pinakita’ nanaw hani wahoer pinakSekla’ ka:i’ .\n’aroma’ pinqyuanSe’ ka kina:at ka ’iSe’ ’isa: Sina:il .\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": "saeboeh",
+       "monthsall": "saeboeh",
+       "confirm-watch-top": "hini ka ye:myen rompa: kanSo’ ray jyenSe’ qintan?",
+       "confirm-unwatch-top": "hini ray yemien ’in’alay kakita’an qintan ’izo’ tilkoraeh?",
+       "imgmultigo": " patawaw!",
+       "imgmultigoto": " rima’ ray minay $1 yemien",
+       "img-lang-go": " patawaw",
+       "table_pager_limit_submit": " patawaw",
+       "watchlistedit-raw-title": "pienji: ’inin’alayan kakita’an qintan",
+       "watchlisttools-view": " komita  ’ima hingha’an somapih",
+       "watchlisttools-edit": " komita o pienji: kakita’an qintan",
+       "watchlisttools-raw": "pienji: ’inin’alayan kakita’an qintan",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1| kapaehrahrangan ]])",
+       "version-specialpages": " ’ima nonak yemyen",
+       "version-ext-colheader-description": " papapnabih",
+       "version-ext-colheader-credits": "kamapaskayzaeh",
+       "version-libraries-description": " papapnabih",
+       "version-libraries-authors": "kamapaskayzaeh",
+       "redirect": "tani tang’an, kamamatawaw, yemin, pinonrowa’ o ka kina:at ID mowa:i’ papanra:an nahan",
+       "redirect-summary": "hini ’ima nonak yemien kayzaeh ’anoka pinapanra:an nahan painrowa’en ray tang’an ( tinoroe’ tang’an raro:o’)、 yemien ( tinoroe’ ka pinonrowa’ ID a ka yemien ID)、 kamamatawaw ka yemien ( tinoroe’ kamamatawaw ID)、a kina:at ka Sinrahoe’ ( tinoroe’ ka kina:at ID).’anoka-:[[{{#Special:Redirect}}/file/Example.jpg]]、[[{{#Special:Redirect}}/page/64308]]、[[{{#Special:Redirect}}/revision/328429]]、[[{{#Special:Redirect}}/user/101]] a [[{{#Special:Redirect}}/logid/186]].",
+       "redirect-submit": " patawaw",
+       "redirect-revision": "pinonrpwa’ ka yemin ID",
+       "fileduplicatesearch-submit": " komi:im",
+       "specialpages": " ’ima nonak yemyen",
+       "tag-filter": "[[Special:Tags| kakSekla’an ]] komi:im :",
+       "tag-list-wrapper": "[[Special:Tags|$1 ka kaSakira’an ]]:$2",
+       "tag-mw-rollback": "paklobih",
+       "tag-mw-undo": " paklobih",
+       "tags-source-header": " kawa:i’an",
+       "tags-edit": " bienji",
+       "tags-create-submit": "paskayzaeh",
+       "permanentlink": "pinakrengreng kalotoran",
+       "htmlform-cloner-delete": "tilkoraeh",
+       "logentry-delete-delete": "$1 boloe’ ka ye:myen $3",
+       "logentry-delete-restore": "$1{{GENDER:$2| paklobih }} ray yemien $3($4)",
+       "logentry-delete-revision": "$1 {{GENDER:$2|sinapih ila}} ray yemien ’izo’ $3 中 {{PLURAL:$5|1 筆 pinonrowa’|$5 筆 pinonrowa’}}ka kakita’an :$4",
+       "logentry-move-move": "$1 {{GENDER:$2| tinilkoraeh }} ka ye:myen $3 ray $4",
+       "logentry-move-move-noredirect": "$1 {{GENDER:$2|tinilkoraeh ila}} yemien $3 o $4,’okay ’o:ol papanra:an nahan",
+       "logentry-move-move_redir": "$1 tinilkoraeh ka yemien $3 o $4 ma manehmek ka ’inkahayza’an papanra:an nahan",
+       "logentry-patrol-patrol-auto": "$1 pinkakoway nonak ila{{GENDER:$2| pinaSkira:a’ }}yemien $3 ka pinonrowa’ $4 ’isa: kini:im ila.",
+       "logentry-newusers-newusers": "ray{{GENDER:$2| paskayzaehen ila }} kamamatawaw zhanghaw $1",
+       "logentry-newusers-create": "ray{{GENDER:$2| paskayzaehen ila }} kamamatawaw zhanghaw $1",
+       "logentry-newusers-autocreate": "pinakkakoway ila {{GENDER:$2| paskayzaeh }} kamamatawaw zhanghaw $1",
+       "logentry-upload-upload": "$1 {{GENDER:$2| paraytiyanawen ila mobay ka kina:at }} $3",
+       "logentry-upload-overwrite": "$1 {{GENDER:$2| maray tiyanaw mobay ka kina:at ila}}’ima SaSo’ panpen ka $3",
+       "feedback-cancel": "kayni’",
+       "searchsuggest-search": " komi:im {{SITENAME}}",
+       "duration-days": "$1 hahila:",
+       "log-action-filter-all": "saeboeh",
+       "log-action-filter-block-block": "soksok",
+       "authmanager-userdoesnotexist": "kamamatawaw zhanghaw \"$1\" ’i’ini’ ka:at ka raro:o’"
+}
index d01454b..a7b6cdf 100644 (file)
                        "A Chinese Wikipedian",
                        "Angrydog001",
                        "GoForceX",
-                       "Ff98sha"
+                       "Ff98sha",
+                       "VulpesVulpes825"
                ]
        },
        "tog-underline": "链接下划线:",
        "blockedtext": "<strong>您的用户名或IP地址已被封禁。</strong>\n\n执行封禁的管理员是$1。封禁原因是<em>$2</em>。\n\n* 开始时间:$8\n* 到期时间:$6\n* 目标用户:$7\n\n您可以联络$1或其他[[{{MediaWiki:Grouppage-sysop}}|管理员]]讨论该封禁。只有当您在[[Special:Preferences|系统设置]]确认了电子邮件地址且未被禁止使用“{{int:emailuser}}”功能时,才可以使用它。您当前的IP地址是$3,该封禁ID是#$5。请在您做出的任何查询中包含所有上述详情。",
        "autoblockedtext": "您的IP地址因曾被一位被$1封禁的用户使用而被自动封禁。封禁原因:\n\n:<em>$2</em>\n\n* 开始时间:$8\n* 到期时间:$6\n* 目标用户:$7\n\n您可以联系$1或其他[[{{MediaWiki:Grouppage-sysop}}|管理员]]申诉该封禁。\n\n请注意,只有当您已在[[Special:Preferences|系统设置]]确认了电子邮件地址且未被禁止使用“{{int:emailuser}}”功能时,才能发送电子邮件联系管理员。\n\n您当前的IP地址为$3,该封禁ID为#$5。请在您做出的任何查询中包含所有上述详情。",
        "systemblockedtext": "您的用户名或IP地址已被MediaWiki自动封禁。封禁原因:\n\n:<em>$2</em>\n\n* 开始时间:$8\n* 到期时间:$6\n* 目标用户:$7\n\n您当前的IP地址是$3。请在您做出的任何查询中包含所有上述详情。",
+       "actionblockedtext": "您已被禁止执行此操作",
        "blockednoreason": "未给出原因",
        "whitelistedittext": "请$1以编辑页面。",
        "confirmedittext": "您必须确认您的电子邮件地址才能编辑页面。请通过[[Special:Preferences|系统设置]]设置并确认您的电子邮件地址。",
        "edit-no-change": "因为没有文字更改,您的编辑已被忽略。",
        "edit-slots-cannot-add": "下列{{PLURAL:$1|栏位|栏位}}在此不受支持:$2。",
        "edit-slots-cannot-remove": "下列{{PLURAL:$1|栏位|栏位}}是必需的且无法被移除:$2。",
+       "edit-slots-missing": "缺少以下{{PLURAL:$1|栏位|栏位}}:$2。",
        "postedit-confirmation-created": "页面已创建。",
        "postedit-confirmation-restored": "页面已恢复。",
        "postedit-confirmation-saved": "您的编辑已保存。",
        "rcfilters-watchlist-edit-watchlist-button": "编辑您的监视页面列表",
        "rcfilters-watchlist-showupdated": "自更改发生以来,对您尚未访问的页面做出的更改以<strong>粗体</strong>显示,并带有实心圆形标记。",
        "rcfilters-preference-label": "使用非JavaScript接口",
-       "rcfilters-preference-help": "返回到2017年界面重新设计版,并重新添加这以后新增的工具。",
+       "rcfilters-preference-help": "加载不带过滤搜索或者高亮功能的近期更改",
        "rcfilters-watchlist-preference-label": "使用非JavaScript接口",
-       "rcfilters-watchlist-preference-help": "å\9b\9eé\80\802017å¹´ç\95\8cé\9d¢å\86\8d设计ï¼\8c以å\8f\8aæ\89\80æ\9c\89è\87ªæ­¤å¼\80å§\8bæ·»å\8a ç\9a\84å·¥å\85·ã\80\82",
+       "rcfilters-watchlist-preference-help": "å\8a è½½ä¸\8d带è¿\87滤æ\90\9cç´¢æ\88\96è\80\85é«\98亮å\8a\9fè\83½ç\9a\84ç\9b\91è§\86æ¸\85å\8d\95",
        "rcfilters-filter-showlinkedfrom-label": "显示链接自该页面的页面上的更改",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>链接自</strong>选定页面的页面",
        "rcfilters-filter-showlinkedto-label": "显示链接到该页面的页面上的更改",
        "move": "移动",
        "movethispage": "移动本页",
        "unusedimagestext": "下面为未被任何页面使用的文件。请注意,其他网站可能会通过URL直接链接某个文件,因此列表中的文件有可能仍在使用。",
+       "unusedimagestext-categorizedimgisused": "以下文件存在但尚未内嵌在任何页面。已分类的图片就算未内嵌在任何页面也视为已使用。\n请注意其他网站可能会直接用URL链接文件,这使得文件尽管被使用的情况下仍被列出。",
        "unusedcategoriestext": "以下分类页面实际存在,即使没有其它页面或分类利用它们。",
        "notargettitle": "无目标",
        "notargettext": "您还没有指定一个目标页面或用户以进行此项操作。",
        "ipb-disableusertalk": "编辑自己的讨论页",
        "ipb-change-block": "使用这些设置重新封禁用户",
        "ipb-confirm": "确认封禁",
+       "ipb-sitewide": "全站范围",
        "ipb-partial": "部分的",
        "ipb-pages-label": "页面",
        "ipb-namespaces-label": "名字空间",
        "ipb-blocklist": "查看现有封禁",
        "ipb-blocklist-contribs": "{{GENDER:$1|$1}}的贡献",
        "ipb-blocklist-duration-left": "剩余$1",
+       "block-actions": "封锁的操作",
        "block-expiry": "终止时间:",
        "block-options": "添加的选项:",
        "block-prevent-edit": "编辑",
        "emailblock": "电子邮件停用",
        "blocklist-nousertalk": "不能编辑自己的讨论页",
        "blocklist-editing": "编辑中",
+       "blocklist-editing-sitewide": "编辑 (全站)",
        "blocklist-editing-page": "页面",
        "blocklist-editing-ns": "名字空间",
        "ipblocklist-empty": "封禁列表为空。",
        "logentry-block-block": "$1{{GENDER:$2|封禁了}}{{GENDER:$4|$3}},到期时间为$5 $6",
        "logentry-block-unblock": "$1{{GENDER:$2|解封了}}{{GENDER:$4|$3}}",
        "logentry-block-reblock": "$1将{{GENDER:$4|$3}}的封禁设置{{GENDER:$2|更改为}}持续时间$5 $6",
-       "logentry-partialblock-block": "$1{{GENDER:$2|封禁了}}{{GENDER:$4|$3}},持续时间$5 $6",
+       "logentry-partialblock-block-page": "{{PLURAL:$1|页面|页面}}$2",
+       "logentry-partialblock-block-ns": "{{PLURAL:$1|命名空间|命名空间}}$2",
+       "logentry-partialblock-block": "$1{{GENDER:$2|封禁了}}{{GENDER:$4|$3}}对$7的编辑,持续时间至$5 $6",
        "logentry-suppress-block": "$1{{GENDER:$2|封禁了}}{{GENDER:$4|$3}},持续时间$5 $6",
        "logentry-suppress-reblock": "$1将{{GENDER:$4|$3}}的封禁设置{{GENDER:$2|更改为}}持续时间$5 $6",
        "logentry-import-upload": "$1通过上传{{GENDER:$2|导入}}了$3",
index 33573f1..841019f 100644 (file)
        "nospecialpagetext": "<strong>您請求的特定頁面無效。</strong>\n\n欲取得有效的特定頁面清單可至 [[Special:SpecialPages|{{int:specialpages}}]]。",
        "error": "錯誤",
        "databaseerror": "資料庫錯誤",
-       "databaseerror-text": "出現資料庫查詢錯誤。\n這可能表示系統有問題存在。",
+       "databaseerror-text": "出現資料庫查詢錯誤。\n這表示系統可能有問題存在。",
        "databaseerror-textcl": "資料庫查詢錯誤。",
        "databaseerror-query": "查詢:$1",
        "databaseerror-function": "功能:$1",
        "title-invalid-too-long": "請求的頁面標題過長,標題使用 UTF-8 編碼不可超過 $1 {{PLURAL:$1|位元組|位元組}}。",
        "title-invalid-leading-colon": "請求的頁面標題包含無效的冒號於開始。",
        "perfcached": "以下為快取資料,可能不是最新的。 快取資料最多可儲存 {{PLURAL:$1|1 筆結果|$1 筆結果}}。",
-       "perfcachedts": "以下為快取資料,最後更新時間為 $1。 快取資料最多可儲存 {{PLURAL:$4|1 筆結果|$4 筆結果}}。",
+       "perfcachedts": "以下為快取資料,最後更新時間為 $1。快取資料最多可儲存 {{PLURAL:$4|1 筆結果|$4 筆結果}}。",
        "querypage-no-updates": "目前已停用此頁面的更新功能。\n在此頁面的資料不會被立即更新。",
        "viewsource": "檢視原始碼",
        "viewsource-title": "檢視 $1 的原始碼",
        "logeventslist-patrol-log": "巡查日誌",
        "logeventslist-tag-log": "標籤日誌",
        "all-logs-page": "所有公開日誌",
-       "alllogstext": "合併顯示所有 {{SITENAME}} 中所有類型的日誌。您可以點選下拉式選單選擇日誌的類型,指定使用者名稱(區分大小寫)或影響的頁面(區分大小寫)。",
+       "alllogstext": "合併顯示所有{{SITENAME}}中所有類型的日誌。您可以點選下拉式選單選擇日誌的類型,指定使用者名稱(區分大小寫)或影響的頁面(區分大小寫)。",
        "logempty": "無符合條件的日誌。",
        "log-title-wildcard": "搜尋以此欄位文字為字首的標題",
        "showhideselectedlogentries": "顯示/隱藏已選擇的日誌項目",
        "days": "$1 天",
        "weeks": "{{PLURAL:$1|$1 週}}",
        "months": "{{PLURAL:$1|$1 個月}}",
-       "years": "{{PLURAL:$1|$1 年}}",
+       "years": "$1年",
        "ago": "$1 前",
        "just-now": "剛才",
        "hours-ago": "$1 小時前",
index 6e460fa..a880114 100644 (file)
@@ -1,5 +1,5 @@
 <?php
-/** Guianan Creole (kréyòl gwiyanè)
+/** Guianan Creole (Kriyòl Gwiyannen)
  *
  * To improve a translation please visit https://translatewiki.net
  *
index 1997fe7..4d34e5d 100644 (file)
--- a/load.php
+++ b/load.php
@@ -22,7 +22,6 @@
  * @author Trevor Parscal
  */
 
-use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\MediaWikiServices;
 
 // This endpoint is supposed to be independent of request cookies and other
@@ -40,11 +39,7 @@ if ( !$wgRequest->checkUrlExtension() ) {
 // writes when getting database connections for ResourceLoader. (T192611)
 MediaWikiServices::getInstance()->getDBLoadBalancerFactory()->disableChronologyProtection();
 
-// Set up ResourceLoader
-$resourceLoader = new ResourceLoader(
-       ConfigFactory::getDefaultInstance()->makeConfig( 'main' ),
-       LoggerFactory::getInstance( 'resourceloader' )
-);
+$resourceLoader = MediaWikiServices::getInstance()->getResourceLoader();
 $context = new ResourceLoaderContext( $resourceLoader, $wgRequest );
 
 // Respond to ResourceLoader request
index 63838d2..cec640b 100644 (file)
@@ -46,7 +46,7 @@ class CleanupRemovedModules extends Maintenance {
                $this->output( "Cleaning up module_deps table...\n" );
 
                $dbw = $this->getDB( DB_MASTER );
-               $rl = new ResourceLoader( MediaWikiServices::getInstance()->getMainConfig() );
+               $rl = MediaWikiServices::getInstance()->getResourceLoader();
                $moduleNames = $rl->getModuleNames();
                $res = $dbw->select( 'module_deps',
                        [ 'md_module', 'md_skin' ],
index b01dde6..2f0bcdf 100644 (file)
@@ -144,7 +144,7 @@ class CompareParsers extends DumpIterator {
                        return;
                }
 
-               $text = strval( $content->getNativeData() );
+               $text = strval( $content->getText() );
 
                $output1 = $parser1->parse( $text, $title, $this->options );
                $output2 = $parser2->parse( $text, $title, $this->options );
index b964417..a79d9f3 100644 (file)
@@ -23,6 +23,7 @@
 
 use MediaWiki\MediaWikiServices;
 use Wikimedia\Rdbms\IDatabase;
+use Wikimedia\Rdbms\IMaintainableDatabase;
 
 require_once __DIR__ . '/../Maintenance.php';
 
index ceba9b5..813f88e 100644 (file)
@@ -413,13 +413,13 @@ class MigrateActors extends LoggedUpdateMaintenance {
        protected function migrateLogSearch() {
                $complainedAboutUsers = [];
 
-               $primaryKey = [ 'ls_field', 'ls_value' ];
+               $primaryKey = [ 'ls_value', 'ls_log_id' ];
                $pkFilter = array_flip( $primaryKey );
                $this->output( "Beginning migration of log_search\n" );
                wfWaitForSlaves();
 
                $dbw = $this->getDB( DB_MASTER );
-               $countUpdated = 0;
+               $countInserted = 0;
                $countActors = 0;
                $countErrors = 0;
 
@@ -427,72 +427,44 @@ class MigrateActors extends LoggedUpdateMaintenance {
                while ( true ) {
                        // Fetch the rows needing update
                        $res = $dbw->select(
+                               [ 'log_search', 'actor' ],
+                               [ 'ls_value', 'ls_log_id', 'actor_id' ],
                                [
-                                       'ls' => $dbw->buildSelectSubquery(
-                                               'log_search',
-                                               'ls_value',
-                                               [
-                                                       'ls_field' => 'target_author_id',
-                                                       $next
-                                               ],
-                                               __METHOD__,
-                                               [
-                                                       'DISTINCT',
-                                                       'ORDER BY' => [ 'ls_value' ],
-                                                       'LIMIT' => $this->mBatchSize,
-                                               ]
-                                       ),
-                                       'actor'
+                                       'ls_field' => 'target_author_id',
+                                       $next
                                ],
+                               __METHOD__,
                                [
-                                       'ls_field' => $dbw->addQuotes( 'target_author_id' ),
-                                       'ls_value',
-                                       'actor_id'
+                                       'ORDER BY' => $primaryKey,
+                                       'LIMIT' => $this->mBatchSize,
                                ],
-                               [],
-                               __METHOD__,
-                               [],
                                [ 'actor' => [ 'LEFT JOIN', 'ls_value = ' . $dbw->buildStringCast( 'actor_user' ) ] ]
                        );
                        if ( !$res->numRows() ) {
                                break;
                        }
 
-                       // Update the rows
-                       $del = [];
+                       // Insert a 'target_author_actor' for each 'target_author_id'
+                       $ins = [];
                        foreach ( $res as $row ) {
                                $lastRow = $row;
                                if ( !$row->actor_id ) {
                                        list( , $display ) = $this->makeNextCond( $dbw, $primaryKey, $row );
-                                       $this->error( "No actor for row with $display\n" );
+                                       $this->error( "No actor for target_author_id row with $display\n" );
                                        $countErrors++;
                                        continue;
                                }
-                               $dbw->update(
-                                       'log_search',
-                                       [
-                                               'ls_field' => 'target_author_actor',
-                                               'ls_value' => $row->actor_id,
-                                       ],
-                                       [
-                                               'ls_field' => $row->ls_field,
-                                               'ls_value' => $row->ls_value,
-                                       ],
-                                       __METHOD__,
-                                       [ 'IGNORE' ]
-                               );
-                               $countUpdated += $dbw->affectedRows();
-                               $del[] = $row->ls_value;
-                       }
-                       if ( $del ) {
-                               $dbw->delete(
-                                       'log_search', [ 'ls_field' => 'target_author_id', 'ls_value' => $del ], __METHOD__
-                               );
-                               $countUpdated += $dbw->affectedRows();
+                               $ins[] = [
+                                       'ls_field' => 'target_author_actor',
+                                       'ls_value' => $row->actor_id,
+                                       'ls_log_id' => $row->ls_log_id,
+                               ];
                        }
+                       $dbw->insert( 'log_search', $ins, __METHOD__, [ 'IGNORE' ] );
+                       $countInserted += $dbw->affectedRows();
 
                        list( $next, $display ) = $this->makeNextCond( $dbw, $primaryKey, $lastRow );
-                       $this->output( "... $display\n" );
+                       $this->output( "... target_author_id, $display\n" );
                        wfWaitForSlaves();
                }
 
@@ -500,31 +472,17 @@ class MigrateActors extends LoggedUpdateMaintenance {
                while ( true ) {
                        // Fetch the rows needing update
                        $res = $dbw->select(
+                               [ 'log_search', 'actor' ],
+                               [ 'ls_value', 'ls_log_id', 'actor_id' ],
                                [
-                                       'ls' => $dbw->buildSelectSubquery(
-                                               'log_search',
-                                               'ls_value',
-                                               [
-                                                       'ls_field' => 'target_author_ip',
-                                                       $next
-                                               ],
-                                               __METHOD__,
-                                               [
-                                                       'DISTINCT',
-                                                       'ORDER BY' => [ 'ls_value' ],
-                                                       'LIMIT' => $this->mBatchSize,
-                                               ]
-                                       ),
-                                       'actor'
+                                       'ls_field' => 'target_author_ip',
+                                       $next
                                ],
+                               __METHOD__,
                                [
-                                       'ls_field' => $dbw->addQuotes( 'target_author_ip' ),
-                                       'ls_value',
-                                       'actor_id'
+                                       'ORDER BY' => $primaryKey,
+                                       'LIMIT' => $this->mBatchSize,
                                ],
-                               [],
-                               __METHOD__,
-                               [],
                                [ 'actor' => [ 'LEFT JOIN', 'ls_value = actor_name' ] ]
                        );
                        if ( !$res->numRows() ) {
@@ -538,45 +496,31 @@ class MigrateActors extends LoggedUpdateMaintenance {
                                $dbw, 'ls_value', $rows, $complainedAboutUsers, $countErrors
                        );
 
-                       // Update the rows
-                       $del = [];
+                       // Insert a 'target_author_actor' for each 'target_author_ip'
+                       $ins = [];
                        foreach ( $rows as $row ) {
                                if ( !$row->actor_id ) {
                                        list( , $display ) = $this->makeNextCond( $dbw, $primaryKey, $row );
-                                       $this->error( "Could not make actor for row with $display\n" );
+                                       $this->error( "Could not make actor for target_author_ip row with $display\n" );
                                        $countErrors++;
                                        continue;
                                }
-                               $dbw->update(
-                                       'log_search',
-                                       [
-                                               'ls_field' => 'target_author_actor',
-                                               'ls_value' => $row->actor_id,
-                                       ],
-                                       [
-                                               'ls_field' => $row->ls_field,
-                                               'ls_value' => $row->ls_value,
-                                       ],
-                                       __METHOD__,
-                                       [ 'IGNORE' ]
-                               );
-                               $countUpdated += $dbw->affectedRows();
-                               $del[] = $row->ls_value;
-                       }
-                       if ( $del ) {
-                               $dbw->delete(
-                                       'log_search', [ 'ls_field' => 'target_author_ip', 'ls_value' => $del ], __METHOD__
-                               );
-                               $countUpdated += $dbw->affectedRows();
+                               $ins[] = [
+                                       'ls_field' => 'target_author_actor',
+                                       'ls_value' => $row->actor_id,
+                                       'ls_log_id' => $row->ls_log_id,
+                               ];
                        }
+                       $dbw->insert( 'log_search', $ins, __METHOD__, [ 'IGNORE' ] );
+                       $countInserted += $dbw->affectedRows();
 
                        list( $next, $display ) = $this->makeNextCond( $dbw, $primaryKey, $lastRow );
-                       $this->output( "... $display\n" );
+                       $this->output( "... target_author_ip, $display\n" );
                        wfWaitForSlaves();
                }
 
                $this->output(
-                       "Completed migration, updated $countUpdated row(s) with $countActors new actor(s), "
+                       "Completed migration, inserted $countInserted row(s) with $countActors new actor(s), "
                        . "$countErrors error(s)\n"
                );
                return $countErrors;
index d540e8f..f8526d0 100644 (file)
@@ -86,7 +86,7 @@ class PreprocessDump extends DumpIterator {
                }
 
                try {
-                       $this->mPreprocessor->preprocessToObj( strval( $content->getNativeData() ), 0 );
+                       $this->mPreprocessor->preprocessToObj( strval( $content->getText() ), 0 );
                } catch ( Exception $e ) {
                        $this->error( "Caught exception " . $e->getMessage() . " in "
                                . $rev->getTitle()->getPrefixedText() );
index 952b825..24b5007 100644 (file)
@@ -51,7 +51,7 @@ class ViewCLI extends Maintenance {
                        $this->fatalError( "Non-text content models not supported" );
                }
 
-               $this->output( $content->getNativeData() );
+               $this->output( $content->getText() );
        }
 }
 
index b0c5c4c..521072e 100644 (file)
@@ -20,7 +20,7 @@
                        .show()
                        .on( 'click', function () {
                                // FIXME: Use CSS transition
-                               // eslint-disable-next-line jquery/no-slide
+                               // eslint-disable-next-line no-jquery/no-slide
                                $( this ).closest( '.config-help-field-container' ).find( '.config-help-field-data' )
                                        .slideToggle( 'fast' );
                        } );
@@ -36,9 +36,9 @@
                                $wrapper = $( document.getElementById( $checked.attr( 'rel' ) ) );
                        if ( $wrapper.is( ':hidden' ) ) {
                                // FIXME: Use CSS transition
-                               // eslint-disable-next-line jquery/no-animate-toggle
+                               // eslint-disable-next-line no-jquery/no-animate-toggle
                                $( '.dbWrapper' ).hide( 'slow' );
-                               // eslint-disable-next-line jquery/no-animate-toggle
+                               // eslint-disable-next-line no-jquery/no-animate-toggle
                                $wrapper.show( 'slow' );
                        }
                } );
                        var $wrapper = $( '#config-cc-wrapper' );
                        if ( $( '#config__LicenseCode_cc-choose' ).is( ':checked' ) ) {
                                // FIXME: Use CSS transition
-                               // eslint-disable-next-line jquery/no-animate-toggle
+                               // eslint-disable-next-line no-jquery/no-animate-toggle
                                $wrapper.show( 'slow' );
                        } else {
-                               // eslint-disable-next-line jquery/no-animate-toggle
+                               // eslint-disable-next-line no-jquery/no-animate-toggle
                                $wrapper.hide( 'slow' );
                        }
                } );
                        var $wrapper = $( '#' + $( this ).attr( 'rel' ) );
                        if ( $( this ).is( ':checked' ) ) {
                                // FIXME: Use CSS transition
-                               // eslint-disable-next-line jquery/no-animate-toggle
+                               // eslint-disable-next-line no-jquery/no-animate-toggle
                                $wrapper.show( 'slow' );
                        } else {
-                               // eslint-disable-next-line jquery/no-animate-toggle
+                               // eslint-disable-next-line no-jquery/no-animate-toggle
                                $wrapper.hide( 'slow' );
                        }
                } );
                        var $wrapper = $( '#' + $( this ).attr( 'rel' ) );
                        if ( $( this ).is( ':checked' ) ) {
                                // FIXME: Use CSS transition
-                               // eslint-disable-next-line jquery/no-animate-toggle
+                               // eslint-disable-next-line no-jquery/no-animate-toggle
                                $wrapper.hide( 'slow' );
                        } else {
-                               // eslint-disable-next-line jquery/no-animate-toggle
+                               // eslint-disable-next-line no-jquery/no-animate-toggle
                                $wrapper.show( 'slow' );
                        }
                } );
                        // FIXME: Ugh, this is ugly
                        if ( $( this ).val() === 'other' ) {
                                // FIXME: Use CSS transition
-                               // eslint-disable-next-line jquery/no-slide
+                               // eslint-disable-next-line no-jquery/no-slide
                                $textbox.prop( 'readonly', false ).closest( '.config-block' ).slideDown( 'fast' );
                        } else {
-                               // eslint-disable-next-line jquery/no-slide
+                               // eslint-disable-next-line no-jquery/no-slide
                                $textbox.prop( 'readonly', true ).closest( '.config-block' ).slideUp( 'fast' );
                        }
                } );
                        var $memc = $( '#config-memcachewrapper' );
                        if ( $( 'input[name$="config__MainCacheType"]:checked' ).val() === 'memcached' ) {
                                // FIXME: Use CSS transition
-                               // eslint-disable-next-line jquery/no-animate-toggle
+                               // eslint-disable-next-line no-jquery/no-animate-toggle
                                $memc.show( 'slow' );
                        } else {
-                               // eslint-disable-next-line jquery/no-animate-toggle
+                               // eslint-disable-next-line no-jquery/no-animate-toggle
                                $memc.hide( 'slow' );
                        }
                } );
index 387e74e..6bcc98a 100644 (file)
@@ -11,7 +11,7 @@
     "selenium-test": "wdio ./tests/selenium/wdio.conf.js"
   },
   "devDependencies": {
-    "eslint-config-wikimedia": "0.10.1",
+    "eslint-config-wikimedia": "0.11.0",
     "grunt": "1.0.3",
     "grunt-banana-checker": "0.6.0",
     "grunt-contrib-copy": "1.0.0",
index 8f3e8c4..9293063 100644 (file)
@@ -1317,6 +1317,9 @@ return [
                'dependencies' => [
                        'mediawiki.api',
                        'mediawiki.storage',
+                       // The two user.* modules are not used by mediawiki.user itself,
+                       // but kept as explicit dependencies because they provide part
+                       // of the mw.user API that consumers of this module expect.
                        'user.options',
                        'user.tokens',
                ],
index 57fd3ab..6107af1 100644 (file)
 
                        // Loop through all the dom cells of the thead
                        $tableRows.each( function ( rowIndex, row ) {
-                               // eslint-disable-next-line jquery/no-each-util
+                               // eslint-disable-next-line no-jquery/no-each-util
                                $.each( row.cells, function ( columnIndex, cell ) {
                                        var matrixRowIndex,
                                                matrixColumnIndex;
        function convertSortList( sortObjects ) {
                var sortList = [];
                sortObjects.forEach( function ( sortObject ) {
-                       // eslint-disable-next-line jquery/no-each-util
+                       // eslint-disable-next-line no-jquery/no-each-util
                        $.each( sortObject, function ( columnIndex, order ) {
                                var orderIndex = ( order === 'desc' ) ? 1 : 0;
                                sortList.push( [ parseInt( columnIndex, 10 ), orderIndex ] );
index ff7a40f..6bb3bce 100644 (file)
         * @return {boolean} Namespace is a signature namespace
         */
        Title.wantSignaturesNamespace = function ( namespaceId ) {
-               return this.isTalkNamespace( namespaceId ) ||
+               return Title.isTalkNamespace( namespaceId ) ||
                        mw.config.get( 'wgExtraSignatureNamespaces' ).indexOf( namespaceId ) !== -1;
        };
 
index 385604d..c7c061e 100644 (file)
                         */
                        getQueryString: function () {
                                var args = [];
-                               // eslint-disable-next-line jquery/no-each-util
+                               // eslint-disable-next-line no-jquery/no-each-util
                                $.each( this.query, function ( key, val ) {
                                        var k = Uri.encode( key ),
                                                vals = Array.isArray( val ) ? val : [ val ];
index e907a98..a370881 100644 (file)
@@ -74,7 +74,7 @@
                // Can't use fadeTo because it calls show(), and we might want to keep some elements hidden
                // (e.g. empty #catlinks)
                // FIXME: Use CSS transition
-               // eslint-disable-next-line jquery/no-animate
+               // eslint-disable-next-line no-jquery/no-animate
                $copyElements.animate( { opacity: 0.4 }, 'fast' );
 
                api = new mw.Api();
                                }
 
                                newList = [];
-                               // eslint-disable-next-line jquery/no-each-util
+                               // eslint-disable-next-line no-jquery/no-each-util
                                $.each( response.parse.indicators, function ( name, indicator ) {
                                        newList.push(
                                                $( '<div>' )
                } ).always( function () {
                        $spinner.hide();
                        // FIXME: Use CSS transition
-                       // eslint-disable-next-line jquery/no-animate
+                       // eslint-disable-next-line no-jquery/no-animate
                        $copyElements.animate( {
                                opacity: 1
                        }, 'fast' );
index 1e7a6e4..dbf029e 100644 (file)
@@ -12,7 +12,7 @@
                                $a = $( '#ca-edit a' );
                                // Not every page has an edit link (T59713)
                                if ( $a.length ) {
-                                       // eslint-disable-next-line jquery/no-event-shorthand
+                                       // eslint-disable-next-line no-jquery/no-event-shorthand
                                        $a.get( 0 ).click();
                                }
                        }
index e3f96b1..e485de1 100644 (file)
@@ -21,7 +21,7 @@
                if ( e.target.nodeName.toLowerCase() !== 'a' ) {
                        // Trigger native HTMLElement click instead of opening URL (T45052)
                        e.preventDefault();
-                       // eslint-disable-next-line jquery/no-event-shorthand
+                       // eslint-disable-next-line no-jquery/no-event-shorthand
                        $edit.get( 0 ).click();
                }
        } );
index f168515..0613023 100644 (file)
@@ -53,7 +53,7 @@
        // Pre-populate with fake ajax promises to save http requests for tokens
        // we already have on the page via the user.tokens module (T36733).
        promises[ defaultOptions.ajax.url ] = {};
-       // eslint-disable-next-line jquery/no-each-util
+       // eslint-disable-next-line no-jquery/no-each-util
        $.each( mw.user.tokens.get(), function ( key, value ) {
                // This requires #getToken to use the same key as user.tokens.
                // Format: token-type + "Token" (eg. csrfToken, patrolToken, watchToken).
index f0ca272..2f69a7a 100644 (file)
@@ -3,6 +3,8 @@
  */
 ( function () {
 
+       var saveOptionsRequests = {};
+
        $.extend( mw.Api.prototype, {
 
                /**
                 * If necessary, the options will be saved using several sequential API requests. Only one promise
                 * is always returned that will be resolved when all requests complete.
                 *
+                * If a request from a previous #saveOptions call is still pending, this will wait for it to be
+                * completed, otherwise MediaWiki gets sad. No requests are sent for anonymous users, as they
+                * would fail anyway. See T214963.
+                *
                 * @param {Object} options Options as a `{ name: value, … }` object
                 * @return {jQuery.Promise}
                 */
                saveOptions: function ( options ) {
                        var name, value, bundleable,
                                grouped = [],
+                               promise;
+
+                       // Logged-out users can't have user options; we can't depend on mw.user, that'd be circular
+                       if ( mw.config.get( 'wgUserName' ) === null ) {
+                               return $.Deferred().reject( 'notloggedin' ).promise();
+                       }
+
+                       // If another options request to this API is pending, wait for it first
+                       if (
+                               saveOptionsRequests[ this.defaults.ajax.url ] &&
+                               // Avoid long chains of promises, they may cause memory leaks
+                               saveOptionsRequests[ this.defaults.ajax.url ].state() === 'pending'
+                       ) {
+                               promise = saveOptionsRequests[ this.defaults.ajax.url ].then( function () {
+                                       // Don't expose the old promise's result, it would be confusing
+                                       return $.Deferred().resolve();
+                               }, function () {
+                                       return $.Deferred().resolve();
+                               } );
+                       } else {
                                promise = $.Deferred().resolve();
+                       }
 
                        for ( name in options ) {
                                value = options[ name ] === null ? null : String( options[ name ] );
                                }.bind( this ) );
                        }
 
+                       saveOptionsRequests[ this.defaults.ajax.url ] = promise;
+
                        return promise;
                }
 
index e5d0574..de0688a 100644 (file)
 
                        file.name = 'file';
 
-                       // eslint-disable-next-line jquery/no-each-util
+                       // eslint-disable-next-line no-jquery/no-each-util
                        $.each( data, function ( key, val ) {
                                $form.append( getHiddenInput( key, val ) );
                        } );
index 189363f..8da7a06 100644 (file)
@@ -91,7 +91,7 @@
                        // Hide the current pane
                        if ( requestedPaneId === currentPaneId ) {
                                // FIXME: Use CSS transition
-                               // eslint-disable-next-line jquery/no-slide
+                               // eslint-disable-next-line no-jquery/no-slide
                                $currentPane.slideUp( updateHov );
                                debug.$container.data( 'currentPane', null );
                                return;
 
                        if ( currentPaneId === undefined || currentPaneId === null ) {
                                // FIXME: Use CSS transition
-                               // eslint-disable-next-line jquery/no-slide
+                               // eslint-disable-next-line no-jquery/no-slide
                                $requestedPane.slideDown( updateHov );
                        } else {
                                $currentPane.hide();
index 661a1c4..78e9f5f 100644 (file)
 
                if ( errors.length === 0 ) {
                        // FIXME: Use CSS transition
-                       // eslint-disable-next-line jquery/no-slide
+                       // eslint-disable-next-line no-jquery/no-slide
                        $errorBox.slideUp( function () {
                                $errorBox
                                        .removeAttr( 'class' )
                                                .detach();
                                }
                                // FIXME: Use CSS transition
-                               // eslint-disable-next-line jquery/no-slide
+                               // eslint-disable-next-line no-jquery/no-slide
                                $errorBox
                                        .attr( 'class', 'error' )
                                        .empty()
                                        .slideDown();
                        };
                        if ( $oldErrorBox !== $errorBox && $oldErrorBox.hasClass( 'error' ) ) {
-                               // eslint-disable-next-line jquery/no-slide
+                               // eslint-disable-next-line no-jquery/no-slide
                                $oldErrorBox.slideUp( showFunc );
                        } else {
                                showFunc();
index 849ccbc..a500226 100644 (file)
 
                style.textContent = css;
                document.body.appendChild( style );
-               // eslint-disable-next-line jquery/no-each-util
+               // eslint-disable-next-line no-jquery/no-each-util
                $.each( style.sheet.cssRules, function ( index, rule ) {
                        selectors.total++;
                        // document.querySelector() on prefixed pseudo-elements can throw exceptions
index 846deb9..3b89a74 100644 (file)
        mw.jqueryMsg.HtmlEmitter = function ( language, magic ) {
                var jmsg = this;
                this.language = language;
-               // eslint-disable-next-line jquery/no-each-util
+               // eslint-disable-next-line no-jquery/no-each-util
                $.each( magic, function ( key, val ) {
                        jmsg[ key.toLowerCase() ] = function () {
                                return val;
                                // typeof returns object for arrays
                                case 'object':
                                        // node is an array of nodes
-                                       // eslint-disable-next-line jquery/no-map-util
+                                       // eslint-disable-next-line no-jquery/no-map-util
                                        subnodes = $.map( node.slice( 1 ), function ( n ) {
                                                return jmsg.emit( n, replacements );
                                        } );
                 */
                concat: function ( nodes ) {
                        var $span = $( '<span>' ).addClass( 'mediaWiki_htmlEmitter' );
-                       // eslint-disable-next-line jquery/no-each-util
+                       // eslint-disable-next-line no-jquery/no-each-util
                        $.each( nodes, function ( i, node ) {
                                // Let jQuery append nodes, arrays of nodes and jQuery objects
                                // other things (strings, numbers, ..) are appended as text nodes (not as HTML strings)
                        }
 
                        // Remove explicit plural forms from the forms. They were set undefined in the above loop.
-                       // eslint-disable-next-line jquery/no-map-util
+                       // eslint-disable-next-line no-jquery/no-map-util
                        forms = $.map( forms, function ( form ) {
                                return form;
                        } );
index b3707a5..1d0e335 100644 (file)
                 * @return {boolean}
                 */
                matchAttribute: function ( objects, attrName ) {
-                       // eslint-disable-next-line jquery/no-map-util
+                       // eslint-disable-next-line no-jquery/no-map-util
                        return $.map( objects, function ( object ) {
                                return object[ attrName ];
                        } ).filter( function ( item, index, a ) {
index e8450df..cd19cb1 100644 (file)
                                        notif.$notification.remove();
                                } else {
                                        // FIXME: Use CSS transition
-                                       // eslint-disable-next-line jquery/no-slide
+                                       // eslint-disable-next-line no-jquery/no-slide
                                        notif.$notification.slideUp( 'fast', function () {
                                                $( this ).remove();
                                        } );
index 30d4a90..cd22da7 100644 (file)
@@ -69,7 +69,7 @@
                // Prepare views
                if ( namespaceStructure ) {
                        items = [];
-                       // eslint-disable-next-line jquery/no-each-util
+                       // eslint-disable-next-line no-jquery/no-each-util
                        $.each( namespaceStructure, function ( namespaceID, label ) {
                                // Build and clean up the individual namespace items definition
                                items.push( {
                // Before we do anything, we need to see if we require additional items in the
                // groups that have 'AllowArbitrary'. For the moment, those are only single_option
                // groups; if we ever expand it, this might need further generalization:
-               // eslint-disable-next-line jquery/no-each-util
+               // eslint-disable-next-line no-jquery/no-each-util
                $.each( views, function ( viewName, viewData ) {
                        viewData.groups.forEach( function ( groupData ) {
                                var extraValues = [];
         */
        Controller.prototype.updateNumericPreference = function ( prefName, newValue ) {
                // FIXME: $.isNumeric is deprecated
-               // eslint-disable-next-line jquery/no-is-numeric
+               // eslint-disable-next-line no-jquery/no-is-numeric
                if ( !$.isNumeric( newValue ) ) {
                        return;
                }
index 831e6eb..db504b5 100644 (file)
 
                // Check for filters that should be initially selected by their default value
                if ( this.isSticky() ) {
-                       // eslint-disable-next-line jquery/no-each-util
+                       // eslint-disable-next-line no-jquery/no-each-util
                        $.each( this.defaultFilters, function ( filterName, filterValue ) {
                                model.getItemByName( filterName ).toggleSelected( filterValue );
                        } );
                                        selected = [];
 
                                // Find if any are selected
-                               // eslint-disable-next-line jquery/no-each-util
+                               // eslint-disable-next-line no-jquery/no-each-util
                                $.each( filters, function ( name, value ) {
                                        if ( value ) {
                                                selected.push( name );
                        // all false
 
                        // Go over the items and define the correct values
-                       // eslint-disable-next-line jquery/no-each-util
+                       // eslint-disable-next-line no-jquery/no-each-util
                        $.each( filterRepresentation, function ( name, value ) {
                                // We must store all parameter values as strings '0' or '1'
                                if ( model.getType() === 'send_unselected_if_any' ) {
                } else if ( this.getType() === 'string_options' ) {
                        values = [];
 
-                       // eslint-disable-next-line jquery/no-each-util
+                       // eslint-disable-next-line no-jquery/no-each-util
                        $.each( filterRepresentation, function ( name, value ) {
                                // Collect values
                                if ( value ) {
                                }
                        } );
 
-                       // eslint-disable-next-line jquery/no-each-util
+                       // eslint-disable-next-line no-jquery/no-each-util
                        $.each( expandedParams, function ( paramName, paramValue ) {
                                var filterItem = paramToFilterMap[ paramName ];
 
index 3e11d1e..1138c4e 100644 (file)
@@ -98,7 +98,7 @@
 
                key = key || 'contextDescription';
 
-               // eslint-disable-next-line jquery/no-each-util
+               // eslint-disable-next-line no-jquery/no-each-util
                $.each( conflicts, function ( filterName, conflict ) {
                        if ( !conflict.item.isSelected() ) {
                                return;
index 2e6abab..d1b9f7a 100644 (file)
                                filterItemGroup = filterItem.getGroupModel();
 
                        // For each item, see if that item is still conflicting
-                       // eslint-disable-next-line jquery/no-each-util
+                       // eslint-disable-next-line no-jquery/no-each-util
                        $.each( model.groups, function ( groupName, groupModel ) {
                                if ( filterItem.getGroupName() === groupName ) {
                                        // Check inside the group
                        expandConflictDefinitions = function ( obj ) {
                                var result = {};
 
-                               // eslint-disable-next-line jquery/no-each-util
+                               // eslint-disable-next-line no-jquery/no-each-util
                                $.each( obj, function ( key, conflicts ) {
                                        var filterName,
                                                adjustedConflicts = {};
                }, views );
 
                // Go over all views
-               // eslint-disable-next-line jquery/no-each-util
+               // eslint-disable-next-line no-jquery/no-each-util
                $.each( allViews, function ( viewName, viewData ) {
                        // Define the view
                        model.views[ viewName ] = {
                filterConflictResult = expandConflictDefinitions( filterConflictMap );
 
                // Set conflicts for groups
-               // eslint-disable-next-line jquery/no-each-util
+               // eslint-disable-next-line no-jquery/no-each-util
                $.each( groupConflictResult, function ( group, conflicts ) {
                        model.groups[ group ].setConflicts( conflicts );
                } );
 
                // Set conflicts for items
-               // eslint-disable-next-line jquery/no-each-util
+               // eslint-disable-next-line no-jquery/no-each-util
                $.each( filterConflictResult, function ( filterName, conflicts ) {
                        var filterItem = model.getItemByName( filterName );
                        // set conflicts for items in the group
                } );
 
                // Create a map between known parameters and their models
-               // eslint-disable-next-line jquery/no-each-util
+               // eslint-disable-next-line no-jquery/no-each-util
                $.each( this.groups, function ( group, groupModel ) {
                        if (
                                groupModel.getType() === 'send_unselected_if_any' ||
                var filtersValue;
                // For arbitrary numeric single_option values make sure the values
                // are normalized to fit within the limits
-               // eslint-disable-next-line jquery/no-each-util
+               // eslint-disable-next-line no-jquery/no-each-util
                $.each( this.getFilterGroups(), function ( groupName, groupModel ) {
                        params[ groupName ] = groupModel.normalizeArbitraryValue( params[ groupName ] );
                } );
                parameters = parameters ? $.extend( true, {}, parameters ) : this.getCurrentParameterState();
 
                // Params
-               // eslint-disable-next-line jquery/no-each-util
+               // eslint-disable-next-line no-jquery/no-each-util
                $.each( this.getEmptyParameterState(), function ( param, value ) {
                        if ( parameters[ param ] !== undefined && parameters[ param ] !== value ) {
                                result[ param ] = parameters[ param ];
 
                view = view || this.getCurrentView();
 
-               // eslint-disable-next-line jquery/no-each-util
+               // eslint-disable-next-line no-jquery/no-each-util
                $.each( this.groups, function ( groupName, groupModel ) {
                        if ( groupModel.getView() === view ) {
                                result[ groupName ] = groupModel;
 
                groups = this.getFilterGroupsByView( view );
 
-               // eslint-disable-next-line jquery/no-each-util
+               // eslint-disable-next-line no-jquery/no-each-util
                $.each( groups, function ( groupName, groupModel ) {
                        result = result.concat( groupModel.getItems() );
                } );
                var result = {};
 
                // Get default filter state
-               // eslint-disable-next-line jquery/no-each-util
+               // eslint-disable-next-line no-jquery/no-each-util
                $.each( this.groups, function ( name, model ) {
                        if ( !model.isSticky() ) {
                                $.extend( true, result, model.getDefaultParams() );
        FiltersViewModel.prototype.getStickyParams = function () {
                var result = [];
 
-               // eslint-disable-next-line jquery/no-each-util
+               // eslint-disable-next-line no-jquery/no-each-util
                $.each( this.groups, function ( name, model ) {
                        if ( model.isSticky() ) {
                                if ( model.isPerGroupRequestParameter() ) {
        FiltersViewModel.prototype.getStickyParamsValues = function () {
                var result = {};
 
-               // eslint-disable-next-line jquery/no-each-util
+               // eslint-disable-next-line no-jquery/no-each-util
                $.each( this.groups, function ( name, model ) {
                        if ( model.isSticky() ) {
                                $.extend( true, result, model.getParamRepresentation() );
                        } );
                }
 
-               // eslint-disable-next-line jquery/no-each-util
+               // eslint-disable-next-line no-jquery/no-each-util
                $.each( groupItems, function ( group, model ) {
                        $.extend(
                                result,
                //    },
                //    group2: "param4|param5"
                // }
-               // eslint-disable-next-line jquery/no-each-util
+               // eslint-disable-next-line no-jquery/no-each-util
                $.each( params, function ( paramName, paramValue ) {
                        var groupName,
                                itemOrGroup = model.parameterMap[ paramName ];
 
                // Go over all groups, so we make sure we get the complete output
                // even if the parameters don't include a certain group
-               // eslint-disable-next-line jquery/no-each-util
+               // eslint-disable-next-line no-jquery/no-each-util
                $.each( this.groups, function ( groupName, groupModel ) {
                        result = $.extend( true, {}, result, groupModel.getFilterRepresentation( groupMap[ groupName ] ) );
                } );
        FiltersViewModel.prototype.findSelectedItems = function () {
                var allSelected = [];
 
-               // eslint-disable-next-line jquery/no-each-util
+               // eslint-disable-next-line no-jquery/no-each-util
                $.each( this.getFilterGroups(), function ( groupName, groupModel ) {
                        allSelected = allSelected.concat( groupModel.findSelectedItems() );
                } );
        FiltersViewModel.prototype.getViewByTrigger = function ( trigger ) {
                var result = 'default';
 
-               // eslint-disable-next-line jquery/no-each-util
+               // eslint-disable-next-line no-jquery/no-each-util
                $.each( this.views, function ( name, data ) {
                        if ( data.trigger === trigger ) {
                                result = name;
                        visibleGroupNames = Object.keys( visibleGroups );
 
                        // Update visibility of items and groups
-                       // eslint-disable-next-line jquery/no-each-util
+                       // eslint-disable-next-line no-jquery/no-each-util
                        $.each( this.getFilterGroups(), function ( groupName, groupModel ) {
                                // Check if the group is visible at all
                                groupModel.toggleVisible( visibleGroupNames.indexOf( groupName ) !== -1 );
index 34c57dd..aa407b9 100644 (file)
                        //     }
                        //   }
                        // }
-                       // eslint-disable-next-line jquery/no-each-util
+                       // eslint-disable-next-line no-jquery/no-each-util
                        $.each( savedQueries.queries || {}, function ( id, obj ) {
                                if ( obj.data && obj.data.filters ) {
                                        obj.data = model.convertToParameters( obj.data );
                }
 
                // Initialize the query items
-               // eslint-disable-next-line jquery/no-each-util
+               // eslint-disable-next-line no-jquery/no-each-util
                $.each( savedQueries.queries || {}, function ( id, obj ) {
                        var normalizedData = obj.data,
                                isDefault = String( savedQueries.default ) === String( id );
 
                // Highlights: appending _color to keys
                newData.highlights = {};
-               // eslint-disable-next-line jquery/no-each-util
+               // eslint-disable-next-line no-jquery/no-each-util
                $.each( data.highlights, function ( highlightedFilterName, value ) {
                        if ( value ) {
                                newData.highlights[ highlightedFilterName + '_color' ] = data.highlights[ highlightedFilterName ];
                        data = this.filtersModel.getMinimizedParamRepresentation( fulldata );
 
                // Split highlight/params
-               // eslint-disable-next-line jquery/no-each-util
+               // eslint-disable-next-line no-jquery/no-each-util
                $.each( data, function ( param, value ) {
                        if ( param !== 'highlight' && highlightParamNames.indexOf( param ) > -1 ) {
                                normalizedData.highlights[ param ] = value;
index 361fe31..ba7f4d1 100644 (file)
                }
 
                // FIXME: Use CSS transition
-               // eslint-disable-next-line jquery/no-fade
+               // eslint-disable-next-line no-jquery/no-fade
                $newChanges
                        .hide()
                        .fadeIn( 1000 );
index 4881542..dc6fc12 100644 (file)
                                )
                        )
                ) {
-                       // eslint-disable-next-line jquery/no-animate
                        $( container ).animate( {
                                scrollTop: newScrollTop
                        } );
index 17c038e..73b874c 100644 (file)
@@ -23,7 +23,7 @@
 
                if ( config.events ) {
                        // Aggregate events
-                       // eslint-disable-next-line jquery/no-each-util
+                       // eslint-disable-next-line no-jquery/no-each-util
                        $.each( config.events, function ( eventName, eventEmit ) {
                                aggregate[ eventName ] = eventEmit;
                        } );
index c352f5a..864d0cf 100644 (file)
                this.$overlay.append( this.highlightPopup.$element );
 
                // Count groups per view
-               // eslint-disable-next-line jquery/no-each-util
+               // eslint-disable-next-line no-jquery/no-each-util
                $.each( groups, function ( groupName, groupModel ) {
                        if ( !groupModel.isHidden() ) {
                                viewGroupCount[ groupModel.getView() ] = viewGroupCount[ groupModel.getView() ] || 0;
                        }
                } );
 
-               // eslint-disable-next-line jquery/no-each-util
+               // eslint-disable-next-line no-jquery/no-each-util
                $.each( groups, function ( groupName, groupModel ) {
                        var currentItems = [],
                                view = groupModel.getView();
index 0069cf9..df12b2e 100644 (file)
@@ -2,7 +2,7 @@
  * Add search suggestions to the search form.
  */
 ( function () {
-       // eslint-disable-next-line jquery/no-map-util
+       // eslint-disable-next-line no-jquery/no-map-util
        var searchNS = $.map( mw.config.get( 'wgFormattedNamespaces' ), function ( nsName, nsID ) {
                if ( nsID >= 0 && mw.user.options.get( 'searchNs' + nsID ) ) {
                        // Cast string key to number
index 68c7ddc..e063a39 100644 (file)
                                        break;
 
                                case 'namespace':
-                                       // eslint-disable-next-line jquery/no-map-util
+                                       // eslint-disable-next-line no-jquery/no-map-util
                                        items = $.map( mw.config.get( 'wgFormattedNamespaces' ), function ( name, ns ) {
                                                if ( ns === '0' ) {
                                                        name = mw.message( 'blanknamespace' ).text();
                }
 
                toRemove = {};
-               // eslint-disable-next-line jquery/no-each-util
+               // eslint-disable-next-line no-jquery/no-each-util
                $.each( this.templatedItemsCache, function ( k, el ) {
                        if ( el.widget.isElementAttached() ) {
                                toRemove[ k ] = el;
                                        }
                                } else {
                                        newVars = {};
-                                       // eslint-disable-next-line jquery/no-each-util
+                                       // eslint-disable-next-line no-jquery/no-each-util
                                        $.each( p.vars, function ( k, v ) {
                                                newVars[ k ] = v.replace( placeholder, value );
                                        } );
                };
                while ( toProcess.length ) {
                        p = toProcess.shift();
-                       // eslint-disable-next-line jquery/no-each-util
+                       // eslint-disable-next-line no-jquery/no-each-util
                        $.each( p.vars, doProcess );
                }
 
-               // eslint-disable-next-line jquery/no-map-util
+               // eslint-disable-next-line no-jquery/no-map-util
                toRemove = $.map( toRemove, function ( el, name ) {
                        delete that.widgets[ name ];
                        return [ el.widgetField, el.helpField ];
                if ( this.paramInfo === null ) {
                        return [];
                } else {
-                       // eslint-disable-next-line jquery/no-map-util
+                       // eslint-disable-next-line no-jquery/no-map-util
                        promises = $.map( this.widgets, function ( widget ) {
                                return widget.apiCheckValid();
                        } );
                if ( this.paramInfo === null ) {
                        this.loadFromQueryParams = params;
                } else {
-                       // eslint-disable-next-line jquery/no-each-util
+                       // eslint-disable-next-line no-jquery/no-each-util
                        $.each( this.widgets, function ( name, widget ) {
                                var v = Object.prototype.hasOwnProperty.call( params, name ) ? params[ name ] : undefined;
                                widget.setApiValue( v );
         * @param {Object} displayParams Write query parameters for display into this object
         */
        ApiSandbox.PageLayout.prototype.getQueryParams = function ( params, displayParams ) {
-               // eslint-disable-next-line jquery/no-each-util
+               // eslint-disable-next-line no-jquery/no-each-util
                $.each( this.widgets, function ( name, widget ) {
                        var value = widget.getApiValue();
                        if ( value !== undefined ) {
         */
        ApiSandbox.PageLayout.prototype.getSubpages = function () {
                var ret = [];
-               // eslint-disable-next-line jquery/no-each-util
+               // eslint-disable-next-line no-jquery/no-each-util
                $.each( this.widgets, function ( name, widget ) {
                        var submodules, i;
                        if ( typeof widget.getSubmodules === 'function' ) {
index de519cb..28cd76c 100644 (file)
@@ -21,7 +21,7 @@
                                render: function ( data, partialTemplates ) {
                                        var partials = {};
                                        if ( partialTemplates ) {
-                                               // eslint-disable-next-line jquery/no-each-util
+                                               // eslint-disable-next-line no-jquery/no-each-util
                                                $.each( partialTemplates, function ( name, template ) {
                                                        partials[ name ] = template.getSource();
                                                } );
index 16b2591..ff41b5e 100644 (file)
@@ -1,11 +1,16 @@
 /* This style adds a toggle button with internationalized message for the TOC. */
 
-/* When the browser supports :checked then overwrite the style="display:none" and make the /*
+/* When the browser supports :checked then overwrite the style="display:none" and make the */
 /* checkbox invisible on another way to allow to focus the checkbox with keyboard. */
 :not( :checked ) > .toctogglecheckbox {
+       // Make the checkbox visible to allow it to focus with keyboard.
        display: inline !important; /* stylelint-disable-line declaration-no-important */
+       // Remove any size of the checkbox.
        position: absolute;
+       // Make the checkbox invisible.
        opacity: 0;
+       // Prevent that the checkbox is clickable and changes the cursor.
+       z-index: -1;
 }
 
 .toctogglespan {
index 85dbf97..e574568 100644 (file)
                        function toggleToc() {
                                if ( $tocList.is( ':hidden' ) ) {
                                        // FIXME: Use CSS transitions
-                                       // eslint-disable-next-line jquery/no-slide
+                                       // eslint-disable-next-line no-jquery/no-slide
                                        $tocList.slideDown( 'fast' );
                                        $tocToggleLink.text( mw.msg( 'hidetoc' ) );
                                        $this.removeClass( 'tochidden' );
                                        mw.cookie.set( 'hidetoc', null );
                                } else {
-                                       // eslint-disable-next-line jquery/no-slide
+                                       // eslint-disable-next-line no-jquery/no-slide
                                        $tocList.slideUp( 'fast' );
                                        $tocToggleLink.text( mw.msg( 'showtoc' ) );
                                        $this.addClass( 'tochidden' );
index e8c1b9b..3bfeb8d 100644 (file)
                                                        parseValue: this.parseSpecValue
                                                };
                                                spec.size = Math.max.apply(
-                                                       // eslint-disable-next-line jquery/no-map-util
+                                                       // eslint-disable-next-line no-jquery/no-map-util
                                                        null, $.map( spec.values, function ( v ) { return v.length; } )
                                                );
                                                return spec;
index fee27c5..ffc1818 100644 (file)
                                } else {
                                        maxlength = spec.size;
                                        if ( spec.intercalarySize ) {
-                                               // eslint-disable-next-line jquery/no-each-util
+                                               // eslint-disable-next-line no-jquery/no-each-util
                                                $.each( spec.intercalarySize, reduceFunc );
                                        }
                                        $field = $( '<input>' ).attr( 'type', 'text' )
index c64a550..f66b0d2 100644 (file)
                        }
                        if ( spec.values ) {
                                spec.size = Math.max.apply(
-                                       // eslint-disable-next-line jquery/no-map-util
+                                       // eslint-disable-next-line no-jquery/no-map-util
                                        null, $.map( spec.values, function ( v ) { return v.length; } )
                                );
                        }
index 06dd2d5..dd17b0b 100644 (file)
 
                if ( config.fullMonthNames && !config.shortMonthNames ) {
                        config.shortMonthNames = {};
-                       // eslint-disable-next-line jquery/no-each-util
+                       // eslint-disable-next-line no-jquery/no-each-util
                        $.each( config.fullMonthNames, function ( k, v ) {
                                config.shortMonthNames[ k ] = v.substr( 0, 3 );
                        } );
                }
                if ( config.shortDayNames && !config.dayLetters ) {
                        config.dayLetters = [];
-                       // eslint-disable-next-line jquery/no-each-util
+                       // eslint-disable-next-line no-jquery/no-each-util
                        $.each( config.shortDayNames, function ( k, v ) {
                                config.dayLetters[ k ] = v.substr( 0, 1 );
                        } );
                }
                if ( config.fullDayNames && !config.dayLetters ) {
                        config.dayLetters = [];
-                       // eslint-disable-next-line jquery/no-each-util
+                       // eslint-disable-next-line no-jquery/no-each-util
                        $.each( config.fullDayNames, function ( k, v ) {
                                config.dayLetters[ k ] = v.substr( 0, 1 );
                        } );
                }
                if ( config.fullDayNames && !config.shortDayNames ) {
                        config.shortDayNames = {};
-                       // eslint-disable-next-line jquery/no-each-util
+                       // eslint-disable-next-line no-jquery/no-each-util
                        $.each( config.fullDayNames, function ( k, v ) {
                                config.shortDayNames[ k ] = v.substr( 0, 3 );
                        } );
 
                if ( this.fullMonthNames && !this.shortMonthNames ) {
                        this.shortMonthNames = {};
-                       // eslint-disable-next-line jquery/no-each-util
+                       // eslint-disable-next-line no-jquery/no-each-util
                        $.each( this.fullMonthNames, function ( k, v ) {
                                this.shortMonthNames[ k ] = v.substr( 0, 3 );
                        }.bind( this ) );
                }
                if ( this.shortDayNames && !this.dayLetters ) {
                        this.dayLetters = [];
-                       // eslint-disable-next-line jquery/no-each-util
+                       // eslint-disable-next-line no-jquery/no-each-util
                        $.each( this.shortDayNames, function ( k, v ) {
                                this.dayLetters[ k ] = v.substr( 0, 1 );
                        }.bind( this ) );
                }
                if ( this.fullDayNames && !this.dayLetters ) {
                        this.dayLetters = [];
-                       // eslint-disable-next-line jquery/no-each-util
+                       // eslint-disable-next-line no-jquery/no-each-util
                        $.each( this.fullDayNames, function ( k, v ) {
                                this.dayLetters[ k ] = v.substr( 0, 1 );
                        }.bind( this ) );
                }
                if ( this.fullDayNames && !this.shortDayNames ) {
                        this.shortDayNames = {};
-                       // eslint-disable-next-line jquery/no-each-util
+                       // eslint-disable-next-line no-jquery/no-each-util
                        $.each( this.fullDayNames, function ( k, v ) {
                                this.shortDayNames[ k ] = v.substr( 0, 3 );
                        }.bind( this ) );
                }
                if ( !this.dayLetters ) {
                        this.dayLetters = [];
-                       // eslint-disable-next-line jquery/no-each-util
+                       // eslint-disable-next-line no-jquery/no-each-util
                        $.each( this.shortDayNames, function ( k, v ) {
                                this.dayLetters[ k ] = v.substr( 0, 1 );
                        }.bind( this ) );
                        spec.parseValue = this.parseSpecValue;
                        if ( spec.values ) {
                                spec.size = Math.max.apply(
-                                       // eslint-disable-next-line jquery/no-map-util
+                                       // eslint-disable-next-line no-jquery/no-map-util
                                        null, $.map( spec.values, function ( v ) { return v.length; } )
                                );
                        }
index 3c939ab..b1ab0d2 100644 (file)
                $headRow.append( $( '<td>' ).text( '\u00A0' ) );
 
                // Iterate over the columns object (ignore the value)
-               // eslint-disable-next-line jquery/no-each-util
+               // eslint-disable-next-line no-jquery/no-each-util
                $.each( this.columns, function ( columnLabel ) {
                        $headRow.append( $( '<th>' ).html( columnLabel ) );
                } );
                $thead.append( $headRow );
 
                // Build table
-               // eslint-disable-next-line jquery/no-each-util
+               // eslint-disable-next-line no-jquery/no-each-util
                $.each( this.rows, function ( rowLabel, rowTag ) {
                        var $row = $( '<tr>' ),
                                labelField = new OO.ui.FieldLayout(
@@ -65,7 +65,7 @@
                        $row.append( $( '<td>' ).append( labelField.$element ) );
 
                        // Columns
-                       // eslint-disable-next-line jquery/no-each-util
+                       // eslint-disable-next-line no-jquery/no-each-util
                        $.each( widget.columns, function ( columnLabel, columnTag ) {
                                var thisTag = columnTag + '-' + rowTag,
                                        checkbox = new OO.ui.CheckboxInputWidget( {
                // setDisabled sometimes gets called before the widget is ready
                if ( this.checkboxes && Object.keys( this.checkboxes ).length > 0 ) {
                        // Propagate to all checkboxes and update their disabled state
-                       // eslint-disable-next-line jquery/no-each-util
+                       // eslint-disable-next-line no-jquery/no-each-util
                        $.each( this.checkboxes, function ( name, checkbox ) {
                                checkbox.setDisabled( widget.isTagDisabled( name ) );
                        } );
index 7b9f71b..15f0d66 100644 (file)
@@ -45,7 +45,7 @@
                        exclude = config.exclude || [],
                        mainNamespace = mw.config.get( 'wgNamespaceIds' )[ '' ];
 
-               // eslint-disable-next-line jquery/no-map-util
+               // eslint-disable-next-line no-jquery/no-map-util
                options = $.map( mw.config.get( 'wgFormattedNamespaces' ), function ( name, ns ) {
                        if ( ns < mainNamespace || exclude.indexOf( Number( ns ) ) !== -1 ) {
                                return null; // skip
index 55d8cf5..818ad89 100644 (file)
                        urls = data.data[ 3 ],
                        self = this;
 
-               // eslint-disable-next-line jquery/no-each-util
+               // eslint-disable-next-line no-jquery/no-each-util
                $.each( titles, function ( i, result ) {
                        items.push( new mw.widgets.TitleOptionWidget(
                                self.getOptionWidgetData(
index a151080..f20481b 100644 (file)
@@ -616,6 +616,9 @@ class BlockTest extends MediaWikiLangTestCase {
         * @covers Block::appliesToTitle
         */
        public function testAppliesToTitleReturnsTrueOnSitewideBlock() {
+               $this->setMwGlobals( [
+                       'wgBlockDisablesLogin' => false,
+               ] );
                $user = $this->getTestUser()->getUser();
                $block = new Block( [
                        'expiry' => wfTimestamp( TS_MW, wfTimestamp() + ( 40 * 60 * 60 ) ),
@@ -642,6 +645,9 @@ class BlockTest extends MediaWikiLangTestCase {
         * @covers Block::appliesToTitle
         */
        public function testAppliesToTitleOnPartialBlock() {
+               $this->setMwGlobals( [
+                       'wgBlockDisablesLogin' => false,
+               ] );
                $user = $this->getTestUser()->getUser();
                $block = new Block( [
                        'expiry' => wfTimestamp( TS_MW, wfTimestamp() + ( 40 * 60 * 60 ) ),
@@ -673,6 +679,9 @@ class BlockTest extends MediaWikiLangTestCase {
         * @covers Block::appliesToPage
         */
        public function testAppliesToReturnsTrueOnSitewideBlock() {
+               $this->setMwGlobals( [
+                       'wgBlockDisablesLogin' => false,
+               ] );
                $user = $this->getTestUser()->getUser();
                $block = new Block( [
                        'expiry' => wfTimestamp( TS_MW, wfTimestamp() + ( 40 * 60 * 60 ) ),
@@ -697,6 +706,9 @@ class BlockTest extends MediaWikiLangTestCase {
         * @covers Block::appliesToPage
         */
        public function testAppliesToPageOnPartialPageBlock() {
+               $this->setMwGlobals( [
+                       'wgBlockDisablesLogin' => false,
+               ] );
                $user = $this->getTestUser()->getUser();
                $block = new Block( [
                        'expiry' => wfTimestamp( TS_MW, wfTimestamp() + ( 40 * 60 * 60 ) ),
@@ -725,6 +737,9 @@ class BlockTest extends MediaWikiLangTestCase {
         * @covers Block::appliesToNamespace
         */
        public function testAppliesToNamespaceOnPartialNamespaceBlock() {
+               $this->setMwGlobals( [
+                       'wgBlockDisablesLogin' => false,
+               ] );
                $user = $this->getTestUser()->getUser();
                $block = new Block( [
                        'expiry' => wfTimestamp( TS_MW, wfTimestamp() + ( 40 * 60 * 60 ) ),
@@ -749,6 +764,9 @@ class BlockTest extends MediaWikiLangTestCase {
         * @covers Block::prevents
         */
        public function testBlockAllowsPurge() {
+               $this->setMwGlobals( [
+                       'wgBlockDisablesLogin' => false,
+               ] );
                $block = new Block();
                $this->assertFalse( $block->prevents( 'purge' ) );
        }
index 7361047..9c08b9f 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\IMaintainableDatabase;
 use Wikimedia\ScopedCallback;
 use Wikimedia\TestingAccessWrapper;
 
index 7d40d8c..7bb5c38 100644 (file)
@@ -2531,7 +2531,7 @@ class OutputPageTest extends MediaWikiTestCase {
                $nonce->setAccessible( true );
                $nonce->setValue( $out, 'secret' );
                $rl = $out->getResourceLoader();
-               $rl->setMessageBlobStore( new NullMessageBlobStore() );
+               $rl->setMessageBlobStore( $this->createMock( MessageBlobStore::class ) );
                $rl->register( [
                        'test.foo' => new ResourceLoaderTestModule( [
                                'script' => 'mw.test.foo( { a: true } );',
@@ -2647,7 +2647,7 @@ class OutputPageTest extends MediaWikiTestCase {
                        ->method( 'buildCssLinksArray' )
                        ->willReturn( [] );
                $rl = $op->getResourceLoader();
-               $rl->setMessageBlobStore( new NullMessageBlobStore() );
+               $rl->setMessageBlobStore( $this->createMock( MessageBlobStore::class ) );
 
                // Register custom modules
                $rl->register( [
@@ -3051,21 +3051,3 @@ class OutputPageTest extends MediaWikiTestCase {
                return new OutputPage( $context );
        }
 }
-
-/**
- * MessageBlobStore that doesn't do anything
- */
-class NullMessageBlobStore extends MessageBlobStore {
-       public function get( ResourceLoader $resourceLoader, $modules, $lang ) {
-               return [];
-       }
-
-       public function updateModule( $name, ResourceLoaderModule $module, $lang ) {
-       }
-
-       public function updateMessage( $key ) {
-       }
-
-       public function clear() {
-       }
-}
index ea26808..1b6ff2a 100644 (file)
@@ -39,7 +39,7 @@ class SlotRecordTest extends MediaWikiTestCase {
                $this->assertTrue( $record->hasContentId() );
                $this->assertTrue( $record->hasRevision() );
                $this->assertTrue( $record->isInherited() );
-               $this->assertSame( 'A', $record->getContent()->getNativeData() );
+               $this->assertSame( 'A', $record->getContent()->getText() );
                $this->assertSame( 5, $record->getSize() );
                $this->assertSame( 'someHash', $record->getSha1() );
                $this->assertSame( CONTENT_MODEL_WIKITEXT, $record->getModel() );
@@ -75,7 +75,7 @@ class SlotRecordTest extends MediaWikiTestCase {
                $this->assertTrue( $record->hasRevision() );
                $this->assertFalse( $record->hasContentId() );
                $this->assertFalse( $record->isInherited() );
-               $this->assertSame( 'A', $record->getContent()->getNativeData() );
+               $this->assertSame( 'A', $record->getContent()->getText() );
                $this->assertSame( 1, $record->getSize() );
                $this->assertNotNull( $record->getSha1() );
                $this->assertSame( CONTENT_MODEL_WIKITEXT, $record->getModel() );
@@ -94,7 +94,7 @@ class SlotRecordTest extends MediaWikiTestCase {
                $this->assertFalse( $record->hasRevision() );
                $this->assertFalse( $record->isInherited() );
                $this->assertFalse( $record->hasOrigin() );
-               $this->assertSame( 'A', $record->getContent()->getNativeData() );
+               $this->assertSame( 'A', $record->getContent()->getText() );
                $this->assertSame( 1, $record->getSize() );
                $this->assertNotNull( $record->getSha1() );
                $this->assertSame( CONTENT_MODEL_WIKITEXT, $record->getModel() );
@@ -237,7 +237,7 @@ class SlotRecordTest extends MediaWikiTestCase {
                $this->assertTrue( $saved->hasContentId() );
                $this->assertSame( 'theNewAddress', $saved->getAddress() );
                $this->assertSame( 20, $saved->getContentId() );
-               $this->assertSame( 'A', $saved->getContent()->getNativeData() );
+               $this->assertSame( 'A', $saved->getContent()->getText() );
                $this->assertSame( 10, $saved->getRevision() );
                $this->assertSame( 10, $saved->getOrigin() );
 
index 339dc30..a17d21d 100644 (file)
@@ -657,7 +657,7 @@ abstract class RevisionDbTestBase extends MediaWikiTestCase {
                        'new null revision should have the same SHA1 as the original revision' );
                $this->assertTrue( $orig->getRevisionRecord()->hasSameContent( $rev->getRevisionRecord() ),
                        'new null revision should have the same content as the original revision' );
-               $this->assertEquals( __METHOD__, $rev->getContent()->getNativeData() );
+               $this->assertEquals( __METHOD__, $rev->getContent()->getText() );
        }
 
        /**
@@ -1379,7 +1379,7 @@ abstract class RevisionDbTestBase extends MediaWikiTestCase {
                );
                $rev = $this->testPage->getRevision();
 
-               $this->assertSame( $expectedText, $rev->getContent()->getNativeData() );
+               $this->assertSame( $expectedText, $rev->getContent()->getText() );
                $this->assertSame( $expectedText, $rev->getSerializedData() );
                $this->assertSame( $this->testPage->getContentModel(), $rev->getContentModel() );
                $this->assertSame( $this->testPage->getContent()->getDefaultFormat(), $rev->getContentFormat() );
index 8049a47..4600551 100644 (file)
@@ -1343,6 +1343,54 @@ class ApiBaseTest extends ApiTestCase {
                ], $user ) );
        }
 
+       public function testAddBlockInfoToStatus() {
+               $mock = new MockApi();
+
+               // Sanity check empty array
+               $expect = Status::newGood();
+               $test = Status::newGood();
+               $mock->addBlockInfoToStatus( $test );
+               $this->assertEquals( $expect, $test );
+
+               // No blocked $user, so no special block handling
+               $expect = Status::newGood();
+               $expect->fatal( 'blockedtext' );
+               $expect->fatal( 'autoblockedtext' );
+               $expect->fatal( 'systemblockedtext' );
+               $expect->fatal( 'mainpage' );
+               $expect->fatal( 'parentheses', 'foobar' );
+               $test = clone $expect;
+               $mock->addBlockInfoToStatus( $test );
+               $this->assertEquals( $expect, $test );
+
+               // Has a blocked $user, so special block handling
+               $user = $this->getMutableTestUser()->getUser();
+               $block = new \Block( [
+                       'address' => $user->getName(),
+                       'user' => $user->getID(),
+                       'by' => $this->getTestSysop()->getUser()->getId(),
+                       'reason' => __METHOD__,
+                       'expiry' => time() + 100500,
+               ] );
+               $block->insert();
+               $blockinfo = [ 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $block ) ];
+
+               $expect = Status::newGood();
+               $expect->fatal( ApiMessage::create( 'apierror-blocked', 'blocked', $blockinfo ) );
+               $expect->fatal( ApiMessage::create( 'apierror-autoblocked', 'autoblocked', $blockinfo ) );
+               $expect->fatal( ApiMessage::create( 'apierror-systemblocked', 'blocked', $blockinfo ) );
+               $expect->fatal( 'mainpage' );
+               $expect->fatal( 'parentheses', 'foobar' );
+               $test = Status::newGood();
+               $test->fatal( 'blockedtext' );
+               $test->fatal( 'autoblockedtext' );
+               $test->fatal( 'systemblockedtext' );
+               $test->fatal( 'mainpage' );
+               $test->fatal( 'parentheses', 'foobar' );
+               $mock->addBlockInfoToStatus( $test, $user );
+               $this->assertEquals( $expect, $test );
+       }
+
        public function testDieStatus() {
                $mock = new MockApi();
 
index 2161093..1706ad1 100644 (file)
@@ -152,7 +152,7 @@ class ApiEditPageTest extends ApiTestCase {
                $content = $page->getContent();
                $this->assertNotNull( $content, 'Page should have been created' );
 
-               $text = $content->getNativeData();
+               $text = $content->getText();
 
                $this->assertSame( $expected, $text );
        }
@@ -176,7 +176,7 @@ class ApiEditPageTest extends ApiTestCase {
                $this->assertSame( 'Success', $re['edit']['result'] );
                $newtext = WikiPage::factory( Title::newFromText( $name ) )
                        ->getContent( Revision::RAW )
-                       ->getNativeData();
+                       ->getText();
                $this->assertSame( "==section 1==\nnew content 1\n\n==section 2==\ncontent2", $newtext );
 
                // Test that we raise a 'nosuchsection' error
@@ -216,7 +216,7 @@ class ApiEditPageTest extends ApiTestCase {
                // Check the page text is correct
                $text = WikiPage::factory( Title::newFromText( $name ) )
                        ->getContent( Revision::RAW )
-                       ->getNativeData();
+                       ->getText();
                $this->assertSame( "== header ==\n\ntest", $text );
 
                // Now on one that does
@@ -232,7 +232,7 @@ class ApiEditPageTest extends ApiTestCase {
                $this->assertSame( 'Success', $re2['edit']['result'] );
                $text = WikiPage::factory( Title::newFromText( $name ) )
                        ->getContent( Revision::RAW )
-                       ->getNativeData();
+                       ->getText();
                $this->assertSame( "== header ==\n\ntest\n\n== header ==\n\ntest", $text );
        }
 
@@ -733,7 +733,7 @@ class ApiEditPageTest extends ApiTestCase {
                        'undoafter' => $revId1,
                ] );
 
-               $text = ( new WikiPage( $titleObj ) )->getContent()->getNativeData();
+               $text = ( new WikiPage( $titleObj ) )->getContent()->getText();
 
                // This is wrong!  It should be 1.  But let's test for our incorrect
                // behavior for now, so if someone fixes it they'll fix the test as
@@ -761,7 +761,7 @@ class ApiEditPageTest extends ApiTestCase {
                ] );
 
                $text = ( new WikiPage( Title::newFromText( $name ) ) )->getContent()
-                       ->getNativeData();
+                       ->getText();
                $this->assertSame( '3', $text );
        }
 
@@ -784,7 +784,7 @@ class ApiEditPageTest extends ApiTestCase {
                ] );
 
                $text = ( new WikiPage( Title::newFromText( $name ) ) )->getContent()
-                       ->getNativeData();
+                       ->getText();
                $this->assertSame( '1', $text );
        }
 
@@ -855,7 +855,7 @@ class ApiEditPageTest extends ApiTestCase {
                ] );
 
                $text = ( new WikiPage( Title::newFromText( $name ) ) )
-                       ->getContent()->getNativeData();
+                       ->getContent()->getText();
                $this->assertSame( 'Alert: Some text', $text );
        }
 
@@ -872,7 +872,7 @@ class ApiEditPageTest extends ApiTestCase {
                ] );
 
                $text = ( new WikiPage( Title::newFromText( $name ) ) )
-                       ->getContent()->getNativeData();
+                       ->getContent()->getText();
                $this->assertSame( 'Some text is nice', $text );
        }
 
@@ -890,7 +890,7 @@ class ApiEditPageTest extends ApiTestCase {
                ] );
 
                $text = ( new WikiPage( Title::newFromText( $name ) ) )
-                       ->getContent()->getNativeData();
+                       ->getContent()->getText();
                $this->assertSame( 'Alert: Some text is nice', $text );
        }
 
@@ -957,7 +957,7 @@ class ApiEditPageTest extends ApiTestCase {
                } finally {
                        // Validate that content was not changed
                        $text = ( new WikiPage( Title::newFromText( $name ) ) )
-                               ->getContent()->getNativeData();
+                               ->getContent()->getText();
 
                        $this->assertSame( 'Some text', $text );
                }
@@ -1059,7 +1059,7 @@ class ApiEditPageTest extends ApiTestCase {
                ] );
 
                $text = ( new WikiPage( Title::newFromText( $name ) ) )
-                       ->getContent()->getNativeData();
+                       ->getContent()->getText();
 
                $this->assertSame( "Initial content\n\n== New section ==", $text );
        }
@@ -1097,7 +1097,7 @@ class ApiEditPageTest extends ApiTestCase {
                $page = new WikiPage( Title::newFromText( $name ) );
 
                $this->assertSame( "Initial content\n\n== My section ==\n\nMore content",
-                       $page->getContent()->getNativeData() );
+                       $page->getContent()->getText() );
                $this->assertSame( '/* My section */ new section',
                        $page->getRevision()->getComment() );
        }
@@ -1118,7 +1118,7 @@ class ApiEditPageTest extends ApiTestCase {
                $page = new WikiPage( Title::newFromText( $name ) );
 
                $this->assertSame( "Initial content\n\n== Add new section ==\n\nMore content",
-                       $page->getContent()->getNativeData() );
+                       $page->getContent()->getText() );
                // EditPage actually assumes the summary is the section name here
                $this->assertSame( '/* Add new section */ new section',
                        $page->getRevision()->getComment() );
@@ -1141,7 +1141,7 @@ class ApiEditPageTest extends ApiTestCase {
                $page = new WikiPage( Title::newFromText( $name ) );
 
                $this->assertSame( "Initial content\n\n== My section ==\n\nMore content",
-                       $page->getContent()->getNativeData() );
+                       $page->getContent()->getText() );
                $this->assertSame( 'Add new section',
                        $page->getRevision()->getComment() );
        }
@@ -1160,7 +1160,7 @@ class ApiEditPageTest extends ApiTestCase {
                ] );
 
                $text = ( new WikiPage( Title::newFromText( $name ) ) )
-                       ->getContent()->getNativeData();
+                       ->getContent()->getText();
 
                $this->assertSame( "== Section 1 ==\n\nContent and more content\n\n" .
                        "== Section 2 ==\n\nFascinating!", $text );
@@ -1179,7 +1179,7 @@ class ApiEditPageTest extends ApiTestCase {
                ] );
 
                $text = ( new WikiPage( Title::newFromText( $name ) ) )
-                       ->getContent()->getNativeData();
+                       ->getContent()->getText();
 
                $this->assertSame( "Content and more content\n\n== Section 1 ==\n\n" .
                        "Fascinating!", $text );
@@ -1201,7 +1201,7 @@ class ApiEditPageTest extends ApiTestCase {
                        ] );
                } finally {
                        $text = ( new WikiPage( Title::newFromText( $name ) ) )
-                               ->getContent()->getNativeData();
+                               ->getContent()->getText();
 
                        $this->assertSame( 'Content', $text );
                }
@@ -1223,7 +1223,7 @@ class ApiEditPageTest extends ApiTestCase {
                        ] );
                } finally {
                        $text = ( new WikiPage( Title::newFromText( $name ) ) )
-                               ->getContent()->getNativeData();
+                               ->getContent()->getText();
 
                        $this->assertSame( 'Content', $text );
                }
@@ -1474,8 +1474,7 @@ class ApiEditPageTest extends ApiTestCase {
        public function testEditWhileBlocked() {
                $name = 'Help:' . ucfirst( __FUNCTION__ );
 
-               $this->setExpectedException( ApiUsageException::class,
-                       'You have been blocked from editing.' );
+               $this->assertNull( Block::newFromTarget( '127.0.0.1' ), 'Sanity check' );
 
                $block = new Block( [
                        'address' => self::$users['sysop']->getUser()->getName(),
@@ -1483,6 +1482,7 @@ class ApiEditPageTest extends ApiTestCase {
                        'reason' => 'Capriciousness',
                        'timestamp' => '19370101000000',
                        'expiry' => 'infinity',
+                       'enableAutoblock' => true,
                ] );
                $block->insert();
 
@@ -1492,6 +1492,10 @@ class ApiEditPageTest extends ApiTestCase {
                                'title' => $name,
                                'text' => 'Some text',
                        ] );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( ApiUsageException $ex ) {
+                       $this->assertSame( 'You have been blocked from editing.', $ex->getMessage() );
+                       $this->assertNotNull( Block::newFromTarget( '127.0.0.1' ), 'Autoblock spread' );
                } finally {
                        $block->delete();
                        self::$users['sysop']->getUser()->clearInstanceCache();
index 1e66a7d..b9c49b1 100644 (file)
@@ -130,6 +130,39 @@ class ApiMoveTest extends ApiTestCase {
                }
        }
 
+       public function testMoveWhileBlocked() {
+               $this->assertNull( Block::newFromTarget( '127.0.0.1' ), 'Sanity check' );
+
+               $block = new Block( [
+                       'address' => self::$users['sysop']->getUser()->getName(),
+                       'by' => self::$users['sysop']->getUser()->getId(),
+                       'reason' => 'Capriciousness',
+                       'timestamp' => '19370101000000',
+                       'expiry' => 'infinity',
+                       'enableAutoblock' => true,
+               ] );
+               $block->insert();
+
+               $name = ucfirst( __FUNCTION__ );
+               $id = $this->createPage( $name );
+
+               try {
+                       $this->doApiRequestWithToken( [
+                               'action' => 'move',
+                               'from' => $name,
+                               'to' => "$name 2",
+                       ] );
+                       $this->fail( 'Expected exception not thrown' );
+               } catch ( ApiUsageException $ex ) {
+                       $this->assertSame( 'You have been blocked from editing.', $ex->getMessage() );
+                       $this->assertNotNull( Block::newFromTarget( '127.0.0.1' ), 'Autoblock spread' );
+               } finally {
+                       $block->delete();
+                       self::$users['sysop']->getUser()->clearInstanceCache();
+                       $this->assertSame( $id, Title::newFromText( $name )->getArticleID() );
+               }
+       }
+
        // @todo File moving
 
        public function testPingLimiter() {
index dc4ab6f..1ee4a03 100644 (file)
@@ -26,18 +26,32 @@ class TemporaryPasswordAuthenticationRequestTest extends AuthenticationRequestTe
                global $wgPasswordPolicy;
 
                $policy = $wgPasswordPolicy;
-               $policy['policies']['default'] += [
+               unset( $policy['policies'] );
+               $policy['policies']['default'] = [
                        'MinimalPasswordLength' => 1,
-                       'MinimalPasswordLengthToLogin' => 1,
+                       'MinimumPasswordLengthToLogin' => 1,
                ];
 
-               $this->setMwGlobals( 'wgPasswordPolicy', $policy );
+               $this->setMwGlobals( [
+                       'wgMinimalPasswordLength' => 10,
+                       'wgPasswordPolicy' => $policy,
+               ] );
 
                $ret1 = TemporaryPasswordAuthenticationRequest::newRandom();
                $ret2 = TemporaryPasswordAuthenticationRequest::newRandom();
-               $this->assertNotSame( '', $ret1->password );
-               $this->assertNotSame( '', $ret2->password );
+               $this->assertEquals( 10, strlen( $ret1->password ) );
+               $this->assertEquals( 10, strlen( $ret2->password ) );
                $this->assertNotSame( $ret1->password, $ret2->password );
+
+               $policy['policies']['default']['MinimalPasswordLength'] = 15;
+               $this->setMwGlobals( 'wgPasswordPolicy', $policy );
+               $ret = TemporaryPasswordAuthenticationRequest::newRandom();
+               $this->assertEquals( 15, strlen( $ret->password ) );
+
+               $policy['policies']['default']['MinimalPasswordLength'] = [ 'value' => 20 ];
+               $this->setMwGlobals( 'wgPasswordPolicy', $policy );
+               $ret = TemporaryPasswordAuthenticationRequest::newRandom();
+               $this->assertEquals( 20, strlen( $ret->password ) );
        }
 
        public function testNewInvalid() {
index 2d78018..5bbd3d0 100644 (file)
@@ -25,6 +25,9 @@ class BlockRestrictionTest extends \MediaWikiLangTestCase {
         * @covers ::rowToRestriction
         */
        public function testLoadMultipleRestrictions() {
+               $this->setMwGlobals( [
+                       'wgBlockDisablesLogin' => false,
+               ] );
                $block = $this->insertBlock();
 
                $pageFoo = $this->getExistingTestPage( 'Foo' );
index c760d02..47cdb15 100644 (file)
@@ -7,7 +7,7 @@ class CustomDifferenceEngine extends DifferenceEngine {
        }
 
        public function generateContentDiffBody( Content $old, Content $new ) {
-               return $old->getNativeData() . '|' . $new->getNativeData();
+               return $old->getText() . '|' . $new->getText();
        }
 
        public function showDiffStyle() {
index 892bdcf..2b81222 100644 (file)
@@ -33,7 +33,7 @@ class ImportTest extends MediaWikiLangTestCase {
                $title = Title::newFromText( $title );
                $this->assertTrue( $title->exists() );
 
-               $this->assertEquals( WikiPage::factory( $title )->getContent()->getNativeData(), $text );
+               $this->assertEquals( WikiPage::factory( $title )->getContent()->getText(), $text );
        }
 
        public function getUnknownTagsXML() {
index 369b2bf..d9b7e18 100644 (file)
@@ -30,9 +30,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                parent::setUp();
 
                $this->cache = new WANObjectCache( [
-                       'cache' => new HashBagOStuff(),
-                       'pool' => 'testcache-hash',
-                       'relayer' => new EventRelayerNull( [] )
+                       'cache' => new HashBagOStuff()
                ] );
 
                $wanCache = TestingAccessWrapper::newFromObject( $this->cache );
@@ -440,8 +438,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                };
 
                $cache = new NearExpiringWANObjectCache( [
-                       'cache'        => new HashBagOStuff(),
-                       'pool'         => 'empty',
+                       'cache'        => new HashBagOStuff()
                ] );
 
                $wasSet = 0;
@@ -468,7 +465,6 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                };
                $cache = new NearExpiringWANObjectCache( [
                        'cache'        => new HashBagOStuff(),
-                       'pool'         => 'empty',
                        'asyncHandler' => $asyncHandler
                ] );
 
@@ -500,8 +496,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $this->assertEquals( $value, $v, "New value stored" );
 
                $cache = new PopularityRefreshingWANObjectCache( [
-                       'cache'   => new HashBagOStuff(),
-                       'pool'    => 'empty'
+                       'cache'   => new HashBagOStuff()
                ] );
 
                $mockWallClock = $priorTime;
@@ -694,7 +689,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                        WANObjectCache::VALUE_KEY_PREFIX . 'k1' => 'val-id1',
                        WANObjectCache::VALUE_KEY_PREFIX . 'k2' => 'val-id2'
                ] );
-               $wanCache = new WANObjectCache( [ 'cache' => $localBag, 'pool' => 'testcache-hash' ] );
+               $wanCache = new WANObjectCache( [ 'cache' => $localBag ] );
 
                // Warm the process cache
                $keyedIds = new ArrayIterator( [ 'k1' => 'id1', 'k2' => 'id2' ] );
@@ -1504,9 +1499,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                        ->willReturn( false );
 
                $wanCache = new WANObjectCache( [
-                       'cache' => $backend,
-                       'pool' => 'testcache-hash',
-                       'relayer' => new EventRelayerNull( [] )
+                       'cache' => $backend
                ] );
 
                $isStale = null;
@@ -1556,8 +1549,6 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $localBag->expects( $this->never() )->method( 'delete' );
                $wanCache = new WANObjectCache( [
                        'cache' => $localBag,
-                       'pool' => 'testcache-hash',
-                       'relayer' => new EventRelayerNull( [] ),
                        'mcrouterAware' => true,
                        'region' => 'pmtpa',
                        'cluster' => 'mw-wan'
@@ -1582,8 +1573,6 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                        ->setMethods( [ 'set' ] )->getMock();
                $wanCache = new WANObjectCache( [
                        'cache' => $localBag,
-                       'pool' => 'testcache-hash',
-                       'relayer' => new EventRelayerNull( [] ),
                        'mcrouterAware' => true,
                        'region' => 'pmtpa',
                        'cluster' => 'mw-wan'
@@ -1600,8 +1589,6 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                        ->setMethods( [ 'set' ] )->getMock();
                $wanCache = new WANObjectCache( [
                        'cache' => $localBag,
-                       'pool' => 'testcache-hash',
-                       'relayer' => new EventRelayerNull( [] ),
                        'mcrouterAware' => true,
                        'region' => 'pmtpa',
                        'cluster' => 'mw-wan'
@@ -1618,8 +1605,6 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                        ->setMethods( [ 'delete' ] )->getMock();
                $wanCache = new WANObjectCache( [
                        'cache' => $localBag,
-                       'pool' => 'testcache-hash',
-                       'relayer' => new EventRelayerNull( [] ),
                        'mcrouterAware' => true,
                        'region' => 'pmtpa',
                        'cluster' => 'mw-wan'
@@ -1633,7 +1618,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
 
        public function testEpoch() {
                $bag = new HashBagOStuff();
-               $cache = new WANObjectCache( [ 'cache' => $bag, 'pool' => 'testcache-hash' ] );
+               $cache = new WANObjectCache( [ 'cache' => $bag ] );
                $key = $cache->makeGlobalKey( 'The whole of the Law' );
 
                $now = microtime( true );
@@ -1649,7 +1634,6 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
 
                $cache = new WANObjectCache( [
                        'cache' => $bag,
-                       'pool' => 'testcache-hash',
                        'epoch' => $now - 3600
                ] );
                $cache->setMockTime( $now );
@@ -1660,7 +1644,6 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                $now += 30;
                $cache = new WANObjectCache( [
                        'cache' => $bag,
-                       'pool' => 'testcache-hash',
                        'epoch' => $now + 3600
                ] );
                $cache->setMockTime( $now );
@@ -1746,9 +1729,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                        ->willReturn( 'special' );
 
                $wanCache = new WANObjectCache( [
-                       'cache' => $backend,
-                       'pool' => 'testcache-hash',
-                       'relayer' => new EventRelayerNull( [] )
+                       'cache' => $backend
                ] );
 
                $this->assertSame( 'special', $wanCache->makeKey( 'a', 'b' ) );
@@ -1764,9 +1745,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
                        ->willReturn( 'special' );
 
                $wanCache = new WANObjectCache( [
-                       'cache' => $backend,
-                       'pool' => 'testcache-hash',
-                       'relayer' => new EventRelayerNull( [] )
+                       'cache' => $backend
                ] );
 
                $this->assertSame( 'special', $wanCache->makeGlobalKey( 'a', 'b' ) );
@@ -1787,9 +1766,7 @@ class WANObjectCacheTest extends PHPUnit\Framework\TestCase {
         */
        public function testStatsKeyClass( $key, $class ) {
                $wanCache = TestingAccessWrapper::newFromObject( new WANObjectCache( [
-                       'cache' => new HashBagOStuff,
-                       'pool' => 'testcache-hash',
-                       'relayer' => new EventRelayerNull( [] )
+                       'cache' => new HashBagOStuff
                ] ) );
 
                $this->assertEquals( $class, $wanCache->determineKeyClass( $key ) );
index 466e209..524fbdc 100644 (file)
@@ -190,8 +190,7 @@ class ArticleViewTest extends MediaWikiTestCase {
                        ->willReturn( new ParserOutput( 'Structured Output' ) );
                $content->method( 'getModel' )
                        ->willReturn( 'NotText' );
-               $content->method( 'getNativeData' )
-                       ->willReturn( [ (object)[ 'x' => 'stuff' ] ] );
+               $content->expects( $this->never() )->method( 'getNativeData' );
                $content->method( 'copy' )
                        ->willReturn( $content );
 
@@ -447,7 +446,7 @@ class ArticleViewTest extends MediaWikiTestCase {
                        'ArticleContentViewCustom',
                        function ( Content $content, Title $title, OutputPage $output ) use ( $page ) {
                                $this->assertSame( $page->getTitle(), $title, '$title' );
-                               $this->assertSame( 'Test A', $content->getNativeData(), '$content' );
+                               $this->assertSame( 'Test A', $content->getText(), '$content' );
 
                                $output->addHTML( 'Hook Text' );
                                return false;
@@ -483,9 +482,8 @@ class ArticleViewTest extends MediaWikiTestCase {
                        'ArticleRevisionViewCustom',
                        function ( RevisionRecord $rev, Title $title, $oldid, OutputPage $output ) use ( $page ) {
                                $content = $rev->getContent( SlotRecord::MAIN );
-
                                $this->assertSame( $page->getTitle(), $title, '$title' );
-                               $this->assertSame( 'Test A', $content->getNativeData(), '$content' );
+                               $this->assertSame( 'Test A', $content->getText(), '$content' );
 
                                $output->addHTML( 'Hook Text' );
                                return false;
@@ -517,7 +515,7 @@ class ArticleViewTest extends MediaWikiTestCase {
                        'ArticleAfterFetchContentObject',
                        function ( Article &$articlePage, Content &$content ) use ( $page, $article ) {
                                $this->assertSame( $article, $articlePage, '$articlePage' );
-                               $this->assertSame( 'Test A', $content->getNativeData(), '$content' );
+                               $this->assertSame( 'Test A', $content->getText(), '$content' );
 
                                $content = new WikitextContent( 'Hook Text' );
                        }
index 933e47d..e4134b8 100644 (file)
@@ -737,7 +737,7 @@ abstract class WikiPageDbTestBase extends MediaWikiLangTestCase {
                $rev = $page->getRevision();
 
                $this->assertEquals( $page->getLatest(), $rev->getId() );
-               $this->assertEquals( "some text", $rev->getContent()->getNativeData() );
+               $this->assertEquals( "some text", $rev->getContent()->getText() );
        }
 
        /**
@@ -753,7 +753,7 @@ abstract class WikiPageDbTestBase extends MediaWikiLangTestCase {
                $this->createPage( $page, "some text", CONTENT_MODEL_WIKITEXT );
 
                $content = $page->getContent();
-               $this->assertEquals( "some text", $content->getNativeData() );
+               $this->assertEquals( "some text", $content->getText() );
        }
 
        /**
@@ -1111,7 +1111,7 @@ more stuff
                $content = ContentHandler::makeContent( $with, $page->getTitle(), $page->getContentModel() );
                $c = $page->replaceSectionContent( $section, $content, $sectionTitle );
 
-               $this->assertEquals( $expected, is_null( $c ) ? null : trim( $c->getNativeData() ) );
+               $this->assertEquals( $expected, is_null( $c ) ? null : trim( $c->getText() ) );
        }
 
        /**
@@ -1127,7 +1127,7 @@ more stuff
                $content = ContentHandler::makeContent( $with, $page->getTitle(), $page->getContentModel() );
                $c = $page->replaceSectionAtRev( $section, $content, $sectionTitle, $baseRevId );
 
-               $this->assertEquals( $expected, is_null( $c ) ? null : trim( $c->getNativeData() ) );
+               $this->assertEquals( $expected, is_null( $c ) ? null : trim( $c->getText() ) );
        }
 
        /**
@@ -1242,7 +1242,7 @@ more stuff
                $page = new WikiPage( $page->getTitle() );
                $this->assertEquals( $rev2->getSha1(), $page->getRevision()->getSha1(),
                        "rollback did not revert to the correct revision" );
-               $this->assertEquals( "one\n\ntwo", $page->getContent()->getNativeData() );
+               $this->assertEquals( "one\n\ntwo", $page->getContent()->getText() );
 
                $rc = MediaWikiServices::getInstance()->getRevisionStore()->getRecentChange(
                        $page->getRevision()->getRevisionRecord()
@@ -1332,7 +1332,7 @@ more stuff
                $page = new WikiPage( $page->getTitle() );
                $this->assertEquals( $rev1->getSha1(), $page->getRevision()->getSha1(),
                        "rollback did not revert to the correct revision" );
-               $this->assertEquals( "one", $page->getContent()->getNativeData() );
+               $this->assertEquals( "one", $page->getContent()->getText() );
        }
 
        /**
@@ -1817,8 +1817,8 @@ more stuff
                $fetchedPage = WikiPage::newFromID( $createdPage->getId() );
                $this->assertSame( $createdPage->getId(), $fetchedPage->getId() );
                $this->assertEquals(
-                       $createdPage->getContent()->getNativeData(),
-                       $fetchedPage->getContent()->getNativeData()
+                       $createdPage->getContent()->getText(),
+                       $fetchedPage->getContent()->getText()
                );
        }
 
diff --git a/tests/phpunit/includes/password/Argon2PasswordTest.php b/tests/phpunit/includes/password/Argon2PasswordTest.php
new file mode 100644 (file)
index 0000000..b518040
--- /dev/null
@@ -0,0 +1,105 @@
+<?php
+
+/**
+ * @group large
+ * @covers Argon2Password
+ * @covers Password
+ * @covers ParameterizedPassword
+ *
+ * @phpcs:disable Generic.Files.LineLength
+ */
+class Argon2PasswordTest extends PasswordTestCase {
+
+       public function setUp() {
+               parent::setUp();
+               if ( !defined( 'PASSWORD_ARGON2I' ) ) {
+                       $this->markTestSkipped( 'Argon2 support not found' );
+               }
+       }
+
+       /**
+        * Return an array of configs to be used for this class's password type.
+        *
+        * @return array[]
+        */
+       protected function getTypeConfigs() {
+               return [
+                       'argon2' => [
+                               'class' => Argon2Password::class,
+                               'algo' => 'argon2i',
+                               'memory_cost' => 1024,
+                               'time_cost' => 2,
+                               'threads' => 2,
+                       ]
+               ];
+       }
+
+       /**
+        * @return array
+        */
+       public static function providePasswordTests() {
+               $result = [
+                       [
+                               true,
+                               ':argon2:$argon2i$v=19$m=1024,t=2,p=2$RHpGTXJPeFlSV2NDTEswNA$VeW7rumZY4pL8XO4KeQkKD43r5uX3eazVJRtrFN7lNc',
+                               'password',
+                       ],
+                       [
+                               true,
+                               ':argon2:$argon2i$v=19$m=2048,t=5,p=3$MHFKSnh6WWZEWkpKa09SUQ$vU92h/8hkByL5VKW1P9amCj054pZILGKznAvKWAivZE',
+                               'password',
+                       ],
+                       [
+                               true,
+                               ':argon2:$argon2i$v=19$m=1024,t=2,p=2$bFJ4TzM5RWh2T0VmeFhDTA$AHFUFZRh69aZYBqyxn6tpujpEcf2JP8wgRCPU3nw3W4',
+                               "pass\x00word",
+                       ],
+                       [
+                               false,
+                               ':argon2:$argon2i$v=19$m=1024,t=2,p=2$UGZqTWJRUkI1alVNTGRUbA$RcASw9XUWjCDO9WNnuVkGkEylURUW/CcNwSffdFwN74',
+                               'password',
+                       ]
+               ];
+
+               if ( defined( 'PASSWORD_ARGON2ID' ) ) {
+                       // @todo: Argon2id cases
+                       $result = array_merge( $result, [] );
+               }
+
+               return $result;
+       }
+
+       /**
+        * @dataProvider provideNeedsUpdate
+        */
+       public function testNeedsUpdate( $updateExpected, $hash ) {
+               $password = $this->passwordFactory->newFromCiphertext( $hash );
+               $this->assertSame( $updateExpected, $password->needsUpdate() );
+       }
+
+       public function provideNeedsUpdate() {
+               return [
+                       [ false, ':argon2:$argon2i$v=19$m=1024,t=2,p=2$bFJ4TzM5RWh2T0VmeFhDTA$AHFUFZRh69aZYBqyxn6tpujpEcf2JP8wgRCPU3nw3W4' ],
+                       [ false, ':argon2:$argon2i$v=19$m=1024,t=2,p=2$<whatever>' ],
+                       [ true, ':argon2:$argon2i$v=19$m=666,t=2,p=2$<whatever>' ],
+                       [ true, ':argon2:$argon2i$v=19$m=1024,t=666,p=2$<whatever>' ],
+                       [ true, ':argon2:$argon2i$v=19$m=1024,t=2,p=666$<whatever>' ],
+               ];
+       }
+
+       public function testPartialConfig() {
+               $factory = new PasswordFactory();
+               $factory->register( 'argon2', [
+                       'class' => Argon2Password::class,
+                       'algo' => 'argon2i',
+               ] );
+
+               $partialPassword = $factory->newFromType( 'argon2' );
+               $partialPassword->crypt( 'password' );
+               $fullPassword = $this->passwordFactory->newFromCiphertext( $partialPassword->toString() );
+
+               $this->assertFalse( $fullPassword->needsUpdate(),
+                       'Options not set for a password should fall back to defaults'
+               );
+       }
+}
index c5d397f..7384310 100644 (file)
@@ -78,6 +78,7 @@ class EncryptedPasswordTest extends PasswordTestCase {
                $this->assertRegExp( '/^:both:aes-256-cbc:1:/', $serialized );
                $fromNewHash = $this->passwordFactory->newFromCiphertext( $serialized );
                $fromPlaintext = $this->passwordFactory->newFromPlaintext( 'password', $fromNewHash );
-               $this->assertTrue( $fromHash->equals( $fromPlaintext ) );
+               $this->assertTrue( $fromPlaintext->verify( 'password' ) );
+               $this->assertTrue( $fromHash->verify( 'password' ) );
        }
 }
index 65c9199..61a5147 100644 (file)
  * @covers InvalidPassword
  */
 class PasswordTest extends MediaWikiTestCase {
-       public function testInvalidUnequalInvalid() {
-               $passwordFactory = new PasswordFactory();
-               $invalid1 = $passwordFactory->newFromCiphertext( null );
-               $invalid2 = $passwordFactory->newFromCiphertext( null );
-
-               $this->assertFalse( $invalid1->equals( $invalid2 ) );
-       }
-
        public function testInvalidPlaintext() {
                $passwordFactory = new PasswordFactory();
                $invalid = $passwordFactory->newFromPlaintext( null );
index 384db5f..d1e2578 100644 (file)
@@ -60,9 +60,8 @@ abstract class PasswordTestCase extends MediaWikiTestCase {
         * @dataProvider providePasswordTests
         */
        public function testHashing( $shouldMatch, $hash, $password ) {
-               $fromHash = $this->passwordFactory->newFromCiphertext( $hash );
-               $fromPassword = $this->passwordFactory->newFromPlaintext( $password, $fromHash );
-               $this->assertSame( $shouldMatch, $fromHash->equals( $fromPassword ) );
+               $passwordObj = $this->passwordFactory->newFromCiphertext( $hash );
+               $this->assertSame( $shouldMatch, $passwordObj->verify( $password ) );
        }
 
        /**
@@ -85,6 +84,7 @@ abstract class PasswordTestCase extends MediaWikiTestCase {
 
                $this->assertFalse( $invalid->equals( $normal ) );
                $this->assertFalse( $normal->equals( $invalid ) );
+               $this->assertFalse( $invalid->verify( $hash ) );
        }
 
        protected function getValidTypes() {
@@ -106,6 +106,13 @@ abstract class PasswordTestCase extends MediaWikiTestCase {
                $fromType = $this->passwordFactory->newFromType( $type );
                $fromType->crypt( 'password' );
                $fromPlaintext = $this->passwordFactory->newFromPlaintext( 'password', $fromType );
-               $this->assertTrue( $fromType->equals( $fromPlaintext ) );
+               $this->assertTrue( $fromType->verify( 'password' ) );
+               $this->assertTrue( $fromPlaintext->verify( 'password' ) );
+               $this->assertFalse( $fromType->verify( 'different password' ) );
+               $this->assertFalse( $fromPlaintext->verify( 'different password' ) );
+               $this->assertEquals( get_class( $fromType ),
+                       get_class( $fromPlaintext ),
+                       'newFromPlaintext() should produce instance of the same class as newFromType()'
+               );
        }
 }
index 58e6d7d..70bf39f 100644 (file)
@@ -9,6 +9,7 @@ use Wikimedia\TestingAccessWrapper;
 class MessageBlobStoreTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
+       use PHPUnit4And6Compat;
 
        protected function setUp() {
                parent::setUp();
@@ -37,7 +38,7 @@ class MessageBlobStoreTest extends PHPUnit\Framework\TestCase {
 
        protected function makeBlobStore( $methods = null, $rl = null ) {
                $blobStore = $this->getMockBuilder( MessageBlobStore::class )
-                       ->setConstructorArgs( [ $rl ] )
+                       ->setConstructorArgs( [ $rl ?? $this->createMock( ResourceLoader::class ) ] )
                        ->setMethods( $methods )
                        ->getMock();
 
index a17f39d..0b3adc0 100644 (file)
@@ -401,6 +401,9 @@ class SpecialBlockTest extends SpecialPageTestBase {
                $expectedResult,
                $reason
        ) {
+               $this->setMwGlobals( [
+                       'wgBlockDisablesLogin' => false,
+               ] );
                $this->setGroupPermissions( 'sysop', 'unblockself', true );
                $this->setGroupPermissions( 'user', 'block', true );
                // Getting errors about creating users in db in provider.
index 6bc7c44..e3cac83 100644 (file)
@@ -104,7 +104,7 @@ class DummyContentForTesting extends AbstractContent {
        public function getParserOutput( Title $title, $revId = null,
                ParserOptions $options = null, $generateHtml = true
        ) {
-               return new ParserOutput( $this->getNativeData() );
+               return new ParserOutput( $this->data );
        }
 
        /**
@@ -118,6 +118,6 @@ class DummyContentForTesting extends AbstractContent {
         */
        protected function fillParserOutput( Title $title, $revId,
                        ParserOptions $options, $generateHtml, ParserOutput &$output ) {
-               $output = new ParserOutput( $this->getNativeData() );
+               $output = new ParserOutput( $this->data );
        }
 }
index e65f522..bdfa8d0 100644 (file)
@@ -102,7 +102,7 @@ class DummyNonTextContent extends AbstractContent {
        public function getParserOutput( Title $title, $revId = null,
                ParserOptions $options = null, $generateHtml = true
        ) {
-               return new ParserOutput( $this->getNativeData() );
+               return new ParserOutput( $this->serialize() );
        }
 
        /**
@@ -116,6 +116,6 @@ class DummyNonTextContent extends AbstractContent {
         */
        protected function fillParserOutput( Title $title, $revId,
                        ParserOptions $options, $generateHtml, ParserOutput &$output ) {
-               $output = new ParserOutput( $this->getNativeData() );
+               $output = new ParserOutput( $this->serialize() );
        }
 }
index 8a08181..776dee1 100644 (file)
@@ -1,8 +1,11 @@
 <?php
+
+use MediaWiki\MediaWikiServices;
+use Wikimedia\TestingAccessWrapper;
+
 /**
  * Sanity checks for making sure registered resources are sane.
  *
- * @file
  * @author Antoine Musso
  * @author Niklas Laxström
  * @author Santhosh Thottingal
@@ -171,8 +174,8 @@ class ResourcesTest extends MediaWikiTestCase {
                $org_wgEnableJavaScriptTest = $wgEnableJavaScriptTest;
                $wgEnableJavaScriptTest = true;
 
-               // Initialize ResourceLoader
-               $rl = new ResourceLoader();
+               // Get main ResourceLoader
+               $rl = MediaWikiServices::getInstance()->getResourceLoader();
 
                $modules = [];
 
@@ -243,9 +246,6 @@ class ResourcesTest extends MediaWikiTestCase {
        /**
         * Get all resource files from modules that are an instance of
         * ResourceLoaderFileModule (or one of its subclasses).
-        *
-        * Since the raw data is stored in protected properties, we have to
-        * overrride this through ReflectionObject methods.
         */
        public static function provideResourceFiles() {
                $data = self::getAllModules();
@@ -273,14 +273,12 @@ class ResourcesTest extends MediaWikiTestCase {
                                continue;
                        }
 
-                       $reflectedModule = new ReflectionObject( $module );
+                       $moduleProxy = TestingAccessWrapper::newFromObject( $module );
 
                        $files = [];
 
                        foreach ( $filePathProps['lists'] as $propName ) {
-                               $property = $reflectedModule->getProperty( $propName );
-                               $property->setAccessible( true );
-                               $list = $property->getValue( $module );
+                               $list = $moduleProxy->$propName;
                                foreach ( $list as $key => $value ) {
                                        // 'scripts' are numeral arrays.
                                        // 'styles' can be numeral or associative.
@@ -295,9 +293,7 @@ class ResourcesTest extends MediaWikiTestCase {
                        }
 
                        foreach ( $filePathProps['nested-lists'] as $propName ) {
-                               $property = $reflectedModule->getProperty( $propName );
-                               $property->setAccessible( true );
-                               $lists = $property->getValue( $module );
+                               $lists = $moduleProxy->$propName;
                                foreach ( $lists as $list ) {
                                        foreach ( $list as $key => $value ) {
                                                // We need the same filter as for 'lists',
@@ -311,29 +307,23 @@ class ResourcesTest extends MediaWikiTestCase {
                                }
                        }
 
-                       // Get method for resolving the paths to full paths
-                       $method = $reflectedModule->getMethod( 'getLocalPath' );
-                       $method->setAccessible( true );
-
                        // Populate cases
                        foreach ( $files as $file ) {
                                $cases[] = [
-                                       $method->invoke( $module, $file ),
+                                       $moduleProxy->getLocalPath( $file ),
                                        $moduleName,
                                        ( $file instanceof ResourceLoaderFilePath ? $file->getPath() : $file ),
                                ];
                        }
 
                        // To populate missingLocalFileRefs. Not sure how sane this is inside this test...
-                       $module->readStyleFiles(
+                       $moduleProxy->readStyleFiles(
                                $module->getStyleFiles( $data['context'] ),
                                $module->getFlip( $data['context'] ),
                                $data['context']
                        );
 
-                       $property = $reflectedModule->getProperty( 'missingLocalFileRefs' );
-                       $property->setAccessible( true );
-                       $missingLocalFileRefs = $property->getValue( $module );
+                       $missingLocalFileRefs = $moduleProxy->missingLocalFileRefs;
 
                        foreach ( $missingLocalFileRefs as $file ) {
                                $cases[] = [
index 26a784a..b5bd882 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @author Sam Smith <samsmith@wikimedia.org>
  */
@@ -7,7 +9,7 @@ class LessTestSuite extends PHPUnit_Framework_TestSuite {
        public function __construct() {
                parent::__construct();
 
-               $resourceLoader = new ResourceLoader();
+               $resourceLoader = MediaWikiServices::getInstance()->getResourceLoader();
 
                foreach ( $resourceLoader->getModuleNames() as $name ) {
                        $module = $resourceLoader->getModule( $name );
index 03b02ba..bce5b16 100644 (file)
@@ -12,6 +12,6 @@
                "valid-jsdoc": "off",
                "qunit/require-expect": "off",
                "qunit/resolve-async": "off",
-               "jquery/no-parse-html-literal": "off"
+               "no-jquery/no-parse-html-literal": "off"
        }
 }
index df3d61b..3e52d8b 100644 (file)
                                // Check for incomplete animations/requests/etc and throw if there are any.
                                if ( $.timers && $.timers.length !== 0 ) {
                                        timers = $.timers.length;
-                                       // eslint-disable-next-line jquery/no-each-util
+                                       // eslint-disable-next-line no-jquery/no-each-util
                                        $.each( $.timers, function ( i, timer ) {
                                                var node = timer.elem;
                                                mw.log.warn( 'Unfinished animation #' + i + ' in ' + timer.queue + ' queue on ' +
                var altPromises = [];
 
                // When we have ES6 support we'll be able to use Array.from here
-               // eslint-disable-next-line jquery/no-each-util
+               // eslint-disable-next-line no-jquery/no-each-util
                $.each( arguments, function ( i, arg ) {
                        var alt = $.Deferred();
                        altPromises.push( alt );
index 2e35420..fdde3ba 100644 (file)
@@ -5,7 +5,7 @@
                var done = assert.async(),
                        $canvas = $( '<div>' ).css( 'background-color', '#fff' ).appendTo( '#qunit-fixture' );
 
-               // eslint-disable-next-line jquery/no-animate
+               // eslint-disable-next-line no-jquery/no-animate
                $canvas.animate( { 'background-color': '#000' }, 3 ).promise()
                        .done( function () {
                                var endColors = $.colorUtil.getRGB( $canvas.css( 'background-color' ) );
index 549deb0..5691a1b 100644 (file)
@@ -1,5 +1,8 @@
 ( function () {
        QUnit.module( 'mediawiki.api.options', QUnit.newMwEnvironment( {
+               config: {
+                       wgUserName: 'Foo'
+               },
                setup: function () {
                        this.server = this.sandbox.useFakeServer();
                        this.server.respondImmediately = true;
                        } )
                );
        } );
+
+       QUnit.test( 'saveOptions (anonymous)', function ( assert ) {
+               var promise, test = this;
+
+               mw.config.set( 'wgUserName', null );
+               promise = new mw.Api().saveOptions( { foo: 'bar' } );
+
+               assert.rejects( promise, /notloggedin/, 'Can not save options while not logged in' );
+
+               return promise
+                       .catch( function () {
+                               return $.Deferred().resolve();
+                       } )
+                       .then( function () {
+                               assert.strictEqual( test.server.requests.length, 0, 'No requests made' );
+                       } );
+       } );
 }() );
index 84e1d4e..fca1f7d 100644 (file)
        } );
 
        QUnit.test( 'wantSignaturesNamespace', function ( assert ) {
-               var namespaces = mw.config.values.wgExtraSignatureNamespaces;
-
-               mw.config.values.wgExtraSignatureNamespaces = [];
+               mw.config.set( 'wgExtraSignatureNamespaces', [] );
                assert.strictEqual( mw.Title.wantSignaturesNamespace( 0 ), false, 'Main namespace has no signatures' );
                assert.strictEqual( mw.Title.wantSignaturesNamespace( 1 ), true, 'Talk namespace has signatures' );
                assert.strictEqual( mw.Title.wantSignaturesNamespace( 2 ), false, 'NS2 has no signatures' );
                assert.strictEqual( mw.Title.wantSignaturesNamespace( 3 ), true, 'NS3 has signatures' );
 
-               mw.config.values.wgExtraSignatureNamespaces = [ 0 ];
+               mw.config.set( 'wgExtraSignatureNamespaces', [ 0 ] );
                assert.strictEqual( mw.Title.wantSignaturesNamespace( 0 ), true, 'Main namespace has signatures when explicitly defined' );
-
-               // Restore
-               mw.config.values.wgExtraSignatureNamespaces = namespaces;
        } );
 
        QUnit.test( 'Throw error on invalid title', function ( assert ) {
index 56801de..a237c7e 100644 (file)
@@ -74,7 +74,7 @@
                } );
        }
 
-       // eslint-disable-next-line jquery/no-each-util
+       // eslint-disable-next-line no-jquery/no-each-util
        $.each( pluralTestcases, function ( langCode, tests ) {
                if ( langCode === mw.config.get( 'wgUserLanguage' ) ) {
                        pluralTest( langCode, tests );
index 5a4d614..3d008f6 100644 (file)
                ]
        };
 
-       // eslint-disable-next-line jquery/no-each-util
+       // eslint-disable-next-line no-jquery/no-each-util
        $.each( grammarTests, function ( langCode, test ) {
                if ( langCode === mw.config.get( 'wgUserLanguage' ) ) {
                        grammarTest( langCode, test );
index d22c8d0..6b316e5 100644 (file)
        QUnit.test( 'wikiUrlencode', function ( assert ) {
                assert.strictEqual( util.wikiUrlencode( 'Test:A & B/Here' ), 'Test:A_%26_B/Here' );
                // See also wfUrlencodeTest.php#provideURLS
-               // eslint-disable-next-line jquery/no-each-util
+               // eslint-disable-next-line no-jquery/no-each-util
                $.each( {
                        '+': '%2B',
                        '&': '%26',