Merge "Bump PHP version requirement to 7.2.0+"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Tue, 17 Sep 2019 01:39:02 +0000 (01:39 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 17 Sep 2019 01:39:02 +0000 (01:39 +0000)
198 files changed:
.phan/config.php
RELEASE-NOTES-1.34
docs/hooks.txt
includes/DefaultSettings.php
includes/EditPage.php
includes/FeedUtils.php
includes/GlobalFunctions.php
includes/Linker.php
includes/OutputPage.php
includes/Revision/RevisionStoreFactory.php
includes/ServiceWiring.php
includes/Status.php
includes/Storage/SqlBlobStore.php
includes/StreamFile.php
includes/Title.php
includes/WebRequest.php
includes/actions/Action.php
includes/actions/HistoryAction.php
includes/actions/InfoAction.php
includes/actions/RawAction.php
includes/actions/RollbackAction.php
includes/actions/SpecialPageAction.php
includes/api/ApiComparePages.php
includes/api/ApiEditPage.php
includes/api/ApiFormatXmlRsd.php
includes/api/ApiHelpParamValueMessage.php
includes/api/ApiImageRotate.php
includes/api/ApiParse.php
includes/api/ApiQueryBacklinks.php
includes/api/ApiQueryDeletedrevs.php
includes/api/ApiQueryQueryPage.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiSetNotificationTimestamp.php
includes/api/i18n/fr.json
includes/api/i18n/he.json
includes/api/i18n/qqq.json
includes/block/BlockManager.php
includes/changes/CategoryMembershipChange.php
includes/changes/ChangesFeed.php
includes/changes/ChangesList.php
includes/changes/EnhancedChangesList.php
includes/changes/RCCacheEntryFactory.php
includes/changetags/ChangeTagsLogItem.php
includes/collation/CustomUppercaseCollation.php
includes/content/ContentHandler.php
includes/debug/logger/ConsoleLogger.php
includes/diff/DifferenceEngine.php
includes/export/WikiExporter.php
includes/filerepo/FileRepo.php
includes/filerepo/file/ArchivedFile.php
includes/filerepo/file/LocalFileDeleteBatch.php
includes/historyblob/ConcatenatedGzipHistoryBlob.php
includes/historyblob/HistoryBlobCurStub.php
includes/historyblob/HistoryBlobStub.php
includes/htmlform/HTMLFormField.php
includes/htmlform/fields/HTMLSelectAndOtherField.php
includes/http/MWCallbackStream.php
includes/import/ImportStreamSource.php
includes/import/WikiImporter.php
includes/installer/InstallDocFormatter.php
includes/installer/LocalSettingsGenerator.php
includes/installer/MysqlUpdater.php
includes/installer/PostgresInstaller.php
includes/installer/i18n/be-tarask.json
includes/installer/i18n/io.json
includes/libs/filebackend/FileBackendStore.php
includes/libs/filebackend/SwiftFileBackend.php
includes/libs/filebackend/fileophandle/SwiftFileOpHandle.php
includes/logging/DeleteLogFormatter.php
includes/media/DjVuHandler.php
includes/media/DjVuImage.php
includes/objectcache/ObjectCache.php
includes/page/Article.php
includes/page/PageArchive.php
includes/page/WikiFilePage.php
includes/page/WikiPage.php
includes/parser/CoreParserFunctions.php
includes/profiler/SectionProfiler.php
includes/resourceloader/DerivativeResourceLoaderContext.php
includes/resourceloader/MessageBlobStore.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderCircularDependencyError.php
includes/resourceloader/ResourceLoaderClientHtml.php
includes/resourceloader/ResourceLoaderContext.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/resourceloader/ResourceLoaderFilePath.php
includes/resourceloader/ResourceLoaderForeignApiModule.php
includes/resourceloader/ResourceLoaderImage.php
includes/resourceloader/ResourceLoaderImageModule.php
includes/resourceloader/ResourceLoaderLanguageDataModule.php
includes/resourceloader/ResourceLoaderLessVarFileModule.php
includes/resourceloader/ResourceLoaderModule.php
includes/resourceloader/ResourceLoaderOOUIFileModule.php
includes/resourceloader/ResourceLoaderOOUIIconPackModule.php
includes/resourceloader/ResourceLoaderOOUIModule.php
includes/resourceloader/ResourceLoaderSiteModule.php
includes/resourceloader/ResourceLoaderSiteStylesModule.php
includes/resourceloader/ResourceLoaderSkinModule.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/resourceloader/ResourceLoaderUserDefaultsModule.php
includes/resourceloader/ResourceLoaderUserModule.php
includes/resourceloader/ResourceLoaderUserOptionsModule.php
includes/resourceloader/ResourceLoaderUserStylesModule.php
includes/resourceloader/ResourceLoaderUserTokensModule.php
includes/resourceloader/ResourceLoaderWikiModule.php
includes/revisiondelete/RevDelArchivedFileItem.php
includes/revisiondelete/RevDelFileItem.php
includes/revisiondelete/RevDelList.php
includes/revisiondelete/RevDelLogItem.php
includes/revisiondelete/RevDelLogList.php
includes/revisiondelete/RevDelRevisionItem.php
includes/revisiondelete/RevDelRevisionList.php
includes/revisiondelete/RevisionDeleteUser.php
includes/revisiondelete/RevisionDeleter.php
includes/revisionlist/RevisionItem.php
includes/site/MediaWikiSite.php
includes/site/Site.php
includes/specialpage/ChangesListSpecialPage.php
includes/specials/SpecialBlockList.php
includes/specials/SpecialMergeHistory.php
includes/specials/SpecialRevisionDelete.php
includes/specials/SpecialTags.php
includes/specials/forms/PreferencesFormOOUI.php
includes/specials/pagers/ContribsPager.php
includes/specials/pagers/DeletedContribsPager.php
includes/title/MediaWikiTitleCodec.php
includes/user/User.php
includes/utils/AvroValidator.php
includes/watcheditem/WatchedItemQueryService.php
languages/LanguageConverter.php
languages/data/Names.php
languages/data/ZhConversion.php
languages/i18n/awa.json
languages/i18n/ban.json
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/bg.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/en.json
languages/i18n/exif/nds-nl.json
languages/i18n/exif/sr-ec.json
languages/i18n/fr.json
languages/i18n/gv.json
languages/i18n/hu.json
languages/i18n/io.json
languages/i18n/ja.json
languages/i18n/jv.json
languages/i18n/ka.json
languages/i18n/kiu.json
languages/i18n/min.json
languages/i18n/nl.json
languages/i18n/nqo.json
languages/i18n/pl.json
languages/i18n/ro.json
languages/i18n/roa-tara.json
languages/i18n/sl.json
languages/i18n/sv.json
languages/i18n/szl.json
languages/i18n/tt-cyrl.json
languages/i18n/zh-hant.json
languages/i18n/zh-hk.json
maintenance/Doxyfile
maintenance/archives/upgradeLogging.php
maintenance/cleanupSpam.php
maintenance/findDeprecated.php
maintenance/getText.php
maintenance/language/zhtable/simp2trad.manual
maintenance/language/zhtable/simp2trad_noconvert.manual
maintenance/language/zhtable/toCN.manual
maintenance/language/zhtable/toHK.manual
maintenance/language/zhtable/toSimp.manual
maintenance/language/zhtable/toTW.manual
maintenance/language/zhtable/toTrad.manual
maintenance/language/zhtable/trad2simp.manual
maintenance/language/zhtable/tradphrases.manual
maintenance/language/zhtable/tradphrases_exclude.manual
maintenance/populateRevisionLength.php
maintenance/preprocessDump.php
maintenance/refreshLinks.php
maintenance/userDupes.inc
resources/Resources.php
resources/src/jquery/jquery.checkboxShiftClick.js [deleted file]
resources/src/mediawiki.page.ready.js [deleted file]
resources/src/mediawiki.page.ready/.eslintrc.json [new file with mode: 0644]
resources/src/mediawiki.page.ready/checkboxShift.js [new file with mode: 0644]
resources/src/mediawiki.page.ready/ready.js [new file with mode: 0644]
tests/phpunit/includes/MediaWikiServicesTest.php
tests/phpunit/includes/Revision/RevisionStoreFactoryTest.php
tests/phpunit/includes/RevisionTest.php
tests/phpunit/includes/TitleTest.php
tests/phpunit/includes/api/ApiQuerySiteinfoTest.php
tests/phpunit/includes/block/BlockManagerTest.php
tests/phpunit/includes/filebackend/FileBackendTest.php
tests/phpunit/includes/filebackend/SwiftFileBackendTest.php
tests/phpunit/maintenance/fetchTextTest.php
tests/selenium/wdio-mediawiki/Api.js
thumb.php

index fc775fe..56a8ccb 100644 (file)
@@ -104,8 +104,6 @@ $cfg['suppress_issue_types'] = array_merge( $cfg['suppress_issue_types'], [
 
        // approximate error count: 45
        "PhanTypeMismatchArgument",
-       // approximate error count: 693
-       "PhanUndeclaredProperty",
 ] );
 
 // This helps a lot in discovering bad code, but unfortunately it will always fail for
@@ -113,6 +111,10 @@ $cfg['suppress_issue_types'] = array_merge( $cfg['suppress_issue_types'], [
 // @todo Enable when the issue above is resolved and we update our config!
 $cfg['redundant_condition_detection'] = false;
 
+// Do not use aliases in core.
+// Use the correct name, because we don't need backward compatibility
+$cfg['enable_class_alias_support'] = false;
+
 $cfg['ignore_undeclared_variables_in_global_scope'] = true;
 // @todo It'd be great if we could just make phan read these from DefaultSettings, to avoid
 // duplicating the types.
index ea5ecd0..c4bbd4a 100644 (file)
@@ -303,6 +303,8 @@ because of Phabricator reports.
 * mw.language.specialCharacters, deprecated in 1.33, has been removed.
   Use require( 'mediawiki.language.specialCharacters' ) instead.
 * The jquery.colorUtil module was removed. Use jquery.color instead.
+* The jquery.checkboxShiftClick module was removed. The functionality
+  is provided by mediawiki.page.ready instead (T232688).
 * EditPage::submit(), deprecated in 1.29, has been removed. Use $this->edit()
   directly.
 * HTMLForm::getErrors(), deprecated in 1.28, has been removed. Use
@@ -430,6 +432,8 @@ because of Phabricator reports.
   * Revision::selectPageFields()
   * Revision::selectUserFields()
 * User::setNewpassword(), deprecated in 1.27 has been removed.
+* The ObjectCache::getMainWANInstance and ObjectCache::getMainStashInstance
+  functions, deprecated since 1.28, have been removed.
 
 === Deprecations in 1.34 ===
 * The MWNamespace class is deprecated. Use NamespaceInfo.
@@ -565,6 +569,9 @@ because of Phabricator reports.
 * The GetBlockedStatus hook is deprecated. Use GetUserBlock instead, to add or
   remove a block.
 * $wgContentHandlerUseDB is deprecated and should always be true.
+* StreamFile::send404Message() and StreamFile::parseRange() are now deprecated.
+  Use HTTPFileStreamer::send404Message() and HTTPFileStreamer::parseRange()
+  respectively instead.
 
 === Other changes in 1.34 ===
 * …
index 43bfd8d..55ba06e 100644 (file)
@@ -2921,7 +2921,7 @@ result augmentors.
 Note that lists should be in the format name => object and the names in both
   lists should be distinct.
 
-'SecondaryDataUpdates': DEPRECATED! Use RevisionDataUpdates or override
+'SecondaryDataUpdates': DEPRECATED since 1.32! Use RevisionDataUpdates or override
 ContentHandler::getSecondaryDataUpdates instead.
 Allows modification of the list of DataUpdates to perform when page content is modified.
 $title: Title of the page that is being edited.
@@ -3969,7 +3969,7 @@ dumps. One, and only one hook should set this, and return false.
 &$opts: Options to use for the query
 &$join: Join conditions
 
-'WikiPageDeletionUpdates': DEPRECATED! Use PageDeletionDataUpdates or
+'WikiPageDeletionUpdates': DEPRECATED since 1.32! Use PageDeletionDataUpdates or
 override ContentHandler::getDeletionDataUpdates instead.
 Manipulates the list of DeferrableUpdates to be applied when a page is deleted.
 $page: the WikiPage
index 47fd073..6b04070 100644 (file)
@@ -2733,16 +2733,17 @@ $wgExtensionInfoMTime = false;
  * although they are sometimes still referred to as Squid settings for
  * historical reasons.
  *
- * Achieving a high hit ratio with an HTTP proxy requires special
- * configuration. See https://www.mediawiki.org/wiki/Manual:Squid_caching for
- * more details.
+ * Achieving a high hit ratio with an HTTP proxy requires special configuration.
+ * See https://www.mediawiki.org/wiki/Manual:Performance_tuning#Page_view_caching
+ * for more details.
  *
  * @{
  */
 
 /**
  * Enable/disable CDN.
- * See https://www.mediawiki.org/wiki/Manual:Squid_caching
+ *
+ * See https://www.mediawiki.org/wiki/Manual:Performance_tuning#Page_view_caching
  *
  * @since 1.34 Renamed from $wgUseSquid.
  */
index c346b75..9d89785 100644 (file)
@@ -25,7 +25,7 @@ use MediaWiki\EditPage\TextboxBuilder;
 use MediaWiki\EditPage\TextConflictHelper;
 use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\ScopedCallback;
 
 /**
@@ -2742,7 +2742,7 @@ ERROR;
         * content.
         *
         * @param Content|null|bool|string $content
-        * @return string The editable text form of the content.
+        * @return string|false|null The editable text form of the content.
         *
         * @throws MWException If $content is not an instance of TextContent and
         *   $this->allowNonTextContent is not true.
index 8efae4f..bfd1e2a 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Feed
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Helper functions for feeds
index 38daab5..3b4e657 100644 (file)
@@ -1816,10 +1816,11 @@ function mimeTypeMatch( $type, $avail ) {
  *
  * @param array $cprefs Client's acceptable type list
  * @param array $sprefs Server's offered types
- * @return string
+ * @return string|null
  *
  * @todo FIXME: Doesn't handle params like 'text/plain; charset=UTF-8'
  * XXX: generalize to negotiate other stuff
+ * @todo The function appears unused. Is it worth to keep?
  */
 function wfNegotiateType( $cprefs, $sprefs ) {
        $combine = [];
index 1a5058d..324b1f5 100644 (file)
@@ -21,7 +21,7 @@
  */
 use MediaWiki\Linker\LinkTarget;
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Some internal bits split of from Skin.php. These functions are used
index 9dbbf13..c9b4193 100644 (file)
@@ -332,7 +332,7 @@ class OutputPage extends ContextSource {
         * a OutputPage tied to that context.
         * @param IContextSource $context
         */
-       function __construct( IContextSource $context ) {
+       public function __construct( IContextSource $context ) {
                $this->setContext( $context );
        }
 
@@ -385,8 +385,8 @@ class OutputPage extends ContextSource {
         * @param string $name Name of the meta tag
         * @param string $val Value of the meta tag
         */
-       function addMeta( $name, $val ) {
-               array_push( $this->mMetatags, [ $name, $val ] );
+       public function addMeta( $name, $val ) {
+               $this->mMetatags[] = [ $name, $val ];
        }
 
        /**
@@ -406,8 +406,8 @@ class OutputPage extends ContextSource {
         *
         * @param array $linkarr Associative array of attributes.
         */
-       function addLink( array $linkarr ) {
-               array_push( $this->mLinktags, $linkarr );
+       public function addLink( array $linkarr ) {
+               $this->mLinktags[] = $linkarr;
        }
 
        /**
@@ -425,7 +425,7 @@ class OutputPage extends ContextSource {
         * in preference to addLink(), to avoid duplicate link tags.
         * @param string $url
         */
-       function setCanonicalUrl( $url ) {
+       public function setCanonicalUrl( $url ) {
                $this->mCanonicalUrl = $url;
        }
 
@@ -447,7 +447,7 @@ class OutputPage extends ContextSource {
         *
         * @param string $script Raw HTML
         */
-       function addScript( $script ) {
+       public function addScript( $script ) {
                $this->mScripts .= $script;
        }
 
@@ -621,7 +621,7 @@ class OutputPage extends ContextSource {
         *
         * @return array
         */
-       function getHeadItemsArray() {
+       public function getHeadItemsArray() {
                return $this->mHeadItems;
        }
 
@@ -1598,6 +1598,7 @@ class OutputPage extends ContextSource {
         * @param ParserOptions|null $options Either the ParserOption to use or null to only get the
         *   current ParserOption object. This parameter is deprecated since 1.31.
         * @return ParserOptions
+        * @suppress PhanUndeclaredProperty For isBogus
         */
        public function parserOptions( $options = null ) {
                if ( $options !== null ) {
@@ -1954,7 +1955,7 @@ class OutputPage extends ContextSource {
         * @param ParserOutput $parserOutput
         * @param array $poOptions Options to ParserOutput::getText()
         */
-       function addParserOutput( ParserOutput $parserOutput, $poOptions = [] ) {
+       public function addParserOutput( ParserOutput $parserOutput, $poOptions = [] ) {
                $this->addParserOutputMetadata( $parserOutput );
                $this->addParserOutputText( $parserOutput, $poOptions );
        }
@@ -2188,7 +2189,7 @@ class OutputPage extends ContextSource {
         *
         * @return array
         */
-       function getCacheVaryCookies() {
+       public function getCacheVaryCookies() {
                if ( self::$cacheVaryCookies === null ) {
                        $config = $this->getConfig();
                        self::$cacheVaryCookies = array_values( array_unique( array_merge(
@@ -2209,7 +2210,7 @@ class OutputPage extends ContextSource {
         *
         * @return bool
         */
-       function haveCacheVaryCookies() {
+       public function haveCacheVaryCookies() {
                $request = $this->getRequest();
                foreach ( $this->getCacheVaryCookies() as $cookieName ) {
                        if ( $request->getCookie( $cookieName, '', '' ) !== '' ) {
index acecee1..1de4d7f 100644 (file)
@@ -27,7 +27,7 @@ namespace MediaWiki\Revision;
 
 use ActorMigration;
 use CommentStore;
-use MediaWiki\Logger\Spi as LoggerSpi;
+use Psr\Log\LoggerInterface;
 use MediaWiki\Storage\BlobStoreFactory;
 use MediaWiki\Storage\NameTableStoreFactory;
 use WANObjectCache;
@@ -54,8 +54,8 @@ class RevisionStoreFactory {
        private $dbLoadBalancerFactory;
        /** @var WANObjectCache */
        private $cache;
-       /** @var LoggerSpi */
-       private $loggerProvider;
+       /** @var LoggerInterface */
+       private $logger;
 
        /** @var CommentStore */
        private $commentStore;
@@ -84,7 +84,7 @@ class RevisionStoreFactory {
         * @param CommentStore $commentStore
         * @param ActorMigration $actorMigration
         * @param int $migrationStage
-        * @param LoggerSpi $loggerProvider
+        * @param LoggerInterface $logger
         * @param bool $contentHandlerUseDB see {@link $wgContentHandlerUseDB}. Must be the same
         *        for all wikis in the cluster. Will go away after MCR migration.
         */
@@ -97,7 +97,7 @@ class RevisionStoreFactory {
                CommentStore $commentStore,
                ActorMigration $actorMigration,
                $migrationStage,
-               LoggerSpi $loggerProvider,
+               LoggerInterface $logger,
                $contentHandlerUseDB
        ) {
                Assert::parameterType( 'integer', $migrationStage, '$migrationStage' );
@@ -109,7 +109,7 @@ class RevisionStoreFactory {
                $this->commentStore = $commentStore;
                $this->actorMigration = $actorMigration;
                $this->mcrMigrationStage = $migrationStage;
-               $this->loggerProvider = $loggerProvider;
+               $this->logger = $logger;
                $this->contentHandlerUseDB = $contentHandlerUseDB;
        }
 
@@ -118,7 +118,7 @@ class RevisionStoreFactory {
         *
         * @param bool|string $dbDomain DB domain of the relevant wiki or false for the current one
         *
-        * @return RevisionStore for the given wikiId with all necessary services and a logger
+        * @return RevisionStore for the given wikiId with all necessary services
         */
        public function getRevisionStore( $dbDomain = false ) {
                Assert::parameterType( 'string|boolean', $dbDomain, '$dbDomain' );
@@ -137,7 +137,7 @@ class RevisionStoreFactory {
                        $dbDomain
                );
 
-               $store->setLogger( $this->loggerProvider->getLogger( 'RevisionStore' ) );
+               $store->setLogger( $this->logger );
                $store->setContentHandlerUseDB( $this->contentHandlerUseDB );
 
                return $store;
index 689a98e..4cd3d85 100644 (file)
@@ -111,7 +111,8 @@ return [
                        new ServiceOptions(
                                BlockManager::$constructorOptions, $services->getMainConfig()
                        ),
-                       $services->getPermissionManager()
+                       $services->getPermissionManager(),
+                       LoggerFactory::getInstance( 'BlockManager' )
                );
        },
 
@@ -632,7 +633,7 @@ return [
                        $services->getCommentStore(),
                        $services->getActorMigration(),
                        $config->get( 'MultiContentRevisionSchemaMigrationStage' ),
-                       LoggerFactory::getProvider(),
+                       LoggerFactory::getInstance( 'RevisionStore' ),
                        $config->get( 'ContentHandlerUseDB' )
                );
 
index 76b905e..932fd2a 100644 (file)
@@ -115,6 +115,7 @@ class Status extends StatusValue {
         * ]
         *
         * @return Status[]
+        * @suppress PhanUndeclaredProperty Status vs StatusValue
         */
        public function splitByErrorType() {
                list( $errorsOnlyStatus, $warningsOnlyStatus ) = parent::splitByErrorType();
index 8c011df..bcbc9e8 100644 (file)
@@ -103,10 +103,10 @@ class SqlBlobStore implements IDBAccessObject, BlobStore {
         * @param ExternalStoreAccess $extStoreAccess Access layer for external storage
         * @param WANObjectCache $cache A cache manager for caching blobs. This can be the local
         *        wiki's default instance even if $dbDomain refers to a different wiki, since
-        *        makeGlobalKey() is used to constructed a key that allows cached blobs from the
-        *        same database to be re-used between wikis. For example, enwiki and frwiki will
-        *        use the same cache keys for blobs from the wikidatawiki database, regardless of
-        *        the cache's default key space.
+        *        makeGlobalKey() is used to construct a key that allows cached blobs from the
+        *        same database to be re-used between wikis. For example, wiki A and wiki B will
+        *        use the same cache keys for blobs fetched from wiki C, regardless of the
+        *        wiki-specific default key space.
         * @param bool|string $dbDomain The ID of the target wiki database. Use false for the local wiki.
         */
        public function __construct(
@@ -449,16 +449,15 @@ class SqlBlobStore implements IDBAccessObject, BlobStore {
         * Get a cache key for a given Blob address.
         *
         * The cache key is constructed in a way that allows cached blobs from the same database
-        * to be re-used between wikis. For example, enwiki and frwiki will use the same cache keys
-        * for blobs from the wikidatawiki database.
+        * to be re-used between wikis. For example, wiki A and wiki B will use the same cache keys
+        * for blobs fetched from wiki C.
         *
         * @param string $blobAddress
         * @return string
         */
        private function getCacheKey( $blobAddress ) {
                return $this->cache->makeGlobalKey(
-                       'BlobStore',
-                       'address',
+                       'SqlBlobStore-blob',
                        $this->dbLoadBalancer->resolveDomainID( $this->dbDomain ),
                        $blobAddress
                );
index 2afd651..c9b2c33 100644 (file)
@@ -68,8 +68,10 @@ class StreamFile {
         * @param string $fname Full name and path of the file to stream
         * @param int $flags Bitfield of STREAM_* constants
         * @since 1.24
+        * @deprecated since 1.34, use HTTPFileStreamer::send404Message() instead
         */
        public static function send404Message( $fname, $flags = 0 ) {
+               wfDeprecated( __METHOD__, '1.34' );
                HTTPFileStreamer::send404Message( $fname, $flags );
        }
 
@@ -80,8 +82,10 @@ class StreamFile {
         * @param int $size File size
         * @return array|string Returns error string on failure (start, end, length)
         * @since 1.24
+        * @deprecated since 1.34, use HTTPFileStreamer::parseRange() instead
         */
        public static function parseRange( $range, $size ) {
+               wfDeprecated( __METHOD__, '1.34' );
                return HTTPFileStreamer::parseRange( $range, $size );
        }
 
index bdff7a7..0f5c384 100644 (file)
@@ -23,7 +23,7 @@
  */
 
 use MediaWiki\Permissions\PermissionManager;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\Assert\Assert;
 use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\IDatabase;
@@ -1561,14 +1561,32 @@ class Title implements LinkTarget, IDBAccessObject {
         * Get a Title object associated with the talk page of this article
         *
         * @deprecated since 1.34, use getTalkPageIfDefined() or NamespaceInfo::getTalkPage()
-        *             with NamespaceInfo::canHaveTalkPage().
+        *             with NamespaceInfo::canHaveTalkPage(). Note that the new method will
+        *             throw if asked for the talk page of a section-only link, or of an interwiki
+        *             link.
         * @return Title The object for the talk page
         * @throws MWException if $target doesn't have talk pages, e.g. because it's in NS_SPECIAL
         *         or because it's a relative link, or an interwiki link.
         */
        public function getTalkPage() {
-               return self::castFromLinkTarget(
-                       MediaWikiServices::getInstance()->getNamespaceInfo()->getTalkPage( $this ) );
+               // NOTE: The equivalent code in NamespaceInfo is less lenient about producing invalid titles.
+               //       Instead of failing on invalid titles, let's just log the issue for now.
+               //       See the discussion on T227817.
+
+               // Is this the same title?
+               $talkNS = MediaWikiServices::getInstance()->getNamespaceInfo()->getTalk( $this->mNamespace );
+               if ( $this->mNamespace == $talkNS ) {
+                       return $this;
+               }
+
+               $title = self::makeTitle( $talkNS, $this->mDbkeyform );
+
+               $this->warnIfPageCannotExist( $title, __METHOD__ );
+
+               return $title;
+               // TODO: replace the above with the code below:
+               // return self::castFromLinkTarget(
+               // MediaWikiServices::getInstance()->getNamespaceInfo()->getTalkPage( $this ) );
        }
 
        /**
@@ -1596,8 +1614,51 @@ class Title implements LinkTarget, IDBAccessObject {
         * @return Title The object for the subject page
         */
        public function getSubjectPage() {
-               return self::castFromLinkTarget(
-                       MediaWikiServices::getInstance()->getNamespaceInfo()->getSubjectPage( $this ) );
+               // Is this the same title?
+               $subjectNS = MediaWikiServices::getInstance()->getNamespaceInfo()
+                       ->getSubject( $this->mNamespace );
+               if ( $this->mNamespace == $subjectNS ) {
+                       return $this;
+               }
+               // NOTE: The equivalent code in NamespaceInfo is less lenient about producing invalid titles.
+               //       Instead of failing on invalid titles, let's just log the issue for now.
+               //       See the discussion on T227817.
+               $title = self::makeTitle( $subjectNS, $this->mDbkeyform );
+
+               $this->warnIfPageCannotExist( $title, __METHOD__ );
+
+               return $title;
+               // TODO: replace the above with the code below:
+               // return self::castFromLinkTarget(
+               // MediaWikiServices::getInstance()->getNamespaceInfo()->getSubjectPage( $this ) );
+       }
+
+       /**
+        * @param Title $title
+        * @param string $method
+        *
+        * @return bool whether a warning was issued
+        */
+       private function warnIfPageCannotExist( Title $title, $method ) {
+               if ( $this->getText() == '' ) {
+                       wfLogWarning(
+                               $method . ': called on empty title ' . $this->getFullText() . ', returning '
+                               . $title->getFullText()
+                       );
+
+                       return true;
+               }
+
+               if ( $this->getInterwiki() !== '' ) {
+                       wfLogWarning(
+                               $method . ': called on interwiki title ' . $this->getFullText() . ', returning '
+                               . $title->getFullText()
+                       );
+
+                       return true;
+               }
+
+               return false;
        }
 
        /**
@@ -1610,8 +1671,23 @@ class Title implements LinkTarget, IDBAccessObject {
         * @return Title
         */
        public function getOtherPage() {
-               return self::castFromLinkTarget(
-                       MediaWikiServices::getInstance()->getNamespaceInfo()->getAssociatedPage( $this ) );
+               // NOTE: Depend on the methods in this class instead of their equivalent in NamespaceInfo,
+               //       until their semantics has become exactly the same.
+               //       See the discussion on T227817.
+               if ( $this->isSpecialPage() ) {
+                       throw new MWException( 'Special pages cannot have other pages' );
+               }
+               if ( $this->isTalkPage() ) {
+                       return $this->getSubjectPage();
+               } else {
+                       if ( !$this->canHaveTalkPage() ) {
+                               throw new MWException( "{$this->getPrefixedText()} does not have an other page" );
+                       }
+                       return $this->getTalkPage();
+               }
+               // TODO: replace the above with the code below:
+               // return self::castFromLinkTarget(
+               // MediaWikiServices::getInstance()->getNamespaceInfo()->getAssociatedPage( $this ) );
        }
 
        /**
index a48d032..c94e8d4 100644 (file)
@@ -547,7 +547,7 @@ class WebRequest {
         *
         * @param string $name
         * @param array|null $default Option default (or null)
-        * @return array Array of ints
+        * @return int[]|null
         */
        public function getIntArray( $name, $default = null ) {
                $val = $this->getArray( $name, $default );
index f892c5e..4be2f7d 100644 (file)
@@ -22,7 +22,7 @@
 use MediaWiki\MediaWikiServices;
 
 /**
- * @defgroup Actions Action done on pages
+ * @defgroup Actions Actions
  */
 
 /**
index db874f2..6a61045 100644 (file)
@@ -433,27 +433,30 @@ class HistoryAction extends FormlessAction {
         * @return FeedItem
         */
        function feedItem( $row ) {
-               $rev = new Revision( $row, 0, $this->getTitle() );
-
+               $revisionStore = MediaWikiServices::getInstance()->getRevisionStore();
+               $rev = $revisionStore->newRevisionFromRow( $row, 0, $this->getTitle() );
+               $prevRev = $revisionStore->getPreviousRevision( $rev );
+               $revComment = $rev->getComment() === null ? null : $rev->getComment()->text;
                $text = FeedUtils::formatDiffRow(
                        $this->getTitle(),
-                       $this->getTitle()->getPreviousRevisionID( $rev->getId() ),
+                       $prevRev ? $prevRev->getId() : false,
                        $rev->getId(),
                        $rev->getTimestamp(),
-                       $rev->getComment()
+                       $revComment
                );
-               if ( $rev->getComment() == '' ) {
+               $revUserText = $rev->getUser() ? $rev->getUser()->getName() : '';
+               if ( $revComment == '' ) {
                        $contLang = MediaWikiServices::getInstance()->getContentLanguage();
                        $title = $this->msg( 'history-feed-item-nocomment',
-                               $rev->getUserText(),
+                               $revUserText,
                                $contLang->timeanddate( $rev->getTimestamp() ),
                                $contLang->date( $rev->getTimestamp() ),
                                $contLang->time( $rev->getTimestamp() )
                        )->inContentLanguage()->text();
                } else {
-                       $title = $rev->getUserText() .
+                       $title = $revUserText .
                                $this->msg( 'colon-separator' )->inContentLanguage()->text() .
-                               FeedItem::stripComment( $rev->getComment() );
+                               FeedItem::stripComment( $revComment );
                }
 
                return new FeedItem(
@@ -461,7 +464,7 @@ class HistoryAction extends FormlessAction {
                        $text,
                        $this->getTitle()->getFullURL( 'diff=' . $rev->getId() . '&oldid=prev' ),
                        $rev->getTimestamp(),
-                       $rev->getUserText(),
+                       $revUserText,
                        $this->getTitle()->getTalkPage()->getFullURL()
                );
        }
index 9a8949f..0360fe4 100644 (file)
@@ -23,7 +23,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\Rdbms\Database;
 
 /**
index 8fd4e0a..0586e09 100644 (file)
@@ -238,23 +238,31 @@ class RawAction extends FormlessAction {
         */
        public function getOldId() {
                $oldid = $this->getRequest()->getInt( 'oldid' );
+               $rl = MediaWikiServices::getInstance()->getRevisionLookup();
                switch ( $this->getRequest()->getText( 'direction' ) ) {
                        case 'next':
                                # output next revision, or nothing if there isn't one
-                               $nextid = 0;
+                               $nextRev = null;
                                if ( $oldid ) {
-                                       $nextid = $this->getTitle()->getNextRevisionID( $oldid );
+                                       $oldRev = $rl->getRevisionById( $oldid );
+                                       if ( $oldRev ) {
+                                               $nextRev = $rl->getNextRevision( $oldRev );
+                                       }
                                }
-                               $oldid = $nextid ?: -1;
+                               $oldid = $nextRev ? $nextRev->getId() : -1;
                                break;
                        case 'prev':
                                # output previous revision, or nothing if there isn't one
+                               $prevRev = null;
                                if ( !$oldid ) {
                                        # get the current revision so we can get the penultimate one
                                        $oldid = $this->page->getLatest();
                                }
-                               $previd = $this->getTitle()->getPreviousRevisionID( $oldid );
-                               $oldid = $previd ?: -1;
+                               $oldRev = $rl->getRevisionById( $oldid );
+                               if ( $oldRev ) {
+                                       $prevRev = $rl->getPreviousRevision( $oldRev );
+                               }
+                               $oldid = $prevRev ? $prevRev->getId() : -1;
                                break;
                        case 'cur':
                                $oldid = 0;
index 519da61..1c9e63b 100644 (file)
@@ -20,7 +20,7 @@
  * @ingroup Actions
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * User interface for the rollback action
index 8a231cb..56be456 100644 (file)
@@ -35,6 +35,9 @@ class SpecialPageAction extends FormlessAction {
                'editchangetags' => 'EditTags',
        ];
 
+       /**
+        * @inheritDoc
+        */
        public function getName() {
                $request = $this->getRequest();
                $actionName = $request->getVal( 'action', 'view' );
index 05eb438..6e788d5 100644 (file)
@@ -26,6 +26,9 @@ use MediaWiki\Revision\RevisionArchiveRecord;
 use MediaWiki\Revision\RevisionStore;
 use MediaWiki\Revision\SlotRecord;
 
+/**
+ * @ingroup API
+ */
 class ApiComparePages extends ApiBase {
 
        /** @var RevisionStore */
@@ -249,6 +252,7 @@ class ApiComparePages extends ApiBase {
                        );
                        if ( $row ) {
                                $rev = $this->revisionStore->newRevisionFromArchiveRow( $row );
+                               // @phan-suppress-next-line PhanUndeclaredProperty
                                $rev->isArchive = true;
                        }
                }
@@ -617,6 +621,7 @@ class ApiComparePages extends ApiBase {
                                }
                        }
 
+                       // @phan-suppress-next-line PhanUndeclaredProperty
                        if ( !empty( $rev->isArchive ) ) {
                                $this->getMain()->setCacheMode( 'private' );
                                $vals["{$prefix}archive"] = true;
index fdf9cf1..1936407 100644 (file)
@@ -20,7 +20,8 @@
  * @file
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\MediaWikiServices;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * A module that allows for editing and creating pages.
@@ -239,11 +240,15 @@ class ApiEditPage extends ApiBase {
                        $params['text'] = $newContent->serialize( $contentFormat );
                        // If no summary was given and we only undid one rev,
                        // use an autosummary
-                       if ( is_null( $params['summary'] ) &&
-                               $titleObj->getNextRevisionID( $undoafterRev->getId() ) == $params['undo']
-                       ) {
-                               $params['summary'] = wfMessage( 'undo-summary' )
-                                       ->params( $params['undo'], $undoRev->getUserText() )->inContentLanguage()->text();
+
+                       if ( is_null( $params['summary'] ) ) {
+                               $nextRev = MediaWikiServices::getInstance()->getRevisionLookup()
+                                       ->getNextRevision( $undoafterRev->getRevisionRecord() );
+                               if ( $nextRev && $nextRev->getId() == $params['undo'] ) {
+                                       $params['summary'] = wfMessage( 'undo-summary' )
+                                               ->params( $params['undo'], $undoRev->getUserText() )
+                                               ->inContentLanguage()->text();
+                               }
                        }
                }
 
index 6b892fa..3052b89 100644 (file)
@@ -21,6 +21,9 @@
  * @file
  */
 
+/**
+ * @ingroup API
+ */
 class ApiFormatXmlRsd extends ApiFormatXml {
        public function __construct( ApiMain $main, $format ) {
                parent::__construct( $main, $format );
index 7aebf90..0272dcd 100644 (file)
@@ -28,6 +28,7 @@
  * 'APIGetParamDescriptionMessages' hook simple.
  *
  * @since 1.25
+ * @ingroup API
  */
 class ApiHelpParamValueMessage extends Message {
 
index 1f8b012..8a0e8c9 100644 (file)
@@ -1,7 +1,4 @@
 <?php
-
-use MediaWiki\MediaWikiServices;
-
 /**
  * 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
@@ -21,6 +18,11 @@ use MediaWiki\MediaWikiServices;
  * @file
  */
 
+use MediaWiki\MediaWikiServices;
+
+/**
+ * @ingroup API
+ */
 class ApiImageRotate extends ApiBase {
        private $mPageSet = null;
 
index 40edafa..2e7db78 100644 (file)
@@ -21,7 +21,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * @ingroup API
index d21f111..a6b15e9 100644 (file)
@@ -41,6 +41,9 @@ class ApiQueryBacklinks extends ApiQueryGeneratorBase {
        private $redirect;
        private $bl_ns, $bl_from, $bl_from_ns, $bl_table, $bl_code, $bl_title, $bl_fields, $hasNS;
 
+       /** @var string */
+       private $helpUrl;
+
        /**
         * Maps ns and title to pageid
         *
index eb787d1..b8caeb9 100644 (file)
@@ -22,7 +22,7 @@
 
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Storage\NameTableAccessException;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Query module to enumerate all deleted revisions.
index 26c17c5..12e908f 100644 (file)
@@ -61,7 +61,7 @@ class ApiQueryQueryPage extends ApiQueryGeneratorBase {
         * @param string $name
         * @return QueryPage
         */
-       private function getSpecialPage( $name ) {
+       private function getSpecialPage( $name ) : QueryPage {
                $qp = $this->specialPageFactory->getPage( $name );
                if ( !$qp ) {
                        self::dieDebug(
index 7e4a891..47212b3 100644 (file)
@@ -279,6 +279,8 @@ class ApiQuerySiteinfo extends ApiQueryBase {
        }
 
        protected function appendNamespaces( $property ) {
+               $nsProtection = $this->getConfig()->get( 'NamespaceProtection' );
+
                $data = [
                        ApiResult::META_TYPE => 'assoc',
                ];
@@ -303,6 +305,17 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        $data[$ns]['content'] = $nsInfo->isContent( $ns );
                        $data[$ns]['nonincludable'] = $nsInfo->isNonincludable( $ns );
 
+                       if ( isset( $nsProtection[$ns] ) ) {
+                               if ( is_array( $nsProtection[$ns] ) ) {
+                                       $specificNs = implode( "|", array_filter( $nsProtection[$ns] ) );
+                               } elseif ( $nsProtection[$ns] !== '' ) {
+                                       $specificNs = $nsProtection[$ns];
+                               }
+                               if ( isset( $specificNs ) && $specificNs !== '' ) {
+                                       $data[$ns]['namespaceprotection'] = $specificNs;
+                               }
+                       }
+
                        $contentmodel = $nsInfo->getNamespaceContentModel( $ns );
                        if ( $contentmodel ) {
                                $data[$ns]['defaultcontentmodel'] = $contentmodel;
index 7e9f56d..3f6f14c 100644 (file)
@@ -93,13 +93,14 @@ class ApiSetNotificationTimestamp extends ApiBase {
                        $titles = $pageSet->getGoodTitles();
                        $title = reset( $titles );
                        if ( $title ) {
-                               $revid = $title->getNextRevisionID( $params['newerthanrevid'], Title::READ_LATEST );
-                               if ( $revid ) {
-                                       $timestamp = $dbw->timestamp(
-                                               MediaWikiServices::getInstance()->getRevisionStore()->getTimestampFromId( $title, $revid )
-                                       );
-                               } else {
-                                       $timestamp = null;
+                               $timestamp = null;
+                               $rl = MediaWikiServices::getInstance()->getRevisionLookup();
+                               $currRev = $rl->getRevisionById( $params['newerthanrevid'], Title::READ_LATEST );
+                               if ( $currRev ) {
+                                       $nextRev = $rl->getNextRevision( $currRev, Title::READ_LATEST );
+                                       if ( $nextRev ) {
+                                               $timestamp = $dbw->timestamp( $nextRev->getTimestamp() );
+                                       }
                                }
                        }
                }
index 5ce00f5..12ece4c 100644 (file)
@@ -37,7 +37,7 @@
                        "Lucas Werkmeister (WMDE)"
                ]
        },
-       "apihelp-main-extended-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Documentation]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Liste de diffusion]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annonces de l’API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bogues et demandes]\n</div>\n<strong>État :</strong> l’API de MediaWiki est une interface stable et mature qui est supportée et améliorée de façon active. Bien que nous essayions de l’éviter, nous pouvons avoir parfois besoin de faire des modifications impactantes ; inscrivez-vous à [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la liste de diffusion ''mediawiki-api-announce''] pour être informé des mises à jour.\n\n<strong>Requêtes erronées :</strong> si des requêtes erronées sont envoyées à l’API, un entête HTTP sera renvoyé avec la clé « MediaWiki-API-Error ». La valeur de cet entête et le code d’erreur renvoyé prendront la même valeur. Pour plus d’information, voyez [[mw:Special:MyLanguage/API:Errors_and_warnings|API:Errors and warnings]].\n\n<p class=\"mw-apisandbox-link\"><strong>Test :</strong> Pour faciliter le test des requêtes à l’API, voyez [[Special:ApiSandbox]].</p>",
+       "apihelp-main-extended-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Documentation]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Liste de diffusion]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annonces de l’API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bogues et demandes]\n</div>\n<strong>État :</strong> l’API de MediaWiki est une interface stable et mature qui est supportée et améliorée de façon active. Bien que nous essayions de l’éviter, nous pouvons avoir parfois besoin de faire des modifications impactantes ; inscrivez-vous à [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la liste de diffusion ''mediawiki-api-announce''] pour être informé des mises à jour.\n\n<strong>Requêtes erronées :</strong> si des requêtes erronées sont envoyées à l’API, un entête HTTP sera renvoyé avec la clé « MediaWiki-API-Error ». La valeur de cet entête et le code d’erreur renvoyé prendront la même valeur. Pour plus d’information, voyez [[mw:Special:MyLanguage/API:Errors_and_warnings|API:Errors and warnings]].\n\n<p class=\"mw-apisandbox-link\"><strong>Test :</strong> Pour faciliter le test des requêtes à l’API, voyez [[Special:ApiSandbox]].</p>",
        "apihelp-main-param-action": "Quelle action effectuer.",
        "apihelp-main-param-format": "Le format de sortie.",
        "apihelp-main-param-maxlag": "La latence maximale peut être utilisée quand MediaWiki est installé sur une grappe de réplication de base de données. Pour éviter des actions provoquant un supplément de latence de réplication de site, ce paramètre peut faire attendre le client jusqu’à ce que la latence de réplication soit inférieure à une valeur spécifiée. En cas de latence excessive, le code d’erreur <samp>maxlag</samp> est renvoyé avec un message tel que <samp>Attente de $host : $lag secondes de délai</samp>.<br />Voyez [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Manuel : paramètre Maxlag]] pour plus d’informations.",
index e2c5fe7..e7cf3d4 100644 (file)
        "apihelp-query-param-indexpageids": "לכלול פסקת pageids נוספת עם רשימת כל מזהי הדף שהוחזרו.",
        "apihelp-query-param-export": "יצוא הגרסאות הנוכחיות של כל הדפים הנתונים המחוללים.",
        "apihelp-query-param-exportnowrap": "להחזיר את ה־XML של היצוא בלי לעטוף אותו בתוצאת XML (אותו תסדיר כמו [[Special:Export]]). אפשר להשתמש בזה רק עם $1export.",
+       "apihelp-query-param-exportschema": "להשתמש בגרסה הנתונה של תסדיר היטל XML בעת היצוא. יכול לשמש רק עם <var>$1export</var>.",
        "apihelp-query-param-iwurl": "האם לקבל את ה־URL המלא אם הכותרת היא קישור בינוויקי.",
        "apihelp-query-param-rawcontinue": "להחזיר נתוני <samp>query-continue</samp> גולמיים להמשך.",
        "apihelp-query-example-revisions": "אחזור [[Special:ApiHelp/query+siteinfo|site info]] ו־[[Special:ApiHelp/query+revisions|revisions]] של <kbd>Main Page</kbd>.",
        "apihelp-query+langlinks-param-inlanguagecode": "קוד שפה בשביל שמות שפות מתורגמות.",
        "apihelp-query+langlinks-example-simple": "קבלת קישורים בין־לשוניים מהדף <kbd>Main Page</kbd>.",
        "apihelp-query+languageinfo-summary": "מחזירה מידע על שפות זמינות.",
+       "apihelp-query+languageinfo-extended-description": "אפשר להחיל [[mw:API:Query#Continuing queries|המשך]] אם אחזור המידע לוקח יותר מדי זמן בשביל בקשה אחת.",
        "apihelp-query+languageinfo-param-prop": "איזה מידע לקבל עבור כל שפה.",
+       "apihelp-query+languageinfo-paramvalue-prop-code": "קוד השפה. (הקוד הזה ייחודי למדיה־ויקי, אם כי יש חפיפה עם תקנים אחרים.)",
+       "apihelp-query+languageinfo-paramvalue-prop-bcp47": "קוד שפת לפי BCP-47.",
        "apihelp-query+languageinfo-paramvalue-prop-dir": "כיוון הכתיבה של השפה (<code>ltr</code> או <code>rtl</code>).",
+       "apihelp-query+languageinfo-paramvalue-prop-autonym": "השם העצמי של השפה, כלומר השם באותה השפה.",
+       "apihelp-query+languageinfo-paramvalue-prop-name": "השם בשפה בשפה שצוינה בפרמטר <var>uselang</var>, עם שפת גיבוי כשזה נחוץ.",
+       "apihelp-query+languageinfo-paramvalue-prop-fallbacks": "קודי השפה של שפות הגיבוי שמוגדרים עבור השפה הזאת. הגיבוי המשתמע הסופי ל־\"en\" אינו כלול (אבל שפות אחדות יכולות להיות מגובות ב־\"en\" במפורש).",
+       "apihelp-query+languageinfo-paramvalue-prop-variants": "קודי השפה של ההגוונים שהשפה הזאת תומכת בהם.",
+       "apihelp-query+languageinfo-param-code": "קודי השפה של השפות שאמורות להיות מוחזרות, או <code>*</code> כדי לקבל את כל השפות.",
        "apihelp-query+languageinfo-example-simple": "קבלת קודי שפה של כל השפות הנתמכות.",
+       "apihelp-query+languageinfo-example-autonym-name-de": "קבלת השמות העצמיים והשמות הגרמניים של כל השפות הנתמכות.",
+       "apihelp-query+languageinfo-example-fallbacks-variants-oc": "קבלת שפות הגיבוי וההגוונים של אוקסיטנית.",
+       "apihelp-query+languageinfo-example-bcp47-dir": "קבלת קודי שפה ב־BCP-47 וכיוון עבור כל השפות הנתמכות.",
        "apihelp-query+links-summary": "החזרת כל הקישורים מהדפים שצוינו.",
        "apihelp-query+links-param-namespace": "להציג קישורים רק במרחבי השם האלה.",
        "apihelp-query+links-param-limit": "כמה קישורים להחזיר.",
        "api-help-param-templated-var-first": "יש להחליף את הטקסט <var>&#x7B;$1&#x7D;</var> (בשם הפרמטר) עם הערכים של הפרמטר <var>$2</var>",
        "api-help-param-templated-var": "<var>&#x7B;$1&#x7D;</var> עם הערכים של הפרמטר <var>$2</var>",
        "api-help-datatypes-header": "סוגי נתונים",
-       "api-help-datatypes": "קלט למדיה־ויקי צריך להיות בקידוד UTF-8 מנורמל ב־NFC. מדיה־ויקי יכולה לנסות להמיר קלט אחר, אבל זה עלול לגרום לפעולות מסוימות (כגון [[Special:ApiHelp/edit|עריכות]] עם בדיקות MD5) להיכשל.\n\nחלק מסוגי הפרמטרים בבקשות API דורשים הסבר נוסף:\n;בוליאני (boolean)\n:פרמטרים בוליאניים עובדים כמו תיבות סימון של HTML: אם הפרמטר צוין, בלי קשר לערך שלו, הוא אמת (true). בשביל ערך שקר (false), יש להשמיט את הפרמטר לגמרי.\n;חותם־זמן (timestamp)\n:אפשר לכתוב חותמי־זמן במספר תסדירים. תאריך ושעה לפי ISO 8601 הוא הדבר המומלת. כל הזמנים מצוינים ב־ UTC, לא תהיה השפעה לשום אזור זמן שיצוין.\n:* תאריך ושעה לפי ISO 8601‏, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd> (לא חובה לכתוב פיסוק ו־<kbd>Z</kbd>)\n:* תאריך ושעה לפי ISO 8601 עם חלקי שנייה (שלא תהיה להם שום השפעה), <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>.<var>00001</var>Z</kbd> (לא חובה לכתוב קווים מפרידים, נקודתיים ו־<kbd>Z</kbd>)\n:* תסדיר MediaWiki‏, <kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* תסדיר מספרי כללי, <kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd> (לאזור זמן אופציונלי של <kbd>GMT</kbd>‏, <kbd dir=\"ltr\">+<var>##</var></kbd>, או <kbd dir=\"ltr\">-<var>##</var></kbd> אין השפעה)\n:* תסדיר EXIF‏, <kbd><var>2001</var>:<var>01</var>:<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* תסדיר RFC 2822 (אפשר להשמיט את אזור הזמן), <kbd><var>Mon</var>, <var>15</var> <var>Jan</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* תסדיר RFC 850 (אפשר להשמיט את אזור הזמן), <kbd><var>Monday</var>, <var>15</var>-<var>Jan</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* תסדיר C ctime‏, <kbd><var>Mon</var> <var>Jan</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>2001</var></kbd>\n:* שניות מאז 1970-01-01T00:00:00Z בתור מספר שלך בין 1 ל־13 (לא כולל <kbd>0</kbd>)\n:* המחרוזת <kbd>now</kbd>\n;מפריד ערכים מרובים חלופי\n:פרמטרים שלוקחים ערכים מרובים בדרך־כלל נשלחים עם הערכים מופרדים באמצעות תו מקל, למשל <kbd>param=value1|value2</kbd> או <kbd>param=value1%7Cvalue2</kbd>. אם הערך צריך להכיל את תו המקל, יש להשתמש ב־U+001F (מפריד יחידות) בתור המפריד ''וגם'' להוסיף לתחילת הערך U+001F, למשל <kbd>param=%1Fvalue1%1Fvalue2</kbd>.",
+       "api-help-datatypes": "קלט למדיה־ויקי צריך להיות בקידוד UTF-8 מנורמל ב־NFC. מדיה־ויקי יכולה לנסות להמיר קלט אחר, אבל זה עלול לגרום לפעולות מסוימות (כגון [[Special:ApiHelp/edit|עריכות]] עם בדיקות MD5) להיכשל.\n\nחלק מסוגי הפרמטרים בבקשות API דורשים הסבר נוסף:\n;בוליאני (boolean)\n:פרמטרים בוליאניים עובדים כמו תיבות סימון של HTML: אם הפרמטר צוין, בלי קשר לערך שלו, הוא אמת (true). בשביל ערך שקר (false), יש להשמיט את הפרמטר לגמרי.\n;חותם־זמן (timestamp)\n:אפשר לכתוב חותמי־זמן במספר תסדירים, ר' את [[mw:Special:MyLanguage/Timestamp|תיעוד תסדירי הקלט של ספריית Timestamp באתר mediawiki.org]] לפרטים. תאריך ושעה לפי ISO 8601 הוא הדבר המומלץ: <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd>. בנוסף, המחרוזת <kbd>now</kbd> יכולה לשמש לציון חום־הזמן הנוכחי.\n;מפריד ערכים מרובים חלופי\n:פרמטרים שלוקחים ערכים מרובים בדרך־כלל נשלחים עם הערכים מופרדים באמצעות תו מקל, למשל <kbd>param=value1|value2</kbd> או <kbd>param=value1%7Cvalue2</kbd>. אם הערך צריך להכיל את תו המקל, יש להשתמש ב־U+001F (מפריד יחידות) בתור המפריד ''וגם'' להוסיף לתחילת הערך U+001F, למשל <kbd>param=%1Fvalue1%1Fvalue2</kbd>.",
        "api-help-templatedparams-header": "פרמטרים בתבניות",
        "api-help-templatedparams": "התכונה \"פרמטרים בתבניות\" תומכת במקרים שבהם מודול של API זקוק לערך כלשהו עבור ערכים של פרמטרים אחרים. למשל, אם היה מודול API לבקשת פרי, ייתכן שהוא היה זקוק לפרמטר בשם <var>פירות</var> על־מנת לציין מהם הפירות המבוקשים, ולפרמטר בתבנית בשם <var>{פרי}-כמות</var> על־מנת לציין את הכמות של כל פרי עבור הבקשה. לשם כך, לקוח API שמעוניין לקבל תפוח אחד, 5 בננות ו־20 תותים יכול היה ליצור בקשה בסגנון <kbd>פירות=תפוחים|בננות|תותים&תפוחים-כמות=1&בננות-כמות=5&תותים-כמות=20</kbd>.",
        "api-help-param-type-limit": "סוג: מספר שלם או <kbd>max</kbd>",
        "apierror-cantoverwrite-sharedfile": "קובץ היעד קיים במאגר משותף ואין לך הרשאה לעקוף אותו.",
        "apierror-cantsend": "לא נכנסת לחשבון, אין לך חשבון דואר אלקטרוני מאושר, או שאסור לך לשלוח דואר אלקטרוני למשתמשים אחרים, ולכן אין לך אפשרות לשלוח דואר אלקטרוני.",
        "apierror-cantundelete": "לא היה אפשר לשחזר ממחיקה: אולי הגרסאות המבוקשות אינן קיימות, ואולי הן כבר נמחקו.",
+       "apierror-cantview-deleted-comment": "אין לך הרשאה לצפות בהערות מחוקות.",
+       "apierror-cantview-deleted-description": "אין לך הרשאה לצפות בתיאורים של קבצים מחוקים.",
+       "apierror-cantview-deleted-metadata": "אין לך הרשאה לצפות במטא־נתונים של קבצים מחוקים.",
+       "apierror-cantview-deleted-revision-content": "אין לך הרשאה לצפות בתוכן של גרסאות מחוקות.",
        "apierror-changeauth-norequest": "יצירת בקשת השינוי נכשלה.",
        "apierror-chunk-too-small": "גודל הפלח המזערי הוא {{PLURAL:$1|בית אחד|$1 בתים}} בשביל פלחים לא סופיים.",
        "apierror-cidrtoobroad": "טווחי CIDR של $1 שרחבים יותר מ־/$2 אינם קבילים.",
        "apiwarn-deprecation-missingparam": "מכיוון שלא צוין <var>$1</var>, ישמש תסדיר ישן לפלט. התסדיר הזה מוכרז בתור מיושן, ובעתיד ישמש רק התסדיר החדש.",
        "apiwarn-deprecation-parameter": "הפרמטר <var>$1</var> מיושן.",
        "apiwarn-deprecation-parse-headitems": "<kbd>prop=headitems</kbd> מיושן מאז מדיה־ויקי 1.28. יש להשתמש ב־<kbd>prop=headhtml</kbd> בעת יצירת מסמכי HTML חדשים, או ב־<kbd>prop=modules|jsconfigvars</kbd> בעת עדכון מסמך בצד הלקוח.",
+       "apiwarn-deprecation-post-without-content-type": "בקשת POST נעשתה ללא כותר <code>Content-Type</code>. זה לא עובד באופן מהימן.",
        "apiwarn-deprecation-purge-get": "שימוש ב־<kbd>action=purge</kbd> דרך GET מיושן. יש להשתמש ב־POST במקום זה.",
        "apiwarn-deprecation-withreplacement": "<kbd>$1</kbd> מיושן. יש להשתמש ב־<kbd>$2</kbd> במקום זה.",
        "apiwarn-difftohidden": "לא היה אפשר לעשות השוואה עם גרסה $1: התוכן מוסתר.",
index b648443..25e7522 100644 (file)
        "apihelp-block-param-userid": "{{doc-apihelp-param|block|userid}}",
        "apihelp-block-param-expiry": "{{doc-apihelp-param|block|expiry}}\n{{doc-important|Do not translate \"5 months\", \"2 weeks\", \"infinite\", \"indefinite\" or \"never\"!}}",
        "apihelp-block-param-reason": "{{doc-apihelp-param|block|reason}}",
-       "apihelp-block-param-anononly": "{{doc-apihelp-param|block|anononly}}\n* See also {{msg-mw|ipb-hardblock}}",
+       "apihelp-block-param-anononly": "{{doc-apihelp-param|block|anononly}}\n\n* See also {{msg-mw|ipb-hardblock}}",
        "apihelp-block-param-nocreate": "{{doc-apihelp-param|block|nocreate}}\n* See also {{msg-mw|ipbcreateaccount}}",
        "apihelp-block-param-autoblock": "{{doc-singularthey}}\n{{doc-apihelp-param|block|autoblock}}\n* See also {{msg-mw|ipbenableautoblock}}",
-       "apihelp-block-param-noemail": "{{doc-apihelp-param|block|noemail}}\n* See also {{msg-mw|ipbemailban}}",
+       "apihelp-block-param-noemail": "{{doc-apihelp-param|block|noemail}}\n\n* See also {{msg-mw|ipbemailban}}",
        "apihelp-block-param-hidename": "{{doc-apihelp-param|block|hidename}}",
        "apihelp-block-param-allowusertalk": "{{doc-apihelp-param|block|allowusertalk}}\n* See also {{msg-mw|ipb-disableusertalk}}",
        "apihelp-block-param-reblock": "{{doc-apihelp-param|block|reblock}}",
index 2e20529..4c2f27e 100644 (file)
@@ -29,6 +29,7 @@ use MediaWiki\Config\ServiceOptions;
 use MediaWiki\Permissions\PermissionManager;
 use MediaWiki\User\UserIdentity;
 use MWCryptHash;
+use Psr\Log\LoggerInterface;
 use User;
 use WebRequest;
 use WebResponse;
@@ -41,6 +42,12 @@ use Wikimedia\IPSet;
  * @since 1.34 Refactored from User and Block.
  */
 class BlockManager {
+       /** @var PermissionManager */
+       private $permissionManager;
+
+       /** @var ServiceOptions */
+       private $options;
+
        /**
         * TODO Make this a const when HHVM support is dropped (T192166)
         *
@@ -59,17 +66,23 @@ class BlockManager {
                'SoftBlockRanges',
        ];
 
+       /** @var LoggerInterface */
+       private $logger;
+
        /**
         * @param ServiceOptions $options
         * @param PermissionManager $permissionManager
+        * @param LoggerInterface $logger
         */
        public function __construct(
                ServiceOptions $options,
-               PermissionManager $permissionManager
+               PermissionManager $permissionManager,
+               LoggerInterface $logger
        ) {
                $options->assertRequiredOptions( self::$constructorOptions );
                $this->options = $options;
                $this->permissionManager = $permissionManager;
+               $this->logger = $logger;
        }
 
        /**
@@ -392,15 +405,14 @@ class BlockManager {
                                $ipList = $this->checkHost( $hostname );
 
                                if ( $ipList ) {
-                                       wfDebugLog(
-                                               'dnsblacklist',
+                                       $this->logger->info(
                                                "Hostname $hostname is {$ipList[0]}, it's a proxy says $basename!"
                                        );
                                        $found = true;
                                        break;
                                }
 
-                               wfDebugLog( 'dnsblacklist', "Requested $hostname, not found in $basename." );
+                               $this->logger->debug( "Requested $hostname, not found in $basename." );
                        }
                }
 
index 2ef9c9f..5a7f45e 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\MediaWikiServices;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Helper class for category membership changes
@@ -273,11 +274,15 @@ class CategoryMembershipChange {
         * @return null|string
         */
        private function getPreviousRevisionTimestamp() {
-               $previousRev = Revision::newFromId(
-                               $this->pageTitle->getPreviousRevisionID( $this->pageTitle->getLatestRevID() )
-                       );
-
-               return $previousRev ? $previousRev->getTimestamp() : null;
+               $rl = MediaWikiServices::getInstance()->getRevisionLookup();
+               $latestRev = $rl->getRevisionByTitle( $this->pageTitle );
+               if ( $latestRev ) {
+                       $previousRev = $rl->getPreviousRevision( $latestRev );
+                       if ( $previousRev ) {
+                               return $previousRev->getTimestamp();
+                       }
+               }
+               return null;
        }
 
 }
index 79092ee..e60cc09 100644 (file)
@@ -21,7 +21,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Feed to Special:RecentChanges and Special:RecentChangesLinked.
index a48e191..fbcbc35 100644 (file)
@@ -23,7 +23,7 @@
  */
 use MediaWiki\Linker\LinkRenderer;
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\Rdbms\IResultWrapper;
 
 class ChangesList extends ContextSource {
index e461762..d2c4dd4 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Generates a list of changes using an Enhanced system (uses javascript).
index a048a22..83720d3 100644 (file)
@@ -20,7 +20,7 @@
  * @file
  */
 use MediaWiki\Linker\LinkRenderer;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 class RCCacheEntryFactory {
 
@@ -56,7 +56,6 @@ class RCCacheEntryFactory {
         */
        public function newFromRecentChange( RecentChange $baseRC, $watched ) {
                $user = $this->context->getUser();
-               $counter = $baseRC->counter;
 
                $cacheEntry = RCCacheEntry::newFromParent( $baseRC );
 
@@ -73,8 +72,8 @@ class RCCacheEntryFactory {
                // called too many times (50% of CPU time on RecentChanges!).
                $showDiffLinks = $this->showDiffLinks( $cacheEntry, $user );
 
-               $cacheEntry->difflink = $this->buildDiffLink( $cacheEntry, $showDiffLinks, $counter );
-               $cacheEntry->curlink = $this->buildCurLink( $cacheEntry, $showDiffLinks, $counter );
+               $cacheEntry->difflink = $this->buildDiffLink( $cacheEntry, $showDiffLinks );
+               $cacheEntry->curlink = $this->buildCurLink( $cacheEntry, $showDiffLinks );
                $cacheEntry->lastlink = $this->buildLastLink( $cacheEntry, $showDiffLinks );
 
                // Make user links
@@ -182,11 +181,10 @@ class RCCacheEntryFactory {
        /**
         * @param RecentChange $cacheEntry
         * @param bool $showDiffLinks
-        * @param int $counter
         *
         * @return string
         */
-       private function buildCurLink( RecentChange $cacheEntry, $showDiffLinks, $counter ) {
+       private function buildCurLink( RecentChange $cacheEntry, $showDiffLinks ) {
                $queryParams = $this->buildCurQueryParams( $cacheEntry );
                $curMessage = $this->getMessage( 'cur' );
                $logTypes = [ RC_LOG ];
@@ -217,11 +215,10 @@ class RCCacheEntryFactory {
        /**
         * @param RecentChange $cacheEntry
         * @param bool $showDiffLinks
-        * @param int $counter
         *
         * @return string
         */
-       private function buildDiffLink( RecentChange $cacheEntry, $showDiffLinks, $counter ) {
+       private function buildDiffLink( RecentChange $cacheEntry, $showDiffLinks ) {
                $queryParams = $this->buildDiffQueryParams( $cacheEntry );
                $diffMessage = $this->getMessage( 'diff' );
                $logTypes = [ RC_NEW, RC_LOG ];
index 1827aab..ce82b71 100644 (file)
@@ -20,7 +20,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Item class for a logging table row with its associated change tags.
index 170d5c2..8f4f058 100644 (file)
@@ -45,6 +45,9 @@ class CustomUppercaseCollation extends NumericUppercaseCollation {
        /** @var array $puaSubset List of private use area codes */
        private $puaSubset;
 
+       /** @var array */
+       private $firstLetters;
+
        /**
         * @note This assumes $alphabet does not contain U+F3000-U+F3FFF
         *
index 9fbb72c..533f639 100644 (file)
@@ -26,7 +26,7 @@
  * @author Daniel Kinzler
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\Assert\Assert;
 use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\MediaWikiServices;
index a48faf1..56fc0b3 100644 (file)
@@ -10,6 +10,9 @@ use Psr\Log\AbstractLogger;
  * goal.
  */
 class ConsoleLogger extends AbstractLogger {
+       /** @var string */
+       private $channel;
+
        /**
         * @param string $channel
         */
index 8a5caa2..7e4e53e 100644 (file)
@@ -1713,14 +1713,29 @@ class DifferenceEngine extends ContextSource {
         *     false signifies that there is no previous/next revision ($old is the oldest/newest one).
         */
        public function mapDiffPrevNext( $old, $new ) {
+               $rl = MediaWikiServices::getInstance()->getRevisionLookup();
                if ( $new === 'prev' ) {
                        // Show diff between revision $old and the previous one. Get previous one from DB.
                        $newid = intval( $old );
-                       $oldid = $this->getTitle()->getPreviousRevisionID( $newid );
+                       $oldid = false;
+                       $newRev = $rl->getRevisionById( $newid );
+                       if ( $newRev ) {
+                               $oldRev = $rl->getPreviousRevision( $newRev );
+                               if ( $oldRev ) {
+                                       $oldid = $oldRev->getId();
+                               }
+                       }
                } elseif ( $new === 'next' ) {
                        // Show diff between revision $old and the next one. Get next one from DB.
                        $oldid = intval( $old );
-                       $newid = $this->getTitle()->getNextRevisionID( $oldid );
+                       $newid = false;
+                       $oldRev = $rl->getRevisionById( $oldid );
+                       if ( $oldRev ) {
+                               $newRev = $rl->getNextRevision( $oldRev );
+                               if ( $newRev ) {
+                                       $newid = $newRev->getId();
+                               }
+                       }
                } else {
                        $oldid = intval( $old );
                        $newid = intval( $new );
index c1b3595..fd200d1 100644 (file)
@@ -28,7 +28,7 @@
  */
 
 use MediaWiki\MediaWikiServices as MediaWikiServicesAlias;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
 
index 42e78ff..ff8f056 100644 (file)
@@ -142,6 +142,12 @@ class FileRepo {
        /** @var WANObjectCache */
        protected $wanCache;
 
+       /**
+        * @var string
+        * @protected Use $this->getName(). Public for back-compat only
+        */
+       public $name;
+
        /**
         * @param array|null $info
         * @throws MWException
index 17fa146..b4fd176 100644 (file)
@@ -94,6 +94,9 @@ class ArchivedFile {
        /** @var Title */
        protected $title; # image title
 
+       /** @var bool */
+       private $exists;
+
        /**
         * @throws MWException
         * @param Title $title
index 85988f6..f363beb 100644 (file)
@@ -22,7 +22,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Helper class for file deletion
index 6e760fa..a5d7145 100644 (file)
@@ -149,6 +149,5 @@ if ( false ) {
        // autoload entries for the lowercase variants of these classes (T166759).
        // The code below is never executed, but it is picked up by the AutoloadGenerator
        // parser, which scans for class_alias() calls.
-       // @phan-suppress-next-line PhanRedefineClassAlias
        class_alias( ConcatenatedGzipHistoryBlob::class, 'concatenatedgziphistoryblob' );
 }
index cd2a935..8858c8d 100644 (file)
@@ -69,6 +69,5 @@ if ( false ) {
        // autoload entries for the lowercase variants of these classes (T166759).
        // The code below is never executed, but it is picked up by the AutoloadGenerator
        // parser, which scans for class_alias() calls.
-       // @phan-suppress-next-line PhanRedefineClassAlias
        class_alias( HistoryBlobCurStub::class, 'historyblobcurstub' );
 }
index c92e1b5..9a4df1f 100644 (file)
@@ -149,6 +149,5 @@ if ( false ) {
        // autoload entries for the lowercase variants of these classes (T166759).
        // The code below is never executed, but it is picked up by the AutoloadGenerator
        // parser, which scans for class_alias() calls.
-       // @phan-suppress-next-line PhanRedefineClassAlias
        class_alias( HistoryBlobStub::class, 'historyblobstub' );
 }
index 048abbb..b55b652 100644 (file)
@@ -657,6 +657,7 @@ abstract class HTMLFormField {
         * @param OOUI\Widget $inputField
         * @param array $config
         * @return OOUI\FieldLayout|OOUI\ActionFieldLayout
+        * @suppress PhanUndeclaredProperty Only some subclasses declare mClassWithButton
         */
        protected function getFieldLayoutOOUI( $inputField, $config ) {
                if ( isset( $this->mClassWithButton ) ) {
index 354432b..05ab0bb 100644 (file)
@@ -11,6 +11,9 @@
  * @todo FIXME: If made 'required', only the text field should be compulsory.
  */
 class HTMLSelectAndOtherField extends HTMLSelectField {
+       /** @var string[] */
+       private $mFlatOptions;
+
        public function __construct( $params ) {
                if ( array_key_exists( 'other', $params ) ) {
                        // Do nothing
index a4120a3..13ab9b7 100644 (file)
@@ -29,6 +29,7 @@ use GuzzleHttp\Psr7\StreamDecoratorTrait;
  *
  * @private for use by GuzzleHttpRequest only
  * @since 1.33
+ * @property StreamInterface $stream Defined in StreamDecoratorTrait via @property, not read by phan
  */
 class MWCallbackStream implements StreamInterface {
        use StreamDecoratorTrait;
index 2f8f5dd..81e414e 100644 (file)
@@ -30,6 +30,9 @@ use MediaWiki\MediaWikiServices;
  * @ingroup SpecialPage
  */
 class ImportStreamSource implements ImportSource {
+       /** @var resource */
+       private $mHandle;
+
        /**
         * @param resource $handle
         */
index 0d1cc68..6eba4f3 100644 (file)
@@ -33,7 +33,8 @@ use MediaWiki\MediaWikiServices;
  * @ingroup SpecialPage
  */
 class WikiImporter {
-       private $reader = null;
+       /** @var XMLReader */
+       private $reader;
        private $foreignNamespaces = null;
        private $mLogItemCallback, $mUploadCallback, $mRevisionCallback, $mPageCallback;
        private $mSiteInfoCallback, $mPageOutCallback;
index 08cfd86..eb96e05 100644 (file)
@@ -21,6 +21,9 @@
  */
 
 class InstallDocFormatter {
+       /** @var string */
+       private $text;
+
        public static function format( $text ) {
                $obj = new self( $text );
 
index a2179c6..6921361 100644 (file)
@@ -30,6 +30,7 @@
 class LocalSettingsGenerator {
 
        protected $extensions = [];
+       protected $skins = [];
        protected $values = [];
        protected $groupPermissions = [];
        protected $dbSettings = '';
index 64c017b..ea88411 100644 (file)
@@ -29,7 +29,7 @@ use MediaWiki\MediaWikiServices;
  *
  * @ingroup Deployment
  * @since 1.17
- * @property DatabaseMysqlBase $db
+ * @property Wikimedia\Rdbms\DatabaseMysqlBase $db
  */
 class MysqlUpdater extends DatabaseUpdater {
        protected function getCoreUpdateList() {
index 9a3d4a3..e9b0c56 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use Wikimedia\Rdbms\Database;
+use Wikimedia\Rdbms\DatabasePostgres;
 use Wikimedia\Rdbms\DBQueryError;
 use Wikimedia\Rdbms\DBConnectionError;
 
index 168c937..dfea0a5 100644 (file)
@@ -7,7 +7,8 @@
                        "Zedlik",
                        "아라",
                        "Red Winged Duck",
-                       "Macofe"
+                       "Macofe",
+                       "Renessaince"
                ]
        },
        "config-desc": "Праграма ўсталяваньня MediaWiki",
@@ -85,7 +86,7 @@
        "config-uploads-not-safe": "'''Папярэджаньне:''' дырэкторыя для загрузак па змоўчваньні <code>$1</code> уразьлівая да выкананьня адвольнага коду.\nХоць MediaWiki і правярае ўсе файлы перад захаваньнем, вельмі рэкамэндуецца [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security закрыць гэтую ўразьлівасьць] перад уключэньнем магчымасьці загрузкі файлаў.",
        "config-no-cli-uploads-check": "'''Папярэджаньне:''' Вашая дырэкторыя для загрузак па змоўчваньні (<code>$1</code>), не правераная на ўразьлівасьць да выкананьня адвольных скрыптоў падчас усталяваньня CLI.\n.",
        "config-brokenlibxml": "У Вашай сыстэме ўсталяваныя PHP і libxml2 зь несумяшчальнымі вэрсіямі, што можа прывесьці да пашкоджаньня зьвестак MediaWiki і іншых вэб-дастасаваньняў.\nАбнавіце libxml2 да вэрсіі 2.7.3 ці больш позьняй ([https://bugs.php.net/bug.php?id=45996 паведамленьне пра памылку на сайце PHP]).\nУсталяваньне перарванае.",
-       "config-suhosin-max-value-length": "Suhosin усталяваны і абмяжоўвае <code>даўжыню</code> парамэтру GET да $1 {{PLURAL:$1|1=байта|байтаў}}.\nResourceLoader, складнік MediaWiki, будзе абходзіць гэтае абмежаваньне, што адаб’ецца на прадукцыйнасьці.\nКалі магчыма, варта ўсталяваць у <code>php.ini</code> значэньне <code>suhosin.get.max_value_length</code> роўным 1024 ці больш, а таксама вызначыць тое ж значэньне для <code>$wgResourceLoaderMaxQueryLength</code> у <code>LocalSettings.php</code>.",
+       "config-suhosin-max-value-length": "Suhosin усталяваны і абмяжоўвае <code>даўжыню</code> парамэтру GET да $1 {{PLURAL:$1|1=байта|байтаў}}.\nMediaWiki патрабуе, каб <code>suhosin.get.max_value_length</code> складаў прынамсі $2. Адключыце гэтую наладу ці павялічце гэтае значэньня да $3 ў <code>php.ini</code>.",
        "config-using-32bit": "<strong>Папярэджаньне:</strong> падобна, што вашая сыстэма выкарыстоўвае 32-бітавыя цэлыя лікі. Гэта [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:32-bit не рэкамэндуецца].",
        "config-db-type": "Тып базы зьвестак:",
        "config-db-host": "Хост базы зьвестак:",
index 74d8895..3ce3fe2 100644 (file)
@@ -12,6 +12,7 @@
        "config-localsettings-upgrade": "L'arkivo <code>LocalSettings.php</code> trovesis.\nPor plubonigar l'instaluro, voluntez informar la valoro dil  <code>$wgUpgradeKey</code> en l'infra buxo.\nVu trovos ol en <code>LocalSettings.php</code>.",
        "config-session-error": "Eroro dum komenco di seciono: $1",
        "config-session-expired": "Vua sesiono probable finis.\nSesioni programesis por durar $1\nVu povas augmentar to per modifiko di <code>session.gc_maxlifetime</code> en php.ini.\nRikomencez l'instalo-procedo.",
+       "config-no-session": "La dati pri vua sesiono desaparis!\nVerifikez vua arkivo php.ini e certigez su pri <code>session.save_path</code> indikas la korekta libro di adresaro.",
        "config-your-language": "Vua idiomo:",
        "config-your-language-help": "Selektez l'idiomo por uzar dum l'instalo-procedo.",
        "config-wiki-language": "Wiki linguo:",
        "config-help-restart": "Ka vu deziras efacar omna dati qui vu sparis, e rikomencar la procedi pri instalo?",
        "config-restart": "Yes, rikomencez ol",
        "config-welcome-section-copyright": "=== Autoroyuro e termini ===\n\n$1\n\nCa informatikoprogramo esas libera; vu povas ridistributar ol e/o modifikar ol segun la termini de la Generala Licenco Publika GNU, quale stipulata da Free Software Foundation; segun lua versiono 2 o sequanta.\n\nNi expektas ke ca programo esas utila, kande ni distributas ol. <strong>Tamen, ni ne povas grantar ke ol fakte esos utila</strong>. Ni anke ne povas afirmar ke ol esos <strong>vendebla</strong> o <strong>ke ol esos utila por specifika intenco</strong>.\nLektez la Generala Licenco Publika GNU por plusa detali.\n\nKune ica programo vu certe recevis [$2  kopiuro di la Generala Licenco Publika GNU]. Se vu ne recevis ol, voluntez skribar a la fonduro Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA, o [https://www.gnu.org/copyleft/gpl.html lektez ol che l'interreto].",
+       "config-sidebar-readme": "Lektez me",
+       "config-sidebar-relnotes": "Informi pri la versiono",
+       "config-sidebar-license": "Kopiuro",
+       "config-sidebar-upgrade": "Nova versiono",
        "config-env-good": "Omno verifikesis.\nVu povas intalar MediaWiki.",
        "config-env-bad": "Omno verifikesis.\nVu NE POVAS intalar MediaWiki.",
        "config-env-php": "PHP $1 instalesis.",
        "config-env-hhvm": "HHVM $1 instalesis.",
+       "config-unicode-using-intl": "Uzanta [https://php.net/manual/en/book.intl.php PHP intl extension] por normaligo Unicode.",
        "config-unicode-pure-php-warning": "<strong>Atencez:</strong> La [https://php.net/manual/en/book.intl.php prolonguro PHP intl] ne esas disponebla por traktar skribo-normaligo \"Unicode\". Vice, uzesas la plu lenta laborado en pura PHP.\nSe vu administras pagini multe vizitata, vu mustas lektar la [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations skribo-normaligo Unicode].",
+       "config-unicode-update-warning": "<strong>Atencez:</strong> La versiono di ''Unicode normalization wrapper'' instalata en vua komputero uzas obsoleta versiono di la biblioteko del [http://site.icu-project.org/ projeto ICU].\nVu mustas instalar [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations la nova versiono] se vu deziras uzar Unicode.",
        "config-memory-raised": "Parametro <code>memory_limit</code> esas $1, modifikata a $2.",
        "config-memory-bad": "<strong>Atences:</strong> la limito por PHP <code>memory_limit</code> esas $1.\nTo probable esas nesuficanta.\nL'instalo-procedo povas faliar!",
        "config-apc": "[https://www.php.net/apc APC] instalesis",
        "config-apcu": "[https://www.php.net/apcu APCu] instalesis",
        "config-wincache": "[https://www.iis.net/downloads/microsoft/wincache-extension WinCache] instalesis",
+       "config-no-uri": "<strong>Eroro:</strong> Ne esis posibla identifikar l'existanta URI.\nInstalo interruptata.",
+       "config-no-cli-uri": "<strong>Avizo:</strong> Nula <code>--scriptpath</code> informata. Uzanta la preexistanta: <code>$1</code>.",
+       "config-using-server": "Uzanta ret-adreso (URL) dil servero \"<nowiki>$1</nowiki>\".",
        "config-using-uri": "Ret-adreso (URL) dil servero \"<nowiki>$1$2</nowiki>\".",
+       "config-db-type": "Tipo di datumaro:",
+       "config-db-host": "Loko dil datumaro:",
        "config-db-wiki-settings": "Identifikez ca wiki",
        "config-db-name": "Nomo dil datumaro (sen strekteti):",
        "config-db-install-account": "Konto dil uzero por instalo",
        "config-db-username": "Uzero-nomo dil datumaro:",
        "config-db-password": "Pasovorto dil datumaro:",
        "config-invalid-db-type": "Nevalida tipo di datumaro.",
+       "config-missing-db-name": "Vu mustas informar valoro por \"{{int:config-db-name}}\".",
+       "config-missing-db-host": "Vu mustas informar valoro por \"{{int:config-db-host}}\".",
+       "config-sqlite-readonly": "L'arkivo <code>$1</code> esas nur lektebla.",
+       "config-sqlite-cant-create-db": "Ne povis krear l'arkivo di datumaro <code>$1</code>.",
        "config-ns-generic": "Projeto",
        "config-ns-site-name": "Sama kam la wiki-nomo: $1",
        "config-ns-other": "Altra (definez precise)",
index 5caf250..d7d428e 100644 (file)
@@ -1396,12 +1396,12 @@ abstract class FileBackendStore extends FileBackend {
                        }
                }
 
-               $res = $this->doExecuteOpHandlesInternal( $fileOpHandles );
+               $statuses = $this->doExecuteOpHandlesInternal( $fileOpHandles );
                foreach ( $fileOpHandles as $fileOpHandle ) {
                        $fileOpHandle->closeResources();
                }
 
-               return $res;
+               return $statuses;
        }
 
        /**
index 5632d5e..820634c 100644 (file)
@@ -172,64 +172,33 @@ class SwiftFileBackend extends FileBackendStore {
        }
 
        /**
-        * Sanitize and filter the custom headers from a $params array.
-        * Only allows certain "standard" Content- and X-Content- headers.
+        * Filter/normalize a header map to only include mutable "content-"/"x-content-" headers
         *
-        * @param array $params
-        * @return array Sanitized value of 'headers' field in $params
-        */
-       protected function sanitizeHdrsStrict( array $params ) {
-               if ( !isset( $params['headers'] ) ) {
-                       return [];
-               }
-
-               $headers = $this->getCustomHeaders( $params['headers'] );
-               unset( $headers[ 'content-type' ] );
-
-               return $headers;
-       }
-
-       /**
-        * Sanitize and filter the custom headers from a $params array.
-        * Only allows certain "standard" Content- and X-Content- headers.
+        * Mutable headers can be changed via HTTP POST even if the file content is the same
         *
-        * When POSTing data, libcurl adds Content-Type: application/x-www-form-urlencoded
-        * if Content-Type is not set, which overwrites the stored Content-Type header
-        * in Swift - therefore for POSTing data do not strip the Content-Type header (the
-        * previously-stored header that has been already read back from swift is sent)
-        *
-        * @param array $params
-        * @return array Sanitized value of 'headers' field in $params
+        * @see https://docs.openstack.org/api-ref/object-store
+        * @param string[] $headers Map of (header => value) for a swift object
+        * @return string[] Map of (header => value) for Content-* headers mutable via POST
         */
-       protected function sanitizeHdrs( array $params ) {
-               return isset( $params['headers'] )
-                       ? $this->getCustomHeaders( $params['headers'] )
-                       : [];
-       }
-
-       /**
-        * @param array $rawHeaders
-        * @return array Custom non-metadata HTTP headers
-        */
-       protected function getCustomHeaders( array $rawHeaders ) {
-               $headers = [];
-
+       protected function extractMutableContentHeaders( array $headers ) {
+               $contentHeaders = [];
                // Normalize casing, and strip out illegal headers
-               foreach ( $rawHeaders as $name => $value ) {
+               foreach ( $headers as $name => $value ) {
                        $name = strtolower( $name );
-                       if ( preg_match( '/^content-length$/', $name ) ) {
-                               continue; // blacklisted
-                       } elseif ( preg_match( '/^(x-)?content-/', $name ) ) {
-                               $headers[$name] = $value; // allowed
-                       } elseif ( preg_match( '/^content-(disposition)/', $name ) ) {
-                               $headers[$name] = $value; // allowed
+                       if ( !preg_match( '/^(x-)?content-(?!length$)/', $name ) ) {
+                               // Only allow content-* and x-content-* headers (but not content-length)
+                               continue;
+                       } elseif ( $name === 'content-type' && !strlen( $value ) ) {
+                               // This header can be set to a value but not unset for sanity
+                               continue;
                        }
+                       $contentHeaders[$name] = $value;
                }
                // By default, Swift has annoyingly low maximum header value limits
-               if ( isset( $headers['content-disposition'] ) ) {
+               if ( isset( $contentHeaders['content-disposition'] ) ) {
                        $disposition = '';
                        // @note: assume FileBackend::makeContentDisposition() already used
-                       foreach ( explode( ';', $headers['content-disposition'] ) as $part ) {
+                       foreach ( explode( ';', $contentHeaders['content-disposition'] ) as $part ) {
                                $part = trim( $part );
                                $new = ( $disposition === '' ) ? $part : "{$disposition};{$part}";
                                if ( strlen( $new ) <= 255 ) {
@@ -238,36 +207,40 @@ class SwiftFileBackend extends FileBackendStore {
                                        break; // too long; sigh
                                }
                        }
-                       $headers['content-disposition'] = $disposition;
+                       $contentHeaders['content-disposition'] = $disposition;
                }
 
-               return $headers;
+               return $contentHeaders;
        }
 
        /**
-        * @param array $rawHeaders
-        * @return array Custom metadata headers
+        * @see https://docs.openstack.org/api-ref/object-store
+        * @param string[] $headers Map of (header => value) for a swift object
+        * @return string[] Map of (metadata header name => metadata value)
         */
-       protected function getMetadataHeaders( array $rawHeaders ) {
-               $headers = [];
-               foreach ( $rawHeaders as $name => $value ) {
+       protected function extractMetadataHeaders( array $headers ) {
+               $metadataHeaders = [];
+               foreach ( $headers as $name => $value ) {
                        $name = strtolower( $name );
                        if ( strpos( $name, 'x-object-meta-' ) === 0 ) {
-                               $headers[$name] = $value;
+                               $metadataHeaders[$name] = $value;
                        }
                }
 
-               return $headers;
+               return $metadataHeaders;
        }
 
        /**
-        * @param array $rawHeaders
-        * @return array Custom metadata headers with prefix removed
+        * @see https://docs.openstack.org/api-ref/object-store
+        * @param string[] $headers Map of (header => value) for a swift object
+        * @return string[] Map of (metadata key name => metadata value)
         */
-       protected function getMetadata( array $rawHeaders ) {
+       protected function getMetadataFromHeaders( array $headers ) {
+               $prefixLen = strlen( 'x-object-meta-' );
+
                $metadata = [];
-               foreach ( $this->getMetadataHeaders( $rawHeaders ) as $name => $value ) {
-                       $metadata[substr( $name, strlen( 'x-object-meta-' ) )] = $value;
+               foreach ( $this->extractMetadataHeaders( $headers ) as $name => $value ) {
+                       $metadata[substr( $name, $prefixLen )] = $value;
                }
 
                return $metadata;
@@ -283,19 +256,24 @@ class SwiftFileBackend extends FileBackendStore {
                        return $status;
                }
 
-               $sha1Hash = Wikimedia\base_convert( sha1( $params['content'] ), 16, 36, 31 );
-               $contentType = $params['headers']['content-type']
+               // Headers that are not strictly a function of the file content
+               $mutableHeaders = $this->extractMutableContentHeaders( $params['headers'] ?? [] );
+               // Make sure that the "content-type" header is set to something sensible
+               $mutableHeaders['content-type'] = $mutableHeaders['content-type']
                        ?? $this->getContentType( $params['dst'], $params['content'], null );
 
                $reqs = [ [
                        'method' => 'PUT',
                        'url' => [ $dstCont, $dstRel ],
-                       'headers' => [
-                               'content-length' => strlen( $params['content'] ),
-                               'etag' => md5( $params['content'] ),
-                               'content-type' => $contentType,
-                               'x-object-meta-sha1base36' => $sha1Hash
-                       ] + $this->sanitizeHdrsStrict( $params ),
+                       'headers' => array_merge(
+                               $mutableHeaders,
+                               [
+                                       'content-length' => strlen( $params['content'] ),
+                                       'etag' => md5( $params['content'] ),
+                                       'x-object-meta-sha1base36' =>
+                                               Wikimedia\base_convert( sha1( $params['content'] ), 16, 36, 31 )
+                               ]
+                       ),
                        'body' => $params['content']
                ] ];
 
@@ -309,6 +287,8 @@ class SwiftFileBackend extends FileBackendStore {
                        } else {
                                $this->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
                        }
+
+                       return SwiftFileOpHandle::CONTINUE_IF_OK;
                };
 
                $opHandle = new SwiftFileOpHandle( $this, $handler, $reqs );
@@ -332,16 +312,13 @@ class SwiftFileBackend extends FileBackendStore {
                }
 
                AtEase::suppressWarnings();
-               $sha1Hash = sha1_file( $params['src'] );
+               $sha1Base16 = sha1_file( $params['src'] );
                AtEase::restoreWarnings();
-               if ( $sha1Hash === false ) { // source doesn't exist?
+               if ( $sha1Base16 === false ) { // source doesn't exist?
                        $status->fatal( 'backend-fail-store', $params['src'], $params['dst'] );
 
                        return $status;
                }
-               $sha1Hash = Wikimedia\base_convert( $sha1Hash, 16, 36, 31 );
-               $contentType = $params['headers']['content-type']
-                       ?? $this->getContentType( $params['dst'], null, $params['src'] );
 
                $handle = fopen( $params['src'], 'rb' );
                if ( $handle === false ) { // source doesn't exist?
@@ -350,15 +327,23 @@ class SwiftFileBackend extends FileBackendStore {
                        return $status;
                }
 
+               // Headers that are not strictly a function of the file content
+               $mutableHeaders = $this->extractMutableContentHeaders( $params['headers'] ?? [] );
+               // Make sure that the "content-type" header is set to something sensible
+               $mutableHeaders['content-type'] = $mutableHeaders['content-type']
+                       ?? $this->getContentType( $params['dst'], null, $params['src'] );
+
                $reqs = [ [
                        'method' => 'PUT',
                        'url' => [ $dstCont, $dstRel ],
-                       'headers' => [
-                               'content-length' => filesize( $params['src'] ),
-                               'etag' => md5_file( $params['src'] ),
-                               'content-type' => $contentType,
-                               'x-object-meta-sha1base36' => $sha1Hash
-                       ] + $this->sanitizeHdrsStrict( $params ),
+                       'headers' => array_merge(
+                               $mutableHeaders,
+                               [
+                                       'content-length' => fstat( $handle )['size'],
+                                       'etag' => md5_file( $params['src'] ),
+                                       'x-object-meta-sha1base36' => Wikimedia\base_convert( $sha1Base16, 16, 36, 31 )
+                               ]
+                       ),
                        'body' => $handle // resource
                ] ];
 
@@ -372,6 +357,8 @@ class SwiftFileBackend extends FileBackendStore {
                        } else {
                                $this->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
                        }
+
+                       return SwiftFileOpHandle::CONTINUE_IF_OK;
                };
 
                $opHandle = new SwiftFileOpHandle( $this, $handler, $reqs );
@@ -406,10 +393,13 @@ class SwiftFileBackend extends FileBackendStore {
                $reqs = [ [
                        'method' => 'PUT',
                        'url' => [ $dstCont, $dstRel ],
-                       'headers' => [
-                               'x-copy-from' => '/' . rawurlencode( $srcCont ) .
-                                       '/' . str_replace( "%2F", "/", rawurlencode( $srcRel ) )
-                       ] + $this->sanitizeHdrsStrict( $params ), // extra headers merged into object
+                       'headers' => array_merge(
+                               $this->extractMutableContentHeaders( $params['headers'] ?? [] ),
+                               [
+                                       'x-copy-from' => '/' . rawurlencode( $srcCont ) . '/' .
+                                               str_replace( "%2F", "/", rawurlencode( $srcRel ) )
+                               ]
+                       )
                ] ];
 
                $method = __METHOD__;
@@ -418,10 +408,14 @@ class SwiftFileBackend extends FileBackendStore {
                        if ( $rcode === 201 ) {
                                // good
                        } elseif ( $rcode === 404 ) {
-                               $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
+                               if ( empty( $params['ignoreMissingSource'] ) ) {
+                                       $status->fatal( 'backend-fail-copy', $params['src'], $params['dst'] );
+                               }
                        } else {
                                $this->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
                        }
+
+                       return SwiftFileOpHandle::CONTINUE_IF_OK;
                };
 
                $opHandle = new SwiftFileOpHandle( $this, $handler, $reqs );
@@ -451,16 +445,17 @@ class SwiftFileBackend extends FileBackendStore {
                        return $status;
                }
 
-               $reqs = [
-                       [
-                               'method' => 'PUT',
-                               'url' => [ $dstCont, $dstRel ],
-                               'headers' => [
-                                       'x-copy-from' => '/' . rawurlencode( $srcCont ) .
-                                               '/' . str_replace( "%2F", "/", rawurlencode( $srcRel ) )
-                               ] + $this->sanitizeHdrsStrict( $params ) // extra headers merged into object
-                       ]
-               ];
+               $reqs = [ [
+                       'method' => 'PUT',
+                       'url' => [ $dstCont, $dstRel ],
+                       'headers' => array_merge(
+                               $this->extractMutableContentHeaders( $params['headers'] ?? [] ),
+                               [
+                                       'x-copy-from' => '/' . rawurlencode( $srcCont ) . '/' .
+                                               str_replace( "%2F", "/", rawurlencode( $srcRel ) )
+                               ]
+                       )
+               ] ];
                if ( "{$srcCont}/{$srcRel}" !== "{$dstCont}/{$dstRel}" ) {
                        $reqs[] = [
                                'method' => 'DELETE',
@@ -477,10 +472,17 @@ class SwiftFileBackend extends FileBackendStore {
                        } elseif ( $request['method'] === 'DELETE' && $rcode === 204 ) {
                                // good
                        } elseif ( $rcode === 404 ) {
-                               $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
+                               if ( empty( $params['ignoreMissingSource'] ) ) {
+                                       $status->fatal( 'backend-fail-move', $params['src'], $params['dst'] );
+                               } else {
+                                       // Leave Status as OK but skip the DELETE request
+                                       return SwiftFileOpHandle::CONTINUE_NO;
+                               }
                        } else {
                                $this->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
                        }
+
+                       return SwiftFileOpHandle::CONTINUE_IF_OK;
                };
 
                $opHandle = new SwiftFileOpHandle( $this, $handler, $reqs );
@@ -521,6 +523,8 @@ class SwiftFileBackend extends FileBackendStore {
                        } else {
                                $this->onError( $status, $method, $params, $rerr, $rcode, $rdesc );
                        }
+
+                       return SwiftFileOpHandle::CONTINUE_IF_OK;
                };
 
                $opHandle = new SwiftFileOpHandle( $this, $handler, $reqs );
@@ -554,17 +558,20 @@ class SwiftFileBackend extends FileBackendStore {
                        return $status;
                }
 
-               // POST clears prior headers, so we need to merge the changes in to the old ones
-               $metaHdrs = [];
+               // Swift object POST clears any prior headers, so merge the new and old headers here.
+               // Also, during, POST, libcurl adds "Content-Type: application/x-www-form-urlencoded"
+               // if "Content-Type" is not set, which would clobber the header value for the object.
+               $oldMetadataHeaders = [];
                foreach ( $stat['xattr']['metadata'] as $name => $value ) {
-                       $metaHdrs["x-object-meta-$name"] = $value;
+                       $oldMetadataHeaders["x-object-meta-$name"] = $value;
                }
-               $customHdrs = $this->sanitizeHdrs( $params ) + $stat['xattr']['headers'];
+               $newContentHeaders = $this->extractMutableContentHeaders( $params['headers'] ?? [] );
+               $oldContentHeaders = $stat['xattr']['headers'];
 
                $reqs = [ [
                        'method' => 'POST',
                        'url' => [ $srcCont, $srcRel ],
-                       'headers' => $metaHdrs + $customHdrs
+                       'headers' => $oldMetadataHeaders + $newContentHeaders + $oldContentHeaders
                ] ];
 
                $method = __METHOD__;
@@ -743,9 +750,9 @@ class SwiftFileBackend extends FileBackendStore {
                }
 
                // Find prior custom HTTP headers
-               $postHeaders = $this->getCustomHeaders( $objHdrs );
+               $postHeaders = $this->extractMutableContentHeaders( $objHdrs );
                // Find prior metadata headers
-               $postHeaders += $this->getMetadataHeaders( $objHdrs );
+               $postHeaders += $this->extractMetadataHeaders( $objHdrs );
 
                $status = $this->newStatus();
                /** @noinspection PhpUnusedLocalVariableInspection */
@@ -1293,11 +1300,6 @@ class SwiftFileBackend extends FileBackendStore {
                return $hdrs;
        }
 
-       /**
-        * @param FileBackendStoreOpHandle[] $fileOpHandles
-        *
-        * @return StatusValue[]
-        */
        protected function doExecuteOpHandlesInternal( array $fileOpHandles ) {
                /** @var SwiftFileOpHandle[] $fileOpHandles */
                '@phan-var SwiftFileOpHandle[] $fileOpHandles';
@@ -1334,13 +1336,18 @@ class SwiftFileBackend extends FileBackendStore {
                for ( $stage = 0; $stage < $reqCount; ++$stage ) {
                        $httpReqs = $this->http->runMulti( $httpReqsByStage[$stage] );
                        foreach ( $httpReqs as $index => $httpReq ) {
+                               /** @var SwiftFileOpHandle $fileOpHandle */
+                               $fileOpHandle = $fileOpHandles[$index];
                                // Run the callback for each request of this operation
-                               $callback = $fileOpHandles[$index]->callback;
-                               $callback( $httpReq, $statuses[$index] );
-                               // On failure, abort all remaining requests for this operation
-                               // (e.g. abort the DELETE request if the COPY request fails for a move)
-                               if ( !$statuses[$index]->isOK() ) {
-                                       $stages = count( $fileOpHandles[$index]->httpOp );
+                               $status = $statuses[$index];
+                               ( $fileOpHandle->callback )( $httpReq, $status );
+                               // On failure, abort all remaining requests for this operation. This is used
+                               // in "move" operations to abort the DELETE request if the PUT request fails.
+                               if (
+                                       !$status->isOK() ||
+                                       $fileOpHandle->state === $fileOpHandle::CONTINUE_NO
+                               ) {
+                                       $stages = count( $fileOpHandle->httpOp );
                                        for ( $s = ( $stage + 1 ); $s < $stages; ++$s ) {
                                                unset( $httpReqsByStage[$s][$index] );
                                        }
@@ -1670,9 +1677,9 @@ class SwiftFileBackend extends FileBackendStore {
         */
        protected function getStatFromHeaders( array $rhdrs ) {
                // Fetch all of the custom metadata headers
-               $metadata = $this->getMetadata( $rhdrs );
+               $metadata = $this->getMetadataFromHeaders( $rhdrs );
                // Fetch all of the custom raw HTTP headers
-               $headers = $this->sanitizeHdrs( [ 'headers' => $rhdrs ] );
+               $headers = $this->extractMutableContentHeaders( $rhdrs );
 
                return [
                        // Convert various random Swift dates to TS_MW
index 1119867..70ed46a 100644 (file)
  * @see FileBackendStoreOpHandle
  */
 class SwiftFileOpHandle extends FileBackendStoreOpHandle {
-       /** @var array List of Requests for MultiHttpClient */
+       /** @var array[] List of HTTP request maps for MultiHttpClient */
        public $httpOp;
-       /** @var Closure */
+       /** @var Closure Function to run after each HTTP request finishes */
        public $callback;
 
+       /** @var int Class CONTINUE_* constant */
+       public $state = self::CONTINUE_IF_OK;
+
+       /** @var int Continue with the next requests stages if no errors occured */
+       const CONTINUE_IF_OK = 0;
+       /** @var int Cancel the next requests stages */
+       const CONTINUE_NO = 1;
+
        /**
+        * Construct a handle to be use with SwiftFileOpHandle::doExecuteOpHandlesInternal()
+        *
+        * The callback returns a class CONTINUE_* constant and takes the following parameters:
+        *   - An HTTP request map array with 'response' filled
+        *   - A StatusValue instance to be updated as needed
+        *
         * @param SwiftFileBackend $backend
-        * @param Closure $callback Function that takes (HTTP request array, status)
+        * @param Closure $callback
         * @param array $httpOp MultiHttpClient op
         */
        public function __construct( SwiftFileBackend $backend, Closure $callback, array $httpOp ) {
index 652c36a..565a65f 100644 (file)
@@ -24,7 +24,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * This class formats delete log entries.
index 3b904e8..d54dd6b 100644 (file)
@@ -240,6 +240,7 @@ class DjVuHandler extends ImageHandler {
         * @param File|FSFile $image
         * @param string $path
         * @return DjVuImage
+        * @suppress PhanUndeclaredProperty Custom property
         */
        function getDjVuImage( $image, $path ) {
                if ( !$image ) {
@@ -290,6 +291,7 @@ class DjVuHandler extends ImageHandler {
         * @param File $image
         * @param bool $gettext DOCUMENT (Default: false)
         * @return bool|SimpleXMLElement
+        * @suppress PhanUndeclaredProperty Custom property
         */
        public function getMetaTree( $image, $gettext = false ) {
                if ( $gettext && isset( $image->djvuTextTree ) ) {
index 92fad52..50b13a4 100644 (file)
@@ -42,6 +42,9 @@ class DjVuImage {
         */
        const DJVUTXT_MEMORY_LIMIT = 300000;
 
+       /** @var string */
+       private $mFilename;
+
        /**
         * @param string $filename The DjVu file name.
         */
index 5e99ac9..e49feae 100644 (file)
@@ -43,11 +43,6 @@ use MediaWiki\MediaWikiServices;
  *
  * Primary entry points:
  *
- * - ObjectCache::getMainWANInstance()
- *   Purpose: Memory cache.
- *   Stored in the local data-center's main cache (keyspace different from local-cluster cache).
- *   Delete events are broadcasted to other DCs main cache. See WANObjectCache for details.
- *
  * - ObjectCache::getLocalServerInstance( $fallbackType )
  *   Purpose: Memory cache for very hot keys.
  *   Stored only on the individual web server (typically APC or APCu for web requests,
@@ -60,13 +55,6 @@ use MediaWiki\MediaWikiServices;
  *   Stored centrally within the local data-center. Not replicated to other DCs.
  *   Configured by $wgMainCacheType.
  *
- * - ObjectCache::getMainStashInstance()
- *   Purpose: Ephemeral global storage.
- *   Stored centrally within the primary data-center.
- *   Changes are applied there first and replicated to other DCs (best-effort).
- *   To retrieve the latest value (e.g. not from a replica DB), use BagOStuff::READ_LATEST.
- *   This store may be subject to LRU style evictions.
- *
  * - ObjectCache::getInstance( $cacheType )
  *   Purpose: Special cases (like tiered memory/disk caches).
  *   Get a specific cache type by key in $wgObjectCaches.
@@ -351,30 +339,6 @@ class ObjectCache {
                return self::getInstance( $wgMainCacheType );
        }
 
-       /**
-        * Get the main WAN cache object.
-        *
-        * @since 1.26
-        * @return WANObjectCache
-        * @deprecated Since 1.28 Use MediaWikiServices::getInstance()->getMainWANObjectCache()
-        */
-       public static function getMainWANInstance() {
-               wfDeprecated( __METHOD__, '1.28' );
-               return MediaWikiServices::getInstance()->getMainWANObjectCache();
-       }
-
-       /**
-        * Get the cache object for the main stash.
-        *
-        * @return BagOStuff
-        * @since 1.26
-        * @deprecated Since 1.28 Use MediaWikiServices::getInstance()->getMainObjectStash()
-        */
-       public static function getMainStashInstance() {
-               wfDeprecated( __METHOD__, '1.28' );
-               return MediaWikiServices::getInstance()->getMainObjectStash();
-       }
-
        /**
         * Clear all the cached instances.
         */
index 4bede96..6aeb038 100644 (file)
@@ -363,8 +363,16 @@ class Article implements Page {
                        }
                }
 
+               $rl = MediaWikiServices::getInstance()->getRevisionLookup();
+               $oldRev = $this->mRevision ? $this->mRevision->getRevisionRecord() : null;
                if ( $request->getVal( 'direction' ) == 'next' ) {
-                       $nextid = $this->getTitle()->getNextRevisionID( $oldid );
+                       $nextid = 0;
+                       if ( $oldRev ) {
+                               $nextRev = $rl->getNextRevision( $oldRev );
+                               if ( $nextRev ) {
+                                       $nextid = $nextRev->getId();
+                               }
+                       }
                        if ( $nextid ) {
                                $oldid = $nextid;
                                $this->mRevision = null;
@@ -372,7 +380,13 @@ class Article implements Page {
                                $this->mRedirectUrl = $this->getTitle()->getFullURL( 'redirect=no' );
                        }
                } elseif ( $request->getVal( 'direction' ) == 'prev' ) {
-                       $previd = $this->getTitle()->getPreviousRevisionID( $oldid );
+                       $previd = 0;
+                       if ( $oldRev ) {
+                               $prevRev = $rl->getPreviousRevision( $oldRev );
+                               if ( $prevRev ) {
+                                       $previd = $prevRev->getId();
+                               }
+                       }
                        if ( $previd ) {
                                $oldid = $previd;
                                $this->mRevision = null;
@@ -1599,8 +1613,9 @@ class Article implements Page {
                                        'oldid' => $oldid
                                ] + $extraParams
                        );
-               $prev = $this->getTitle()->getPreviousRevisionID( $oldid );
-               $prevlink = $prev
+               $rl = MediaWikiServices::getInstance()->getRevisionLookup();
+               $prevExist = (bool)$rl->getPreviousRevision( $revision->getRevisionRecord() );
+               $prevlink = $prevExist
                        ? Linker::linkKnown(
                                $this->getTitle(),
                                $context->msg( 'previousrevision' )->escaped(),
@@ -1611,7 +1626,7 @@ class Article implements Page {
                                ] + $extraParams
                        )
                        : $context->msg( 'previousrevision' )->escaped();
-               $prevdiff = $prev
+               $prevdiff = $prevExist
                        ? Linker::linkKnown(
                                $this->getTitle(),
                                $context->msg( 'diff' )->escaped(),
index 40c63d2..8b2ff6b 100644 (file)
@@ -756,10 +756,14 @@ class PageArchive {
 
                        Hooks::run( 'ArticleUndelete',
                                [ &$this->title, $created, $comment, $oldPageId, $restoredPages ] );
+
                        if ( $this->title->getNamespace() == NS_FILE ) {
-                               DeferredUpdates::addUpdate(
-                                       new HTMLCacheUpdate( $this->title, 'imagelinks', 'file-restore' )
+                               $job = HTMLCacheUpdateJob::newForBacklinks(
+                                       $this->title,
+                                       'imagelinks',
+                                       [ 'causeAction' => 'file-restore' ]
                                );
+                               JobQueueGroup::singleton()->lazyPush( $job );
                        }
                }
 
index acd506b..fd9f7b2 100644 (file)
@@ -176,9 +176,12 @@ class WikiFilePage extends WikiPage {
 
                if ( $this->mFile->exists() ) {
                        wfDebug( 'ImagePage::doPurge purging ' . $this->mFile->getName() . "\n" );
-                       DeferredUpdates::addUpdate(
-                               new HTMLCacheUpdate( $this->mTitle, 'imagelinks', 'file-purge' )
+                       $job = HTMLCacheUpdateJob::newForBacklinks(
+                               $this->mTitle,
+                               'imagelinks',
+                               [ 'causeAction' => 'file-purge' ]
                        );
+                       JobQueueGroup::singleton()->lazyPush( $job );
                } else {
                        wfDebug( 'ImagePage::doPurge no image for '
                                . $this->mFile->getName() . "; limiting purge to cache only\n" );
index f0a656d..c8566ac 100644 (file)
@@ -3404,9 +3404,12 @@ class WikiPage implements Page, IDBAccessObject {
                MediaWikiServices::getInstance()->getLinkCache()->invalidateTitle( $title );
 
                // Invalidate caches of articles which include this page
-               DeferredUpdates::addUpdate(
-                       new HTMLCacheUpdate( $title, 'templatelinks', 'page-create' )
+               $job = HTMLCacheUpdateJob::newForBacklinks(
+                       $title,
+                       'templatelinks',
+                       [ 'causeAction' => 'page-create' ]
                );
+               JobQueueGroup::singleton()->lazyPush( $job );
 
                if ( $title->getNamespace() == NS_CATEGORY ) {
                        // Load the Category object, which will schedule a job to create
@@ -3448,9 +3451,12 @@ class WikiPage implements Page, IDBAccessObject {
 
                // Images
                if ( $title->getNamespace() == NS_FILE ) {
-                       DeferredUpdates::addUpdate(
-                               new HTMLCacheUpdate( $title, 'imagelinks', 'page-delete' )
+                       $job = HTMLCacheUpdateJob::newForBacklinks(
+                               $title,
+                               'imagelinks',
+                               [ 'causeAction' => 'page-delete' ]
                        );
+                       JobQueueGroup::singleton()->lazyPush( $job );
                }
 
                // User talk pages
@@ -3482,20 +3488,24 @@ class WikiPage implements Page, IDBAccessObject {
                $slotsChanged = null
        ) {
                // TODO: move this into a PageEventEmitter service
-
-               if ( $slotsChanged === null || in_array( SlotRecord::MAIN,  $slotsChanged ) ) {
+               $jobs = [];
+               if ( $slotsChanged === null || in_array( SlotRecord::MAIN, $slotsChanged ) ) {
                        // Invalidate caches of articles which include this page.
                        // Only for the main slot, because only the main slot is transcluded.
                        // TODO: MCR: not true for TemplateStyles! [SlotHandler]
-                       DeferredUpdates::addUpdate(
-                               new HTMLCacheUpdate( $title, 'templatelinks', 'page-edit' )
+                       $jobs[] = HTMLCacheUpdateJob::newForBacklinks(
+                               $title,
+                               'templatelinks',
+                               [ 'causeAction' => 'page-edit' ]
                        );
                }
-
                // Invalidate the caches of all pages which redirect here
-               DeferredUpdates::addUpdate(
-                       new HTMLCacheUpdate( $title, 'redirect', 'page-edit' )
+               $jobs[] = HTMLCacheUpdateJob::newForBacklinks(
+                       $title,
+                       'redirect',
+                       [ 'causeAction' => 'page-edit' ]
                );
+               JobQueueGroup::singleton()->lazyPush( $jobs );
 
                MediaWikiServices::getInstance()->getLinkCache()->invalidateTitle( $title );
 
index e1f4f38..b803241 100644 (file)
@@ -1121,7 +1121,7 @@ class CoreParserFunctions {
         * @param Parser $parser
         * @param Title $title
         * @param string $vary ParserOuput vary-* flag
-        * @return Revision
+        * @return Revision|null
         * @since 1.23
         */
        private static function getCachedRevisionObject( $parser, $title, $vary ) {
index c27ab4f..92e276d 100644 (file)
@@ -96,9 +96,15 @@ class SectionProfiler {
        public function getFunctionStats() {
                $this->collateData();
 
-               $totalCpu = max( $this->end['cpu'] - $this->start['cpu'], 0 );
-               $totalReal = max( $this->end['real'] - $this->start['real'], 0 );
-               $totalMem = max( $this->end['memory'] - $this->start['memory'], 0 );
+               if ( is_array( $this->start ) ) {
+                       $totalCpu = max( $this->end['cpu'] - $this->start['cpu'], 0 );
+                       $totalReal = max( $this->end['real'] - $this->start['real'], 0 );
+                       $totalMem = max( $this->end['memory'] - $this->start['memory'], 0 );
+               } else {
+                       $totalCpu = 0;
+                       $totalReal = 0;
+                       $totalMem = 0;
+               }
 
                $profile = [];
                foreach ( $this->collated as $fname => $data ) {
index d84a92a..0a1d5f7 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Derivative context for ResourceLoader modules.
- *
  * 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
  */
 
 /**
+ * A mutable version of ResourceLoaderContext.
+ *
  * Allows changing specific properties of a context object,
- * without changing the main one. Inspired by DerivativeContext.
+ * without changing the main one. Inspired by MediaWiki's DerivativeContext.
  *
+ * @ingroup ResourceLoader
  * @since 1.24
  */
 class DerivativeResourceLoaderContext extends ResourceLoaderContext {
index d0f6729..b4f0b7c 100644 (file)
@@ -27,10 +27,13 @@ use Psr\Log\NullLogger;
 use Wikimedia\Rdbms\Database;
 
 /**
- * This class generates message blobs for use by ResourceLoader modules.
+ * This class generates message blobs for use by ResourceLoader.
  *
- * A message blob is a JSON object containing the interface messages for a certain module in
- * a certain language.
+ * A message blob is a JSON object containing the interface messages for a
+ * certain module in a certain language.
+ *
+ * @ingroup ResourceLoader
+ * @since 1.17
  */
 class MessageBlobStore implements LoggerAwareInterface {
 
index 6121bbf..d959ff6 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Base class for resource loading system.
- *
  * 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
@@ -30,13 +28,21 @@ use Wikimedia\Rdbms\DBConnectionError;
 use Wikimedia\WrappedString;
 
 /**
- * Dynamic JavaScript and CSS resource loading system.
+ * @defgroup ResourceLoader ResourceLoader
+ *
+ * For higher level documentation, see <https://www.mediawiki.org/wiki/ResourceLoader/Architecture>.
+ */
+
+/**
+ * ResourceLoader is a loading system for JavaScript and CSS resources.
+ *
+ * For higher level documentation, see <https://www.mediawiki.org/wiki/ResourceLoader/Architecture>.
  *
- * Most of the documentation is on the MediaWiki documentation wiki starting at:
- *    https://www.mediawiki.org/wiki/ResourceLoader
+ * @ingroup ResourceLoader
+ * @since 1.17
  */
 class ResourceLoader implements LoggerAwareInterface {
-       /** @var Config $config */
+       /** @var Config */
        protected $config;
        /** @var MessageBlobStore */
        protected $blobStore;
index 7cd53fe..5a62861 100644 (file)
@@ -1,6 +1,5 @@
 <?php
 /**
- *
  * 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
@@ -20,6 +19,7 @@
  */
 
 /**
+ * @ingroup ResourceLoader
  * @internal For use by ResourceLoaderStartUpModule only
  */
 class ResourceLoaderCircularDependencyError extends Exception {
index ea35de6..bf03e49 100644 (file)
@@ -24,6 +24,7 @@ use Wikimedia\WrappedStringList;
 /**
  * Load and configure a ResourceLoader client on an HTML page.
  *
+ * @ingroup ResourceLoader
  * @since 1.28
  */
 class ResourceLoaderClientHtml {
index 95b8ff0..3db0c01 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Context for ResourceLoader modules.
- *
  * 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
@@ -26,8 +24,11 @@ use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\MediaWikiServices;
 
 /**
- * Object passed around to modules which contains information about the state
- * of a specific loader request.
+ * Context object that contains information about the state of a specific
+ * ResourceLoader web request. Passed around to ResourceLoaderModule methods.
+ *
+ * @ingroup ResourceLoader
+ * @since 1.17
  */
 class ResourceLoaderContext implements MessageLocalizer {
        const DEFAULT_LANG = 'qqx';
index f2d0856..23a9a14 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * ResourceLoader module based on local JavaScript/CSS files.
- *
  * 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
  */
 
 /**
- * ResourceLoader module based on local JavaScript/CSS files.
+ * Module based on local JavaScript/CSS files.
  *
  * The following public methods can query the database:
  *
  * - getDefinitionSummary / … / ResourceLoaderModule::getFileDependencies.
  * - getVersionHash / getDefinitionSummary / … / ResourceLoaderModule::getFileDependencies.
  * - getStyles / ResourceLoaderModule::saveFileDependencies.
+ *
+ * @ingroup ResourceLoader
+ * @since 1.17
  */
 class ResourceLoaderFileModule extends ResourceLoaderModule {
 
index dff9a39..c70081b 100644 (file)
@@ -1,8 +1,5 @@
 <?php
 /**
- * An object to represent a path to a JavaScript/CSS file, along with a remote
- * and local base path, for use with ResourceLoaderFileModule.
- *
  * 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
@@ -24,6 +21,9 @@
 /**
  * An object to represent a path to a JavaScript/CSS file, along with a remote
  * and local base path, for use with ResourceLoaderFileModule.
+ *
+ * @ingroup ResourceLoader
+ * @since 1.17
  */
 class ResourceLoaderFilePath {
 
index 4d215d6..152a1f7 100644 (file)
@@ -1,8 +1,5 @@
 <?php
 /**
- * ResourceLoader module for mediawiki.ForeignApi that has dynamically
- * generated dependencies, via a hook usable by extensions.
- *
  * 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
  */
 
 /**
- * ResourceLoader module for mediawiki.ForeignApi and its generated data
+ * Module for mediawiki.ForeignApi that has dynamically
+ * generated dependencies, via a hook usable by extensions.
+ *
+ * @ingroup ResourceLoader
+ * @internal
  */
 class ResourceLoaderForeignApiModule extends ResourceLoaderFileModule {
        public function getDependencies( ResourceLoaderContext $context = null ) {
index 6497543..2b0f5ed 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Class encapsulating an image used in a ResourceLoaderImageModule.
- *
  * 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
@@ -25,6 +23,7 @@ use MediaWiki\Shell\Shell;
 /**
  * Class encapsulating an image used in a ResourceLoaderImageModule.
  *
+ * @ingroup ResourceLoader
  * @since 1.25
  */
 class ResourceLoaderImage {
@@ -337,6 +336,7 @@ class ResourceLoaderImage {
                // Reattach all direct children of the `<svg>` root node to the `<g>` wrapper
                while ( $root->firstChild ) {
                        $node = $root->firstChild;
+                       // @phan-suppress-next-line PhanUndeclaredProperty False positive
                        if ( !$titleNode && $node->nodeType === XML_ELEMENT_NODE && $node->tagName === 'title' ) {
                                // Remember the first encountered `<title>` node
                                $titleNode = $node;
index 902fa91..0585cfd 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * ResourceLoader module for generated and embedded images.
- *
  * 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
@@ -22,8 +20,9 @@
  */
 
 /**
- * ResourceLoader module for generated and embedded images.
+ * Module for generated and embedded images.
  *
+ * @ingroup ResourceLoader
  * @since 1.25
  */
 class ResourceLoaderImageModule extends ResourceLoaderModule {
index c0a0921..ffc9b3d 100644 (file)
  */
 
 /**
- * ResourceLoader module for populating language specific data, such as grammar forms.
+ * Module for populating language specific data, such as grammar forms.
+ *
+ * @ingroup ResourceLoader
+ * @internal
  */
 class ResourceLoaderLanguageDataModule extends ResourceLoaderFileModule {
 
index 0269ec3..49501ff 100644 (file)
@@ -1,7 +1,28 @@
 <?php
+/**
+ * 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
+ */
 
 /**
- * Subclass with context specific LESS variables
+ * Module augmented with context-specific LESS variables.
+ *
+ * @ingroup ResourceLoader
+ * @since 1.32
  */
 class ResourceLoaderLessVarFileModule extends ResourceLoaderFileModule {
        protected $lessVariables = [];
index ed2d09c..c9fd267 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Abstraction for ResourceLoader modules.
- *
  * 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
@@ -32,6 +30,9 @@ use Wikimedia\ScopedCallback;
 
 /**
  * Abstraction for ResourceLoader modules, with name registration and maxage functionality.
+ *
+ * @ingroup ResourceLoader
+ * @since 1.17
  */
 abstract class ResourceLoaderModule implements LoggerAwareInterface {
        /** @var Config */
index 7d39a58..e1a2711 100644 (file)
  */
 
 /**
- * ResourceLoaderFileModule which magically loads the right skinScripts and skinStyles for every
+ * Module which magically loads the right skinScripts and skinStyles for every
  * skin, using the specified OOUI theme for each.
  *
- * @since 1.30
+ * @ingroup ResourceLoader
+ * @internal
  */
 class ResourceLoaderOOUIFileModule extends ResourceLoaderFileModule {
        use ResourceLoaderOOUIModule;
index c860362..11c59a0 100644 (file)
@@ -21,6 +21,7 @@
 /**
  * Allows loading arbitrary sets of OOUI icons.
  *
+ * @ingroup ResourceLoader
  * @since 1.34
  */
 class ResourceLoaderOOUIIconPackModule extends ResourceLoaderOOUIImageModule {
index fdcc213..007bbd1 100644 (file)
@@ -21,7 +21,8 @@
 /**
  * Convenience methods for dealing with OOUI themes and their relations to MW skins.
  *
- * @since 1.30
+ * @ingroup ResourceLoader
+ * @internal
  */
 trait ResourceLoaderOOUIModule {
        protected static $knownScriptsModules = [ 'core' ];
index 236112e..0ae8371 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * ResourceLoader module for site customizations.
- *
  * 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
  */
 
 /**
- * Module for site customizations
+ * Module for site customizations.
+ *
+ * @ingroup ResourceLoader
+ * @internal
  */
 class ResourceLoaderSiteModule extends ResourceLoaderWikiModule {
 
index 79922bf..be4e31d 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * ResourceLoader module for site style customizations.
- *
  * 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
  */
 
 /**
- * Module for site style customizations
+ * Module for site style customizations.
+ *
+ * @ingroup ResourceLoader
+ * @internal
  */
 class ResourceLoaderSiteStylesModule extends ResourceLoaderWikiModule {
 
index 0f33666..e7ab951 100644 (file)
  */
 
 /**
- * ResourceLoader module for skin stylesheets.
+ * Module for skin stylesheets.
+ *
+ * @ingroup ResourceLoader
+ * @internal
  */
 class ResourceLoaderSkinModule extends ResourceLoaderFileModule {
        /**
index 9f583a5..78775fb 100644 (file)
@@ -38,6 +38,9 @@ use MediaWiki\MediaWikiServices;
  * - safemode: Only register modules that have ORIGIN_CORE as their origin.
  *   This effectively disables ORIGIN_USER modules. (T185303)
  *   See also: OutputPage::disallowUserJs()
+ *
+ * @ingroup ResourceLoader
+ * @internal
  */
 class ResourceLoaderStartUpModule extends ResourceLoaderModule {
        protected $targets = [ 'desktop', 'mobile' ];
index 61cff82..9610cce 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * ResourceLoader module for default user preferences.
- *
  * 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
@@ -23,6 +21,9 @@
 
 /**
  * Module for default user preferences.
+ *
+ * @ingroup ResourceLoader
+ * @internal
  */
 class ResourceLoaderUserDefaultsModule extends ResourceLoaderModule {
 
index 026cea1..4794231 100644 (file)
  */
 
 /**
- * Module for user customizations scripts
+ * Module for user customizations scripts.
+ *
+ * @ingroup ResourceLoader
+ * @internal
  */
 class ResourceLoaderUserModule extends ResourceLoaderWikiModule {
 
index ecbb501..866d98b 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * ResourceLoader module for user preference customizations.
- *
  * 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
  */
 
 /**
- * Module for user preference customizations
+ * Module for user preferences.
+ *
+ * @ingroup ResourceLoader
+ * @internal
  */
 class ResourceLoaderUserOptionsModule extends ResourceLoaderModule {
 
index 69e8a97..fe949aa 100644 (file)
  */
 
 /**
- * Module for user customizations styles
+ * Module for user customizations styles.
+ *
+ * @ingroup ResourceLoader
+ * @internal
  */
 class ResourceLoaderUserStylesModule extends ResourceLoaderWikiModule {
 
index 85c14cb..45edd6e 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * ResourceLoader module for user tokens.
- *
  * 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
  * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
- * @author Krinkle
  */
 
 /**
- * Module for user tokens
+ * Module for user authorization tokens.
+ *
+ * @ingroup ResourceLoader
+ * @internal
  */
 class ResourceLoaderUserTokensModule extends ResourceLoaderModule {
 
index a2501c4..37501d4 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Abstraction for ResourceLoader modules that pull from wiki pages.
- *
  * 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
@@ -23,7 +21,7 @@
  */
 
 use MediaWiki\Linker\LinkTarget;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\Assert\Assert;
 use Wikimedia\Rdbms\Database;
 use Wikimedia\Rdbms\IDatabase;
@@ -48,6 +46,9 @@ use MediaWiki\MediaWikiServices;
  *   - getDB()
  *   - isKnownEmpty()
  *   - getTitleInfo()
+ *
+ * @ingroup ResourceLoader
+ * @since 1.17
  */
 class ResourceLoaderWikiModule extends ResourceLoaderModule {
 
index 5b03ad0..ab5d954 100644 (file)
@@ -19,7 +19,7 @@
  * @ingroup RevisionDelete
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Item class for a filearchive table row
index 8c080ba..33ce11b 100644 (file)
@@ -19,7 +19,7 @@
  * @ingroup RevisionDelete
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Item class for an oldimage table row
index f4ea54f..746ca27 100644 (file)
@@ -20,7 +20,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Abstract base class for a list of deletable items. The list class
index edb86da..829eefa 100644 (file)
@@ -19,7 +19,7 @@
  * @ingroup RevisionDelete
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Item class for a logging table row
index fcdcb9a..adb3974 100644 (file)
@@ -19,7 +19,7 @@
  * @ingroup RevisionDelete
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\Rdbms\IDatabase;
 
 /**
index f61d378..604ab2c 100644 (file)
@@ -19,7 +19,7 @@
  * @ingroup RevisionDelete
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Item class for a live revision table row
index 0705503..011386e 100644 (file)
@@ -19,7 +19,7 @@
  * @ingroup RevisionDelete
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\Rdbms\FakeResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
 
index 9a9ab19..00e77e1 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup RevisionDelete
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\Rdbms\IDatabase;
 
 /**
index 3ab96cb..6361a7a 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup RevisionDelete
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * General controller for RevDel, used by both SpecialRevisiondelete and
index bf90c06..85c01c8 100644 (file)
@@ -20,7 +20,7 @@
  * @file
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Item class for a live revision table row
index 14c9a73..3e2a9a2 100644 (file)
@@ -176,7 +176,7 @@ class MediaWikiSite extends Site {
         *
         * @param string|bool $pageName Page name or false (default: false)
         *
-        * @return string
+        * @return string|bool|null
         */
        public function getPageUrl( $pageName = false ) {
                $url = $this->getLinkPath();
index bcf8b32..10711a6 100644 (file)
@@ -365,7 +365,7 @@ class Site implements Serializable {
         *
         * @param bool|string $pageName
         *
-        * @return string|bool
+        * @return string|bool|null
         */
        public function getPageUrl( $pageName = false ) {
                $url = $this->getLinkPath();
index 0954c45..bf5734a 100644 (file)
@@ -884,87 +884,85 @@ abstract class ChangesListSpecialPage extends SpecialPage {
        }
 
        /**
-        * Get (cheap to compute) information about change tags.
+        * Get information about change tags, without parsing messages, for getRcFiltersConfigSummary().
+        *
+        * Message contents are the raw values (->plain()), because parsing messages is expensive.
+        * Even though we're not parsing messages, building a data structure with the contents of
+        * hundreds of i18n messages is still not cheap (see T223260#5370610), so the result of this
+        * function is cached in WANCache for 24 hours.
         *
         * Returns an array of associative arrays with information about each tag:
         * - name: Tag name (string)
         * - labelMsg: Short description message (Message object)
+        * - label: Short description message (raw message contents)
         * - descriptionMsg: Long description message (Message object)
+        * - description: Long description message (raw message contents)
         * - cssClass: CSS class to use for RC entries with this tag
         * - hits: Number of RC entries that have this tag
         *
         * @param ResourceLoaderContext $context
         * @return array[] Information about each tag
         */
-       protected static function getChangeTagInfo( ResourceLoaderContext $context ) {
-               $explicitlyDefinedTags = array_fill_keys( ChangeTags::listExplicitlyDefinedTags(), 0 );
-               $softwareActivatedTags = array_fill_keys( ChangeTags::listSoftwareActivatedTags(), 0 );
-
-               $tagStats = ChangeTags::tagUsageStatistics();
-               $tagHitCounts = array_merge( $explicitlyDefinedTags, $softwareActivatedTags, $tagStats );
-
-               $result = [];
-               foreach ( $tagHitCounts as $tagName => $hits ) {
-                       if (
-                               (
-                                       // Only get active tags
-                                       isset( $explicitlyDefinedTags[ $tagName ] ) ||
-                                       isset( $softwareActivatedTags[ $tagName ] )
-                               ) &&
-                               // Only get tags with more than 0 hits
-                               $hits > 0
-                       ) {
-                               $labelMsg = ChangeTags::tagShortDescriptionMessage( $tagName, $context );
-                               if ( $labelMsg === false ) {
-                                       // Tag is hidden, skip it
-                                       continue;
-                               }
-                               $result[] = [
-                                       'name' => $tagName,
-                                       // 'label' and 'description' filled in by getChangeTagList()
-                                       'labelMsg' => $labelMsg,
-                                       'descriptionMsg' => ChangeTags::tagLongDescriptionMessage( $tagName, $context ),
-                                       'cssClass' => Sanitizer::escapeClass( 'mw-tag-' . $tagName ),
-                                       'hits' => $hits,
-                               ];
-                       }
-               }
-               return $result;
-       }
-
-       /**
-        * Get information about change tags for use in getRcFiltersConfigSummary().
-        *
-        * This expands labelMsg and descriptionMsg to the raw values of each message, which captures
-        * changes in the messages but avoids the expensive step of parsing them.
-        *
-        * @param ResourceLoaderContext $context
-        * @return array[] Result of getChangeTagInfo(), with messages expanded to raw contents
-        */
        protected static function getChangeTagListSummary( ResourceLoaderContext $context ) {
-               $tags = self::getChangeTagInfo( $context );
-               foreach ( $tags as &$tagInfo ) {
-                       $tagInfo['labelMsg'] = $tagInfo['labelMsg']->plain();
-                       if ( $tagInfo['descriptionMsg'] ) {
-                               $tagInfo['descriptionMsg'] = $tagInfo['descriptionMsg']->plain();
+               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
+               return $cache->getWithSetCallback(
+                       $cache->makeKey( 'ChangesListSpecialPage-changeTagListSummary', $context->getLanguage() ),
+                       WANObjectCache::TTL_DAY,
+                       function ( $oldValue, &$ttl, array &$setOpts ) use ( $context ) {
+                               $explicitlyDefinedTags = array_fill_keys( ChangeTags::listExplicitlyDefinedTags(), 0 );
+                               $softwareActivatedTags = array_fill_keys( ChangeTags::listSoftwareActivatedTags(), 0 );
+
+                               $tagStats = ChangeTags::tagUsageStatistics();
+                               $tagHitCounts = array_merge( $explicitlyDefinedTags, $softwareActivatedTags, $tagStats );
+
+                               $result = [];
+                               foreach ( $tagHitCounts as $tagName => $hits ) {
+                                       if (
+                                               (
+                                                       // Only get active tags
+                                                       isset( $explicitlyDefinedTags[ $tagName ] ) ||
+                                                       isset( $softwareActivatedTags[ $tagName ] )
+                                               ) &&
+                                               // Only get tags with more than 0 hits
+                                               $hits > 0
+                                       ) {
+                                               $labelMsg = ChangeTags::tagShortDescriptionMessage( $tagName, $context );
+                                               if ( $labelMsg === false ) {
+                                                       // Tag is hidden, skip it
+                                                       continue;
+                                               }
+                                               $descriptionMsg = ChangeTags::tagLongDescriptionMessage( $tagName, $context );
+                                               $result[] = [
+                                                       'name' => $tagName,
+                                                       'labelMsg' => $labelMsg,
+                                                       'label' => $labelMsg->plain(),
+                                                       'descriptionMsg' => $descriptionMsg,
+                                                       'description' => $descriptionMsg ? $descriptionMsg->plain() : '',
+                                                       'cssClass' => Sanitizer::escapeClass( 'mw-tag-' . $tagName ),
+                                                       'hits' => $hits,
+                                               ];
+                                       }
+                               }
+                               return $result;
                        }
-               }
-               return $tags;
+               );
        }
 
        /**
         * Get information about change tags to export to JS via getRcFiltersConfigVars().
         *
-        * This removes labelMsg and descriptionMsg, and adds label and description, which are parsed,
-        * stripped and (in the case of description) truncated versions of these messages. Message
+        * This manipulates the label and description of each tag, which are parsed, stripped
+        * and (in the case of description) truncated versions of these messages. Message
         * parsing is expensive, so to detect whether the tag list has changed, use
         * getChangeTagListSummary() instead.
         *
+        * The result of this function is cached in WANCache for 24 hours.
+        *
         * @param ResourceLoaderContext $context
-        * @return array[] Result of getChangeTagInfo(), with messages parsed, stripped and truncated
+        * @return array[] Same as getChangeTagListSummary(), with messages parsed, stripped and truncated
         */
        protected static function getChangeTagList( ResourceLoaderContext $context ) {
-               $tags = self::getChangeTagInfo( $context );
+               $tags = self::getChangeTagListSummary( $context );
                $language = Language::factory( $context->getLanguage() );
                foreach ( $tags as &$tagInfo ) {
                        $tagInfo['label'] = Sanitizer::stripAllTags( $tagInfo['labelMsg']->parse() );
index 2dd682f..4ba9b65 100644 (file)
@@ -23,6 +23,7 @@
 
 use MediaWiki\Block\DatabaseBlock;
 use MediaWiki\MediaWikiServices;
+use Wikimedia\Rdbms\IDatabase;
 
 /**
  * A special page that lists existing blocks
index 5b77d5a..1babf8c 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup SpecialPage
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Special page allowing users with the appropriate permissions to
index 698e590..67177b7 100644 (file)
@@ -22,7 +22,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use MediaWiki\Permissions\PermissionManager;
 
 /**
index 2c8d432..34665dd 100644 (file)
@@ -381,6 +381,7 @@ class SpecialTags extends SpecialPage {
 
                $form = HTMLForm::factory( 'ooui', $fields, $this->getContext() );
                $form->setAction( $this->getPageTitle( 'delete' )->getLocalURL() );
+               // @phan-suppress-next-line PhanUndeclaredProperty
                $form->tagAction = 'delete'; // custom property on HTMLForm object
                $form->setSubmitCallback( [ $this, 'processTagForm' ] );
                $form->setSubmitTextMsg( 'tags-delete-submit' );
@@ -433,6 +434,7 @@ class SpecialTags extends SpecialPage {
 
                $form = HTMLForm::factory( 'ooui', $fields, $this->getContext() );
                $form->setAction( $this->getPageTitle( $actionStr )->getLocalURL() );
+               // @phan-suppress-next-line PhanUndeclaredProperty
                $form->tagAction = $actionStr;
                $form->setSubmitCallback( [ $this, 'processTagForm' ] );
                // tags-activate-submit, tags-deactivate-submit
@@ -441,6 +443,12 @@ class SpecialTags extends SpecialPage {
                $form->show();
        }
 
+       /**
+        * @param array $data
+        * @param HTMLForm $form
+        * @return bool
+        * @suppress PhanUndeclaredProperty $form->tagAction
+        */
        public function processTagForm( array $data, HTMLForm $form ) {
                $context = $form->getContext();
                $out = $context->getOutput();
index b1bfd0b..445f0c3 100644 (file)
@@ -111,6 +111,8 @@ class PreferencesFormOOUI extends OOUIHTMLForm {
        function filterDataForSubmit( $data ) {
                foreach ( $this->mFlatFields as $fieldname => $field ) {
                        if ( $field instanceof HTMLNestedFilterable ) {
+                               // @phan-suppress-next-next-line PhanUndeclaredProperty All HTMLForm fields have mParams,
+                               // but the instanceof confuses phan, which doesn't support intersections
                                $info = $field->mParams;
                                $prefix = $info['prefix'] ?? $fieldname;
                                foreach ( $field->filterDataForSubmit( $data[$fieldname] ) as $key => $value ) {
index 3a56a87..95749ba 100644 (file)
@@ -25,7 +25,7 @@
  */
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Linker\LinkRenderer;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\FakeResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
index 2893759..0ff54fd 100644 (file)
@@ -24,7 +24,7 @@
  */
 use MediaWiki\Linker\LinkRenderer;
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\Rdbms\IDatabase;
 use Wikimedia\Rdbms\IResultWrapper;
 use Wikimedia\Rdbms\FakeResultWrapper;
index 3bd66d4..3ebb443 100644 (file)
@@ -237,6 +237,7 @@ class MediaWikiTitleCodec implements TitleFormatter, TitleParser {
         * @param LinkTarget $title
         *
         * @return string
+        * @suppress PhanUndeclaredProperty
         */
        public function getPrefixedText( LinkTarget $title ) {
                if ( !isset( $title->prefixedText ) ) {
index f5e3c69..fc96fe1 100644 (file)
@@ -3726,11 +3726,17 @@ class User implements IDBAccessObject, UserIdentity {
                                $this->setNewtalk( false );
 
                                // If there is a new, unseen, revision, use its timestamp
-                               $nextid = $oldid
-                                       ? $title->getNextRevisionID( $oldid, Title::READ_LATEST )
-                                       : null;
-                               if ( $nextid ) {
-                                       $this->setNewtalk( true, Revision::newFromId( $nextid ) );
+                               if ( $oldid ) {
+                                       $rl = MediaWikiServices::getInstance()->getRevisionLookup();
+                                       $oldRev = $rl->getRevisionById( $oldid, Title::READ_LATEST );
+                                       if ( $oldRev ) {
+                                               $newRev = $rl->getNextRevision( $oldRev );
+                                               if ( $newRev ) {
+                                                       // TODO: actually no need to wrap in a revision,
+                                                       // setNewtalk really only needs a RevRecord
+                                                       $this->setNewtalk( true, new Revision( $newRev ) );
+                                               }
+                                       }
                                }
                        } );
                }
index f3a8810..77ea3d9 100644 (file)
@@ -34,7 +34,7 @@ class AvroValidator {
         * @return string|string[] An error or list of errors in the
         *  provided $datum. When no errors exist the empty array is
         *  returned.
-        * @suppress PhanUndeclaredMethod
+        * @suppress PhanUndeclaredMethod,PhanUndeclaredProperty
         */
        public static function getErrors( AvroSchema $schema, $datum ) {
                switch ( $schema->type ) {
index df5ea70..13f2b52 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 
 use MediaWiki\Linker\LinkTarget;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use MediaWiki\User\UserIdentity;
 use Wikimedia\Assert\Assert;
 use Wikimedia\Rdbms\IDatabase;
index 9886425..f42bb88 100644 (file)
@@ -21,7 +21,7 @@
 use MediaWiki\MediaWikiServices;
 
 use MediaWiki\Logger\LoggerFactory;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 /**
  * Base class for language conversion.
index 353127d..783a211 100644 (file)
@@ -80,7 +80,7 @@ class Names {
                'az' => 'azərbaycanca', # Azerbaijani
                'azb' => 'تۆرکجه', # South Azerbaijani
                'ba' => 'башҡортса', # Bashkir
-               'ban' => 'Basa Bali', # Balinese
+               'ban' => 'Bali', # Balinese
                'bar' => 'Boarisch', # Bavarian (Austro-Bavarian and South Tyrolean)
                'bat-smg' => 'žemaitėška', # Samogitian (deprecated code, 'sgs' in ISO 639-3 since 2010-06-30 )
                'bbc' => 'Batak Toba', # Batak Toba (falls back to bbc-latn)
index 0a15530..8fe3be3 100644 (file)
@@ -2982,7 +2982,7 @@ public static $zh2Hant = [
 '𫄨' => '絺',
 '𫄷' => '繶',
 '𫄸' => '纁',
-'ð«\87­' => 'è\94¿',
+'ð«\87­' => 'è\92\8d',
 '𫌀' => '襀',
 '𫌨' => '覼',
 '𫍙' => '訑',
@@ -3707,6 +3707,8 @@ public static $zh2Hant = [
 '于少保' => '于少保',
 '于山国' => '于山國',
 '于山國' => '于山國',
+'于山岛' => '于山島',
+'于山島' => '于山島',
 '于帅' => '于帥',
 '于帥' => '于帥',
 '于幼军' => '于幼軍',
@@ -3724,7 +3726,6 @@ public static $zh2Hant = [
 '于志寧' => '于志寧',
 '于忠肃集' => '于忠肅集',
 '于忠肅集' => '于忠肅集',
-'于思' => '于思',
 '于慎行' => '于慎行',
 '于慧' => '于慧',
 '于成龍' => '于成龍',
@@ -3817,6 +3818,7 @@ public static $zh2Hant = [
 '于都县' => '于都縣',
 '于都縣' => '于都縣',
 '于里察' => '于里察',
+'于闐' => '于闐',
 '于阗' => '于闐',
 '于双戈' => '于雙戈',
 '于雙戈' => '于雙戈',
@@ -4114,6 +4116,7 @@ public static $zh2Hant = [
 '党進' => '党進',
 '党項' => '党項',
 '党项' => '党項',
+'入侵并' => '入侵並',
 '内脏' => '內臟',
 '内制' => '內製',
 '内面包' => '內面包',
@@ -4470,6 +4473,8 @@ public static $zh2Hant = [
 '叮叮当当' => '叮叮噹噹',
 '叮当' => '叮噹',
 '可紧可松' => '可緊可鬆',
+'可能干預' => '可能干預',
+'可能干预' => '可能干預',
 '可自制' => '可自制',
 '可鉴' => '可鑑',
 '台子女' => '台子女',
@@ -4802,7 +4807,7 @@ public static $zh2Hant = [
 '大型钟面' => '大型鐘面',
 '大多只' => '大多只',
 '大伙' => '大夥',
-'大干' => '大幹',
+'大干一' => '大幹一',
 '大批涌到' => '大批湧到',
 '大折儿' => '大摺兒',
 '大明历' => '大明曆',
@@ -5527,6 +5532,8 @@ public static $zh2Hant = [
 '恶直丑正' => '惡直醜正',
 '恶斗' => '惡鬥',
 '惴栗' => '惴慄',
+'意大利面临' => '意大利面臨',
+'意大利面臨' => '意大利面臨',
 '意大利面' => '意大利麵',
 '愛河里花子' => '愛河里花子',
 '爱河里花子' => '愛河里花子',
@@ -5991,6 +5998,8 @@ public static $zh2Hant = [
 '方向' => '方向',
 '方法里' => '方法裡',
 '于吉林' => '於吉林',
+'于格林' => '於格林',
+'于越南' => '於越南',
 '于震中' => '於震中',
 '于震前' => '於震前',
 '于震后' => '於震後',
@@ -6474,6 +6483,8 @@ public static $zh2Hant = [
 '浅淀' => '淺澱',
 '清心寡欲' => '清心寡欲',
 '渠冲' => '渠衝',
+'温岚' => '温嵐',
+'温嵐' => '温嵐',
 '测不准' => '測不準',
 '港制' => '港製',
 '游离' => '游離',
@@ -6699,6 +6710,7 @@ public static $zh2Hant = [
 '版本里' => '版本裡',
 '牙签' => '牙籤',
 '牛只' => '牛隻',
+'牢里' => '牢裡',
 '物欲' => '物慾',
 '抵牾' => '牴牾',
 '抵触' => '牴觸',
@@ -7028,7 +7040,6 @@ public static $zh2Hant = [
 '称赞' => '稱讚',
 '稻谷' => '稻穀',
 '稽征' => '稽徵',
-'谷人' => '穀人',
 '谷保家商' => '穀保家商',
 '谷仓' => '穀倉',
 '谷圭' => '穀圭',
@@ -7656,6 +7667,7 @@ public static $zh2Hant = [
 '药签' => '藥籤',
 '药面儿' => '藥麵兒',
 '苏昆' => '蘇崑',
+'𬞟' => '蘋',
 '苹婆' => '蘋婆',
 '苹果' => '蘋果',
 '苹果干' => '蘋果乾',
@@ -7751,6 +7763,7 @@ public static $zh2Hant = [
 '袋表' => '袋錶',
 '袖里' => '袖裡',
 '被废后' => '被廢後',
+'被卷回' => '被捲回',
 '被系上' => '被繫上',
 '被里' => '被裡',
 '被夸' => '被誇',
@@ -9319,6 +9332,7 @@ public static $zh2Hant = [
 '鹰雕' => '鹰鵰',
 '鹰鵰' => '鹰鵰',
 '咸、甜' => '鹹、甜',
+'咸吃' => '鹹吃',
 '咸味' => '鹹味',
 '咸嘴淡舌' => '鹹嘴淡舌',
 '咸土' => '鹹土',
@@ -11458,6 +11472,7 @@ public static $zh2Hans = [
 '葦' => '苇',
 '葯' => '药',
 '葷' => '荤',
+'蒍' => '𫇭',
 '蒓' => '莼',
 '蒔' => '莳',
 '蒞' => '莅',
@@ -13699,6 +13714,7 @@ public static $zh2Hans = [
 '孫乾' => '孙乾',
 '宏碁' => '宏碁',
 '官陞' => '官升',
+'尋陞' => '寻升',
 '將軍抽俥' => '将军抽俥',
 '將軍抽車' => '将军抽車',
 '爾冬陞' => '尔冬升',
@@ -14152,7 +14168,10 @@ public static $zh2TW = [
 '克罗地亚' => '克羅埃西亞',
 '克羅地亞' => '克羅埃西亞',
 '克里斯托弗' => '克里斯多福',
+'全角' => '全形',
 '万维网' => '全球資訊網',
+'全角度' => '全角度',
+'全角色' => '全角色',
 '八杆' => '八桿',
 '公共交通' => '公共運輸',
 '六杆' => '六桿',
@@ -14259,6 +14278,7 @@ public static $zh2TW = [
 '塞维利亚' => '塞維亞',
 '西維爾' => '塞維亞',
 '塞黑' => '塞蒙',
+'多美和普林西比' => '多美普林西比',
 '塔希提' => '大溪地',
 '共和联邦' => '大英國協',
 '英联邦' => '大英國協',
@@ -14330,6 +14350,7 @@ public static $zh2TW = [
 '希拉里' => '希拉蕊',
 '希特拉' => '希特勒',
 '残疾人奥林匹克' => '帕拉林匹克',
+'殘疾人奧林匹克' => '帕拉林匹克',
 '残奥会' => '帕運會',
 '殘奧會' => '帕運會',
 '巴尔米拉环礁' => '帕邁拉環礁',
@@ -14413,6 +14434,7 @@ public static $zh2TW = [
 '施罗德' => '施洛德',
 '旱烟' => '旱菸',
 '旱煙' => '旱菸',
+'比勒陀利' => '普利托利',
 '普利策' => '普利茲',
 '普利策奖' => '普立茲獎',
 '芯片' => '晶片',
@@ -14429,6 +14451,8 @@ public static $zh2TW = [
 '马恩岛' => '曼島',
 '木杆' => '木桿',
 '尾班車' => '末班車',
+'萨格勒布' => '札格瑞布',
+'薩格勒布' => '札格瑞布',
 '列奥纳多' => '李奧納多',
 '杜塞尔多夫' => '杜塞道夫',
 '杜塞爾多夫' => '杜塞道夫',
@@ -14496,6 +14520,8 @@ public static $zh2TW = [
 '海洛英' => '海洛因',
 '侯賽因' => '海珊',
 '侯赛因' => '海珊',
+'温得和克' => '溫荷克',
+'溫得和克' => '溫荷克',
 '鼠标' => '滑鼠',
 '汉诺威' => '漢諾瓦',
 '漢诺威' => '漢諾瓦',
@@ -14607,13 +14633,12 @@ public static $zh2TW = [
 '卢浮宫' => '羅浮宮',
 '樂行童軍' => '羅浮童軍',
 '意大利' => '義大利',
+'意大利面' => '義大利麵',
 '昂山素姬' => '翁山蘇姬',
 '昂山素季' => '翁山蘇姬',
 '圣基茨和尼维斯' => '聖克里斯多福及尼維斯',
 '聖吉斯納域斯' => '聖克里斯多福及尼維斯',
 '聖佐治' => '聖喬治',
-'圣多美和普林西比' => '聖多美普林西比',
-'聖多美和普林西比' => '聖多美普林西比',
 '圣文森特和格林纳丁斯' => '聖文森及格瑞那丁',
 '聖文森特和格林納丁斯' => '聖文森及格瑞那丁',
 '圣赫勒拿' => '聖赫倫那',
@@ -14836,6 +14861,8 @@ public static $zh2TW = [
 '亚拉巴马' => '阿拉巴馬',
 '阿联酋' => '阿聯',
 '阿聯酋' => '阿聯',
+'亚的斯亚贝巴' => '阿迪斯阿貝巴',
+'亞的斯亞貝巴' => '阿迪斯阿貝巴',
 '罗纳德·里根' => '隆納·雷根',
 '私隱' => '隱私',
 '耶加達' => '雅加達',
@@ -14958,6 +14985,7 @@ public static $zh2HK = [
 '因特网' => '互聯網',
 '網際網路' => '互聯網',
 '井里' => '井裏',
+'阿迪斯阿貝巴' => '亞的斯亞貝巴',
 '亮著' => '亮着',
 '亮著《' => '亮著《',
 '亮著作' => '亮著作',
@@ -15340,6 +15368,9 @@ public static $zh2HK = [
 '柯林頓' => '克林頓',
 '克羅埃西亞' => '克羅地亞',
 '奈洛比' => '內羅畢',
+'全角' => '全形',
+'全角度' => '全角度',
+'全角色' => '全角色',
 '公布' => '公佈',
 '公寓里' => '公寓裏',
 '冒著' => '冒着',
@@ -16406,7 +16437,7 @@ public static $zh2HK = [
 '格瑞那達' => '格林納達',
 '格莱美奖' => '格林美獎',
 '葛萊美獎' => '格林美獎',
-'格鲁吉亚' => '格魯吉亞',
+'喬治亞字母' => '格魯吉亞字母',
 '框里' => '框裏',
 '台式电脑' => '桌上型電腦',
 '台球' => '桌球',
@@ -16462,6 +16493,7 @@ public static $zh2HK = [
 '殺著錄' => '殺著錄',
 '壳里' => '殼裏',
 '殿里' => '殿裏',
+'普利托利亞' => '比勒陀利亞',
 '茅利塔尼亞' => '毛里塔尼亞',
 '模里西斯' => '毛里裘斯',
 '毛里求斯' => '毛里裘斯',
@@ -16587,6 +16619,7 @@ public static $zh2HK = [
 '溢著者' => '溢著者',
 '溢著述' => '溢著述',
 '溢著錄' => '溢著錄',
+'溫荷克' => '溫得和克',
 '演著' => '演着',
 '演著作' => '演著作',
 '演著名' => '演著名',
@@ -16657,6 +16690,7 @@ public static $zh2HK = [
 '版图里' => '版圖裏',
 '版本里' => '版本裏',
 '版权信息' => '版權資訊',
+'牢里' => '牢裏',
 '千里達及托巴哥' => '特立尼達和多巴哥',
 '牽著' => '牽着',
 '牽著作' => '牽著作',
@@ -17123,6 +17157,7 @@ public static $zh2HK = [
 '聖克里斯多福及尼維斯' => '聖吉斯納域斯',
 '聖多美普林西比' => '聖多美和普林西比',
 '聖文森及格瑞那丁' => '聖文森特和格林納丁斯',
+'聖文森國' => '聖文森特和格林納丁斯',
 '聖露西亞' => '聖盧西亞',
 '聖馬利諾' => '聖馬力諾',
 '聽不著' => '聽不着',
@@ -17243,6 +17278,7 @@ public static $zh2HK = [
 '肖邦' => '蕭邦',
 '薛丁格' => '薛定諤',
 '塞拉耶佛' => '薩拉熱窩',
+'札格瑞布' => '薩格勒布',
 '萨达姆' => '薩達姆',
 '藉著' => '藉着',
 '藏著' => '藏着',
@@ -18106,6 +18142,7 @@ public static $zh2CN = [
 '網際網絡' => '互联网',
 '網際網路' => '互联网',
 '亞歷山卓' => '亚历山大',
+'阿迪斯阿貝巴' => '亚的斯亚贝巴',
 '雅穆索戈' => '亚穆苏克罗',
 '交帳' => '交账',
 '亮著' => '亮着',
@@ -18636,6 +18673,7 @@ public static $zh2CN = [
 '聖吉斯納域斯' => '圣基茨和尼维斯',
 '聖多美普林西比' => '圣多美和普林西比',
 '聖文森及格瑞那丁' => '圣文森特和格林纳丁斯',
+'聖文森國' => '圣文森特和格林纳丁斯',
 '聖馬利諾' => '圣马力诺',
 '蓋亞那' => '圭亚那',
 '坐著' => '坐着',
@@ -19413,6 +19451,7 @@ public static $zh2CN = [
 '格瑞那達' => '格林纳达',
 '格林美獎' => '格莱美奖',
 '葛萊美獎' => '格莱美奖',
+'喬治亞字母' => '格鲁吉亚字母',
 '森巴舞' => '桑巴舞',
 '梅赫西迪' => '梅赛德斯',
 '夢著' => '梦着',
@@ -19437,6 +19476,7 @@ public static $zh2CN = [
 '帕運會' => '残奥会',
 '帕拉林匹克' => '残疾人奥林匹克',
 '庇里牛斯' => '比利牛斯',
+'普利托利亞' => '比勒陀利亚',
 '披索' => '比索',
 '畢卡索' => '毕加索',
 '茅利塔尼亞' => '毛里塔尼亚',
@@ -19524,6 +19564,7 @@ public static $zh2CN = [
 '混帳' => '混账',
 '清澈' => '清澈',
 '清帳' => '清账',
+'溫荷克' => '温得和克',
 '渴著' => '渴着',
 '渴著書' => '渴著书',
 '渴著作' => '渴著作',
@@ -20108,6 +20149,7 @@ public static $zh2CN = [
 '獲著述' => '获著述',
 '菁寮' => '菁寮',
 '塞拉耶佛' => '萨拉热窝',
+'札格瑞布' => '萨格勒布',
 '落著' => '落着',
 '落著書' => '落著书',
 '落著作' => '落著作',
index bdbe4b0..fd973af 100644 (file)
        "nocreate-loggedin": "आप कय नँवा पन्ना बनावे कय अनुमति नाई है ।",
        "sectioneditnotsupported-title": "अनुभाग सम्पादन समर्थित नाई है",
        "sectioneditnotsupported-text": "इ पन्ना पे अनुभाग सम्पादन समर्थित नाई है",
+       "modeleditnotsupported-title": "संपादन सपोर्ट नही करत",
+       "modeleditnotsupported-text": "सामग्री मॉडल $1 के बरे संपादन सपोर्ट नही अहै",
        "permissionserrors": "अनुमति त्रुटि",
        "permissionserrorstext": "निचे दिहा {{PLURAL:$1|कारण|कारणन्}} कय नाते आप कय ऐसन करे कय अनुमति नाइ है:",
        "permissionserrorstext-withaction": "आप कय $2 कय अनुमति नाई है,निचे दिहा {{PLURAL:$1|कारण|कारणन्}} कय नाते से:",
        "sessionfailure": "ऐसा प्रतीत होता है कि आपके लॉगिन सत्र के साथ कोई समस्या है।\nसत्र अपहरण से बचाने के लिए सावधानी के तौर पर आपका यह क्रियाकलाप रद्द कर दिया गया है।\nकृपया पीछे जाएँ और पृष्ठ को पुनः लोड करें, तब दुबारा कोशिश करें।",
        "changecontentmodel": "पन्ने का सामग्री प्रारूप बदलें",
        "changecontentmodel-legend": "पृष्ठ सामग्री का नमूना",
-       "changecontentmodel-title-label": "पृष्ठ शीर्षक",
+       "changecontentmodel-title-label": "पृष्ठ शीर्षक:",
        "changecontentmodel-current-label": "Current content model:",
-       "changecontentmodel-model-label": "नयि à¤¸à¤¾à¤®à¤\97à¥\8dरà¥\80 à¤\95ा à¤¨à¤®à¥\82ना",
+       "changecontentmodel-model-label": "नयि à¤¸à¤¾à¤®à¤\97à¥\8dरà¥\80 à¤\95य à¤¨à¤®à¥\82ना:",
        "changecontentmodel-reason-label": "कारण:",
        "changecontentmodel-submit": "बदला",
        "changecontentmodel-success-title": "सामगरि का नामुने मे बदलाव हुुुाा हेेे",
index 52dfc22..b142bb5 100644 (file)
@@ -31,6 +31,8 @@
        "tog-watchdefault": "imbuhin lembar panyuntingansane sunting titiang ring kepahan pangiwasan",
        "tog-watchmoves": "imbuhang lembar sane kakisidang titiang ring kepahan pangiwasan",
        "tog-watchdeletion": "imbuhin lembar sane kaapus ring kepahan pangiwasan",
+       "tog-watchuploads": "Tambehin berkas anyar sané unggah tiang ka pupulan pantaun\nTambahkan berkas baru yang saya unggah ke daftar pantauan",
+       "tog-watchrollback": "Tambehin kaca sané sampun uliang tiang ka tengah pupulan pantauan tiangé",
        "tog-minordefault": "pingetin samian suntingan dados suntingan alit sane ajeg",
        "tog-previewontop": "tampilang pratayang sadurung kotak sunting lan nenten sadurungnyane",
        "tog-previewonfirst": "tampilang pratayang ring suntingan kapertama",
@@ -47,6 +49,8 @@
        "tog-watchlisthidebots": "engkebang panguwahan bot ring kepahan pangiwasan",
        "tog-watchlisthideminor": "engkebang panguwahan alit ring kepahan pangiwasan",
        "tog-watchlisthideliu": "engkebang suntingan penganggen malebu log ring kepahan pangiwasan",
+       "tog-watchlistreloadautomatically": "Ulangin pupulan pantauan manut otomatis ritatkala silih tunggil penyaringan kauah (JavaScript kaperluang)",
+       "tog-watchlistunwatchlinks": "Tambehin pacihna pantau/usap pantauan ka kaca sané kapantau tur kauah (JavaScript kaperluang anggén nganti tetujon puniki)",
        "tog-watchlisthideanons": "engkebangsuntingan penganggen tan maadan ring kepahan pangiwasan",
        "tog-watchlisthidepatrolled": "engkebang panguwahan mapatrol kepahan pangiwasan",
        "tog-watchlisthidecategorization": "Engkebang katégorisasi kacané",
@@ -56,6 +60,8 @@
        "tog-norollbackdiff": "Sampunang tampilang binanne sesampun ngewaliang",
        "tog-useeditwarning": "elingang titiang yening ngalahin lembar panyuntingan sadurung nyimpen pagentosan",
        "tog-prefershttps": "Setata nganggen sambungan sane aman rikala malebu log",
+       "tog-showrollbackconfirmation": "Sinahang konfirmasi ritatkala ngklik pranala sané kauliang\nTampilkan konfirmasi ketika mengeklik pranala pengembalian",
+       "tog-requireemail": "Kaperluang sewala anggén ngawé malih kruna sandi",
        "underline-always": "Setata",
        "underline-never": "Nénten naénin",
        "underline-default": "kulit utawi penjelajah paaban",
        "hidden-categories": "{{plural:$1|Kategori sané kaengkebang}}",
        "hidden-category-category": "Kategori sané kaengkebang",
        "category-subcat-count": "{{PLURAL:$2|Kategori iki wantah madué subkategori ring sor puniki|Kategori iki madué {{PLURAL:$1|subkategori|$1 subkategori}} ring sor puniki, saking $2 akéhnyané.}}",
+       "category-subcat-count-limited": "Kelompok puniki madué {{PLURAL:$1|$1 kategori alit}} sakadi punika.",
        "category-article-count": "{{PLURAL:$2|Kategori puniki wantah madué kaca ring sor puniki.|{{PLURAL:$1|Kaca|$1 kaca}} ring sor puniki wénten ring kategori puniki, saking $2 akéhnyané.}}",
+       "category-article-count-limited": "Kelompok puniki madué {{PLURAL:$1|$1 kaca}} sakadi punika.",
        "category-file-count": "{{PLURAL:$2|golongan puniki madue{{PLURAL:$1|$1 lembar}}, saking total $2.}}",
+       "category-file-count-limited": "Kelompok puniki madué {{PLURAL:$1|$1 berkas}} sakadi punika.",
        "listingcontinuesabbrev": "lant.",
        "index-category": "Lembar sane maindeks",
        "noindex-category": "Lembar sane nenten maindeks",
        "broken-file-category": "Suratan sane ngelah pranala usak",
+       "categoryviewer-pagedlinks": "($1) ($2)",
+       "category-header-numerals": "$1–$2",
        "about": "Indik",
        "article": "Kaca daging",
-       "newwindow": "(bukak ring jendela anyar)",
+       "newwindow": "(métbét ring jendéla anyar)",
        "cancel": "Wangdé",
        "moredotdotdot": "Lianan...",
+       "morenotlisted": "Bacakan puniki asané nénten lengkap.",
        "mypage": "Kaca",
        "mytalk": "Pabligbagan",
        "anontalk": "Pabligbagan",
        "help": "Wantuan",
        "help-mediawiki": "Pitulung MediaWiki",
        "search": "Rereh",
+       "search-ignored-headings": "# <pre>\n# Murda sané jagi nénten karunguang olih pangrereh.\n# Suratan puniki jagi kalaksanayang sasampun kaca taler murda puniki kaindeks.\n# Ragané prasida ngmaksayang pangindeksan mawali kaca puniki antuk nglaksanayang suratan kosong (''null edit'')\n# Sintaksisnyané sakadi puniki:\n#   * Makasami saking watek \"#\" ka bait untat inggih punika silih tunggil pabligbagan.\n#   * Tiap bait ten-kosong inggih punika murda sané patut sané jagi nénten karunguang.\nReferensi\nPranala luar\nCingak taler\n #</pre>",
        "searchbutton": "Rereh",
        "go": "Lanturang",
        "searcharticle": "Rereh",
        "history": "Babad kaca",
        "history_short": "Babad",
        "history_small": "babad",
+       "updatedmarker": "kamutakhiran sekat pengunjung tiang sané kaping untat",
        "printableversion": "Vérsi cétak",
        "permalink": "Pranala ajeg",
        "print": "Citak",
        "view": "Cingak",
        "view-foreign": "Cingak ring $1",
        "edit": "Uah",
+       "edit-local": "Tambeh déskripsi lokal",
        "create": "Kardi",
        "create-local": "Tambeh déskripsi lokal",
        "delete": "Usap",
+       "undelete_short": "Wangdeang usap {{PLURAL:$1|$1 suratan}}",
        "viewdeleted_short": "Cingak {{PLURAL:$1|siki uahan sané kausapin|$1 uahan sané kausapin}}",
        "protect": "Saib",
        "protect_change": "uah",
        "talk": "Pabligbagan",
        "views": "Pakantenan",
        "toolbox": "Piranti",
+       "tool-link-userrights": "Uah{{GENDER:$1|pangangge}}",
+       "tool-link-userrights-readonly": "Cingak kelompok {{GENDER:$1|pangangge}}",
        "tool-link-emailuser": "Kirim surel ring {{GENDER:$1|pengguna}} puniki",
        "imagepage": "Cingak kaca berkas",
        "mediawikipage": "Cingak kaca séwala",
        "redirectedfrom": "(Kagingsirang saking $1)",
        "redirectpagesub": "Kaca gingsiran",
        "redirectto": "Magingsir ring:",
-       "lastmodifiedat": "Kaca puniki kaping untat kauah rikala  $2, $1",
+       "lastmodifiedat": "Kaca puniki kaping untat kauah ri tatkala  $2, $1",
+       "viewcount": "Kaca puniki sampun diaksés ping {{PLURAL:$1|$1 kali}}.<br />",
        "protectedpage": "Kaca sané kasaibin",
        "jumpto": "Lanturang ka:",
        "jumptonavigation": "navigasi",
        "jumptosearch": "rereh",
+       "view-pool-error": "Ampura, server kari sibuk mangkin.\nAkéh pisan panganggé sané mautsaha nyingakin kaca puniki.\nAntosang jebos sadurung ragané jagi ngeaksés kaca puniki. \nMaaf, server sedang sibuk pada saat ini.\nTerlalu banyak pengguna berusaha melihat halaman ini.\nTunggu sebentar sebelum Anda mencoba lagi mengakses halaman ini.\n\n$1",
+       "generic-pool-error": "Ampura, server kari sibuk mangkin.\nKaliwat akéh panganggé sané mautsaha nyingakin sumber puniki.\nAntosang jebos sadurung ragané jagi ngaksés kaca puniki malih.",
+       "pool-timeout": "Liwat galah ngantosang kunci",
+       "pool-queuefull": "Pupulan antrian sampun penuh",
        "pool-errorunknown": "Iwang sané durung kauningin",
+       "pool-servererror": "Layanan pangitung pool punika nénten kasayagayang ($1).",
+       "poolcounter-usage-error": "Pikobet panganggean: $1",
        "aboutsite": "Indik {{SITENAME}}",
        "aboutpage": "Project:Indik",
        "copyright": "Daging kasayagayang ring sor $1 ri tatkala nénten wénten uahan.",
        "helppage-top-gethelp": "Wantuan",
        "mainpage": "Kaca Utama",
        "mainpage-description": "Kaca utama",
+       "policy-url": "Project:Kapatutan",
        "portal": "Kori sekaa",
        "portal-url": "Project:Kori sekaa",
        "privacy": "Awig-awig indik data praragan",
        "privacypage": "Project:Awig-awig indik data praragan",
+       "badaccess": "Pikobet lugra",
+       "badaccess-group0": "Ragané nénten kadurusang antuk nglaksanayang parilaksana sakadi sané kapinta.\nAnda tidak diizinkan untuk melakukan tindakan yang Anda minta.",
+       "badaccess-groups": "Parilaksana sané kapinta kawatesin antuk pangangge ring tengah {{PLURAL:$2|kelompok}}: $1.",
+       "versionrequired": "Kaperluang MediaWiki manut $1",
+       "versionrequiredtext": "MediaWiki versi $1 kaperluang antuk nglaksanayang kaca puniki. Cingak [[Special:Version|kaca versi]]",
        "ok": "OK",
        "retrievedfrom": "Kapolihang saking \"$1\"",
        "youhavenewmessages": "{{PLURAL:$3|Ragané madué}} $1 ($2)",
        "toc": "Daging",
        "showtoc": "sinahang",
        "hidetoc": "engkebang",
+       "collapsible-collapse": "Alitin malih",
        "collapsible-expand": "buka",
        "confirmable-confirm": "{{GENDER:$1|Jero}} yakin?",
        "confirmable-yes": "Inggih",
        "confirmable-no": "Nénten",
+       "thisisdeleted": "Cingak utawi uliang $1?",
        "viewdeleted": "Cingak $1?",
        "restorelink": "{{PLURAL:$1|siki uahan sané kausapin|$1 uahan sané kausapin}}",
        "feedlinks": "Asupan:",
        "feed-invalid": "Tipe permintaan asupan tusing beneh.",
+       "feed-unavailable": "Umpan sindikasi nénten kasayagayang",
+       "site-rss-feed": "Umpan RSS $1",
        "site-atom-feed": "$1 \"atom feed\"",
+       "page-rss-feed": "Umpan RSS \"$1\"",
        "page-atom-feed": "$1 \"atom feed\"",
        "red-link-title": "$1 (kaca nénten wénten)",
+       "sort-descending": "Urutang ka betén",
+       "sort-ascending": "Urutang menék",
        "nstab-main": "Kaca",
        "nstab-user": "Kaca sang anganggé",
+       "nstab-media": "Kaca media",
        "nstab-special": "Kaca kusus",
        "nstab-project": "Kaca proyék",
        "nstab-image": "Depukan",
        "nstab-help": "Kaca wantuan",
        "nstab-category": "Kategori",
        "mainpage-nstab": "Kaca utama",
+       "nosuchaction": "Nénten wénten parilaksana sakadi punika",
+       "nosuchactiontext": "Parilaksana sané kapinta olih URL punika nénten valid. Ragané asané iwang ngetik URL, utawi ngikutin silih tunggil pranala sané ten patut. Unduk puniki taler asané kaindikasian silih tunggil bug ring perangkat lunak sané kaanggén olih {{SITENAME}}.",
        "nosuchspecialpage": "Nénten wénten kaca kusus sakadi punika",
        "nospecialpagetext": "<strong>Ida nagih kaca pinih luwih sane nenten patut.</strong>\n\nWacakan kaca pinih luwih dados kacingak ring [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Kaiwangan",
        "databaseerror": "Database kaluputan",
+       "databaseerror-text": "Silih tunggil galat kueri basis data sampun kalaksanayang.\nIndik puniki asané kaindikasian wénten pikobet ring perangkat lunaknyané.",
+       "databaseerror-textcl": "Silih tunggil galat kueri basis data sampun kajadian.",
        "databaseerror-query": "Kuéri: $1",
        "databaseerror-function": "Pungsi: $1",
        "databaseerror-error": "Pelih: $1",
+       "transaction-duration-limit-exceeded": "Mangde nénten katunda saduran sané tegeh, kiriman puniki kawangdeang mawanin galah nyurat ($1) ngliwatin wates $2 ring limit dauh.\nYéning ragané jagi nguah akéh ring galah sané masikian, ngiring laksanayang ring karya sané alitan.",
+       "laggedslavemode": "Pangeling: Kaca asané nénten kadagingin uahan pinih anyar.",
+       "readonly": "Basis data kakunci",
+       "enterlockreason": "Asukan napi sané ngawinan penguncian, rumasuk kirang langkung ring galah napu kunci jagi kabuka",
+       "readonlytext": "Basis data kantun kakunci ring masukan miwah uahan sané anyar, asané pamecikan basis data, sasampun keadaan jagi normal sakadi sadurungnyané. \n\nPrajuru sané nglaksanayang panguncian ngemaang daging sakadi punika: $1",
        "missing-article": "data utama nenten prasida nemu tulisan saking lembar sane sepatutne wenten, inggih punika  $1, $2\n\nindike puniki biasane keranayang olih pranala kaon nuju pabenahan sane dumun lembar sane sampun kaicalang\n\nyening nenten puniki sane ngranayang, ida dane minab sampun manggihin kaiwangang ring sajeroning piranti lunak.\nDurus sadokang indik puniki rin silih sinunggil anak \n\n[[Special:ListUsers/sysop|Pengurus]], antuk ngetik alamat URL sane katuju",
        "missingarticle-rev": "(pabenahan#:$1)",
+       "missingarticle-diff": "(Malianan: $1, $2)",
+       "readonly_lag": "Basis data sampun kakunci otomatis sakantun basis data sekunder nglaksanayang sinkronisasi antuk basis data sané utama",
+       "nonwrite-api-promise-error": "Manggala HTTP 'Promise-Non-Write-API-Action' sampun kakirim nanging paminta kabuat mantuké modul manyurat API.",
+       "internalerror": "Pikobet saking tengah",
+       "internalerror_info": "Pikobet saking tengah: $1",
+       "internalerror-fatal-exception": "Sajabaning fatal ngetik \"$1\"",
+       "filecopyerror": "Nénten mrasidayang nyadur berkas \"$1\" ka \"$2\".",
+       "filerenameerror": "Nénten prasida nguah wastan berkas \"$1\" manados \"$2\".",
+       "filedeleteerror": "Nénten prasida ngusap berkas \"$1\".",
+       "directorycreateerror": "Nénten prasida ngaé direktori \"$1\".",
+       "directoryreadonlyerror": "Direktori \"$1\" wantah-baca.",
+       "directorynotreadableerror": "Direktori \"$1\" nénten prasida kabaca.",
+       "filenotfound": "Nénten prasida ngusap berkas \"$1\".",
+       "unexpected": "Nilai di sisin jangkauan: \"$1\"=\"$2\".",
+       "formerror": "Pikobet: Nénten prasida ngirim blanko.",
+       "badarticleerror": "Parilaksana puniki nénten prasida ring kaca puniki.",
+       "cannotdelete": "Kaca utawi berkas \"$1\" nénten prasida kausap.\nAsané sampun kausap olih jadma lianan.",
+       "cannotdelete-title": "Nénten prasida ngusap kaca \"$1\"",
+       "delete-scheduled": "Kaca $1 karencanayang mangda kausap. Mangda trepti.",
+       "delete-hook-aborted": "Pangusapan kawangdeang olih kait parser.\nNénten wénten panlatarang.",
+       "no-null-revision": "Nénten prasida makarya revisi null anyar anggén kaca \"$1\"",
        "badtitle": "murda sane nenten manut",
        "badtitletext": "Judul halaman sane katagih nenten patut, kosong, atau judul antarbahasa atau antarwiki yang salah sambung.\n\nmurda lembar sane kaarsa nenten sida kaedengang, kosong, utawi murda murda antarbasa utawi antarwiki sane iwang",
+       "title-invalid-empty": "Murda kaca sané kapinta nénten madaging napi-napi utawi madaging wantah wasta saking silih tunggil genah aran\nJudul halaman yang diminta kosong atau berisi hanya nama sebuah ruang nama.",
+       "title-invalid-utf8": "Murda kaca sané kapinta madué paiketan UTF-8 sané nénten resmi.",
+       "title-invalid-interwiki": "Murda madué pranala pantaraningwiki sané nénten prasida kaanggén ring murda.",
+       "title-invalid-talk-namespace": "Murda situs sané kapinta nuju ka kaca pablibagan sané nénten prasida kasayagayang.",
+       "title-invalid-characters": "Murda kaca sané kapinta madué watek sané ten resmi:\"$1\".",
+       "title-invalid-relative": "Murda madué alamat relatif. Murda kaca relatif (./, ../) nénten resmi, mawinan prasida ngawinan wangde ritatkala kapindatangan olih prajuru panganggé.",
+       "title-invalid-magic-tilde": "Murda kaca madué paiketan tilda sané nénten resmi (<nowiki>~~~</nowiki>).",
+       "title-invalid-too-long": "Murda kaca sané kapinta kalintang dawa. Punika patut kasimbolang sareng $1 {{PLURAL:$1|byte|bytes}} ring simbol UTF-8.",
+       "title-invalid-leading-colon": "Murda kaca sané kapinta kakawitin antuk tanda petik kalih sané nénten resmi.",
+       "perfcached": "Data sakadi puniki kaambil saking pasinggahan miwah asané nénten data sané mutakhir. {{PLURAL:$1|Hasil}} sakwéhnyané wénten ring pasinggahan.",
+       "perfcachedts": "Data sakadi puniki kaambil saking pasinggahan miwah pinih untat kaanyarin ring $1. {{PLURAL:$4|Hasil}} sakwéhnyané wénten ring pasinggahan.",
+       "querypage-no-updates": "Pamutakhiran saking kaca puniki kantun kamatiang. Data sané wénten driki mangkin nénten jagi kamuat malih.",
        "viewsource": "Cingak wit",
        "viewsource-title": "Cingak wit saking $1",
+       "actionthrottled": "Parilaksana kawatesin",
+       "actionthrottledtext": "Ragané kawatesin antuk nglaksanayang parilaksana puniki kalintang akéh ring galah sané nampek, miwah ragané sampun ngliwatin wates sané kadurusang. Ngiring ulang malih ring akudang menit malih.",
+       "protectedpagetext": "Kaca puniki sampun kakunci antuk ngahalangin pauahan utawi parilaksana lianan.",
        "viewsourcetext": "Ragané dados nyingakin miwah nurun wit saking kaca puniki.",
+       "viewyourtext": "Ragané prasida nyingakin utawi nyadur sumber saking '''uahan Ragané''' ka kaca puniki.",
+       "protectedinterface": "Kaca puniki ngamuat teks pantaraningrai antuk perangkat lunak ring wiki puniki, miwah kalindungin ring parilaksana sané nénten patut. Antuk nambehin utawi nguah terjemahan ring makasami wiki, mangda nganggé [https://translatewiki.net/ translatewiki.net], pakarya pelokalan MediaWiki.",
+       "editinginterface": "<strong>Panginget:</strong> Ragané nguah silih tunggil kaca sané kaangén nyayagayang teks pantaraningrai antuk perangkat lunak.\nUahan ring kaca puniki jagi ngawinang mal ring pantaraningrai panganggé majeng panganggé lianan ring wiki puniki.",
+       "translateinterface": "Antuk nambehin utawi nguah terjemahan makasami wiki, mangda anggén   [https://translatewiki.net/ translatewiki.net], pakarya pelokalan MediaWiki.",
+       "cascadeprotected": "Kaca puniki sampun kajaga saking uwahan mawinan kasarengi ring {{PLURAL:$1|kaca|kaca-kaca}} sakadi punika sané sampun kajaga malarapan opsi \"madérét\":\n$2",
+       "namespaceprotected": "Ragané ten madué kawenangan ngakses antuk nguah kaca ring genah aran '''$1'''.",
+       "customcssprotected": "Ragané nénten madué izin antuk nguah kaca CSS puniki, mawinan madaging tatacara praragan panganggé.",
+       "customjsonprotected": "Ragané nénten madué izin antuk nguah kaca JSON puniki mawinan madaging tatacara praragan panganggé.",
+       "customjsprotected": "Ragané nénten madué izin antuk nguah kaca JavaScrip puniki, mawinan madaging tatacara praragan panganggé lianan.",
+       "sitecssprotected": "Ragané nénten madué izin antuk nguah kaca CSS puniki mawinan parilaksana sakadi punika asané prasida mabuat ring makasami pamiarsa.",
+       "sitejsonprotected": "Ragané nénten madué izin antuk nguah kaca JSON puniki mawinan parilaksana sakadi punika prasida mabuat ring makasami pamiarsa.",
+       "sitejsprotected": "Ragané nénten madué izin antuk nguah kaca JavaScript puniki mawinan parilaksana sakadi punika asané prasida mabuat ring makasami pamiarsa.",
+       "mycustomcssprotected": "Ragané nénten madué izin antuk nguah kaca CSS puniki.",
+       "mycustomjsonprotected": "Ragané nénten madué izin antuk nguah kaca JSON puniki.",
+       "mycustomjsprotected": "Ragané nénten madué izin antuk nguah kaca JavaScript puniki.",
+       "myprivateinfoprotected": "Ragané nénten madué izin antuk nguah informasi praragan ragané.",
+       "mypreferencesprotected": "Ragané nénten madué izin antuk nguah kaca JavaScript puniki.",
+       "ns-specialprotected": "Kaca ring genah aran {{ns:special}} nénten prasida kauah.",
+       "titleprotected": "Murda puniki kajaga saking pabuat saking [[User:$1|$1]].\nNapi ngawinan asapunika wantah kaicénin sakadi <em>$2</em>.",
+       "filereadonlyerror": "Nénten prasida memodifikasi berkas \"$1\" mawinan berkas repositori \"$2\" inggih punika mode baca-manten.\n\nPrajuru sané ngunci madué napi sané ngawinan asapunika: \"$3\".",
+       "invalidtitle": "Murda nénten resmi",
+       "invalidtitle-knownnamespace": "Murda sané nénten resmi antuk genah aran \"$2\" miwah teks \"$3\"",
+       "invalidtitle-unknownnamespace": "Judul sané nénten resmi antuk nomor genah aran nénten kauningin $1 miwah teks \"$2\"",
+       "exception-nologin": "Durung manjing log",
        "yourname": "Peséngan sang anganggé:",
        "userlogin-yourname": "Peséngan sang anganggé",
        "userlogin-yourname-ph": "Dagingin peséngan sang anganggé ragané",
        "watchthis": "Awasin kaca puniki",
        "savearticle": "Raksa kaca",
        "publishpage": "Terbitang kaca",
+       "publishchanges": "Wedah uahan",
        "savearticle-start": "Raksa kaca...",
        "publishpage-start": "Terbitang kaca…",
+       "publishchanges-start": "Wedah uahan...",
        "preview": "Pracingak",
        "showpreview": "Édengang pracingak",
        "showdiff": "Cingak uahan",
        "userpage-userdoesnotexist-view": "Akun sang anganggé \"$1\" nénten madaptar.",
        "clearyourcache": "<strong>Catetan:</strong>Sesampun karaksayang, Ragané patut ngentasin tembolok peramban wéb antuk nyingakin uahan.\n* <strong>Firefox/Safari:</strong> Tahan <em>Shift</em> ritatkala ngaklik <em>Reload</em>, utawi teken <em>Ctrl-F5</em> utawi <em>Ctrl-R</em> (<em>⌘-R</em> ring Mac)\n* <strong>Google Chrome:</strong> Teken <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> ring Mac)\n* <strong>Internet Explorer:</strong> Teken <em>Ctrl</em> ritatkala ngaklik <em>Refresh</em>, utawi teken <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Ngranjing ka <em>Ménu → Pengaturan </em> (<em>Opera → Pustaka</em> ring Mac) Salanturnyané ka <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
        "previewnote": "<strong>Éling yéning puniki wantah pracingak.</strong>\nUahan ragané durung karaksa!",
-       "continue-editing": "Magingsir ka genah ngauwah",
+       "continue-editing": "Magingsir ka genah panguah",
        "editing": "Nguahin $1",
        "creating": "Makarya $1",
        "editingsection": "Nguahin $1 (pahan)",
        "template-semiprotected": "(semi-kasaibin)",
        "hiddencategories": "lembar niki inggih punika krama saking {{PLURAL:$1|1 golongan sane mengkeb|$1 golongan sane mengkeb}}",
        "permissionserrors": "Pikobet lugra",
-       "permissionserrorstext-withaction": "ida dané nénten madué kuasa ngranjing anggén $2, riantukan {{PLURAL:$1|alasan}} ring sor puniki:",
+       "permissionserrorstext-withaction": "Ragané tan kalugra $2, antukan {{PLURAL:$1|larapan}} ring sor puniki:",
        "recreate-moveddeleted-warn": "\"pingetan\" ida dane ngawe malih lembar sane naenin maapus.'''\n\nmangda kayunin malih napike pantes lanturang suntingan ida dane. puniki log pengapusan lan pangisidan saking lembar puniki:",
        "moveddeleted-notice": "Kaca puniki sampun kausapin.\nAnggen pewarah, proteksi, lan pengisidan log saking lembar puniki cingakin pustaka beten.",
        "postedit-confirmation-created": "Kacanyané sampun kakaryanin.",
        "postedit-confirmation-saved": "Uahan jero sampun maraksa.",
+       "postedit-confirmation-published": "Uahan ragané sampun kawedar.",
        "content-model-wikitext": "sesuratan wiki",
        "post-expand-template-inclusion-warning": "pinget: ukuran templat sane keanggen kalangkung ageng. wenten templat sane kacampahang",
        "post-expand-template-inclusion-category": "lembar sane maukuran templat sane nglangkungin wates",
        "difference-title": "Bina pantaraning révisi \"$1\"",
        "lineno": "Carik $1:",
        "compareselectedversions": "bandingang penguwahan sane kapilih",
-       "editundo": "nguliang",
-       "diff-empty": "(Nénten wénten sané malianan)",
+       "editundo": "ulihang",
+       "diff-empty": "(Nénten mabina)",
        "diff-multi-sameuser": "({{PLURAL:$1|$1 revisi pantaraning}} olih pangawi sane pateh nenten kacumawisang)",
        "diff-multi-otherusers": "({{PLURAL:$1|Siki pamecikan pantaraning|$1 pamecikan pantaraning}} olih {{PLURAL:$2|siki pangangge lianan|$2 panggange}} nenten katampilan)",
        "searchresults": "Asil pangrereh",
-       "searchresults-title": "Asil pangrereh anggén \"$1\"",
+       "searchresults-title": "Asil pangrereh indik \"$1\"",
        "prevn": "{{PLURAL:$1|$1}} sadurungnyané",
        "nextn": "{{PLURAL:$1|$1}} salanturnyané",
        "prev-page": "kaca sadurungnyané",
        "prevn-title": "$1 {{PLURAL:$1|asil}} sadurungnyané",
-       "nextn-title": "$1 {{PLURAL:$1|asil}} selanturnyane",
+       "nextn-title": "$1 {{PLURAL:$1|asil}} salanturnyané",
        "shown-title": "Sinahang $1 {{PLURAL:$1|asil}} per kaca",
        "viewprevnext": "Cingak ($1 {{int:pipe-separator}}$2)($3)",
        "searchmenu-exists": "wenten lembar sane mamurda \"[[:$1]]\" ring wiki puniki. {{PLURAL:$2|0=| cingakin taler asil rerehan lianan sane kapolihang}}",
        "search-suggest": "Minab sané aptiang ragané: $1",
        "searchrelated": "paiketan",
        "searchall": "samian",
-       "search-showingresults": "{{PLURAL:$4|Asil <strong>$1</strong> of <strong>$3</strong>|Asil-asil <strong>$1 – $2</strong> saking <strong>$3</strong>}}",
-       "search-nonefound": "nénten wénten asil sané caklek ring arsa",
+       "search-showingresults": "{{PLURAL:$4|Asil <strong>$1</strong> saking <strong>$3</strong>|Asil <strong>$1 – $2</strong> saking <strong>$3</strong>}}",
+       "search-nonefound": "Nénten wénten asil sané cocok sareng kuéri.",
        "powersearch-ns": "Rereh ring genah wastan:",
        "mypreferences": "Préferénsi",
        "prefs-user-pages": "Kaca sang anganggé",
        "newuserlogpage": "Log makarya sang anganggé",
        "rightslog": "Log panguwahan hak ngaksés",
        "action-read": "wacén kaca puniki",
-       "action-edit": "uah kaca puniki",
-       "action-createpage": "karyanin kaca puniki",
+       "action-edit": "nguah kaca puniki",
+       "action-createpage": "ngardi kaca puniki",
        "action-createaccount": "kardi akun sang anganggé puniki",
+       "action-move": "ngingsirang kaca puniki",
        "action-delete": "usap kaca puniki",
        "action-deletedhistory": "cingak babad kaca sané kausapin",
        "action-browsearchive": "rereh kaca sané kausapin",
-       "action-editprotected": "uah kaca sané kasaibin \"{{int:protect-level-sysop}}\"",
+       "action-rollback": "ngwaliang kanti gelis uahan saking sang anganggé pinih untat sané nguah sinalih tunggil kaca",
+       "action-autopatrol": "nyihnain uahan ragané yéning sampun kapratroli",
+       "action-sendemail": "ngirim séwala éléktronik",
+       "action-editprotected": "nguah kaca sané kasaibin \"{{int:protect-level-sysop}}\"",
        "action-editsemiprotected": "uah kaca sané kasaibin \"{{int:protect-level-autoconfirmed}}\"",
        "nchanges": "$1 {{PLURAL:$1|uahan}}",
        "enhancedrc-history": "babad",
        "recentchanges-label-bot": "Uahan puniki kalaksanayang antuk bot",
        "recentchanges-label-unpatrolled": "Uahan puniki durung kapatroli",
        "recentchanges-label-plusminus": "Agengnyané kacané kauahin antuk akéhnyané bita puniki",
-       "recentchanges-legend-heading": "<strong>Legenda:</strong>",
+       "recentchanges-legend-heading": "<strong>Legénda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (taler cingak [[Special:NewPages|bacakan kaca anyar]])",
        "recentchanges-submit": "Sinahang",
        "rcfilters-activefilters-show": "Sinahang",
        "rcfilters-filter-major-label": "Uahan tan alit",
        "rcfilters-filter-pageedits-label": "Uahan kaca",
        "rcnotefrom": "Ring beten puniki inggih punika {{PLURAL:$5|panguwahan}} saking <strong>$3, $4</strong> (kaedengang ngantos <strong>$1</strong> panguwahan).",
-       "rclistfrom": "edengang  penguwahan sane anyar wit saking $3 $2",
+       "rclistfrom": "Édéngang uahan anyar saking $2, $3",
        "rcshowhideminor": "$1 uahan alit",
        "rcshowhideminor-show": "Sinahang",
        "rcshowhideminor-hide": "Engkebang",
        "upload-dialog-button-cancel": "Wangdé",
        "upload-dialog-button-save": "Raksa",
        "backend-fail-delete": "Tan prasida ngusapin berkas \"$1\".",
+       "uploadstash-summary": "Kaca puniki nyayagayang aksés ring berkas sané sampun kaunggah utawi sané jagi kaunggah, nanging durung kawedar ring wikiné. Berkas-berkas punika nénten sinah ring samian anak sajabaning anak sané ngunggahang.",
        "license": "kepahan lugra",
        "license-header": "Lisénsi",
        "listfiles-delete": "usap",
        "nolinkstoimage": "Nénten wénten kaca sané nganggén berkas puniki.",
        "linkstoimage-redirect": "$1 (gingsiran berkas) $2",
        "sharedupload-desc-here": "Depukan puniki mawit saking $1 lan minab kaanggén olih proyék-proyék sané lianan. Déskripsinnyané ring [$2 kaca déskripsi depukannyané] kaarahin ring ungkur puniki.",
-       "filepage-nofile": "Nentén wénten berkas sané mamurda sakadi punika",
+       "filepage-nofile": "Nentén wénten berkas sané maaran sakadi punika.",
        "shared-repo-name-wikimediacommons": "Wikimedia Commons",
        "upload-disallowed-here": "Ragané nénten dados numpuk depukan puniki.",
        "filedelete": "Usap $1",
        "linksearch-ns": "Genah wastan:",
        "linksearch-line": "$1 masambung saking $2",
        "listusers-submit": "Sinahang",
-       "listgrouprights-members": "kepahan krama",
-       "emailuser": "email sane nganggo niki",
+       "listgrouprights-members": "(bacakan krama)",
+       "emailuser": "Kirim séwala éléktronik ring sang anganggé puniki",
        "emailmessage": "Séwala:",
        "usermessage-editor": "Séwala sistem",
        "watchlist": "Pangawasan",
        "protectedarticle": "nyaib \"[[$1]]\"",
        "modifiedarticleprotection": "nguwah tingkatan panyambi antuk  \"[[$1]]\"",
        "protect-default": "Lugra makasami sang anganggé",
+       "protect-level-sysop": "Wantah prajuru sané kalugra",
        "restriction-edit": "Uah",
        "restriction-move": "Gingsirang",
        "undelete": "Cingak kaca sané kausapin",
        "whatlinkshere": "Pranala iriki",
        "whatlinkshere-title": "Kaca sané kasambung ring \"$1\"",
        "whatlinkshere-page": "Kaca:",
-       "linkshere": "lembar puniki maduwe pranala ke '''$2'''",
+       "linkshere": "Kaca-kaca ring sor puniki kasambung ring <strong>$2</strong>:",
        "nolinkshere": "Nénten wénten kaca sané madué pranala ring <strong>$2</strong>.",
        "isredirect": "Kaca gingsiran",
        "istemplate": "sareng kasurat",
-       "isimage": "pranala pupulan-pupulan",
+       "isimage": "pranala berkas",
        "whatlinkshere-prev": "{{PLURAL:$1|sadurungnyané|$1 sadurungnyané}}",
        "whatlinkshere-next": "{{PLURAL:$1|salanturnyané|$1 salanturnyané}}",
        "whatlinkshere-links": "← pranala",
        "tooltip-pt-userpage": "Kaca {{GENDER:|sang anganggé ragané}}",
        "tooltip-pt-mytalk": "Kaca pabligbagan {{GENDER:|ragané}}",
        "tooltip-pt-preferences": "Préferénsi {{GENDER:|ragané}}",
-       "tooltip-pt-watchlist": "kepahan-kepahan lembar sane katinjo titiang",
+       "tooltip-pt-watchlist": "Bacakan kaca sané uahannyané awasin ragané",
        "tooltip-pt-mycontris": "Bacakan pituut {{GENDER:|ragané}}",
        "tooltip-pt-login": "Ragané kaaptiang mangda manjing log; yadiastun nénten wajib",
        "tooltip-pt-logout": "Medal log",
        "tooltip-n-randompage": "Cihnayang kaca ulah-aluh",
        "tooltip-n-help": "Genah ngrereh wantuan",
        "tooltip-t-whatlinkshere": "Bacakan makasami kaca ring wiki sané nuju iriki",
-       "tooltip-t-recentchangeslinked": "Uahan sané mangkin saking kaca-kaca sané linked ring kaca puniki",
+       "tooltip-t-recentchangeslinked": "Uahan sané mangkin saking kaca-kaca sané kasambung ring kaca puniki",
        "tooltip-feed-atom": "\"atom feed\" anggen lembar puniki",
        "tooltip-t-contributions": "Bacakan pituut olih {{GENDER:$1|sang anganggé puniki}}",
        "tooltip-t-emailuser": "Ngirim surel majeng ring {{GENDER:$1|penganggo puniki}}",
        "tooltip-t-upload": "Unggahang depukan",
        "tooltip-t-specialpages": "Bacakan makasami kaca kusus",
        "tooltip-t-print": "Vérsi cétak kaca puniki",
-       "tooltip-t-permalink": "Pranala ajeg anggén révisinnyané kacané puniki",
+       "tooltip-t-permalink": "Pranala ajeg anggén révisin kacané puniki",
        "tooltip-ca-nstab-main": "Cingak kaca daging",
        "tooltip-ca-nstab-user": "Cingak kaca sang anganggé",
        "tooltip-ca-nstab-special": "Puniki kaca kusus tur nénten prasida kauah",
        "tooltip-ca-nstab-category": "Cingak kaca kategori",
        "tooltip-minoredit": "pingetin puniki dados panguwahan kidik",
        "tooltip-save": "Raksa uahan ragané",
+       "tooltip-publish": "Wedar uahan ragané",
        "tooltip-preview": "Pracingak uahan ragané. Rarisang nganggén pracingak puniki sadurung ngraksa.",
        "tooltip-diff": "Édéngang uahan sané karyanin ragané ring suratannyané",
        "tooltip-compareselectedversions": "Cingak bina pantaraning kalih révisi kaca puniki sané kapilih",
        "tooltip-watch": "Tambeh kaca puniki ring pangawasan ragané",
        "tooltip-rollback": "\"Waliang\" wantah ngwangdéang uahan kontributor sané pinih untat ring kaca puniki antuk klik apisan",
-       "tooltip-undo": "\"nguliang\" ngabuwungin jagi ngabecikang niki lan ngagah kotak mecikang ngangge mode pratayang. dasar ipun prasida kaimbuhin ring kotak pamicutet",
+       "tooltip-undo": "\"Ulihang\" wantah ngwangdéang uahan puniki miwah membuka formulir uahannyané ring mode pracingak. Larapan prasida katambehin ring ringkesannyané.",
        "tooltip-summary": "Dagingin ringkesan",
        "simpleantispam-label": "Panuréksa anti-spam.\n<strong>Sampunang</strong> nagingin puniki!",
        "pageinfo-title": "Pidarta indik \"$1\"",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|kaalihang}}; $3 {{PLURAL:$3|nénten-kaalihang}})",
        "pageinfo-firstuser": "Sang makarya kaca",
        "pageinfo-firsttime": "Tanggal ngardi kaca",
-       "pageinfo-lastuser": "Panguwah sané pinih anyar",
+       "pageinfo-lastuser": "Sang nguah pinih untat",
        "pageinfo-lasttime": "Galah antuk uahan sané pinih anyar",
        "pageinfo-edits": "Akéh uahan",
        "pageinfo-authors": "Akéh nomer makasami antuk panyurat sané lianan",
        "sunday-at": "Redite jam $1",
        "bad_image_list": "bentukne sekadi puniki:\n\nwantah kepahan daftar ( baris sane kakawitin anggen tanda *) sane kaitung pranala kapertama ring baris mangda pranala ring berkas sane kaon.\nPranala-Pranala sane selanturnyane ring baris sane pateh kamanahang antuk pinangging, inggih punika lembar sane prasida ngedengang berkas punika.",
        "metadata": "Métadata",
-       "metadata-help": "pupulan puniki madaging wacana imbuhan minab sane kaimbuhin olih kamera digital utawi scanner sane kaanggen antuk ngawi atawi \"mendigitalisasi\" pupulan. Yening pupulan niki sampun taen kautak-atik, rerincine sane wenten minab nenten samian nyiriang wacan saking gambar sane sampun kautak-atik niki.",
+       "metadata-help": "Berkas puniki madaging pidarta tambehan, minab katambehin saking kaméra digital utawi pemindai sané kaanggén ngardi utawi nigitalisasi.\nYéning berkasnyané sampun kamodifikasi saking kawéntenan witnyané, rincian saking witnyané minab nénten samian pateh malih saking berkas sané kamodifikasi.",
        "metadata-fields": "Widang métadata gambar ring séwala puniki jagi kalebuang ring tampilan kaca gambar ri tatkala tabél métadata kacenikang.\nSané lianan jagi kasenetang.\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": "samian",
        "monthsall": "samian",
        "redirect-user": "ID sang anganggé",
        "redirect-page": "ID kaca",
        "redirect-revision": "Uahan kaca",
-       "redirect-file": "Wastan berkas",
+       "redirect-file": "Aran berkas",
        "specialpages": "Kaca kusus",
        "external_image_whitelist": "#banggiang baris niki sapunapi kawentenanne<pre>\n#anggen fragmen akspresi reguler (wantah kepahan ring kekelaih//) ring sor puniki\n#fragmen-fragmen puniki jagi kaadungang sareng URL saking gambar-gambar eksternal (sane kasambungang langsung)\n#fragmen sane adung jagi katampilang dados gambar, sisanne wantah dados pranala kewanten\n#baris sane kakawitin antuk # jagi kadadosang baris komentar\n#niki nenten ngabinayang aksara ageng lan alit\n#genahang samian fragmen ekspresi reguler ring sor baris puniki. banggiang baris niki sapunapi kawentennane</pre>",
-       "tag-filter": "Panyaring [[Special:Tags|tag]]:",
-       "tag-list-wrapper": "[[Special:Tags|{{PLURAL:$1|Tag}}]]: $2",
+       "tag-filter": "Panyaring [[Special:Tags|cihna]]:",
+       "tag-list-wrapper": "[[Special:Tags|{{PLURAL:$1|Cihna}}]]: $2",
        "tag-mw-rollback": "Waliang",
        "tag-mw-rollback-description": "Uahan sané ngwaliang uahan sadurungnyané nganggén pranala waliang",
        "tags-active-yes": "Inggih",
        "tags-delete-title": "Usap tag",
        "compare-page2": "Kaca 2",
        "logentry-delete-delete": "$1 {{GENDER:$2|ngusapin}} kaca $3",
-       "logentry-delete-restore": "$1 {{GENDER:$2|ngwalikan}} kaca $3 ($4)",
+       "logentry-delete-restore": "$1 {{GENDER:$2|ngwaliang}} kaca $3 ($4)",
        "logentry-delete-revision": "$1 {{GENDER:$2|mauah}} kaca utama {{PLURAL:$5|$5  pamecikan}} ring kaca $3: $4",
        "revdelete-content-hid": "daging kaengkebang",
-       "logentry-move-move": "$1 {{GENDER:$2|ngingsirang}} kaca $3 ring $4",
-       "logentry-move-move-noredirect": "$1 {{GENDER:$2|maglisiran}} kaca $3 ka $4 tur nenten ngawe pengalihan",
-       "logentry-move-move_redir": "$1 {{GENDER:$2|maglisiran}} kaca $3 ka $4 tur nenten ngawe pengalihan",
+       "logentry-move-move": "$1 {{GENDER:$2|ngingsirang}} kaca $3 ka $4",
+       "logentry-move-move-noredirect": "$1 {{GENDER:$2|ngingsirang}} kaca $3 ka $4 tur nenten ngawe pengalihan",
+       "logentry-move-move_redir": "$1 {{GENDER:$2|ngingsirang}} kaca $3 ka $4 tur nenten ngawe pengalihan",
        "logentry-patrol-patrol-auto": "$1 otomatis {{GENDER:$2|kacihnayang}} sampun kabecikang $4 saking kaca $3 kaawasin",
        "logentry-newusers-create": "Akun sang anganggé $1 {{GENDER:$2|kakardi}}",
        "logentry-newusers-autocreate": "Akun sang anganggé $1 {{GENDER:$2|kakardi}} otomatis",
index 19585c8..dcb06ae 100644 (file)
        "specialmute-success": "Вашыя налады заглушэньня былі абноўленыя. Глядзіце ўсіх заглушаных удзельнікаў на старонцы [[Special:Preferences|вашых наладаў]].",
        "specialmute-submit": "Пацьвердзіць",
        "specialmute-label-mute-email": "Заглушыць лісты электроннай пошты ад гэтага ўдзельніка",
-       "specialmute-header": "Калі ласка, абярыце вашыя налады заглушэньня для <b>{{BIDI:[[User:$1]]}}</b>.",
+       "specialmute-header": "Калі ласка, абярыце вашыя налады заглушэньня для {{GENDER:$1|ўдзельніка|ўдзельніцы}} <b>{{BIDI:[[User:$1|$1]]}}</b>.",
        "specialmute-error-invalid-user": "Запытанае імя ўдзельніка ня можа быць знойдзенае.",
-       "specialmute-email-footer": "Для кіраваньня наладамі электроннай пошты для {{BIDI:$2}}, калі ласка, наведайце <$1>.",
+       "specialmute-email-footer": "Для кіраваньня наладамі электроннай пошты {{GENDER:$1|ўдзельніка|ўдзельніцы}} {{BIDI:$2}}, калі ласка, наведайце <$1>.",
        "specialmute-login-required": "Калі ласка, увайдзіце, каб зьмяніць вашыя налады заглушэньня.",
        "mute-preferences": "Налады заглушэньня",
        "revid": "вэрсія $1",
index c356041..3132c1b 100644 (file)
        "search-interwiki-more": "(яшчэ)",
        "search-interwiki-more-results": "больш вынікаў",
        "search-relatedarticle": "Дачыняюцца*",
+       "search-invalid-sort-order": "Парадак сартавання ў $1 не распазнаны, будзе ўжыта сартаванне па змоўчанні. Правільныя запыты на сартаванне: $2",
        "searchrelated": "маюць дачыненне",
        "searchall": "усе",
        "showingresults": "Ніжэй паказаны да {{PLURAL:$1|'''$1''' выніку|'''$1''' вынікаў}}, пачынаючы з нумару '''$2'''.",
        "exbeforeblank": "змесціва перад ачысткаю было: '$1'",
        "delete-confirm": "Выдаліць \"$1\"",
        "delete-legend": "Выдаліць",
-       "historywarning": "<strong>Увага:</strong> Ð¡Ñ\82аÑ\80онка, Ñ\8fкÑ\83Ñ\8e Ð²Ñ\8b Ñ\85оÑ\87аÑ\86е Ð²Ñ\8bдалÑ\96Ñ\86Ñ\8c, Ð¼Ð°Ðµ Ð³Ñ\96Ñ\81Ñ\82оÑ\80Ñ\8bÑ\8e Ð· Ð¿Ñ\80Ñ\8bблÑ\96зна $1 {{PLURAL:$1|пÑ\80аÑ\9eкÑ\83|пÑ\80аÑ\9eкÑ\96|пÑ\80авак}}:",
+       "historywarning": "<strong>Увага:</strong> Ð¡Ñ\82аÑ\80онка, Ñ\8fкÑ\83Ñ\8e Ð²Ñ\8b Ñ\85оÑ\87аÑ\86е Ð²Ñ\8bдалÑ\96Ñ\86Ñ\8c, Ð¼Ð°Ðµ Ð³Ñ\96Ñ\81Ñ\82оÑ\80Ñ\8bÑ\8e Ð¿Ñ\80авак Ð· $1 {{PLURAL:$1|веÑ\80Ñ\81Ñ\96Ñ\8fй|веÑ\80Ñ\81Ñ\96Ñ\8fмÑ\96|веÑ\80Ñ\81Ñ\96Ñ\8fмÑ\96}}:",
        "historyaction-submit": "Паказаць",
        "confirmdeletetext": "Вы збіраецеся выдаліць старонку разам з усёй яе гісторыяй правак.\nПацвердзіце свой намер зрабіць гэта, сваё разуменне наступстваў, і што Вы робіце гэта ў адпаведнасці з [[{{MediaWiki:Policy-url}}|асноўнымі правіламі праекта]].",
        "actioncomplete": "Завершана аперацыя",
        "newimages-hidepatrolled": "Без паказу ўхваленых ўкладанняў",
        "newimages-mediatype": "Тып медиафайла:",
        "noimages": "Тут нічога няма.",
-       "gallery-slideshow-toggle": "Ð\9fеÑ\80еклÑ\8eÑ\87иÑ\82ь мініяцюры",
+       "gallery-slideshow-toggle": "Ð\9fеÑ\80аклÑ\8eÑ\87Ñ\8bÑ\86ь мініяцюры",
        "ilsubmit": "Знайсці",
        "bydate": "п. датаў",
        "sp-newimages-showfrom": "Паказаць новыя файлы, пачынаючы з $2, $1",
index 1a0775b..ed8ae16 100644 (file)
        "nocreate-loggedin": "Нямате необходимите права да създавате нови страници.",
        "sectioneditnotsupported-title": "Не се поддържа редактиране на раздели",
        "sectioneditnotsupported-text": "Не се поддържа редактиране на раздели на тази страница.",
+       "modeleditnotsupported-title": "Редактирането не се поддържа",
+       "modeleditnotsupported-text": "Редактирането не се поддържа за модел на съдържанието $1.",
        "permissionserrors": "Грешка при правата на достъп",
        "permissionserrorstext": "Нямате правата да извършите това действие по {{PLURAL:$1|следната причина|следните причини}}:",
        "permissionserrorstext-withaction": "Нямате разрешение за $2 поради {{PLURAL:$1|следната причина|следните причини}}:",
        "rcfilters-clear-all-filters": "Изчистване на всички филтри",
        "rcfilters-show-new-changes": "Преглед на промените направени след $1",
        "rcfilters-search-placeholder": "Филтриране на промените (използвайте менюто или търсете по име на филтър)",
+       "rcfilters-search-placeholder-mobile": "Филтри",
        "rcfilters-invalid-filter": "Невалиден филтър",
        "rcfilters-empty-filter": "Няма активни филтри. Показани са всички редакции.",
        "rcfilters-filterlist-title": "Филтри",
        "changecontentmodel": "Промяна на модела на съдържанието на страница",
        "changecontentmodel-legend": "Промяна на модела на съдържанието",
        "changecontentmodel-title-label": "Заглавие на страницата:",
+       "changecontentmodel-current-label": "Текущ модел на съдържанието:",
        "changecontentmodel-model-label": "Нов модел на съдържанието:",
        "changecontentmodel-reason-label": "Причина:",
        "changecontentmodel-submit": "Променяне",
        "mycontris": "Приноси",
        "anoncontribs": "Приноси",
        "contribsub2": "За {{GENDER:$3|$1}} ($2)",
+       "contributions-subtitle": "За {{GENDER:$3|$1}}",
        "contributions-userdoesnotexist": "Няма регистрирана потребителска сметка за „$1“.",
        "negative-namespace-not-supported": "Именни пространства с негативни стойности не се поддържат.",
        "nocontribs": "Не са намерени промени, отговарящи на критерия.",
        "permanentlink": "Постоянна препратка",
        "permanentlink-revid": "ID на редакцията",
        "permanentlink-submit": "Към редакцията",
+       "newsection": "Нов раздел",
+       "newsection-page": "Целева страница",
        "dberr-problems": "Съжаляваме! Сайтът изпитва технически затруднения.",
        "dberr-again": "Изчакайте няколко минути и опитайте да презаредите.",
        "dberr-info": "(Няма достъп до базата от данни: $1)",
index 08aaa49..d82e2c7 100644 (file)
        "tog-useeditwarning": "Warnen, sofern eine zur Bearbeitung geöffnete Seite verlassen wird, die nicht gespeicherte Änderungen enthält",
        "tog-prefershttps": "Immer eine sichere Verbindung benutzen, solange ich angemeldet bin",
        "tog-showrollbackconfirmation": "Bei Klick auf „kommentarlos zurücksetzen“ eine Sicherheitsabfrage anzeigen",
+       "tog-requireemail": "E-Mail-Adresse zum Zurücksetzen des Passworts erforderlich",
        "underline-always": "immer",
        "underline-never": "nie",
        "underline-default": "abhängig von der Benutzeroberfläche oder Browsereinstellung",
        "nocreate-loggedin": "Du hast nicht die erforderliche Berechtigung, um neue Seiten erstellen zu können.",
        "sectioneditnotsupported-title": "Die Bearbeitung von Abschnitten wird nicht unterstützt",
        "sectioneditnotsupported-text": "Die Bearbeitung von Abschnitten wird auf dieser Bearbeitungsseite nicht unterstützt.",
+       "modeleditnotsupported-title": "Bearbeiten nicht möglich",
+       "modeleditnotsupported-text": "Das Bearbeiten wird für Seiten des Inhaltsmodells $1 nicht unterstützt.",
        "permissionserrors": "Berechtigungsfehler",
        "permissionserrorstext": "Du bist nicht berechtigt, die Aktion auszuführen. {{PLURAL:$1|Grund|Gründe}}:",
        "permissionserrorstext-withaction": "Du bist aus {{PLURAL:$1|dem folgenden Grund|den folgenden Gründen}} nicht berechtigt, $2:",
        "content-model-css": "CSS",
        "content-json-empty-object": "Leeres Objekt",
        "content-json-empty-array": "Leeres Array",
+       "unsupported-content-model": "<strong>Warnung:</strong> Das Inhaltsmodell $1 wird auf diesem Wiki nicht unterstützt.",
+       "unsupported-content-diff": "Versionsvergleiche werden für Seiten des Inhaltsmodells $1 nicht unterstützt.",
+       "unsupported-content-diff2": "Versionsvergleiche zwischen den Inhaltsmodellen $1 und $2 werden auf diesem Wiki nicht unterstützt.",
        "deprecated-self-close-category": "Seiten, die ungültige selbstschließende HTML-Tags verwenden",
        "deprecated-self-close-category-desc": "Die Seite enthält ungültige selbstschließende HTML-Tags wie <code>&lt;b/></code> oder <code>&lt;span/></code>. Das Verhalten dieser Tags wird bald geändert, um mit der HTML5-Spezifikation konsistent zu sein, so dass ihre Verwendung im Wikitext veraltet ist.",
        "duplicate-args-warning": "<strong>Warnung:</strong> [[:$1]] ruft [[:$2]] mit mehr als einem Wert für den Parameter „$3“ auf. Nur der letzte angegebene Wert wird verwendet.",
        "undo-norev": "Die Bearbeitung konnte nicht rückgängig gemacht werden, da sie nicht vorhanden ist oder gelöscht wurde.",
        "undo-nochange": "Anscheinend wurde diese Bearbeitung bereits rückgängig gemacht.",
        "undo-summary": "Änderung $1 von [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussion]]) rückgängig gemacht.",
+       "undo-summary-anon": "Änderung $1 von [[Special:Contributions/$2|$2]] rückgängig gemacht",
        "undo-summary-username-hidden": "Änderung $1 eines versteckten Benutzers rückgängig gemacht.",
        "cantcreateaccount-text": "Die Erstellung eines Benutzerkontos von der IP-Adresse '''($1)''' aus wurde durch [[User:$3|$3]] gesperrt.\n\nGrund der Sperre: ''$2''",
        "cantcreateaccount-range-text": "Das Erstellen von Benutzerkonten von IP-Adressen im Bereich <strong>$1</strong>, der deine IP-Adresse (<strong>$4</strong>) enthält, wurde von [[User:$3|$3]] gesperrt.\n\nDer angegebene Grund von $3 lautet: <em>$2</em>",
        "prefs-help-email": "Die Angabe einer E-Mail-Adresse ist optional, ermöglicht aber die Zusendung eines Ersatzpasswortes, sofern du dein Passwort vergessen hast.",
        "prefs-help-email-others": "Mit anderen Benutzern kannst du auch über die Benutzerdiskussionsseiten Kontakt aufnehmen, ohne dass du deine Identität offenlegen musst.",
        "prefs-help-email-required": "Es wird eine gültige E-Mail-Adresse benötigt.",
+       "prefs-help-requireemail": "Wird diese Option ausgewählt, werden nur dann E-Mails zum Zurücksetzen des Passworts versandt, wenn die Person beim Zurücksetzen den Benutzernamen und die E-Mail-Adresse dieses Kontos angegeben hat.",
        "prefs-info": "Basisinformationen",
        "prefs-i18n": "Sprache",
        "prefs-signature": "Signatur",
        "rcfilters-filter-showlinkedto-label": "Änderungen auf Seiten anzeigen, die verlinken auf",
        "rcfilters-filter-showlinkedto-option-label": "<strong>Seiten</strong>, die <strong>auf</strong> die ausgewählte Seite <strong>verlinken</strong>",
        "rcfilters-target-page-placeholder": "Einen Seitennamen (oder eine Kategorie) eingeben",
+       "rcfilters-allcontents-label": "Alle Inhaltsseiten",
+       "rcfilters-alldiscussions-label": "Alle Diskussionsseiten",
        "rcnotefrom": "Angezeigt {{PLURAL:$5|wird die Änderung|werden die Änderungen}} seit <strong>$3, $4</strong> (max. <strong>$1</strong> Einträge).",
        "rclistfromreset": "Datumsauswahl zurücksetzen",
        "rclistfrom": "Nur Änderungen seit $3, $2 Uhr zeigen.",
        "backend-fail-contenttype": "Der Inhaltstyp, der im Pfad „$1“ zu speichernden Datei, konnte nicht bestimmt werden.",
        "backend-fail-batchsize": "Der Datenbank wurde eine Stapelverarbeitungsdatei mit {{PLURAL:$1|einem Verarbeitungsschritt|$1 Verarbeitungsschritten}} übermittelt. Die zulässige Obergrenze liegt indes bei {{PLURAL:$2|einem Verarbeitungsschritt|$2 Verarbeitungsschritten}}.",
        "backend-fail-usable": "Die Datei „$1“ konnte entweder aufgrund eines nicht vorhandenen Verzeichnisses oder wegen unzureichender Berechtigungen weder abgerufen noch gespeichert werden.",
+       "backend-fail-stat": "Konnte den Status der Datei $1 nicht auslesen.",
+       "backend-fail-hash": "Konnte den kryptographischen Hash der Datei $1 nicht ermitteln.",
        "filejournal-fail-dbconnect": "Es konnte keine Verbindung zur Journaldatenbank des Datenbanksystems „$1“ hergestellt werden.",
        "filejournal-fail-dbquery": "Die Journaldatenbank des Datenbanksystems „$1“ konnte nicht aktualisiert werden.",
        "lockmanager-notlocked": "„$1“ konnte nicht entsperrt werden, da keine Sperrung besteht.",
        "alreadyrolled": "Das Zurücksetzen der Änderungen von [[User:$2|$2]] ([[User talk:$2|Diskussion]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) an [[:$1]] ist gescheitert, da bereits ein anderer Benutzer die Seite geändert hat.\n\nDie letzte Änderung stammt von [[User:$3|$3]] ([[User talk:$3|Diskussion]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Die Änderungszusammenfassung lautet: <em>$1</em>.",
        "revertpage": "Änderungen von [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussion]]) wurden auf die letzte Version von [[User:$1|$1]] zurückgesetzt",
+       "revertpage-anon": "Änderungen von [[Special:Contributions/$2|$2]] wurden auf die letzte Version von [[User:$1|$1]] zurückgesetzt",
        "revertpage-nouser": "Änderungen von einem versteckten Benutzer rückgängig gemacht und letzte Version von {{GENDER:$1|[[User:$1|$1]]}} wiederhergestellt",
        "rollback-success": "Die Änderungen von {{GENDER:$3|$1}} wurden rückgängig gemacht und die letzte Version von {{GENDER:$4|$2}} wurde wiederhergestellt.",
        "sessionfailure-title": "Sitzungsfehler",
        "sessionfailure": "Es gab ein Problem bei der Übertragung deiner Benutzerdaten.\nDiese Aktion wurde daher sicherheitshalber abgebrochen, um eine falsche Zuordnung deiner Änderungen zu einem anderen Benutzer zu verhindern.\nBitte sende das Formular erneut ab.",
        "changecontentmodel": "Inhaltsmodell einer Seite ändern",
        "changecontentmodel-legend": "Inhaltsmodell ändern",
-       "changecontentmodel-title-label": "Seitentitel",
+       "changecontentmodel-title-label": "Seitentitel:",
        "changecontentmodel-current-label": "Aktuelles Inhaltsmodell:",
-       "changecontentmodel-model-label": "Neues Inhaltsmodell",
+       "changecontentmodel-model-label": "Neues Inhaltsmodell:",
        "changecontentmodel-reason-label": "Grund:",
        "changecontentmodel-submit": "Ändern",
        "changecontentmodel-success-title": "Das Inhaltsmodell wurde geändert",
        "ipblocklist-legend": "Suche nach einem gesperrten Benutzer",
        "blocklist-userblocks": "Benutzersperren ausblenden",
        "blocklist-tempblocks": "Befristete Sperren ausblenden",
+       "blocklist-indefblocks": "Unbefristete Sperren ausblenden",
        "blocklist-addressblocks": "Sperren einzelner IP-Adressen ausblenden",
        "blocklist-type": "Typ:",
        "blocklist-type-opt-all": "Alle",
        "block-log-flags-angry-autoblock": "erweiterter Autoblock aktiviert",
        "block-log-flags-hiddenname": "Benutzername versteckt",
        "range_block_disabled": "Die Möglichkeit, ganze Adressräume zu sperren, ist nicht aktiviert.",
+       "ipb-prevent-user-talk-edit": "Das Bearbeiten der eigenen Diskussionsseite muss bei einer partiellen Sperre erlaubt bleiben, es sei denn, diese enthält Beschränkungen zum Benutzerdiskussions-Namensraum.",
        "ipb_expiry_invalid": "Die eingegebene Dauer ist ungültig.",
        "ipb_expiry_old": "Der Zeitpunkt des Ablaufs liegt in der Vergangenheit.",
        "ipb_expiry_temp": "Benutzernamens-Sperren mit der Verstecken-Option müssen permanent sein.",
        "move-page-legend": "Seite verschieben",
        "movepagetext": "Mit untenstehendem Formular kannst du eine Seite umbenennen, indem du sie mitsamt allen Versionen auf einen neuen Titel verschiebst.\nDer alte Titel wird danach zum neuen weiterleiten.\nDu kannst Weiterleitungen, die auf den Originaltitel verlinken, automatisch korrigieren lassen.\nStelle sicher, dass du im Anschluss alle [[Special:DoubleRedirects|doppelten]] oder [[Special:BrokenRedirects|defekten Weiterleitungen]] überprüfst.\nDu bist dafür verantwortlich, dass Links weiterhin auf das korrekte Ziel verweisen.\n\nDie Seite wird <strong>nicht</strong> verschoben, sofern es bereits eine Seite mit dem vorgesehenen Titel gibt, es sei denn, letztere ist eine Weiterleitung ohne Versionsgeschichte.\nDies bedeutet, dass du die Umbenennung rückgängig machen kannst, sofern du einen Fehler gemacht hast. Du kannst hingegen keine existierende Seite überschreiben.\n\n<strong>Hinweis:</strong>\nDie Verschiebung kann weitreichende und unerwartete Folgen für häufig besuchte Seiten haben.\nDu solltest daher die Konsequenzen verstanden haben, bevor du jetzt fortfährst.",
        "movepagetext-noredirectfixer": "Mit untenstehendem Formular kannst du eine Seite umbenennen, indem du sie mitsamt allen Versionen auf einen neuen Titel verschiebst.\nDer alte Titel wird danach zum neuen weiterleiten.\nStelle sicher, dass du im Anschluss alle [[Special:DoubleRedirects|doppelten]] oder [[Special:BrokenRedirects|defekten Weiterleitungen]] überprüfst.\nDu bist dafür verantwortlich, dass Links weiterhin auf das korrekte Ziel verweisen.\n\nDie Seite wird <strong>nicht</strong> verschoben, sofern es bereits eine Seite mit dem vorgesehenen Titel gibt, es sei denn, diese ist eine Weiterleitung ohne Versionsgeschichte.\nDies bedeutet, dass du die Umbenennung rückgängig machen kannst, sofern du einen Fehler gemacht hast. Du kannst hingegen keine existierende Seite überschreiben.\n\n<strong>Hinweis:</strong>\nDie Verschiebung kann weitreichende und unerwartete Folgen für häufig besuchte Seiten haben.\nDu solltest daher die Konsequenzen verstanden haben, bevor du jetzt fortfährst.",
+       "movepagetext-noredirectsupport": "Mit untenstehendem Formular kannst du eine Seite umbenennen, indem du sie mitsamt allen Versionen auf einen neuen Titel verschiebst. Du bist dafür verantwortlich, dass Links weiterhin auf das korrekte Ziel verweisen. \n\nDie Seite wird <strong>nicht</strong> verschoben, sofern es bereits eine Seite mit dem vorgesehenen Titel gibt. Dies bedeutet, dass du die Umbenennung rückgängig machen kannst, sofern du einen Fehler gemacht hast. Du kannst hingegen keine existierende Seite überschreiben.\n\n<strong>Hinweis:</strong> Die Verschiebung kann weitreichende und unerwartete Folgen für häufig besuchte Seiten haben. Du solltest daher die Konsequenzen verstanden haben, bevor du jetzt fortfährst.",
        "movepagetalktext": "Falls du dieses Kästchen aktivierst, wird die dazugehörige Diskussionsseite automatisch auf den neuen Titel verschoben, sofern nicht bereits eine nicht-leere Diskussionsseite dort vorhanden ist.\n\nIn diesem Fall musst du die Seite manuell verschieben oder zusammenführen, falls erforderlich.",
        "moveuserpage-warning": "<strong>Warnung:</strong> Du bist dabei, eine Benutzerseite zu verschieben. Bitte bedenke, dass dadurch nur die Benutzerseite verschoben, <em>nicht</em> aber der Benutzer umbenannt wird.",
        "movecategorypage-warning": "<strong>Warnung:</strong> Du bist gerade dabei, eine Kategorieseite zu verschieben. Bitte sei dir bewusst, dass nur die Seite verschoben wird. Alle der alten Kategorie zugeordneten Seiten werden <em>nicht</em> neu kategorisiert.",
        "lastmodifiedatby": "Diese Seite wurde zuletzt am $1 um $2 Uhr von $3 bearbeitet.",
        "othercontribs": "Basierend auf der Arbeit von $1.",
        "others": "anderen",
-       "siteusers": "{{SITENAME}}-{{PLURAL:$2|{{GENDER:$1|Benutzer|Benutzerin}}|Benutzer}} $1",
-       "anonusers": "{{PLURAL:$2|unangemeldetem|unangemeldeten}} {{SITENAME}}-{{PLURAL:$2|Benutzer|Benutzern}} $1",
+       "siteusers": "{{PLURAL:$2|{{GENDER:$1|Benutzer|Benutzerin}}|Benutzer}} $1",
+       "anonusers": "{{PLURAL:$2|unangemeldetem|unangemeldeten}} {{PLURAL:$2|Benutzer|Benutzern}} $1",
        "creditspage": "Seitenzuschreibung",
        "nocredits": "Für diese Seite sind keine Zuschreibungen vorhanden.",
        "spamprotectiontitle": "Spamschutzfilter",
        "linkaccounts": "Benutzerkonten verknüpfen",
        "linkaccounts-success-text": "Das Benutzerkonto wurde verknüpft.",
        "linkaccounts-submit": "Benutzerkonten verknüpfen",
+       "cannotunlink-no-provider-title": "Es gibt keine verbundenen Konten, die getrennt werden könnten.",
+       "cannotunlink-no-provider": "Es gibt keine verbundenen Konten, die getrennt werden könnten.",
        "unlinkaccounts": "Benutzerkonten trennen",
        "unlinkaccounts-success": "Das Benutzerkonto wurde getrennt.",
        "authenticationdatachange-ignored": "Die Änderung der Authentifizierungsdaten wurde nicht bearbeitet. Vielleicht wurde kein Anbieter konfiguriert?",
        "specialmute-label-mute-email": "E-Mails von diesem Benutzer stummschalten",
        "specialmute-header": "Bitte wähle deine Stummschaltungseinstellungen für Benutzer <b>{{BIDI:[[User:$1|$1]]}}</b>.",
        "specialmute-error-invalid-user": "Der gesuchte Benutzername konnte nicht gefunden werden.",
+       "specialmute-error-no-options": "Stummschaltungs-Funktionen sind nicht verfügbar. Gründe dafür könnten sein: du hast deine E-Mail-Adresse nicht bestätigt oder ein Administrator hat die E-Mail-Funktionen deaktiviert oder eine E-Mail-Blacklist in diesem Wiki eingerichtet.",
        "specialmute-email-footer": "Um deine E-Mail Einstellungen für Benutzer {{BIDI:$2}} zu verwalten besuche bitte <$1>.",
        "specialmute-login-required": "Bitte melde dich an um deine Stummschaltungseinstellungen zu ändern.",
+       "mute-preferences": "Stummschaltungs-Einstellungen",
        "revid": "Version $1",
        "pageid": "Seitenkennung $1",
        "interfaceadmin-info": "$1\n\nBerechtigungen für das Bearbeiten von wikiweiten CSS/JS/JSON-Dateien wurden kürzlich vom Recht <code>editinterface</code> getrennt. Falls du nicht verstehst, warum du diesen Fehler erhältst, siehe [[mw:MediaWiki_1.32/interface-admin]].",
        "passwordpolicies-policy-passwordnotinlargeblacklist": "Das Passwort kann nicht in der Liste der 100.000 am häufigsten verwendeten Passwörter sein.",
        "passwordpolicies-policyflag-forcechange": "muss bei der Anmeldung geändert werden",
        "passwordpolicies-policyflag-suggestchangeonlogin": "Änderung bei der Anmeldung vorschlagen",
+       "mycustomjsredirectprotected": "Du hast keine Berechtigung, diese JavaScript-Seite zu bearbeiten, da sie eine Weiterleitung, die nicht in deinen Benutzernamensraum zeigt, enthält.",
        "easydeflate-invaliddeflate": "Der angegebene Inhalt ist nicht ordnungsgemäß komprimiert",
        "unprotected-js": "Aus Sicherheitsgründen kann JavaScript-Code nicht mehr von ungeschützten Seiten geladen werden. Erstelle die JavaScript-Seite bitte ausschließlich im Namensraum „MediaWiki“ oder als Benutzerunterseite.",
        "userlogout-continue": "Möchtest du dich abmelden?"
index bfed435..5b83833 100644 (file)
@@ -78,6 +78,7 @@
        "tog-norollbackdiff": "Peyser ardışi ra dıme ferqi measne",
        "tog-useeditwarning": "Wexto ke mı yew pela nizami be vurnayışanê nêqeydbiyayeyan caverdê, hay be mı ser de",
        "tog-prefershttps": "Ronışten akerden de tım greyo itimadın bıkarne",
+       "tog-requireemail": "Parolay reset kerdışi rê email lazıma",
        "underline-always": "Tım",
        "underline-never": "Qet",
        "underline-default": "Cild ya zi cı geyrayoğo hesebiyaye",
@@ -86,8 +87,8 @@
        "editfont-sansserif": "Fontê Sans-serifi",
        "editfont-serif": "Font (çêşıdê nuştey) Serif",
        "sunday": "Bazar",
-       "monday": "Bahdêbazari",
-       "tuesday": "Telete",
+       "monday": "Dışeme",
+       "tuesday": "Sêşeme",
        "wednesday": "Çarşeme",
        "thursday": "Pancşeme",
        "friday": "Êne",
        "fri": "Yen",
        "sat": "Şem",
        "january": "Çele",
-       "february": "Gucige",
+       "february": "Sıbate",
        "march": "Adar",
        "april": "Nisan",
-       "may_long": "Gulan",
+       "may_long": "Gulane",
        "june": "Heziran",
        "july": "Temuz",
        "august": "Tebaxe",
        "september": "Keşkelun",
-       "october": "Cıtmeng",
-       "november": "Kelverdan",
-       "december": "Gağan",
+       "october": "Tışrino Verên",
+       "november": "Tışrino Peyên",
+       "december": "Kanun",
        "january-gen": "Çele",
-       "february-gen": "Şıbat",
+       "february-gen": "Sıbate",
        "march-gen": "Mert",
        "april-gen": "Nisane",
        "may-gen": "Gulane",
        "july-gen": "Temuz",
        "august-gen": "Tebaxe",
        "september-gen": "Keşkelun",
-       "october-gen": "Cıtmeng",
-       "november-gen": "Kelverdan",
-       "december-gen": "Gağan",
+       "october-gen": "Tışrino Verên",
+       "november-gen": "Tışrino Peyên",
+       "december-gen": "Kanun",
        "jan": "Çel",
-       "feb": "Şbt",
+       "feb": "Sbt",
        "mar": "Adr",
        "apr": "Nsn",
        "may": "Gul",
        "nov": "Tşp",
        "dec": "Gğn",
        "january-date": "$1 Çele",
-       "february-date": "$1 Şıbat",
+       "february-date": "$1 Sıbate",
        "march-date": "$1 Adar",
        "april-date": "$1 Nisan",
-       "may-date": "$1 Gulan",
+       "may-date": "$1 Gulane",
        "june-date": "$1 Heziran",
        "july-date": "$1 Temuze",
        "august-date": "$1 Tebaxe",
        "september-date": "$1 Keşkelun",
        "october-date": "$1 Cıtmeng",
        "november-date": "$1 Kelverdan",
-       "december-date": "$1 Gağan",
+       "december-date": "$1 Kanun",
        "period-am": "VD",
        "period-pm": "BD",
-       "pagecategories": "{{PLURAL:$1|Kategori|Kategoriy}}",
+       "pagecategories": "{{PLURAL:$1|Kategoriye|Kategoriyi}}",
        "category_header": "Perrê kategoriya \"$1\"'i",
        "subcategories": "Kategoriyê bınêni",
        "category-media-header": "Dosye yê ke kategoriya \"$1\" dı",
        "category-file-count": "{{PLURAL:$2|Na kategori tenya dosya ya cêri muhtewa kena.|Na kategori de $2 ra pêro piya {{PLURAL:$1|1 dosya est a|$1 dosyey est ê}}.}}",
        "category-file-count-limited": "{{PLURAL:$1|Dosye|$1 Dosyey}} na kategori de yê.",
        "listingcontinuesabbrev": "dewam...",
-       "index-category": "Perrê rêzıni",
+       "index-category": "Pelê rêzıni",
        "noindex-category": "Perrê bêrêzıni",
        "broken-file-category": "Perri be linkanê dosya çewte",
        "categoryviewer-pagedlinks": "($1) ($2)",
        "about": "Heqa",
        "article": "Pela zerreki",
        "newwindow": "(pençerey newey de beno a)",
-       "cancel": "İbtal",
+       "cancel": "Bıtexelne",
        "moredotdotdot": "Vêşi...",
        "morenotlisted": "Na lista qay kemi ya.",
-       "mypage": "Perr",
-       "mytalk": "Vaten",
-       "anontalk": "Vaten",
+       "mypage": "Pele",
+       "mytalk": "Werênayış",
+       "anontalk": "Werênayış",
        "navigation": "Pusula",
        "and": "&#32;u",
        "faq": "PVP",
        "printableversion": "Versiyono nustenaye",
        "permalink": "Gıreyo daimi",
        "print": "Bınustenê",
-       "view": "Bıvin",
+       "view": "Bıvêne",
        "view-foreign": "$1 de bıvin",
-       "edit": "Bıvurn",
+       "edit": "Bıvurne",
        "edit-local": "Şınasnayışê lokali bıvurne",
        "create": "Vıraz",
        "create-local": "Şınasnayışê lokali cı ke",
-       "delete": "Bestern",
+       "delete": "Bestere",
        "undelete_short": "{{PLURAL:$1|nê vırnayışi|$1 vırnayışa}} peyser bıyarê",
        "viewdeleted_short": "{{PLURAL:$1|Jew vurnayış esternayi|$1 Vurnayışanê esternayan}} bımotne",
        "protect": "Bışevekne",
        "protect_change": "bıvırne",
        "unprotect": "Starnayışi bıvurne",
        "newpage": "Perra newi",
-       "talkpagelinktext": "vaten",
+       "talkpagelinktext": "werênayış",
        "specialpage": "Pela xısusiye",
        "personaltools": "Hacetê şexsiy",
        "talk": "Vaten",
        "edithelp": "Peştdariya vurnayışi",
        "helppage-top-gethelp": "Peşti",
        "mainpage": "Perra Seri",
-       "mainpage-description": "Pera seri",
+       "mainpage-description": "Pela seri",
        "policy-url": "Project:Terzê hereketi",
        "portal": "Portalê cemati",
        "portal-url": "Project:Portalê cemati",
        "collapsible-collapse": "Teng ke",
        "collapsible-expand": "Hera kerê",
        "confirmable-confirm": "{{GENDER:$1|Şıma}} bêgumanê?",
-       "confirmable-yes": "E",
+       "confirmable-yes": "Eya",
        "confirmable-no": "Nê",
        "thisisdeleted": "Bıvêne ya zi $1 peyser biya?",
        "viewdeleted": "$1 bıvin?",
        "restorelink": "{{PLURAL:$1|jew vurnayış besteriya|$1 vurnayışi besteriyaye}}",
-       "feedlinks": "Resnayış:",
+       "feedlinks": "Weyiyekerdış:",
        "feed-invalid": "Qeydey cıresnayışê  beğşi nêvêreno.",
        "feed-unavailable": "Cıresnayışê şebekey çıniyê",
        "site-rss-feed": "$1 Cıresnayışê RSSi",
        "red-link-title": "$1 (pele çıniya)",
        "sort-descending": "Rêzkerdışo kêmbiyaye",
        "sort-ascending": "Rêzkerdışo zêdiyaye",
-       "nstab-main": "Perr",
+       "nstab-main": "Pele",
        "nstab-user": "Pera karberi",
        "nstab-media": "Pela medya",
-       "nstab-special": "Perra bağse",
+       "nstab-special": "Pela xısusiye",
        "nstab-project": "Perra procey",
        "nstab-image": "Dosya",
        "nstab-mediawiki": "Mesac",
        "badarticleerror": "Kar  ke şıma kenê, qebul nêbi.",
        "cannotdelete": "Pel  \"$1\" o ke şıma nişane kerd hewn a neşı.\nBelka yewna ten kerdo hewn a.",
        "cannotdelete-title": "Şıma nêşenê pela \"$1\" besterê",
-       "delete-hook-aborted": "Esterıtışi terefê çengeli ra ibtal bi.\nQet tesrih beyan nêbi.",
+       "delete-hook-aborted": "Esterıtışi terefê çengeli ra nêtexeliya.\nQet tesrih beyan nêbi.",
        "no-null-revision": "Qandé \"$1\" zew rewizyono newe névıraziya.",
        "badtitle": "Sernameyo xırabın",
        "badtitletext": "Sernameyê pela ke şıma waşt, nêvêrd, vengo ya zi zıwano miyanêno ğelet gırêdaye ya zi sernameyê wiki.\nBeno ke, tede yew ya zi zêdê işareti estê ke sernameyan de nêxebetiyenê.",
        "virus-scanfailed": "cıgerayiş tamam nêbı (kod $1)",
        "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ê.",
+       "logging-out-notify": "Şıma yê abıriyenê, reca kem bıpawê",
        "logout-failed": "Enewke ronıştışo nêracneyêno:$1",
        "cannotlogoutnow-title": "Enewke ronıştışo nêracneyêno",
        "cannotlogoutnow-text": "Gurenayışê $1i de veciyayış mımkın niyo.",
        "botpasswords-label-appid": "Nameyê boti:",
        "botpasswords-label-create": "Vıraze",
        "botpasswords-label-update": "Rocane ke",
-       "botpasswords-label-cancel": "İbtal",
-       "botpasswords-label-delete": "Bestern",
+       "botpasswords-label-cancel": "Bıtexelne",
+       "botpasswords-label-delete": "Bestere",
        "botpasswords-label-resetpassword": "Parola raçarne",
        "botpasswords-label-grants": "İmtıyazê ravêrdeyi:",
        "botpasswords-label-grants-column": "Dayen",
        "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": "İbtal",
+       "resetpass-submit-cancel": "Bıtexelne",
        "resetpass-wrong-oldpass": "parolayo parola maqbul niyo.\nşıma ya parolaye xo vurnayo ya zi parolayo muwaqqat waşto.",
        "resetpass-recycled": "Parolaya şımaya newiye, wa paroloya şımaya verêne ra ciya bo.",
        "resetpass-temp-emailed": "E postaya rışyayê yubkoda şıma ronıştış akerdo.  Ronıştışi xo temammkerdışi rê yu parolaya newi lazım a",
        "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ê",
+       "rcfilters-allcontents-label": "Zerrek pêro",
+       "rcfilters-alldiscussions-label": "Werênayışi pero",
        "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",
        "rclistfrom": "$3 sehat $2 ra tepiya vurnayışanê neweyan bımotne",
        "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-legend": "Modelê zerreki bıvurne",
-       "changecontentmodel-title-label": "Sernameyê pele",
+       "changecontentmodel-title-label": "Sernameyê pele:",
        "changecontentmodel-current-label": "Mewcud zerrekê modeli:",
-       "changecontentmodel-model-label": "Modelê zerrekiyo newe",
+       "changecontentmodel-model-label": "Modelê zerrekiyo newe:",
        "changecontentmodel-reason-label": "Sebeb:",
        "changecontentmodel-submit": "Bıvırne",
        "changecontentmodel-success-title": "Modelê zerreki vurriya",
        "undelete-search-title": "Bıgeyre pelanê eserıtiyan",
        "undelete-search-box": "bıgêr pelê hewn a biyayeyani",
        "undelete-search-prefix": "pel ê ke pê ney destpêkenî, ramocın",
+       "undelete-search-full": "Zerreki ra serniya pele bımocne",
        "undelete-search-submit": "Cı geyre",
        "undelete-no-results": "Zerre arşîvê esterayîşî de peleyan match nibiyê.",
        "undelete-filename-mismatch": "Vurnayîşê ke pê wextê puli ye $1î nieşkenî biyare: nameyê dosyayî match nibeno",
        "sp-contributions-deleted": "iştırakê {{GENDER:$1|karberi}} esterdi",
        "sp-contributions-uploads": "Barkerdışi",
        "sp-contributions-logs": "qeydi",
-       "sp-contributions-talk": "vaten",
+       "sp-contributions-talk": "werênayış",
        "sp-contributions-userrights": "idareyê heqanê {{GENDER:$1|karberan}}",
        "sp-contributions-blocked-notice": "Eno karber/ena karbere emanet blokekerdeyo/blokekerdiya.\nCıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:",
        "sp-contributions-blocked-notice-anon": "Eno adresê IPi bloke biyo.\nCıkewtışo tewr peyêno ke bloke biyo, cêr seba referansi belikerdeyo:",
        "sp-contributions-newonly": "Tenya vurnayışanê pelevıraştışi bımocne",
        "sp-contributions-hideminor": "Vurriyayışanê werdiyan bınımne",
        "sp-contributions-submit": "Cı geyre",
-       "whatlinkshere": "Gırey na perer",
+       "whatlinkshere": "Çı tiyayi rê gıre beno",
        "whatlinkshere-title": "Wesiqe da \"$1\" rê gıre dayen perri",
        "whatlinkshere-page": "Pele:",
        "linkshere": "Pera <strong>$2</strong> rê gıre dayen perri",
        "ipb-confirm": "Bloke kerdışi tesdik ke",
        "ipb-sitewide": "Site hemi de",
        "ipb-partial": "Qısmi",
+       "ipb-partial-help": "Peli ya zi namey cayanê spesifikan",
        "ipb-pages-label": "Peli",
        "ipb-namespaces-label": "Heruna nameyan",
        "badipaddress": "Adresê IPî raşt niyo",
        "ipb-blocklist": "Blokî ke hama estê ey bivîne",
        "ipb-blocklist-contribs": "İştirakê {{GENDER:$1|$1}}`i",
        "ipb-blocklist-duration-left": "$1 vet",
+       "block-actions": "Hereketê bloqey :",
        "block-expiry": "Qedyayış:",
+       "block-options": "Weçinıtış dekerê:",
        "block-prevent-edit": "Vurnayış",
        "block-reason": "Sebeb:",
        "block-target": "Nameyê karberi ya zi adresa eposteyi",
        "unblocked": "[[User:$1|$1]] blok biyo",
        "unblocked-range": "Blokey $1'i wederya",
        "unblocked-id": "Blokê $1î wedariyayo",
+       "unblocked-ip": "[[Special:Contributions/$1|$1]] bloqe wedarnayo.",
        "blocklist": "Karberê kılitbiyayey",
        "autoblocklist": "Blokeyê otomatiki",
        "autoblocklist-submit": "Cı geyre",
        "autoblocklist-legend": "Lista blokanê otomatikan",
        "autoblocklist-localblocks": "{{PLURAL:$1|otoblokoyo lokal|otoblokeyê lokali}}",
+       "autoblocklist-total-autoblocks": "Amardışê pêroyê autobloqey:$1",
        "autoblocklist-otherblocks": "{{PLURAL:$1|otobloqeyo bin|otobloqeyê bini}}",
        "ipblocklist": "Karberê kılitbiyayey",
        "ipblocklist-legend": "Karberê kılit biyayey bıvin",
        "javascripttest-qunit-intro": "Mediawiki.org dı [dokumanê $1] bıvinê.",
        "tooltip-pt-userpage": "Pela {{GENDER:|şımaya karberi}}",
        "tooltip-pt-anonuserpage": "pelê karberê IPyi",
-       "tooltip-pt-mytalk": "Pera {{GENDER:|şıma}}ya vaten",
+       "tooltip-pt-mytalk": "Pera {{GENDER:|şıma}}y vateni",
        "tooltip-pt-anontalk": "'''Ena adresa IP ra vurnayışa sero qal bıqerê'''",
        "tooltip-pt-preferences": "Tercihê {{GENDER:|şıma}}",
        "tooltip-pt-watchlist": "Listey peranê ke to gırotê seyr kerdış",
        "watchlistedit-clear-legend": "Lista serykerdışê pak kerê",
        "watchlistedit-clear-explain": "Listeya serykerdış da şıma dı sernamey pêro besteryay",
        "watchlistedit-clear-titles": "Sernamey:",
+       "watchlistedit-clear-done": "Lista seyrkerdişê şıma biya pak",
        "watchlisttools-clear": "Lista serykerdışê xo pak kı",
        "watchlisttools-view": "Vurnayışanê elaqedaran bıvêne",
        "watchlisttools-edit": "Lista seyrkerdışi bıvêne û bıvurne",
        "permanentlink": "Gıreyo daimi",
        "permanentlink-revid": "Revizyonê IDyi",
        "permanentlink-submit": "Şo revizyoni",
+       "newsection": "Leteyo newe",
+       "newsection-page": "Etiketê pele",
+       "newsection-submit": "Ravêr pele",
        "dberr-problems": "Mayê muxulêm! Ena sita dı newke xırabiya teknik esta.",
        "dberr-again": "Dı-rê deqiqeyi vınde û heni bar ke.",
        "dberr-info": "(Erzmelumati ra xızmetkari nêreseno: $1)",
index 82826c5..f5af2c5 100644 (file)
        "createaccountmail": "Use a temporary random password and send it to the specified email address",
        "createaccountmail-help": "Can be used to create account for another person without learning the password.",
        "createacct-realname": "Real name (optional)",
-       "createacct-reason": "Reason",
+       "createacct-reason": "Reason (publicly logged)",
        "createacct-reason-ph": "Why you are creating another account",
        "createacct-reason-help": "Message shown in the account creation log",
        "createacct-imgcaptcha-help": "",
index 3eea40f..23871cd 100644 (file)
                        "Servien"
                ]
        },
-       "exif-imagewidth": "Wiedte",
-       "exif-imagelength": "Heugte",
+       "exif-imagewidth": "Wydde",
+       "exif-imagelength": "Höygde",
        "exif-bitspersample": "Bits per komponent",
-       "exif-compression": "Kompressiemethode",
-       "exif-photometricinterpretation": "Beeldpuntsamenstelling",
-       "exif-orientation": "Oriëntasie",
-       "exif-samplesperpixel": "Antal compenenten",
-       "exif-planarconfiguration": "Gegevensstructuur",
+       "exif-compression": "Kompressymetode",
+       "exif-photometricinterpretation": "Bealdpuntsamenstelling",
+       "exif-orientation": "Orientaty",
+       "exif-samplesperpixel": "Antal kompenenten",
+       "exif-planarconfiguration": "Gegeavensstruktuur",
        "exif-ycbcrsubsampling": "Subsamplingsverhouwige van Y tot C",
-       "exif-ycbcrpositioning": "Y- en C-posisionering",
-       "exif-xresolution": "Horizontale resolusie",
-       "exif-yresolution": "Verticale resolusie",
-       "exif-stripoffsets": "Lokasie aofbeeldingsgegevens",
-       "exif-rowsperstrip": "Riejen per strip",
-       "exif-stripbytecounts": "Bytes per ekomprimeerden strip",
-       "exif-jpeginterchangeformat": "Aofstaand tot JPEG SOI",
-       "exif-jpeginterchangeformatlength": "Bytes van JPEG-gegevens",
+       "exif-ycbcrpositioning": "Y- en C-positionering",
+       "exif-xresolution": "Horizontale resoluty",
+       "exif-yresolution": "Vertikale resoluty",
+       "exif-stripoffsets": "Lokaty afbealdingsgegeavens",
+       "exif-rowsperstrip": "Rygen per strip",
+       "exif-stripbytecounts": "Bytes per komprimeerde strip",
+       "exif-jpeginterchangeformat": "Afstand tot JPEG SOI",
+       "exif-jpeginterchangeformatlength": "Bytes van JPEG-gegeavens",
        "exif-whitepoint": "Witpuntchromaticiteit",
-       "exif-primarychromaticities": "Chromasiteit van primaere kleuren",
-       "exif-ycbcrcoefficients": "Transformasiematrixkoëfficiënten veur de kleurruumte",
-       "exif-referenceblackwhite": "Referensieweerden veur zwart/wit",
-       "exif-datetime": "Tiedstip van digitalisasie",
-       "exif-imagedescription": "Aofbeeldingnaam",
+       "exif-primarychromaticities": "Chromaciteit van primäre klören",
+       "exif-ycbcrcoefficients": "Transformatymatrixkoefficienten vöär de klöörruumde",
+       "exif-referenceblackwhite": "Referensywaerden vöär swart/wit",
+       "exif-datetime": "Tydstip van digitalisaty",
+       "exif-imagedescription": "Afbealdingname",
        "exif-make": "Kameramark",
        "exif-model": "Kameramodel",
-       "exif-software": "Programmatuur die gebruukt wörden",
-       "exif-artist": "Eschreven deur",
-       "exif-copyright": "Auteursrechtenhouwer",
-       "exif-exifversion": "Exif-versie",
-       "exif-flashpixversion": "Ondersteunden Flashpix-versie",
-       "exif-colorspace": "Kleurruumte",
-       "exif-componentsconfiguration": "Betekenisse van elk compenent",
-       "exif-compressedbitsperpixel": "Beeldkompressiemethode",
-       "exif-pixelxdimension": "Aofbeeldingsbreedte",
-       "exif-pixelydimension": "Aofbeeldingsheugte",
-       "exif-usercomment": "Opmarkingen",
-       "exif-relatedsoundfile": "Biebeheurend geluudsbestaand",
-       "exif-datetimeoriginal": "Tiedstip van datagenerasie",
-       "exif-datetimedigitized": "Tiedstip van digitalisasie",
-       "exif-subsectime": "Subseconden tiedstip bestaandswieziging",
-       "exif-subsectimeoriginal": "Subseconden tiedstip datagenerasie",
-       "exif-subsectimedigitized": "Subseconden tiedstip digitalisasie",
-       "exif-exposuretime": "Belochtingstied",
+       "exif-software": "Programmatuur dee bruked wördt",
+       "exif-artist": "Autöör",
+       "exif-copyright": "Autöörsrechtenholder",
+       "exif-exifversion": "Exif-versy",
+       "exif-flashpixversion": "Understöände Flashpix-versy",
+       "exif-colorspace": "Klöörruumde",
+       "exif-componentsconfiguration": "Beteykenisse van elk kompenent",
+       "exif-compressedbitsperpixel": "Bealdkompressymetode",
+       "exif-pixelxdimension": "Afbealdingsbreydde",
+       "exif-pixelydimension": "Afbealdingshöygde",
+       "exif-usercomment": "Upmarkingen",
+       "exif-relatedsoundfile": "Bybehöyrend gelüüdsbestand",
+       "exif-datetimeoriginal": "Tydstip van datageneraty",
+       "exif-datetimedigitized": "Tydstip van digitalisaty",
+       "exif-subsectime": "Subsekonden tydstip bestandswysiging",
+       "exif-subsectimeoriginal": "Subsekonden tydstip datageneraty",
+       "exif-subsectimedigitized": "Subsekonden tydstip digitalisaty",
+       "exif-exposuretime": "Belichtingstyd",
        "exif-exposuretime-format": "$1 sek ($2)",
        "exif-fnumber": "F-getal",
-       "exif-exposureprogram": "Belochtingsprogramma",
-       "exif-spectralsensitivity": "Spektrale geveuligheid",
-       "exif-isospeedratings": "ISO-weerde.",
+       "exif-exposureprogram": "Belichtingsprogramma",
+       "exif-spectralsensitivity": "Spektrale gevöligheid",
+       "exif-isospeedratings": "ISO-waerde",
        "exif-shutterspeedvalue": "Slutersnelheid in APEX",
        "exif-aperturevalue": "Diafragma in APEX",
        "exif-brightnessvalue": "Helderheid in APEX",
-       "exif-exposurebiasvalue": "Belochtingscompensasie",
-       "exif-maxaperturevalue": "Maximale diafragmaweerde van de lenze",
-       "exif-subjectdistance": "Aofstaand tot onderwarp",
-       "exif-meteringmode": "Methode lochmeting",
-       "exif-lightsource": "Lochbron",
+       "exif-exposurebiasvalue": "Belichtingskompensaty",
+       "exif-maxaperturevalue": "Maksimale diafragma-oapening",
+       "exif-subjectdistance": "Afstand tot underwarp",
+       "exif-meteringmode": "Metode lichtmeating",
+       "exif-lightsource": "Lichtbron",
        "exif-flash": "Flitser",
-       "exif-focallength": "Braandpuntofstand",
-       "exif-subjectarea": "Objektruumte",
-       "exif-flashenergy": "Flitserstarkte",
-       "exif-focalplanexresolution": "X-resolusie van CDD",
-       "exif-focalplaneyresolution": "Y-resolusie van CCD",
-       "exif-focalplaneresolutionunit": "Eenheid CCD-resolusie",
-       "exif-subjectlocation": "Objeklokasie",
-       "exif-exposureindex": "Belochtingsindex",
-       "exif-sensingmethod": "Meetmethode",
-       "exif-filesource": "Bestaandsnaam op de hardeschieve",
-       "exif-scenetype": "Scènetype",
-       "exif-customrendered": "An-epassen beeldbewarking",
-       "exif-exposuremode": "Belochtingsinstelling",
+       "exif-focallength": "Brandpuntafstand",
+       "exif-subjectarea": "Objektruumde",
+       "exif-flashenergy": "Flitserstarkde",
+       "exif-focalplanexresolution": "Sensorresoluty horizontaal",
+       "exif-focalplaneyresolution": "Sensorresoluty vertikaal",
+       "exif-focalplaneresolutionunit": "Eynheid CCD-resoluty",
+       "exif-subjectlocation": "Objektlokaty",
+       "exif-exposureindex": "Belichtingsindeks",
+       "exif-sensingmethod": "Meatmetode",
+       "exif-filesource": "Bestandsbron",
+       "exif-scenetype": "Scenetype",
+       "exif-customrendered": "Anpasde bealdverwarking",
+       "exif-exposuremode": "Belichtingsinstelling",
        "exif-whitebalance": "Witbalans",
-       "exif-digitalzoomratio": "Digitale zoomfactor",
-       "exif-focallengthin35mmfilm": "Braandpuntaofstaand (35mm-equivalent)",
-       "exif-scenecapturetype": "Soort opname",
-       "exif-gaincontrol": "Piekbeheersing",
+       "exif-digitalzoomratio": "Digitale zoomfaktor",
+       "exif-focallengthin35mmfilm": "Brandpuntafstand (35mm-ekwivalent)",
+       "exif-scenecapturetype": "Soort upnåme",
+       "exif-gaincontrol": "Pykbeheyrsing",
        "exif-contrast": "Kontrast",
-       "exif-saturation": "Verzaojiging",
-       "exif-sharpness": "Scharpte",
-       "exif-devicesettingdescription": "Umschrieving apperaotinstellingen",
-       "exif-subjectdistancerange": "Aofstaandskategorie",
-       "exif-imageuniqueid": "Unieke ID-aofbeelding",
-       "exif-gpsversionid": "GPS-versienummer",
-       "exif-gpslatituderef": "Noorder- of zujerbreedte",
-       "exif-gpslatitude": "Breedte",
-       "exif-gpslongituderef": "Ooster- of westerlengte",
-       "exif-gpslongitude": "Lengtegraod",
-       "exif-gpsaltituderef": "Heugtereferensie",
-       "exif-gpsaltitude": "Heugte",
-       "exif-gpstimestamp": "GPS-tied (atoomklokke)",
-       "exif-gpssatellites": "Satellieten die gebruuk bin veur de meting",
-       "exif-gpsstatus": "Ontvangerstaotus",
-       "exif-gpsmeasuremode": "Meetmodus",
-       "exif-gpsdop": "Meetpresisie",
-       "exif-gpsspeedref": "Snelheidseenheid",
-       "exif-gpsspeed": "Snelheid van GPS-ontvanger",
-       "exif-gpstrackref": "Referensie veur bewegingsrichting",
-       "exif-gpstrack": "Bewegingsrichting",
-       "exif-gpsimgdirectionref": "Referensie veur aofbeeldingsrichting",
-       "exif-gpsimgdirection": "Aofbeeldingsrichtige",
-       "exif-gpsmapdatum": "Geodetiese onderzeuksgegevens die gebruukt bin",
-       "exif-gpsdestlatituderef": "Referensie veur breedtegraod tot bestemming",
-       "exif-gpsdestlatitude": "Breedtegraod bestemming",
-       "exif-gpsdestlongituderef": "Referensie veur lengtegraod bestemming",
-       "exif-gpsdestlongitude": "Lengtegraod bestemming",
-       "exif-gpsdestbearingref": "Referensie veur richting naor bestemming",
-       "exif-gpsdestbearing": "Richting naor bestemming",
-       "exif-gpsdestdistanceref": "Referensie veur aofstaand tot bestemming",
-       "exif-gpsdestdistance": "Aofstaand tot bestemming",
-       "exif-gpsprocessingmethod": "Naam van de GPS-verwarkingsmethode",
-       "exif-gpsareainformation": "Naam van t GPS-gebied",
-       "exif-gpsdatestamp": "GPS-daotum",
-       "exif-gpsdifferential": "Differensiële GPS-korreksie",
-       "exif-jpegfilecomment": "Opmarking bie JPEG-bestaand",
+       "exif-saturation": "Versådiging",
+       "exif-sharpness": "Skarpde",
+       "exif-devicesettingdescription": "Ümskryving apparaatinstellingen",
+       "exif-subjectdistancerange": "Bereik objektafstand",
+       "exif-imageuniqueid": "Unike ID-afbealding",
+       "exif-gpsversionid": "GPS-versynummer",
+       "exif-gpslatituderef": "Noorder- of süderbreydde",
+       "exif-gpslatitude": "Breydde",
+       "exif-gpslongituderef": "Ouster- of westerlängde",
+       "exif-gpslongitude": "Längdegråd",
+       "exif-gpsaltituderef": "Höygdereferensy",
+       "exif-gpsaltitude": "Höygde",
+       "exif-gpstimestamp": "GPS-tyd (atoomklokke)",
+       "exif-gpssatellites": "Satelliten dee bruked binnet vöär de meating",
+       "exif-gpsstatus": "Untvangerståtus",
+       "exif-gpsmeasuremode": "Meatmodus",
+       "exif-gpsdop": "Meatprecisy",
+       "exif-gpsspeedref": "Snelheid eynheid",
+       "exif-gpsspeed": "Snelheid van GPS-untvanger",
+       "exif-gpstrackref": "Referensy vöär beweagingsrichting",
+       "exif-gpstrack": "Beweagingsrichting",
+       "exif-gpsimgdirectionref": "Referensy vöär afbealdingsrichting",
+       "exif-gpsimgdirection": "Afbealdingsrichting",
+       "exif-gpsmapdatum": "Geodetiske undersööksgegeavens dee bruked binnet",
+       "exif-gpsdestlatituderef": "Referensy vöär breyddegråd tot bestemming",
+       "exif-gpsdestlatitude": "Breyddegråd bestemming",
+       "exif-gpsdestlongituderef": "Referensy vöär längdegråd bestemming",
+       "exif-gpsdestlongitude": "Längdegråd bestemming",
+       "exif-gpsdestbearingref": "Referensy vöär richting nå bestemming",
+       "exif-gpsdestbearing": "Richting nå bestemming",
+       "exif-gpsdestdistanceref": "Referensy vöär afstand tot bestemming",
+       "exif-gpsdestdistance": "Afstand tot bestemming",
+       "exif-gpsprocessingmethod": "Name van de GPS-verwarkingsmetode",
+       "exif-gpsareainformation": "Name van et GPS-gebeed",
+       "exif-gpsdatestamp": "GPS-dåtum",
+       "exif-gpsdifferential": "Differentiele GPS-korrekty",
+       "exif-jpegfilecomment": "Upmarking by JPEG-bestand",
        "exif-keywords": "Trefwoorden",
-       "exif-worldregioncreated": "Regio in de wereld waor de aofbeelding emaakt is",
-       "exif-countrycreated": "Laand waor de aofbeelding emaakt is",
-       "exif-countrycodecreated": "Kode veur t laand waor de aofbeelding emaakt is",
-       "exif-provinceorstatecreated": "Provinsie of staot waor de aofbeelding emaakt is",
-       "exif-citycreated": "Plaotse waor de aofbeelding emaakt is",
-       "exif-sublocationcreated": "Wiek van de plaotse waor de aofbeelding emaakt is",
-       "exif-worldregiondest": "Weeregeven wereldregio",
-       "exif-countrydest": "Weeregeven laand",
-       "exif-countrycodedest": "Kode veur t weeregeven laand",
-       "exif-provinceorstatedest": "Weeregeven provinsie of staot",
-       "exif-citydest": "Weeregeven plaotse",
-       "exif-sublocationdest": "Weeregeven wiek in plaotse",
-       "exif-objectname": "Korte naam",
-       "exif-specialinstructions": "Spesiale instruksies",
-       "exif-headline": "Kopjen",
-       "exif-credit": "Krediet/leverancier",
+       "exif-worldregioncreated": "Regio in de wearld wår de afbealding maked is",
+       "exif-countrycreated": "Land wår de afbealding maked is",
+       "exif-countrycodecreated": "Kode vöär et land wår de afbealding maked is",
+       "exif-provinceorstatecreated": "Provinsy of ståt wår de afbealding maked is",
+       "exif-citycreated": "Plaatse wår de afbealding maked is",
+       "exif-sublocationcreated": "Wyk van de plaatse wår de afbealding maked is",
+       "exif-worldregiondest": "Weadergeaven wearldregio",
+       "exif-countrydest": "Weadergeaven land",
+       "exif-countrycodedest": "Kode vöär et weadergeaven land",
+       "exif-provinceorstatedest": "Weadergeaven provinsy of ståt",
+       "exif-citydest": "Weadergeaven plaatse",
+       "exif-sublocationdest": "Weadergeaven wyk in plaatse",
+       "exif-objectname": "Korte name",
+       "exif-specialinstructions": "Speciale instruktys",
+       "exif-headline": "Upskrivt",
+       "exif-credit": "Kredit/leaveransyr",
        "exif-source": "Bron",
-       "exif-editstatus": "Bewarkingsstaotus van de aofbeelding",
-       "exif-urgency": "Urgensie",
-       "exif-fixtureidentifier": "Groepsnaam",
-       "exif-locationdest": "Weeregeven lokasie",
+       "exif-editstatus": "Bewarkingsståtus van de afbealding",
+       "exif-urgency": "Urgensy",
+       "exif-fixtureidentifier": "Grupsname",
+       "exif-locationdest": "Weadergeaven lokaty",
        "exif-locationdestcode": "Kode veur de weeregeven lokasie",
        "exif-objectcycle": "Tied van de dag waor de media veur bedoeld is",
        "exif-contact": "Kontaktgegevens",
index 44e3c94..fdc959c 100644 (file)
        "exif-scenetype-1": "Директно фотографисана слика",
        "exif-customrendered-0": "Нормалан процес",
        "exif-customrendered-1": "Нестандардан процес",
+       "exif-customrendered-2": "HDR (није оригинално сачувано)",
+       "exif-customrendered-3": "HDR (оригинал сачуван)",
+       "exif-customrendered-4": "Оригинал (за HDR)",
+       "exif-customrendered-6": "Панорама",
+       "exif-customrendered-7": "HDR портрет",
+       "exif-customrendered-8": "Портрет",
        "exif-exposuremode-0": "Аутоматска експозиција",
        "exif-exposuremode-1": "Ручна експозиција",
        "exif-exposuremode-2": "Аутоматски са задатим распоном",
index 2e6ccf1..2cd71f0 100644 (file)
        "badretype": "Les mots de passe que vous avez saisis ne correspondent pas.",
        "usernameinprogress": "Une création de compte pour ce nom d’utilisateur est déjà en cours.\nVeuillez patienter.",
        "userexists": "Le nom d’utilisateur saisi est déjà utilisé.\nVeuillez choisir un nom différent.",
-       "createacct-normalization": "Votre nom d’utilisateur sera modifié en « $2 » à cause de restrictions techniques.",
+       "createacct-normalization": "Votre nom d’utilisateur sera modifié en « $2 » à cause de restrictions techniques.",
        "loginerror": "Erreur de connexion",
        "createacct-error": "Erreur lors de la création du compte",
        "createaccounterror": "Impossible de créer le compte : $1",
        "noname": "Vous n’avez pas saisi un nom d’utilisateur valide.",
        "loginsuccesstitle": "Connecté",
        "loginsuccess": "<strong>Vous êtes maintenant connecté{{GENDER:$1||e|(e)}} à {{SITENAME}} en tant que « $1 ».</strong>",
-       "nosuchuser": "L’utilisateur « $1 » n’existe pas.\nLes noms d’utilisateur sont sensibles à la casse.\nVérifiez l’orthographe ou [[Special:CreateAccount|créez un nouveau compte]].",
+       "nosuchuser": "L’utilisateur « $1 » n’existe pas.\nLes noms d’utilisateur sont sensibles à la casse.\nVérifiez l’orthographe ou [[Special:CreateAccount|créez un nouveau compte]].",
        "nosuchusershort": "Il n’y a pas de contributeur avec le nom « $1 ».\nVeuillez vérifier l’orthographe.",
        "nouserspecified": "Vous devez saisir un nom d’utilisateur.",
        "login-userblocked": "{{GENDER:$1|Cet utilisateur|Cette utilisatrice}} est bloqué{{GENDER:$1||e}}. La connexion n’est pas autorisée.",
        "password-login-forbidden": "L’utilisation de ce nom d’utilisateur ou de ce mot de passe a été interdite.",
        "mailmypassword": "Réinitialiser le mot de passe",
        "passwordremindertitle": "Nouveau mot de passe temporaire pour {{SITENAME}}",
-       "passwordremindertext": "Quelqu’un (depuis l’adresse IP $1) a demandé un nouveau mot de passe\npour {{SITENAME}} ($4). Un mot de passe temporaire pour l’utilisateur\n« $2 » a été créé et défini comme « $3 ». Si c’était bien votre intention,\nvous devrez vous connecter et choisir un nouveau mot de passe.\nVotre mot de passe temporaire expirera dans $5 jour{{PLURAL:$5||s}}.\n\nSi vous n’êtes pas l’auteur de cette demande ou si vous vous avez retrouvé votre\nmot de passe et ne souhaitez plus en changer, vous pouvez ignorer ce message et\ncontinuer à utiliser votre ancien mot de passe.",
+       "passwordremindertext": "Quelqu’un (depuis l’adresse IP $1) a demandé un nouveau mot de passe\npour {{SITENAME}} ($4). Un mot de passe temporaire pour l’utilisateur\n« $2 » a été créé et défini comme « $3 ». Si c’était bien votre intention,\nvous devrez vous connecter et choisir un nouveau mot de passe.\nVotre mot de passe temporaire expirera dans $5 jour{{PLURAL:$5||s}}.\n\nSi vous n’êtes pas l’auteur de cette demande ou si vous vous avez retrouvé votre\nmot de passe et ne souhaitez plus en changer, vous pouvez ignorer ce message et\ncontinuer à utiliser votre ancien mot de passe.",
        "noemail": "Aucune adresse de courriel n’a été enregistrée pour l’utilisat{{GENDER:$1|eur|rice}} « $1 ».",
        "noemailcreate": "Vous devez fournir une adresse de courriel valide",
        "passwordsent": "Un nouveau mot de passe a été envoyé à l’adresse de courriel de l’utilisat{{GENDER:$1|eur|rice}} « $1 ».\nVeuillez vous reconnecter après l’avoir reçu.",
        "botpasswords-help-grants": "Les autorisations permettent d’accéder aux droits déjà accordés à votre compte utilisateur. Activer une autorisation ici ne fournit l’accès à aucun droit que votre compte utilisateur n’aurait pas par ailleurs. Voyez le [[Special:ListGrants|tableau des autorisations]] pour plus d’informations.",
        "botpasswords-label-grants-column": "Accordé",
        "botpasswords-bad-appid": "Le nom de robot « $1 » n’est pas valide.",
-       "botpasswords-insert-failed": "Échec de l’ajout du nom de robot « $1 ». A-t-il déjà été ajouté ?",
-       "botpasswords-update-failed": "Échec à la mise à jour du nom de robot « $1 ». A-t-il déjà été supprimé ?",
+       "botpasswords-insert-failed": "Échec de l’ajout du nom de robot « $1 ». A-t-il déjà été ajouté ?",
+       "botpasswords-update-failed": "Échec à la mise à jour du nom de robot « $1 ». A-t-il déjà été supprimé ?",
        "botpasswords-created-title": "Mot de passe de robots créé",
        "botpasswords-created-body": "Le mot de passe pour le robot « $1 » de l’{{GENDER:$2|utilisateur|utilisatrice}} « $2 » a été créé.",
        "botpasswords-updated-title": "Mot de passe de robots mis à jour",
        "botpasswords-newpassword": "Le nouveau mot de passe pour se connecter à <strong>$1</strong> est <strong>$2</strong>. <em>Veuillez l’enregistrer pour y faire référence ultérieurement.</em><br> (Pour les anciens robots qui nécessitent que le nom fourni à la connexion soit le même que le nom d'utilisateur éventuel, vous pouvez aussi utiliser  <strong>$3</strong> comme nom d'utilisateur et <strong>$4</strong> comme mot de passe).",
        "botpasswords-no-provider": "BotPasswordsSessionProvider n’est pas disponible.",
        "botpasswords-restriction-failed": "Les restrictions de mot de passe de robots empêchent cette connexion.",
-       "botpasswords-invalid-name": "Le nom d’utilisateur spécifié ne contient pas de séparateur de mot de passe de robots (« $1 »).",
-       "botpasswords-not-exist": "L’utilisat{{GENDER:$1|eur|rice}} « $1 » n’a pas de mot de passe de robot nommé « $2 ».",
-       "botpasswords-needs-reset": "Le mot de passe du robot nommé « $2 » de l’utilisat{{GENDER:$1|eur|rice}} « $1 » doit être réinitialisé.",
+       "botpasswords-invalid-name": "Le nom d’utilisateur spécifié ne contient pas de séparateur de mot de passe de robots (« $1 »).",
+       "botpasswords-not-exist": "L’utilisat{{GENDER:$1|eur|rice}} « $1 » n’a pas de mot de passe de robot nommé « $2 ».",
+       "botpasswords-needs-reset": "Le mot de passe du robot nommé « $2 » de l’utilisat{{GENDER:$1|eur|rice}} « $1 » doit être réinitialisé.",
        "botpasswords-locked": "Vous ne pouvez pas vous connecter avec un mot de passe de robot, car votre compte est bloqué.",
        "resetpass_forbidden": "Les mots de passe ne peuvent pas être changés",
        "resetpass_forbidden-reason": "Les mots de passe ne peuvent pas être modifiés : $1",
        "resetpass-temp-password": "Mot de passe temporaire :",
        "resetpass-abort-generic": "La modification du mot de passe a été annulée par une extension.",
        "resetpass-expired": "Votre mot de passe a expiré. Veuillez en fournir un nouveau pour vous connecter.",
-       "resetpass-expired-soft": "Votre mot de passe a expiré, et doit être modifié. Veuillez en choisir un nouveau maintenant ou cliquer sur « {{int:authprovider-resetpass-skip-label}} » pour le faire plus tard.",
+       "resetpass-expired-soft": "Votre mot de passe a expiré, et doit être modifié. Veuillez en choisir un nouveau maintenant ou cliquer sur « {{int:authprovider-resetpass-skip-label}} » pour le faire plus tard.",
        "resetpass-validity": "Votre mot de passe est non valide : $1\n\nVeuillez entrer un nouveau mot de passe pour vous connecter.",
-       "resetpass-validity-soft": "Votre mot de passe n’est pas valide : $1\n\nVeuillez choisir un nouveau mot de passe maintenant, ou cliquez sur « {{int:authprovider-resetpass-skip-label}} » pour le modifier plus tard.",
+       "resetpass-validity-soft": "Votre mot de passe n’est pas valide : $1\n\nVeuillez choisir un nouveau mot de passe maintenant, ou cliquez sur « {{int:authprovider-resetpass-skip-label}} » pour le modifier plus tard.",
        "passwordreset": "Réinitialisation du mot de passe",
        "passwordreset-text-one": "Remplissez ce formulaire pour réinitialiser votre mot de passe.",
        "passwordreset-text-many": "{{PLURAL:$1|Remplissez un des champs pour recevoir un mot de passe temporaire par courriel.}}",
        "preview": "Prévisualisation",
        "showpreview": "Prévisualiser",
        "showdiff": "Voir les modifications",
-       "blankarticle": "<strong>Attention :</strong> la page que vous créez est vide.\nSi vous cliquez de nouveau sur « $1 », la page sera créée sans aucun contenu.",
+       "blankarticle": "<strong>Attention :</strong> la page que vous créez est vide.\nSi vous cliquez de nouveau sur « $1 », la page sera créée sans aucun contenu.",
        "anoneditwarning": "<strong>Attention :</strong> vous n’êtes pas connecté(e). Votre adresse IP sera visible de tout le monde si vous faites des modifications. Si vous <strong>[$1 vous connectez]</strong> ou <strong>[$2 créez un compte]</strong>, vos modifications seront attribuées à votre propre nom d’utilisateur(rice) et vous aurez d’autres avantages.",
        "anonpreviewwarning": "<em>Vous n’êtes pas connecté(e). Sauvegarder enregistrera votre adresse IP dans l’historique des modifications de la page.</em>",
        "missingsummary": "<strong>Rappel :</strong> vous n’avez pas encore fourni le résumé de votre modification.\nSi vous cliquez de nouveau sur le bouton « $1 », vos modifications seront sauvegardées sans résumé.",
-       "selfredirect": "<strong>Attention :</strong> vous êtes en train de rediriger la page vers elle-même.\nIl se peut que vous ayez spécifié la mauvaise cible pour la redirection, ou que vous modifiez peut-être la mauvaise page.\nSi vous cliquez de nouveau sur « $1 », la redirection sera tout de même créée.",
+       "selfredirect": "<strong>Attention :</strong> vous êtes en train de rediriger la page vers elle-même.\nIl se peut que vous ayez spécifié la mauvaise cible pour la redirection, ou que vous modifiez peut-être la mauvaise page.\nSi vous cliquez de nouveau sur « $1 », la redirection sera tout de même créée.",
        "missingcommenttext": "Veuillez entrer un commentaire.",
-       "missingcommentheader": "<strong>Rappel :</strong> vous n’avez pas fourni de sujet pour ce commentaire.\nSi vous cliquez de nouveau sur « $1 », votre modification sera enregistrée sans sujet.",
+       "missingcommentheader": "<strong>Rappel :</strong> vous n’avez pas fourni de sujet pour ce commentaire.\nSi vous cliquez de nouveau sur « $1 », votre modification sera enregistrée sans sujet.",
        "summary-preview": "Aperçu du résumé de modification :",
        "subject-preview": "Aperçu du sujet :",
        "previewerrortext": "Une erreur s’est produite lors de la tentative de prévisualisation de vos modifications.",
        "blockedtitle": "L’utilisateur est bloqué.",
        "blocked-email-user": "<strong>Votre nom d’utilisateur a été bloqué pour l’envoi de courriels. Vous pouvez toujours modifier d’autres pages sur ce wiki.</strong> Vous pouvez voir tous les détails du blocage sur [[Special:MyContributions|contributions du compte]].\n\nCe blocage a été fait par $1.\n\nLe motif fourni est <em>$2</em>.\n\n* Début du blocage : $8\n* Expiration du blocage : $6\n* Cible souhaitée du blocage : $7\n* ID du blocage nº $5",
        "blockedtext-partial": "<strong>Votre nom d’utilisateur ou votre adresse IP a été bloqué pour effectuer des modifications sur cette page. Vous pouvez toujours modifier d’autres pages sur ce wiki.</strong> Vous pouvez voir tous les détails sur ce blocage sur [[Special:MyContributions|contributions du compte]].\n\nLe blocage a été effectué par $1.\n\nLe motif fourni est <em>$2</em>.\n\n* Début du blocage : $8\n* Expiration du blocage : $6\n* Cible souhaitée du blocage : $7\n* ID du blocage nº $5",
-       "blockedtext": "<strong>Votre compte utilisateur ou votre adresse IP a été bloqué.</strong>\n\nLe blocage a été effectué par $1.\nLa raison invoquée est la suivante : <em>$2</em>.\n\n* Début du blocage : $8\n* Expiration du blocage : $6\n* Compte bloqué : $7.\n\nVous pouvez contacter $1 ou un autre [[{{MediaWiki:Grouppage-sysop}}|administrateur]] pour en discuter.\nVous ne pouvez utiliser la fonction « {{int:emailuser}} » que si une adresse de courriel valide est spécifiée dans vos [[Special:Preferences|préférences]] et que si cette fonctionnalité ne vous a pas été bloquée.\nVotre adresse IP actuelle est $3 et votre identifiant de blocage est $5.\nVeuillez inclure tous les détails ci-dessus dans chacune des requêtes que vous ferez.",
-       "autoblockedtext": "Votre adresse IP a été bloquée automatiquement car elle a été utilisée par un autre utilisateur, lui-même bloqué par $1.\nLa raison invoquée est :\n\n: <em>$2</em>.\n\n* Début du blocage : $8\n* Expiration du blocage : $6\n* Compte bloqué : $7\n\nVous pouvez contacter $1 ou l’un des autres [[{{MediaWiki:Grouppage-sysop}}|administrateurs]] pour discuter de ce blocage.\n\nNotez que vous ne pourrez utiliser la fonctionnalité « {{int:emailuser}} » que si vous avez une adresse de courriel validée dans vos [[Special:Preferences|préférences]] et que cette fonctionnalité ne vous a pas été désactivée.\n\nVotre adresse IP actuelle est $3, et le numéro de blocage est $5.\nVeuillez inclure tous les détails ci-dessus dans chacune des requêtes que vous ferez.",
+       "blockedtext": "<strong>Votre compte utilisateur ou votre adresse IP a été bloqué.</strong>\n\nLe blocage a été effectué par $1.\nLa raison invoquée est la suivante : <em>$2</em>.\n\n* Début du blocage : $8\n* Expiration du blocage : $6\n* Compte bloqué : $7.\n\nVous pouvez contacter $1 ou un autre [[{{MediaWiki:Grouppage-sysop}}|administrateur]] pour en discuter.\nVous ne pouvez utiliser la fonction « {{int:emailuser}} » que si une adresse de courriel valide est spécifiée dans vos [[Special:Preferences|préférences]] et que si cette fonctionnalité ne vous a pas été bloquée.\nVotre adresse IP actuelle est $3 et votre identifiant de blocage est $5.\nVeuillez inclure tous les détails ci-dessus dans chacune des requêtes que vous ferez.",
+       "autoblockedtext": "Votre adresse IP a été bloquée automatiquement car elle a été utilisée par un autre utilisateur, lui-même bloqué par $1.\nLa raison invoquée est :\n\n: <em>$2</em>.\n\n* Début du blocage : $8\n* Expiration du blocage : $6\n* Compte bloqué : $7\n\nVous pouvez contacter $1 ou l’un des autres [[{{MediaWiki:Grouppage-sysop}}|administrateurs]] pour discuter de ce blocage.\n\nNotez que vous ne pourrez utiliser la fonctionnalité « {{int:emailuser}} » que si vous avez une adresse de courriel validée dans vos [[Special:Preferences|préférences]] et que cette fonctionnalité ne vous a pas été désactivée.\n\nVotre adresse IP actuelle est $3, et le numéro de blocage est $5.\nVeuillez inclure tous les détails ci-dessus dans chacune des requêtes que vous ferez.",
        "systemblockedtext": "Votre nom d'utilisateur ou votre adresse IP ont été bloqués automatiquement par MediaWiki.\nLa raison donnée est la suivante:\n\n: <em>$2</em>.\n\n* Le début du blocage: $8\n* Expiration du délai de blocage: $6\n* Elément concerné: $7\n\nVotre adresse IP actuelle est $3.\nVeuillez inclure tous les détails ci-dessus dans chacune des requêtes que vous ferez.",
        "blockednoreason": "aucune raison donnée",
        "blockedtext-composite": "<strong>Votre nom d'utilisateur ou votre adresse IP ont été bloqués.</strong>\n\nLa raison invoquée est :\n\n: <em>$2</em>.\n\n* Début du blocage : $8\n* Expiration du blocage le plus long : $6\n* $5\n\nVotre adresse IP actuelle est $3.\nVeuillez inclure tous les détails ci-dessus dans chaque demande que vous ferez.",
        "anontalkpagetext": "----\n<em>Vous êtes sur la page de discussion d’un utilisateur anonyme qui n’a pas encore créé de compte ou qui n’en utilise pas</em>.\nPour cette raison, nous devons utiliser son adresse IP pour l'identifier.\nUne telle adresse IP peut être partagée par plusieurs utilisateurs.\nSi vous êtes un{{GENDER:||e|}} utilisat{{GENDER:|eur|rice|eur}} anonyme et si vous constatez que des commentaires qui ne vous concernent pas vous ont été adressés, vous pouvez [[Special:CreateAccount|créer un compte]] ou [[Special:UserLogin|vous connecter]] afin d’éviter toute confusion future avec d’autres contributeurs anonymes.",
        "noarticletext": "Il n’y a pour l’instant aucun texte sur cette page.\nVous pouvez [[Special:Search/{{PAGENAME}}|lancer une recherche sur ce titre]] dans les autres pages,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} rechercher dans les opérations liées]\nou [{{fullurl:{{FULLPAGENAME}}|action=edit}} créer cette page]</span>.",
        "noarticletext-nopermission": "Il n’y a pour l’instant aucun texte sur cette page.\nVous pouvez [[Special:Search/{{PAGENAME}}|faire une recherche sur ce titre]] dans les autres pages,\nou <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} rechercher dans les journaux associés]</span>, mais vous n’avez pas la permission de créer cette page.",
-       "missing-revision": "La révision nº $1 de la page intitulée « {{FULLPAGENAME}} » n’existe pas.\n\nCela survient en général en suivant un lien historique désuet vers une page qui a été supprimée.\nVous pouvez trouver plus de détails dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des suppressions].",
+       "missing-revision": "La révision nº $1 de la page intitulée « {{FULLPAGENAME}} » n’existe pas.\n\nCela survient en général en suivant un lien historique désuet vers une page qui a été supprimée.\nVous pouvez trouver plus de détails dans le [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} journal des suppressions].",
        "userpage-userdoesnotexist": "Le compte utilisateur « <nowiki>$1</nowiki> » n’est pas enregistré. Veuillez vérifier que vous voulez créer cette page.",
        "userpage-userdoesnotexist-view": "Le compte utilisateur « $1 » n'est pas enregistré.",
        "blocked-notice-logextract": "Cet utilisateur est actuellement bloqué.\nLa dernière entrée du journal des blocages est affichée ci-dessous pour référence :",
        "clearyourcache": "<strong>Note :</strong> après avoir enregistré vos modifications, il se peut que vous deviez forcer le rechargement complet du cache de votre navigateur pour voir les changements.\n* <strong>Firefox / Safari :</strong> maintenez la touche <em>Maj</em> (<em>Shift</em>) en cliquant sur le bouton <em>Actualiser</em> ou pressez <em>Ctrl-F5</em> ou <em>Ctrl-R</em> (<em>⌘-R</em> sur un Mac).\n* <strong>Google Chrome :</strong> appuyez sur <em>Ctrl-Maj-R</em> (<em>⌘-Shift-R</em> sur un Mac).\n* <strong>Internet Explorer :</strong> maintenez la touche <em>Ctrl</em> en cliquant sur le bouton <em>Actualiser</em> ou pressez <em>Ctrl-F5</em>.\n* <strong>Opera :</strong> allez dans <em>Menu → Settings</em> (<em>Opera → Préférences</em> sur un Mac) et ensuite à <em>Confidentialité et sécurité → Effacer les données d’exploration → Images et fichiers en cache</em>.",
        "usercssyoucanpreview": "<strong>Astuce :</strong> utilisez le bouton « {{int:showpreview}} » pour tester votre nouvelle feuille CSS avant de l’enregistrer.",
-       "userjsonyoucanpreview": "<strong>Conseil :</strong> utilisez le bouton « {{int:showpreview}} » pour tester votre nouveau JSON avant enregistrement.",
+       "userjsonyoucanpreview": "<strong>Conseil :</strong> utilisez le bouton « {{int:showpreview}} » pour tester votre nouveau JSON avant enregistrement.",
        "userjsyoucanpreview": "<strong>Astuce :</strong> utilisez le bouton « {{int:showpreview}} » pour tester votre nouvelle feuille JavaScript avant de l’enregistrer.",
        "usercsspreview": "<strong>Rappelez-vous que vous ne faites que prévisualiser votre propre feuille CSS.\nElle n’a pas encore été enregistrée !</strong>",
        "userjsonpreview": "<strong>Rappelez-vous que vous êtes seulement en train de tester/voir un aperçu de votre configuration utilisateur JSON.\nElle n’a pas encore été enregistrée !</strong>",
        "sitecsspreview": "<strong>Rappelez-vous que vous ne faites que prévisualiser cette feuille de style. \nElle n’a pas encore été enregistrée !</strong>",
        "sitejsonpreview": "<strong>Souvenez-vous que vous ne faites que regarder un aperçu de cette configuration JSON.\nElle n’a pas encore été enregistrée !</strong>",
        "sitejspreview": "<strong>Rappelez-vous que vous ne faites que prévisualiser ce code JavaScript.\nIl n’a pas encore été enregistré !</strong>",
-       "userinvalidconfigtitle": "<strong>Attention :</strong> il n’existe pas d’habillage « $1 ».\nLes pages personnelles avec extensions .css, .json et .js utilisent des titres en minuscules, par exemple <tt>{{ns:user}}:Foo/vector.css</tt> et non <tt>{{ns:user}}:Foo/Vector.css</tt>.",
+       "userinvalidconfigtitle": "<strong>Attention :</strong> il n’existe pas d’habillage « $1 ».\nLes pages personnelles avec extensions .css, .json et .js utilisent des titres en minuscules, par exemple <tt>{{ns:user}}:Foo/vector.css</tt> et non <tt>{{ns:user}}:Foo/Vector.css</tt>.",
        "updated": "(Mis à jour)",
        "note": "<strong>Note :</strong>",
        "previewnote": "<strong>Rappelez-vous que ce n’est qu’une prévisualisation.</strong>\nVos modifications n’ont pas encore été enregistrées !",
        "editingsection": "Modification de $1 (section)",
        "editingcomment": "Modification de $1 (nouvelle section)",
        "editconflict": "Conflit de modification : $1",
-       "explainconflict": "Cette page a été changée après que vous avez commencé à la modifier.\nLa zone de modification supérieure contient le texte tel qu’il est actuellement enregistré dans la base de données.\nVos modifications apparaissent dans la zone de modification inférieure.\nVous allez devoir fusionner vos modifications dans le texte existant.\n<strong>Seul</strong> le texte de la zone supérieure sera sauvegardé si vous cliquez sur « $1 ».",
+       "explainconflict": "Cette page a été changée après que vous avez commencé à la modifier.\nLa zone de modification supérieure contient le texte tel qu’il est actuellement enregistré dans la base de données.\nVos modifications apparaissent dans la zone de modification inférieure.\nVous allez devoir fusionner vos modifications dans le texte existant.\n<strong>Seul</strong> le texte de la zone supérieure sera sauvegardé si vous cliquez sur « $1 ».",
        "yourtext": "Votre texte",
        "storedversion": "La version enregistrée",
        "editingold": "<strong>Attention : vous êtes en train de modifier une ancienne version de cette page.</strong>\nSi vous la publiez, toutes les modifications effectuées depuis cette version seront perdues.",
        "defaultmessagetext": "Message par défaut",
        "content-failed-to-parse": "Échec de l’analyse syntaxique du contenu de $2 pour le modèle $1 : $3",
        "invalid-content-data": "Données du contenu non valides",
-       "content-not-allowed-here": "Le contenu « $1 » n’est pas autorisé sur la page [[:$2]] dans l’emplacement « $3 »",
-       "editwarning-warning": "Quitter cette page vous fera perdre toutes les modifications que vous avez faites.\nSi vous êtes connecté{{GENDER:||e}}, vous pouvez désactiver cet avertissement dans la section « {{int:prefs-editing}} » de vos préférences.",
+       "content-not-allowed-here": "Le contenu « $1 » n’est pas autorisé sur la page [[:$2]] dans l’emplacement « $3 »",
+       "editwarning-warning": "Quitter cette page vous fera perdre toutes les modifications que vous avez faites.\nSi vous êtes connecté{{GENDER:||e}}, vous pouvez désactiver cet avertissement dans la section « {{int:prefs-editing}} » de vos préférences.",
        "editpage-invalidcontentmodel-title": "Modèle de contenu non pris en charge",
-       "editpage-invalidcontentmodel-text": "Le modèle de contenu « $1 » n’est pas pris en charge.",
+       "editpage-invalidcontentmodel-text": "Le modèle de contenu « $1 » n’est pas pris en charge.",
        "editpage-notsupportedcontentformat-title": "Format de contenu non pris en charge",
        "editpage-notsupportedcontentformat-text": "Le format de contenu $1 n’est pas pris en charge par le modèle de contenu $2 .",
        "slot-name-main": "Principal",
        "unsupported-content-diff2": "Les diffs entre les modèles de contenu $1 et $2 ne sont pas supportés sur ce wiki.",
        "deprecated-self-close-category": "Pages utilisant des balises HTML auto-fermantes non valides",
        "deprecated-self-close-category-desc": "La page contient des balises HTML auto-fermantes non valides, comme <code>&lt;b/></code> ou <code>&lt;span/></code>. Le comportement de celles-ci changera prochainement pour être en accord avec la spécification HTML5, donc leur utilisation dans le wikitexte est désormais désuète.",
-       "duplicate-args-warning": "<strong>Avertissement :</strong> [[:$1]] appelle [[:$2]] avec plus d'une valeur pour le paramètre « $3 ». Seule la dernière valeur fournie sera utilisée.",
+       "duplicate-args-warning": "<strong>Avertissement :</strong> [[:$1]] appelle [[:$2]] avec plus d'une valeur pour le paramètre « $3 ». Seule la dernière valeur fournie sera utilisée.",
        "duplicate-args-category": "Pages utilisant des arguments dupliqués dans les appels de modèle",
        "duplicate-args-category-desc": "La page contient des appels de modèle qui utilisent des arguments dupliqués, comme <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> ou <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "<strong>Attention :</strong> cette page contient de trop nombreux appels à des fonctions coûteuses de l’analyseur syntaxique.\n\nIl devrait y avoir moins de $2 appel{{PLURAL:$2||s}}, alors qu’il y en a maintenant $1.",
        "revdelete-nooldid-title": "Version cible non valide",
        "revdelete-nooldid-text": "Vous n’avez pas précisé de révision(s) cible(s) pour cette fonction, ou la révision spécifiée n’existe pas, ou bien vous tentez de masquer la révision actuelle.",
        "revdelete-no-file": "Le fichier spécifié n'existe pas.",
-       "revdelete-show-file-confirm": "Êtes-vous sûr{{GENDER:||e}} de vouloir voir la révision supprimée du fichier « <nowiki>$1</nowiki> » datant du $2 à $3 ?",
+       "revdelete-show-file-confirm": "Êtes-vous sûr{{GENDER:||e}} de vouloir voir la révision supprimée du fichier « <nowiki>$1</nowiki> » datant du $2 à $3 ?",
        "revdelete-show-file-submit": "Oui",
        "revdelete-selected-text": "{{PLURAL:$1|Révision sélectionnée|Révisions sélectionnées}} de [[:$2]] :",
        "revdelete-selected-file": "{{PLURAL:$1|Version de fichier sélectionnée|Versions de fichier sélectionnées}} de [[:$2]] :",
index 3cb79ca..7d6edd0 100644 (file)
        "nstab-template": "Clowan",
        "nstab-help": "Duillag choonee",
        "nstab-category": "Ronney",
+       "mainpage-nstab": "Ard-ghuillag",
        "nosuchaction": "Cha nel lheid yn obbyr ayn",
        "nosuchspecialpage": "Cha nel y duillag er lheh shoh ayn",
        "error": "Marranys",
        "virus-scanfailed": "vrish y ronsaght (coad $1)",
        "virus-unknownscanner": "ronseyder noi-veerys gyn enney",
        "yourname": "Dt'ennym ymmydeyr:",
+       "userlogin-yourname": "Ennym ymmydeyr",
+       "userlogin-yourname-ph": "Screeu ennym ymmydeyr",
        "yourpassword": "Fockle yn arrey:",
+       "userlogin-yourpassword": "Fockle yn arrey",
        "yourpasswordagain": "Aascreeu dt'ockle arrey:",
        "login": "Log stiagh",
        "nav-login-createaccount": "Log stiagh / croo coontys",
        "notloggedin": "Cha nel ou loggit stiagh",
        "createaccount": "Croo coontys",
        "createaccountmail": "Croo fockle arrey shallidagh gyn tort as cur eh da'n post-l reiht ayd",
+       "createacct-benefit-body2": "{{PLURAL:$1|duillag|duillagyn}}",
        "loginerror": "Marranys loggal stiagh",
        "createaccounterror": "Cha nod shin croo coontys: $1",
        "noname": "Cha honree uss ennym ymmydeyr fondagh.",
        "note": "'''Note:'''",
        "previewnote": "'''Cooinnee nagh vel agh roie-haishbynys eh shoh;\ncha nel dty chaghlaaghyn sauailt foast!'''",
        "editing": "Reaghey $1",
+       "creating": "Croo $1",
        "editingsection": "Reaghey $1 (rheynn)",
        "editingcomment": "Reaghey $1 (meer noa)",
        "yourtext": "Dty heks",
        "action-browsearchive": "duillagyn scrysst y ronsaghey",
        "action-undelete": "yn duillag shoh y yee-scryssey",
        "nchanges": "$1 {{PLURAL:$1|caghlaa|chaghlaa|chaghlaa|caghlaaghyn}}",
+       "enhancedrc-history": "skeeal",
        "recentchanges": "Caghlaaghyn s'noa",
        "recentchanges-legend": "Reihyssyn da ny caghlaaghyn s'noa",
        "recentchanges-summary": "Shirr ny caghlaaghyn s'noa da'n wiki er y duillag shoh.",
        "specialpages-group-other": "Duillagyn elley er lheh",
        "specialpages-group-login": "Log stiagh / croo coontys",
        "specialpages-group-users": "Ymmydeyryn as kiartyn",
+       "tags-active-yes": "Ta",
+       "tags-active-no": "Cha nel",
        "tags-edit": "reaghey",
        "rightsnone": "(veg)",
        "searchsuggest-search": "Ronsaghey",
index 37106e5..15645e3 100644 (file)
@@ -99,6 +99,7 @@
        "tog-useeditwarning": "Figyelmeztessen, ha szerkesztéskor a módosítások mentése nélkül akarom elhagyni a lapot",
        "tog-prefershttps": "Mindig biztonságos kapcsolatot használjon, amikor be vagyok jelentkezve",
        "tog-showrollbackconfirmation": "Megerősítés kérése, amikor a visszaállítás linkre kattintasz",
+       "tog-requireemail": "E-mail-cím megkövetelése jelszó-visszaállításkor",
        "underline-always": "mindig",
        "underline-never": "soha",
        "underline-default": "Felület és böngésző alapértelmezése szerint",
        "prefs-help-email": "Az e-mail-cím megadása nem kötelező, de szükséges új jelszó kéréséhez, ha elfelejtenéd a meglévőt.",
        "prefs-help-email-others": "Úgy is dönthetsz, hogy lehetővé teszed mások számára, hogy kapcsolatba lépjenek veled a felhasználói vagy vitalapodon keresztül, anélkül, hogy fel kellene fedned a személyazonosságodat.",
        "prefs-help-email-required": "Meg kell adnod az e-mail címedet.",
+       "prefs-help-requireemail": "Amennyiben bekapcsolod, csak akkor küldünk jelszó-visszaállító e-mailt, ha az ezt kérő személy helyesen megadja a fiók szerkesztői nevét és e-mail-címét.",
        "prefs-info": "Alapinformációk",
        "prefs-i18n": "Nyelvi beállítások",
        "prefs-signature": "Aláírás",
        "ipblocklist-legend": "Blokkolt felhasználó keresése",
        "blocklist-userblocks": "Fiókblokkolások elrejtése",
        "blocklist-tempblocks": "Ideiglenes blokkolások elrejtése",
+       "blocklist-indefblocks": "Végtelen blokkolások elrejtése",
        "blocklist-addressblocks": "IP-címek blokkolásainak elrejtése",
        "blocklist-type": "Típus:",
        "blocklist-type-opt-all": "Összes",
index d8070a0..8c805bf 100644 (file)
        "block-expiry": "Expiro:",
        "block-options": "Plusa agadi:",
        "block-reason": "Motivo:",
+       "block-target": "Nomo od IP-adreso dil uzero:",
        "unblockip": "Desblokusar uzero",
        "unblockiptext": "Uzez la sequanta formularo por restaurar la skribo-aceso ad IP-adreso qua blokusesis antee.",
        "ipusubmit": "Desblokusar",
        "newimages": "Galerio di nova arkivi",
        "imagelisttext": "Infre esas listo di '''$1''' {{PLURAL:$1|arkivo|arkivi}} rangizita $2.",
        "newimages-legend": "Filtrilo",
+       "newimages-user": "IP-adreso o nomo dil uzero",
        "ilsubmit": "Serchar",
        "bydate": "per dato",
        "minutes": "{{PLURAL:$1|$1 minuto|$1 minuti}}",
index 8bd7bc0..759861d 100644 (file)
        "tog-useeditwarning": "変更を保存せずに編集画面から離れようとしたら警告",
        "tog-prefershttps": "ログインする際、常に安全な接続を使用する",
        "tog-showrollbackconfirmation": "巻き戻しリンクをクリックした際に確認画面を表示する",
+       "tog-requireemail": "パスワードの変更にはメーフアドレスが必要です",
        "underline-always": "常に付ける",
        "underline-never": "常に付けない",
        "underline-default": "外装またはブラウザーの既定値を使用",
        "nocreate-loggedin": "新しいページを作成する権限がありません。",
        "sectioneditnotsupported-title": "節単位編集はサポートされていません",
        "sectioneditnotsupported-text": "このページでは節単位編集はサポートされません。",
+       "modeleditnotsupported-title": "編集はサポートしていません",
+       "modeleditnotsupported-text": "コンテンツモデル$1の編集はサポートしていません",
        "permissionserrors": "権限エラー",
        "permissionserrorstext": "あなたにはこの操作を行う権限がありません。{{PLURAL:$1|理由}}は以下の通りです:",
        "permissionserrorstext-withaction": "あなたには「$2」を行う権限がありません。{{PLURAL:$1|理由}}は以下の通りです:",
index 9a6d447..f31034c 100644 (file)
        "tog-numberheadings": "Wènèhi angkaning sesirah kanthi otomatis",
        "tog-editondblclick": "Besut kaca sarana ngeklik pindho",
        "tog-editsectiononrightclick": "Idinaké mbesut pérangan sarana klik tengen ing sesirahing pérangan",
-       "tog-watchcreations": "Wuwuh kaca gawéanku lan barkas unggahanku menyang pawawanganku",
-       "tog-watchdefault": "Wuwuh kaca lan barkas besutanku menyang pawawanganku",
-       "tog-watchmoves": "Wuwuh kaca lan barkas lih-lihanku menyang pawawanganku",
-       "tog-watchdeletion": "Wuwuh kaca lan barkas busakanku menyang pawawanganku",
-       "tog-watchuploads": "Wuwuh barkas anyar unggahanku menyang pawawanganku",
+       "tog-watchcreations": "Wuwuh kaca gawéanku lan berkas unggahanku menyang pawawanganku",
+       "tog-watchdefault": "Wuwuh kaca lan berkas besutanku menyang pawawanganku",
+       "tog-watchmoves": "Wuwuh kaca lan berkas lih-lihanku menyang pawawanganku",
+       "tog-watchdeletion": "Wuwuh kaca lan berkas busekanku menyang pawawanganku",
+       "tog-watchuploads": "Wuwuh berkas anyar unggahanku menyang pawawanganku",
        "tog-watchrollback": "Wuwuh kaca kang dakpulihaké menyang pawawanganku",
        "tog-minordefault": "Tengeri kabèh besutan minangka besutan cilik sacara baku",
        "tog-previewontop": "Deleng pratuduh sadurungé mbesut kothak",
        "tog-previewonfirst": "Delelng pratuduh nalika mbesut pisanan",
-       "tog-enotifwatchlistpages": "Kirimi aku layang-èl yèn ana kaca utawa barkas ing pawawanganku kang diowahi",
+       "tog-enotifwatchlistpages": "Kirimi aku layang-èl yèn ana kaca utawa berkas ing pawawanganku kang ingowahan",
        "tog-enotifusertalkpages": "Kirimi aku layang-èl yèn kaca parembuganku ana kang ngowahi",
-       "tog-enotifminoredits": "Uga kirimi aku layang-èl yèn ana besutan cilik ing kaca lan barkas",
+       "tog-enotifminoredits": "Uga kirimi aku layang-èl yèn ana besutan cilik ing kaca lan berkas",
        "tog-enotifrevealaddr": "Tuduhaké alamat layang-èlku ing layang wara-wara",
        "tog-shownumberswatching": "Tuduhaké cacah wong kang ngawasi",
        "tog-oldsig": "Tandha tanganmu kang wis cumawis:",
        "category-subcat-count-limited": "Kategori iki duwé {{PLURAL:$1|anak kategori|$1 anak kategori}} kaya ngisor iki.",
        "category-article-count": "{{PLURAL:$2|Kategori iki mung ngandhut kaca ngisor iki.|{{PLURAL:$1|Kaca|$1 kaca}} ngisor iki ana ing kategori iki saka gunggung $2 kaca.}}",
        "category-article-count-limited": "Kategori iki ngemu {{PLURAL:$1|kaca|$1 kaca}} kang kapacak ing isor iki.",
-       "category-file-count": "{{PLURAL:$2|Kategori iki mung isi barkas iki.|{{PLURAL:$1|Barkas|$1 barkas}} iki ana sajeroning kategori iki saka $2 gunggungé.}}",
-       "category-file-count-limited": "Kategori iki duwé {{PLURAL:$1|barkas|$1 barkas}} kang kapacak ing isor iki.",
+       "category-file-count": "{{PLURAL:$2|Kategori iki mung isi berkas iki.|{{PLURAL:$1|Berkas|$1 berkas}} iki ana ing jero kategori iki saka $2 gunggungé.}}",
+       "category-file-count-limited": "Kategori iki duwé {{PLURAL:$1|berkas|$1 berkas}} kang kapacak ing sor iki.",
        "listingcontinuesabbrev": "samb.",
        "index-category": "Kaca kaindhèks",
        "noindex-category": "Kaca ora kaindhèks",
-       "broken-file-category": "Kaca mawa pranala barkas rusak",
+       "broken-file-category": "Kaca mawa pranala berkas rusak",
        "categoryviewer-pagedlinks": "($1) ($2)",
        "category-header-numerals": "$1–$2",
        "about": "Bab",
        "history_short": "Sajarah",
        "history_small": "sajarah",
        "updatedmarker": "wis dianyari kawit tekaku mréné pungkasan",
-       "printableversion": "Vèrsi céthak",
+       "printableversion": "Vèrsi cithak",
        "permalink": "Pranala permanèn",
        "print": "Cithak",
        "view": "Deleng",
        "tool-link-userrights": "Owahi golongan {{GENDER:$1|panganggo}}",
        "tool-link-userrights-readonly": "Deleng golongan {{GENDER:$1|panganggo}}",
        "tool-link-emailuser": "Kirimi {{GENDER:$1|panganggo}} iki layang-é",
-       "imagepage": "Deleng kaca barkas",
+       "imagepage": "Deleng kaca berkas",
        "mediawikipage": "Deleng kaca layang",
        "templatepage": "Deleng kaca cithakan",
        "viewhelppage": "Deleng kaca pitulung",
        "portal-url": "Project:Garupa paguyuban",
        "privacy": "Niti privasi",
        "privacypage": "Project:Niti privasi",
-       "badaccess": "Aksès ora olèh",
+       "badaccess": "Masalah idin",
        "badaccess-group0": "Kowé ora kawogan ngayahi laku kang kojaluk.",
        "badaccess-groups": "Laku kang koarepi mung winates tumrap panganggo ing {{PLURAL:$2|golongan}}: $1.",
-       "versionrequired": "Dibutuhaké MediaWiki vèrsi $1",
+       "versionrequired": "Butuh MediaWiki vèrsi $1",
        "versionrequiredtext": "MediaWiki vèrsi $1 dibutuhaké kanggo nggunakaké kaca iki. Mangga mirsani [[Special:Version|kaca iki]]",
        "ok": "Oké",
        "pagetitle": "$1 - {{SITENAME}}",
        "youhavenewmessages": "{{PLURAL:$3|Kowé duwé}} $1 ($2).",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|Kowé duwé}} $1 saka {{PLURAL:$3|panganggo liya|$3 panganggo}} ($2).",
        "youhavenewmessagesmanyusers": "Kowé duwé $1 saka manéka panganggo ($2).",
-       "newmessageslinkplural": "{{PLURAL:$1|layang anyar|999=layang anyar}}",
+       "newmessageslinkplural": "{{PLURAL:$1|siji layang anyar|999=layang anyar}}",
        "newmessagesdifflinkplural": "{{PLURAL:$1|owahan|999=owahan}} pungkasan",
        "youhavenewmessagesmulti": "Kowé éntuk layang anyar ing $1",
        "editsection": "besut",
        "nstab-media": "Kaca médhia",
        "nstab-special": "Kaca mirunggan",
        "nstab-project": "Kaca proyèk",
-       "nstab-image": "Barkas",
+       "nstab-image": "Berkas",
        "nstab-mediawiki": "Layang",
        "nstab-template": "Cithakan",
        "nstab-help": "Kaca pitulung",
        "readonly_lag": "Database wis dikunci mawa otomatis sawetara database sékundhèr lagi nglakoni sinkronisasi mawa database utama",
        "internalerror": "Masalah njero",
        "internalerror_info": "Masalah njero: $1",
-       "filecopyerror": "Ora bisa nurun barkas \"$1\" dadi \"$2\".",
+       "filecopyerror": "Ora bisa nurun berkas \"$1\" dadi \"$2\".",
        "filerenameerror": "Ora bisa ngowahi saka \"$1\" dadi \"$2\".",
-       "filedeleteerror": "Ora bisa mbusek barkas \"$1\".",
+       "filedeleteerror": "Ora bisa mbusek berkas \"$1\".",
        "directorycreateerror": "Ora bisa nggawé dirèktori \"$1\".",
        "directoryreadonlyerror": "Pérangan \"$1\" mung kena diwaca.",
        "directorynotreadableerror": "Pérangan \"$1\" ora kena diwaca.",
-       "filenotfound": "Ora bisa nemu barkas \"$1\".",
+       "filenotfound": "Ora bisa nemu berkas \"$1\".",
        "unexpected": "Biji (''nilai'') ing njabaning jangkauan: \"$1\"=\"$2\".",
        "formerror": "Masalah: Ora bisa ngirim formulir",
        "badarticleerror": "Laku iki ora bisa kalakokaké ing kaca iki.",
-       "cannotdelete": "Kaca utawa barkas \"$1\" ora bisa kobusek.\nBokmanawa kaca utawa barkasé wis dibusek wong liya.",
+       "cannotdelete": "Kaca utawa berkas \"$1\" ora bisa kobusek.\nBokmanawa kaca utawa berkasé wis dibusek wong liya.",
        "cannotdelete-title": "Ora bisa mbusek kaca \"$1\"",
        "delete-hook-aborted": "Pambusakan dibatalaké déning ''hook''.\nOra ana alesané.",
        "no-null-revision": "Ora isa nggawe revisi 'null' anyar kanggo kaca \"$1\"",
        "customcssprotected": "Kowé ora kawogan mbesut kaca CSS iki amarga ngemu setèlan pribadi panganggo liya.",
        "customjsprotected": "Kowé ora kawogan mbesut kaca JavaScript iki amarga ngemu setèlan pribadi panganggo liya.",
        "mycustomcssprotected": "Sampèyan ora duwé idin kanggo ngowah kaca CSS iki.",
+       "mycustomjsonprotected": "Kowé ora kawogan mbesut kaca JSON iki.",
        "mycustomjsprotected": "Sampèyan ora duwé idin kanggo ngowah kaca JavaScript iki.",
        "myprivateinfoprotected": "Sampèyan ora duwé idin kanggo ngowah informasi privat sampèyan.",
        "mypreferencesprotected": "Sampèyan ora duwé idin kanggo ngowah preferensi sampèyan.",
        "ns-specialprotected": "Kaca mirunggan ora bisa dibesut.",
        "titleprotected": "Irah-irahan iki direksa ora olèh digawé déning [[User:$1|$1]].\nAlesané yaiku <em>$2</em>.",
-       "filereadonlyerror": "Ora bisa ndandani barkas \"$1\" amarga panyimpenan barkas \"$2\" mung bisa diwaca.\n\nPangurus sistem kang ngunci iku njlèntrèhaké: \"$3\".",
+       "filereadonlyerror": "Ora bisa ndandani berkas \"$1\" amarga panyimpenan berkas \"$2\" mung bisa kawaca.\n\nPangurus sistem kang nggembok iku wèwèh pawadan: \"$3\".",
        "invalidtitle": "Sesirah ora trep",
        "invalidtitle-knownnamespace": "Sesirah ora trep mawa mandhala aran \"$2\" lan tulisan \"$3\"",
        "invalidtitle-unknownnamespace": "Sesirah ora trep mawa angka $1 lan tulisan \"$2\" mandhala aran kang ora kaweruhan",
        "virus-scanfailed": "''Pemindaian'' utawa ''scan'' gagal (kode $1)",
        "virus-unknownscanner": "antivirus buhbuhan:",
        "logouttext": "<strong>Kowé wis metu log.</strong>\n\nTulung gatèkaké yèn sawenèh kaca bokmanawa bakal isih katon kaya déné yèn kowé isih mlebu log, kajaba kowé mbusek telihing panglurumu.",
+       "logging-out-notify": "Kowé metu log, entèni sadhéla.",
+       "logout-failed": "Saiki ora bisa metu log: $1",
        "cannotlogoutnow-title": "Ora bisa metu saiki",
        "cannotlogoutnow-text": "Mokal metu log nalika nganggo $1.",
        "welcomeuser": "Sugeng Rawuh, $1!",
        "nosuchuser": "Ora ana panganggo mawa jeneng \"$1\".\nJeneng panganggo iku sènsitif tumrap gedhé-ciliké huruf.\nJajan priksanen pangéjamu, utawa [[Special:CreateAccount|gawénen akun anyar]].",
        "nosuchusershort": "Ora ana panganggo mawa asma \"$1\". Coba dipriksa manèh pasang aksarané (éjaané).",
        "nouserspecified": "Kowé kudu ngisi jeneng panganggo.",
-       "login-userblocked": "Panganggo iki pinalangan. Ora kena mbelu.",
+       "login-userblocked": "Panganggo iki kapenggak. Ora kena mbelu.",
        "wrongpassword": "Jenang panganggo utawa tembung wadi kang koisèkaké salah.\nMangga jajal manèh.",
        "wrongpasswordempty": "Tembung wadi kosong.\nJajalen manèh.",
        "passwordtooshort": "Tembung sesinglon paling sethithik cacahé {{PLURAL:$1|1 aksara|$1 aksara}}.",
        "noemail": "Ora ana alamat layang-èl kang kacathet tumrap ing panganggo \"$1\".",
        "noemailcreate": "Kowé kudu mènèhi alamat layang-èl kang trep",
        "passwordsent": "Tembung wadi anyar wis kinirim menyang alamat layang-èl kang kadhaftar tumrap \"$1\". \nMangga mlebu log manèh sawisé kowé nampa iku.",
-       "blocked-mailpassword": "Alamat IP-mu kablokir saka mbesut. Kanggo ngéndhani laku salah-guna, ora kena nganggo pamulih tembung wadi saka alamat IP iki.",
+       "blocked-mailpassword": "Alamat IP-mu kapenggak saka mbesut. Kanggo ngéndhani laku salah-guna, ora kena nganggo pamulih tembung wadi saka alamat IP iki.",
        "eauthentsent": "Layang-èl konfirmasi wis kinirim menyang alamat layang-èl kang koisèkaké. Sadurungé ana layang-èl liyané kang kinirim menyang akun iku, kowé kudu nututi panuntun ing layang-èl iku saperlu ngonfirmasi yèn akun iku pancèn duwèmu.",
        "throttled-mailpassword": "Layang kanggo mbalèkaké tembung wadi wis dikirim sasuwené ing {{PLURAL:$1|jam|$1 jam}}.\nKanggo nyegah ananing tumindhak culika, namung sak layang kanggo mbalèkaké tembung wadi kang bakal dikirim sasuwéné ing {{PLURAL:$1|jam|$1 jam}}.",
        "mailerror": "Masalah pangirim layang: $1",
-       "acct_creation_throttle_hit": "Para neneka menyang wiki iki kang nganggo alamat IP-né panjenengan wis gawé {{PLURAL:$1|akun cacah 1|akun cacah $1}} sajeroné $2 pungkasan, kang cacahé nyandhak cacah maksimum kang diidinaké.\nTemahané, para neneka kang nganggo alamat IP iki ora bisa gawé akun manèh sauntara iki.",
-       "emailauthenticated": "Alamat layang-èlé panjenengan wis dikonfirmasi ing tanggal $2 pukul $3.",
-       "emailnotauthenticated": "Alamat layang-èlé panjenengan durung dikonfirmasi.\nLayang-èl ora bakal dikirim yèn gegayutan karo fitur-fitur iki.",
-       "noemailprefs": "Panjenengan kudu milih alamat e-mail supaya bisa nganggo fitur iki.",
-       "emailconfirmlink": "Ndhedhes (konfirmasi) alamat e-mail panjenengan",
+       "acct_creation_throttle_hit": "Para neneka menyang wiki iki kang nganggo alamat IP-mu wis gawé {{PLURAL:$1|akun cacah 1|akun cacah $1}} ing dalem $2 pungkasan, kang cacahé nyandhak cacah maksimum kang kaolèhaké.\nTemahané, para neneka kang nganggo alamat IP iki ora bisa gawé akun manèh sawatara wektu iki.",
+       "emailauthenticated": "Alamat layang èlèktronikmu wis kakonfirmasi ing tanggal $2 pukul $3.",
+       "emailnotauthenticated": "Alamat layang-èlèktronikmu durung kakonfirmasi.\nLayang Ã¨lèktronik ora bakal kakirim amarga gegayutan fitur-fitur ing sor iki.",
+       "noemailprefs": "Isi alamat layang èlèktronikmu ing pilalanmu supaya fitur-fitur iki murub.",
+       "emailconfirmlink": "Konfirmasi alamat layang èlèktronikmu",
        "invalidemailaddress": "Alamat e-mail iki ora bisa ditampa amarga formaté ora bener. Tulung lebokna alamat mawa format kang bener utawa kosongaké waé isèn mau.",
        "cannotchangeemail": "Alamat layang-èl akun ora bisa diowah ing wiki iki.",
        "emaildisabled": "Situs iki ora bisa ngirim layang èlèktronik.",
        "accountcreatedtext": "Akun panganggo [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|rembug]]) wis digawé.",
        "createaccount-title": "Gawé akun kanggo {{SITENAME}}",
        "createaccount-text": "Ana kang nggawé akun nganggo alamat layang-èlé panjenengan ing {{SITENAME}} ($4) kanthi aran \"$2\", mawa tembung wadi \"$3\".\nPanjenengan kudu mlebu log lan ngowahi tembung wadiné panjenengan saiki.\n\nPanjenengan kena nglirwakaké layang iki, manawa akun iki ginawé awit kaluputan.",
-       "login-throttled": "Panjenengan wis ping akèh njajal mlebu log.\nTulung nunggu dhisik $1 sadurungé njajal manèh.",
-       "login-abort-generic": "Panjenengan ora bisa mlebu log - Kawurungan",
-       "login-migrated-generic": "Akuné panjenengan wis dimigrasi, lan jeneng panganggoné wis ora ana manèh ing wiki iki.",
+       "login-throttled": "Kowé wis njajal mlebu log ping akèh.\nEntènana $1 sadurung njajal manèh.",
+       "login-abort-generic": "Kowé ora bisa mlebu log - Kawurungaké",
+       "login-migrated-generic": "Akunmu wis ingalihan, lan jeneng panganggomu wis ora ana manèh ing wiki iki.",
        "loginlanguagelabel": "Basa: $1",
-       "suspicious-userlogout": "Panjaluk panjenengan supaya metu ditolak amarga katoné panjlajah internt utawa proksi panyinggah.",
+       "suspicious-userlogout": "Panjalukmu supaya metu log tinulak amarga panjaluké kakirim saka pangluru kang rusak utawa proksi telih.",
        "createacct-another-realname-tip": "Jeneng asli ora kudu diisi.\nYèn diisi, jeneng asliné panjenengan bakal kanggo atribusi awit karyané panjenengan.",
        "pt-login": "Mlebu log",
        "pt-login-button": "Mlebu log",
        "resetpass-wrong-oldpass": "Tembung wadi saiki utawa sauntara ora trep.\nPanjengen bokmanawa wis ngganti tembung wadiné panjenengan utawa nyuwun tembung wadi sauntara kang anyar.",
        "resetpass-temp-password": "Tembung wadi sauntara:",
        "resetpass-abort-generic": "Ngowahi tembung wadi kawurungaké déning èkstènsi.",
+       "resetpass-expired": "Tembung wadimu wis kadaluwarsa. Setèl tembung wadi anyar saperlu mlebu log.",
        "passwordreset": "Balèni gawé tembung wadi",
        "passwordreset-text-one": "Isi formulir iki kanthi jangkep kanggo nampa tembung wadi sauntara lumantar layang-èl.",
        "passwordreset-text-many": "{{PLURAL:$1|Isi salah siji babagan ing ngisor iki supaya bisa nampa tembung wadi sauntara lumantar layang-èl.}}",
        "passwordreset-emailelement": "Jeneng panganggo: \n$1\n\nTembung wadi sauntara: \n$2",
        "passwordreset-emailsentemail": "Yèn layang èlèktronik iki nggayut akun panjenengan, layang kanggo salin tembung wadi bakal dikirim.",
        "passwordreset-emailsentusername": "Manawa ana alamat layang-èl kang ana gayutané karo jeneng panganggo iki, layang-èl kanggo nyetèl ulang tembung wadi bakal dikirim.",
+       "passwordreset-nocaller": "Panyeluk kudu kaisi",
+       "passwordreset-nosuchcaller": "Panyeluk ora ana: $1",
+       "passwordreset-invalidemail": "Alamat layang èlèktronik ora trep",
        "changeemail": "Owah utawa busak alamat layang-èl",
        "changeemail-header": "Isi formulir iki saperlu salin alamat layang-èl panjenengan. Manawa panjenengan péngin ngilangi gegayutané alamat layang-èl saka akuné panjenengan, kosongaké waé babagan layang-èl anyar nalika ngirim formuliré.",
        "changeemail-no-info": "Panjenengan kudu mlebu log kanggo ngaksès kaca iki langsung.",
        "nowiki_sample": "Isi nganggo tulisan tanpa format ing kéné",
        "nowiki_tip": "Aja nganggo format wiki",
        "image_sample": "Conto.jpg",
-       "image_tip": "Barkas sisipan",
+       "image_tip": "Berkas sisipan",
        "media_sample": "Conto.ogg",
-       "media_tip": "Pranala barkas",
+       "media_tip": "Pranala berkas",
        "sig_tip": "Tapak asmané panjenengan mawa tandha wektu",
        "hr_tip": "Garis horisontal",
        "summary": "Ringkesan:",
        "summary-preview": "Pratuduh ringkesan besutan:",
        "subject-preview": "Pratuduh jejer:",
        "previewerrortext": "Ana masalah nalika njajal mratuduhaké owahané panjenengan.",
-       "blockedtitle": "Panganggo kapalangan",
-       "blockedtext": "<b>Asma panganggo utawa alamat IP panjenengan diblokir.</b>\n\nBlokir iki kang nglakoni $1.\nAlesané <i>$2</i>.\n\n* Diblokir wiwit: $8\n* Kadaluwarsa pemblokiran ing: $6\n* Kang arep diblokir: $7\n\nPanjenengan bisa ngubungi $1 utawa [[{{MediaWiki:Grouppage-sysop}}|pangurus liyané]] kanggo ngomongaké prakara iki.\n\nPanjenengan ora bisa nggunakaké fitur 'Kirim layang é-mail panganggo iki' kejaba panjenengan wis nglebokaké alamat é-mail kang trep ing [[Special:Preferences|prèferènsi]] panjenengan.\n\nAlamat IP panjenengan iku $3, lan ID pamblokiran iku #$5.\nTulung kabèh informasi ing ndhuwur iki disertakaké ing saben pitakon panjenengan.",
+       "blockedtitle": "Panganggo kapenggak",
+       "blockedtext": "<strong>Aran panganggomu utawa alamat IP-mu kapenggak.</strong>\n\nKang menggak ya iku $1.\nDhedhasaré <i>$2</i>.\n\n* Kapenggak wiwit: $8\n* Kapenggak nganti: $6\n* Kang arep diblokir: $7\n\nPanjenengan bisa ngubungi $1 utawa [[{{MediaWiki:Grouppage-sysop}}|pangurus liyané]] kanggo ngomongaké prakara iki.\n\nPanjenengan ora bisa nggunakaké fitur 'Kirim layang é-mail panganggo iki' kejaba panjenengan wis nglebokaké alamat é-mail kang trep ing [[Special:Preferences|prèferènsi]] panjenengan.\n\nAlamat IP panjenengan iku $3, lan ID pamblokiran iku #$5.\nTulung kabèh informasi ing ndhuwur iki disertakaké ing saben pitakon panjenengan.",
        "autoblockedtext": "Alamat IP-né panjenangan wis otomatis diblokir amarga dienggo déning panganggo liyané, kang diblokir déning $1.\n\n:<em>$2</em>\n\n* Wiwit diblokir: $8\n* Rampung diblokir: $6\n* Kang diblokir: $7\n\nPanjenengan bisa ngubungi $1 utawa [[{{MediaWiki:Grouppage-sysop}}|pangurus]] liyané kanggo ngrembug blokirané.\n\nPanjenengan ora bisa nganggo fitur \"kirim layang-èl panganggo iki\" kajaba panjenengan wis ndhaftaraké alamat layang-èl kang trep ing [[Special:Preferences|pilalan panganggoné]] panjenengan lan panjenengan durung tau diblokir nalika nganggo iku.\n\nAlamat IP-né panjenengan kang saiki ya iku $3, lan ID blokirané ya iku $5. \nMangga wuwuhen kabèh rerincèn ing ndhuwur sajeroné samubarang pitakoné panjenengan.",
        "blockednoreason": "ora ana alesan kang diwènèhaké",
        "whitelistedittext": "Mangga $1 dhisik yèn arep mbesut kaca.",
        "missing-revision": "Révisi #$1 saka kaca aran \"{{FULLPAGENAME}}\" ora ana.\n\nIki biyasané kasababaké awit nututi pranala sajarah kang wis lawas saka kaca kang wis binusek.\nRerincèné bisa digolèki ing [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log besakan].",
        "userpage-userdoesnotexist": "Akun panganggo \"$1\" ora kadhaftar.\nMangga pesthèkaké dhisik yèn panjenengan péngin nggawé/mbesut kaca iki.",
        "userpage-userdoesnotexist-view": "Akun panganggo \"$1\" ora kadhaftar.",
-       "blocked-notice-logextract": "Panganggo iki saiki lagi diblokir.\nLog pamblokiran pungkasan dituduhaké ing ngisor iki minangka bahan rujukan:",
+       "blocked-notice-logextract": "Panganggo iki lagi kapenggak.\nÈntri log penggakan kang pungkasan cumawis ing sor iki minangka rujukan:",
        "clearyourcache": "<strong>Cathetan:</strong> Nalika rampung nyimpen, panjenengan kudu mbusek telihing pangluruné panjenengan supaya owahané katon.\n* <strong>Firefox / Safari:</strong> Pencèt <em>Shift</em> nalika ngeklik <em>Reload</em>, utawa pencèt <em>Ctrl-F5</em> utawa <em>Ctrl-R</em> (<em>⌘-R</em> ing Mac)\n* <strong>Google Chrome:</strong> Pencèt <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> ing Mac)\n* <strong>Internet Explorer:</strong> Pencèt <em>Ctrl</em> nalika ngeklik <em>Refresh</em>, utawa pencèt <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Menyang <em>Menu → Settings</em> (<em>Opera → Preferences</em> ing Mac) nuli menyang <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
        "usercssyoucanpreview": "'''Tips:''' Gunakna tombol \"{{int:showpreview}}\" kanggo ngetès CSS anyar panjenengan sadurungé disimpen.",
        "userjsyoucanpreview": "'''Tips:''' Gunakna tombol \"{{int:showpreview}}\" kanggo ngetès JavaScript anyar panjenengan sadurungé disimpen.",
        "copyrightwarning": "Tulung dipun-gatèkaké manawa kabèh sumbangsih utawa kontribusi kanggo {{SITENAME}} iku dianggep wis diluncuraké miturut $2 GNU (mangga priksanen $1 kanggo ditèlé).\nManawa panjenengan ora karsa manawa tulisan panjenengan bakal disunting karo disebar, aja didokok ing kéné.<br />\nPanjenengan uga janji manawa apa-apa kang katulis ing kéné, iku karyané panjenengan dhéwé, utawa disalin saka sumber bébas. '''AJA NDOKOK KARYA KANG DIREKSA DÉNING UNDHANG-UNDHANG HAK CIPTA TANPA IDIN!'''",
        "copyrightwarning2": "Mangga digatèkaké yèn kabèh kontribusi marang {{SITENAME}} bisa disunting, diowahi, utawa dibusek penyumbang liyané. Yèn panjenengan ora karsa yèn tulisan panjenengan bisa disunting wong liya, aja ngirim artikel panjenengan ing kéné.<br />Panjenengan uga janji yèn tulisan panjenengan iku kasil karya panjenengan dhéwé, utawa disalin saka sumber umum utawa sumber bébas liyané (mangga delengen $1 kanggo informasi sabanjuré). '''AJA NGIRIM KARYA KANG DIREKSA DÉNING UNDHANG-UNDHANG HAK CIPTA TANPA IDIN!'''",
        "longpageerror": "'''Masalah: Tèks kang panjenengan lebokaké dawané {{PLURAL:$1|sak kilobita|$1 kilobita}}, luwih dawa saka maksimal {{PLURAL:$2|sak kilobita|$2 kilobita}}.'''\nKang mangkono ora bisa kasimpen.",
-       "readonlywarning": "<strong>Pepéling: Basis dhatah lagi ginembok amarga lagi karukti, mula panjenengan saiki ora bisa nyimpen besutané panjenengan.</strong>\nPanjenengan bokmanawa arep nurun tulisané panjenengan ing barkas tèks lan nyimpen iku kanggo mengko.\n\nPangurus kang nggembok basis dhatahé mènèhi panjlèntrèh mengkéné: $1",
+       "readonlywarning": "<strong>Pepéling: Sasana dhatah lagi ginembok amarga lagi karukti, mula kowé saiki ora bisa nyimpen besutanmu.</strong>\nKowé bokmanawa arep nurun tulisanmu menyang berkas tulisan lan nyimpen iku kanggo mengko.\n\nPangurus sistem kang nggembok iku wèwèh pawadan: $1",
        "protectedpagewarning": "<strong>Pélik: Kaca iki wis direksa, mula mung panganggo mawa hak mirunggan pangurus kang bisa mbesut.</strong>\nÈntri log kang pungkasan ana ing ngisor iki minangka rujukan:",
        "semiprotectedpagewarning": "<strong>Cathetan:</strong> Kaca iki pinuju direksa, mula mung panganggo kang kadhaftar kang bisa mbesut.\nÈntri log pungkasan cumepak ana ing ngisor kanggo rujukan:",
        "cascadeprotectedwarning": "<strong>Pènget:</strong> Kaca iki wis direksa saéngga mung panganggo kanthi hak pangurus waé kang bisa mbesut amarga kaca iki katranklusi ing {{PLURAL:$1|kaca|kaca-kaca}} kang kareksa runut ngisor iki:",
        "edit-no-change": "Besutané panjenengan dilirwakaké amarga ora ana owahan apa-apa tumraping tèksé.",
        "postedit-confirmation-created": "Kaca wis kagawé.",
        "postedit-confirmation-restored": "Kacané wis kapulihaké.",
-       "postedit-confirmation-saved": "Besutané panjenengan wis kasimpen.",
-       "postedit-confirmation-published": "Besutané panjenengan wis kababar.",
+       "postedit-confirmation-saved": "Besutanmu wis kasimpen.",
+       "postedit-confirmation-published": "Besutanmu wis kababar.",
        "edit-already-exists": "Ora bisa nggawé kaca anyar.\nKacané wis ana.",
        "defaultmessagetext": "Tèks layang gawan",
        "content-failed-to-parse": "Gagal menjabarkan konten $2 untuk model $1: $3",
        "undo-norev": "Besutan iki ora bisa diwurungaké amarga wis ora ana utawa wis binusek.",
        "undo-summary": "Mbalèkaké owahan $1 déning [[Special:Contributions/$2|$2]] ([[User talk:$2|rembugan]])",
        "undo-summary-username-hidden": "Balèkaké owahan $1 déning panganggo kang didhelikaké",
-       "cantcreateaccount-text": "Saka alamat IP iki ('''$1''') ora diparengaké nggawé akun utawa kang. Kang mblokir utawa ora marengaké iku [[User:$3|$3]].\n\nAlesané miturut $3 yaiku ''$2''",
+       "cantcreateaccount-text": "Panggawéning akun saka alamat IP iki (<strong>$1</strong>) wis dipenggak [[User:$3|$3]].\n\nDhedhasaré pamenggak miturut $3 iku ''$2''",
        "cantcreateaccount-range-text": "Nggawe akun saka alamat IP \"$1\", kang kalebu IP panjenengan (<strong>$4</strong>), wis diblokir kaliyan [[User:$3|$3]].\n\nAlesan pamblokiran yaiku \"$2\"",
        "viewpagelogs": "Deleng cathetaning kaca iki",
        "nohistory": "Babading besutan kaca iki ora ana.",
        "revisiondelete": "Busak/wurung busak révisi",
        "revdelete-nooldid-title": "Révisi tujuan ora trep",
        "revdelete-nooldid-text": "Panjenengan durung mènèhi target revisi kanggo nglakoni fungsi iki.",
-       "revdelete-no-file": "Barkas kang panjenengan karsakaké ora ana.",
-       "revdelete-show-file-confirm": "Apa panjenengan yakin arep mriksa révisi kang kabusek saka barkas \"<nowiki>$1</nowiki>\" nalika $2 jam $3?",
+       "revdelete-no-file": "Berkas kang koarepi ora ana.",
+       "revdelete-show-file-confirm": "Apa kowé yakin arep mriksa révisi kang kabusek saka berkas \"<nowiki>$1</nowiki>\" nalika $2 pukul $3?",
        "revdelete-show-file-submit": "Iya",
        "logdelete-selected": "{{PLURAL:$1|Log kapilih|Log kapilih}} kanggo:",
        "revdelete-text-others": "Administrator liya isih bisa ngaksès isian ndhelik lan mulihaké iku saka pambusakan, kajaba rereksan tambahan disetèl.",
        "revdelete-suppress-text": "Pandhelikan révisi '''mung''' bisa dipigunakaké kanggo kasus ing ngisor:\n* Informasi kang kagolong pitnah\n* Informasi pribadi kang kurang pantes\n*: ''alamat omah lan nomer telepon, nomer kartu idhèntitas, lsp..''",
        "revdelete-legend": "Atur watesan:",
        "revdelete-hide-text": "Tulisan owahan",
-       "revdelete-hide-image": "Dhelikaké isi barkas",
+       "revdelete-hide-image": "Dhelikaké isining berkas",
        "revdelete-hide-name": "Dhelikaké tujuan lan paramèter",
        "revdelete-hide-comment": "Tingkesan besutan",
        "revdelete-hide-user": "Alamat IPné/jeneng panganggoné kang mbesut",
        "searchprofile-everything": "Kabèh",
        "searchprofile-advanced": "Lungidan",
        "searchprofile-articles-tooltip": "Golèkan ing $1",
-       "searchprofile-images-tooltip": "Golèk barkas",
+       "searchprofile-images-tooltip": "Golèk berkas",
        "searchprofile-everything-tooltip": "Golèk kabèh kontèn (kalebu ing kaca parembugan)",
        "searchprofile-advanced-tooltip": "Golèk ing mandhala aran tinamtu",
        "search-result-size": "$1 ({{PLURAL:$2|1 tembung|$2 tembung}})",
-       "search-result-category-size": "{{PLURAL:$1|1 anggota|$1 anggota}} ({{PLURAL:$2|1 subkategori|$2 subkategori}}, {{PLURAL:$3|1 barkas|$3 barkas}})",
+       "search-result-category-size": "{{PLURAL:$1|1 warga|$1 warga}} ({{PLURAL:$2|1 subkategori|$2 subkategori}}, {{PLURAL:$3|1 berkas|$3 berkas}})",
        "search-redirect": "(alihan saka $1)",
        "search-section": "(pérangan $1)",
        "search-category": "(kategori $1)",
-       "search-file-match": "(cocog karo isi barkas)",
+       "search-file-match": "(cocog karo isi berkas)",
        "search-suggest": "Apa kang panjenengan karsakaké iki: $1",
        "search-rewritten": "Tuduhaké kasilé $1, nanging golèkaké $2.",
        "search-interwiki-caption": "Kasil saka proyèk-proyèk sababon",
        "prefs-searchoptions": "Golèk",
        "prefs-namespaces": "Mandhala aran",
        "default": "baku",
-       "prefs-files": "Barkas",
+       "prefs-files": "Berkas",
        "prefs-custom-css": "CSS priangga",
        "prefs-custom-js": "JavaScript priangga",
        "prefs-common-config": "CSS/JS barengan kabèh ules:",
        "right-move-subpages": "Pindhahaké kaca lan kabèh anak-kacané",
        "right-move-rootuserpages": "Ngalih kaca panganggo oyod",
        "right-move-categorypages": "Lih kaca kategori",
-       "right-movefile": "Lih barkas",
+       "right-movefile": "Lih berkas",
        "right-suppressredirect": "Aja nggawé pangalihan saka kaca kang lawas yèn mindhah kaca",
-       "right-upload": "Unggah barkas",
-       "right-reupload": "Tindhihana barkas kang ana",
-       "right-reupload-own": "Nimpa barkas kang ana lan diunggah panganggo kang padha",
-       "right-reupload-shared": "Timpanana barkas ing panyimpenan médhiya barengan lokal",
-       "right-upload_by_url": "Ngunggahaké barkas saka alamat URL",
+       "right-upload": "Unggah berkas",
+       "right-reupload": "Tindhihi berkas kang ana",
+       "right-reupload-own": "Tindhihi berkas kang ana kang diunggah siji wong",
+       "right-reupload-shared": "Tindhihi berkas ing panyimpenan médhiyah barengan lokal",
+       "right-upload_by_url": "Unggah berkas saka URL",
        "right-purge": "Kosongna ''cache'' situs iki kanggo kaca tanpa konfirmasi",
        "right-autoconfirmed": "Owah kaca-kaca sémi-reksa",
        "right-bot": "Anggepen minangka prosès otomatis",
        "right-editsemiprotected": "Owah kaca kang kareksa \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Besut modhèl kontèn kaca",
        "right-editinterface": "Besut antarmuka panganggo",
-       "right-editusercss": "Besut barkas-barkas CSS panganggo liya",
-       "right-edituserjson": "Besut barkas-barkas JSON panganggo liya",
-       "right-edituserjs": "Besut barkas-barkas JavaScript panganggo liya",
-       "right-editmyusercss": "Owahi barkas CSS panganggo panjenengan",
-       "right-editmyuserjson": "Owahi barkas JSON panganggo panjenengan",
-       "right-editmyuserjs": "Owahi barkas JavaScript panganggo panjenengan",
+       "right-editusercss": "Besut berkas CSS panganggo liya",
+       "right-edituserjson": "Besut berkas JSON panganggo liya",
+       "right-edituserjs": "Besut berkas JavaScript panganggo liya",
+       "right-editmyusercss": "Besut berkas CSS panganggomu",
+       "right-editmyuserjson": "Besut berkas JSON panganggomu",
+       "right-editmyuserjs": "Besut berkas JavaScript panganggomu",
        "right-viewmywatchlist": "Deleng pawawangané panjenengan",
        "right-editmywatchlist": "Owahi pawawangané panjenengan. Cathetan: ana cara liyane kanggo nambahi kaca menyang pratélan, sanadyan ora duwe hak iki.",
        "right-viewmyprivateinfo": "Deleng dhata prianggané panjenengan dhéwé (kaya ta alamat layang-èl, jeneng asli)",
        "right-markbotedits": "Tandhani besutan kang kawurungan yèn besutan bot",
        "right-noratelimit": "Ora kadayan watesing cacah besutan.",
        "right-import": "Impor kaca-kaca saka wiki liya",
-       "right-importupload": "Impor kaca saka unggahan barkas",
+       "right-importupload": "Impor kaca saka unggahan berkas",
        "right-patrol": "Tandhani besutané wong liya yèn wis kapriksa",
        "right-autopatrol": "Gawé supaya besutan otomatis tinengeran wis kapriksa",
        "right-patrolmarks": "Ndeleng tandha-tandha patroli owah-owahan anyar",
        "grant-protect": "Reksa lan uculi rereksané kaca",
        "grant-rollback": "Wurungaké owahané kaca",
        "grant-sendemail": "Kirim layang-èl menyang panganggo liyané",
-       "grant-uploadeditmovefile": "Unggah, ganti, lan lih barkas",
-       "grant-uploadfile": "Unggah barkas anyar",
+       "grant-uploadeditmovefile": "Unggah, ganti, lan lih berkas",
+       "grant-uploadfile": "Unggah berkas anyar",
        "grant-basic": "Hak pokok",
-       "grant-viewdeleted": "Deleng barkas lan kaca kang kabusek",
+       "grant-viewdeleted": "Deleng berkas lan kaca kang kabusek",
        "grant-viewmywatchlist": "Deleng pawawangané panjenengan",
        "grant-viewrestrictedlogs": "Deleng isian log kang winates",
        "newuserlogpage": "Log panganggo anyar",
        "action-move-subpages": "lih kaca iki, lan anak-kacané",
        "action-move-rootuserpages": "ngalih kaca panganggo oyod",
        "action-move-categorypages": "alih kaca kategori",
-       "action-movefile": "alih barkas iki",
-       "action-upload": "ngunggah barkas iki",
-       "action-reupload": "nindhih barkas kang wis ana",
-       "action-reupload-shared": "nindhih barkas kang wis ana ing papan panyimpanan barkas kang dianggo bebarengan",
-       "action-upload_by_url": "unggahna barkas iki saka alamat URL",
+       "action-movefile": "ngalih berkas iki",
+       "action-upload": "ngunggah berkas iki",
+       "action-reupload": "nindhihi berkas kang ana iki",
+       "action-reupload-shared": "nindhihi berkas kang ana ing panyimpanan barengan iki",
+       "action-upload_by_url": "ngunggah berkas iki saka URL",
        "action-writeapi": "migunakaké API panulisan",
        "action-delete": "busak kaca iki",
        "action-deleterevision": "busak révisi",
        "action-protect": "owahi tataran rereksané kaca iki",
        "action-rollback": "gelis mbalèkaké suntingané panganggo pungkasan ing kaca tinamtu",
        "action-import": "impor kaca saka wiki liyané",
-       "action-importupload": "impor kaca iki saka pamunggahan barkas",
+       "action-importupload": "impor kaca saka unggahan berkas",
        "action-patrol": "nandhani besutan wong liya yèn wis kapriksa",
        "action-autopatrol": "nandhani besutané panjenengan dhéwé yèn wis kapriksa",
        "action-unwatchedpages": "deleng pratélan kaca kang ingawasan",
        "recentchanges-page-removed-from-category": "[[:$1]] dibusak saka kategori",
        "recentchanges-page-removed-from-category-bundled": "[[:$1]] dibusak saka kategori, [[Special:WhatLinksHere/$1|kaca iki kalebu ing njeroné kaca liyané]]",
        "autochange-username": "Salin otomatis MediaWiki",
-       "upload": "Unggah barkas",
-       "uploadbtn": "Unggah barkas",
+       "upload": "Unggah berkas",
+       "uploadbtn": "Unggah berkas",
        "reuploaddesc": "Wurung ngunggah lan bali menyang formulir unggahan",
-       "upload-tryagain": "Kirim déskripsi barkas kang wis diowah",
+       "upload-tryagain": "Kirim wedharan barkas kang wis kadandani",
        "uploadnologin": "Durung mlebu log",
-       "uploadnologintext": "Sumangga $1 saperlu ngunggah barkas.",
+       "uploadnologintext": "Mangga $1 saperlu ngunggah berkas.",
        "upload_directory_missing": "Dhirèktori unggahan ($1) ora tinemu lan ora bisa digawé déning server wèb.",
        "upload_directory_read_only": "Dhirèktori pangunggahan ($1) ora bisa ditulis déning paladèn jaringan.",
        "uploaderror": "Masalah pangunggah",
-       "upload-recreate-warning": "'''Pèngetan: Barkas mawa jeneng iku wis dibusak utawa disingkiraké.'''\n\nLog pambusakan lan panyingkiran saka kaca iki sumadhiya ing kéné:",
+       "upload-recreate-warning": "<strong>Pepéling: Siji berkas mawa aran mangkono wis binusek utawa ingalihan.</strong>\n\nLog busekan lan lih-lihan tumrap kaca iki cumawis ing kéné:",
        "uploadtext": "Anggonen formulir ngisor iki saperlu ngunggah barkas.\nKanggo ndeleng utawa nggolèki barkas kang wis diunggah sadurungé, panjenengan menyanga [[Special:FileList|pratélan barkas unggahan]]. Barkas unggahan ulang uga kacathet ing [[Special:Log/upload|log unggah]], déné barkas busakan ing [[Special:Log/delete|log busak]].\n\nKanggo muwuhi barkas ing kaca, anggonen pranala kanthi formulir ing ngisor iki, pilih salah siji:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> saperlu nganggo barkasé kanthi vèrsi kang wutuh\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code></strong> saperlu nganggo barkasé kanthi amba 200 piksel déné ana ing njeron kothak lan kapacak ing sisih kiwané kaca mawa \"alt text\" minangka katerangané\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> saperlu nggayutaké langsung barkasé tanpa mitontonaké barkasé dhéwé",
-       "upload-permitted": "{{PLURAL:$2|Jinis}} barkas kang kaolèhaké: $1.",
-       "upload-preferred": "{{PLURAL:$2|Jinis}} barkas kang kaprayogakaké: $1.",
-       "upload-prohibited": "{{PLURAL:$2|Jinis}} barkas kang kalarang: $1.",
+       "upload-permitted": "{{PLURAL:$2|Jinis}} berkas kang kaolèhaké: $1.",
+       "upload-preferred": "{{PLURAL:$2|Jinis}} berkas kang kaprayogakaké: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Jinis}} berkas kang kalarang: $1.",
        "uploadlogpage": "Log unggah",
-       "uploadlogpagetext": "Ing ngisor iki kapacak log pangunggahan barkas kang anyar dhéwé.\nMangga mirsani [[Special:NewFiles|galeri barkas anyar]] kanggo pratélan visual.",
-       "filename": "Jeneng barkas",
+       "uploadlogpagetext": "Ing sor iki kapacak log unggahan berkas kang anyar dhéwé.\nDeleng [[Special:NewFiles|gladri berkas anyar]] kapurih luwih cethané.",
+       "filename": "Aran berkas",
        "filedesc": "Ringkesan",
        "fileuploadsummary": "Ringkesan:",
-       "filereuploadsummary": "Owah-owahan barkas:",
+       "filereuploadsummary": "Owah-owahan berkas:",
        "filestatus": "Status hak cipta",
        "filesource": "Sumber",
-       "ignorewarning": "Lirwakaké pepéling lan simpen langsung barkasé.",
+       "ignorewarning": "Lirwakaké pepéling lan simpen langsung berkasé.",
        "ignorewarnings": "Lirwakaké samubarang pepéling",
-       "minlength1": "Jeneng barkas saorané ngemu sakurup.",
-       "illegalfilename": "Jeneng barkas \"$1\" ngandhut aksara kang ora diparengaké ana sajroning irah-irahan kaca. Mangga owahana jeneng barkas iku lan cobanen  diunggahaké manèh.",
-       "filename-toolong": "Jeneng barkas ora kena munjuli 240 bèt.",
-       "badfilename": "Jeneng barkas wis diowah dadi \"$1\".",
-       "filetype-mime-mismatch": "Èkstènsi barkas \".$1\" ora cocog karo jinis MIME kang kadètèk saka barkas ($2).",
-       "filetype-badmime": "Barkas jinis MIME \"$1\" ora kena kaunggah.",
+       "minlength1": "Jeneng berkas saorané ngemu sakurup.",
+       "illegalfilename": "Aran barkas \"$1\" ngemu karakter kang ora kaolèhaké ing sesirah kaca.\nMangga ganti araning berkasé lan jajal manèh ngunggah berkasé.",
+       "filename-toolong": "Aran barkas ora kena munjuli 240 bèt.",
+       "badfilename": "Aran berkas wis ingowahan dadi \"$1\".",
+       "filetype-mime-mismatch": "Èstènsi berkas \".$1\" ora cocog karo jinis MIME kang tinemu ing berkas ($2).",
+       "filetype-badmime": "Berkas mawa jinis MIME \"$1\" ora kena kaunggah.",
        "filetype-bad-ie-mime": "Ora bisa ngunggahaké barkas iki amarga Internet Explorer ndhétèksi minangka \"$1\", kang ora diidinaké lan minangka tipe barkas kang nduwèni potènsi mbebayani.",
        "filetype-unwanted-type": "<strong>\".$1\"</strong> iku jinis barkas kang ora kapéngini.\nAluwung {{PLURAL:$3|jinis barkasé}} $2.",
        "filetype-banned-type": "<strong>\".$1\"</strong> {{PLURAL:$4|dudu jinis barkas kang diidinaké}}.\n{{PLURAL:$3|Jinis barkas}} kang diidinaké $2.",
        "zip-bad": "Barkas rusak utawa barkas ZIP kang ora bisa diwaca.\nKang mangkono ora bisa kapriksa kanthi patut kanggo kamanan.",
        "zip-unsupported": "Barkasé iku barkas ZIP kang nganggo piranti ZIP kang ora disengkuyung MediaWiki.\nKang mangkono ora bisa kapriksa kanthi patut kanggo kamanan.",
        "uploadstash": "Unggah pandhelikan",
-       "uploadstash-summary": "Kaca iki nyadhiyakaké dalan ing barkas-barkas kang wis diunggah (utawa lagi diunggah) naning durung kababar ing wiki. Barkas-barkas iki ora katon kanggo sapa baé nanging namung kanggo panganggo kang ngunggah baé.",
+       "uploadstash-summary": "Kaca iki nyawisaké aksès marang berkas-berkas kang wis kaunggah utawa kang lagi kaunggah. Berkas-berkas iki ora katon tumrap sesapaa kajaba panganggo kang ngunggah baé.",
        "uploadstash-clear": "Busek barkas kadhelikaké",
        "uploadstash-nofiles": "Panjenengan ora duwé barkas simpenan.",
        "uploadstash-badtoken": "Nglakoni iki ora dadi, bokamanawa amarga hak besut panjenengan wis kadaluwarsa. Sumangga jajal manèh.",
        "listusersfrom": "Tuduhna panganggo kang diawali karo:",
        "listusers-submit": "Tuduhna",
        "listusers-noresult": "Panganggo ora ana.",
-       "listusers-blocked": "(diblokir)",
+       "listusers-blocked": "(kapenggak)",
        "activeusers": "Pratélan panganggo aktif",
        "activeusers-intro": "Iki pratélan panganggo kang katon lakuné ing $1 {{PLURAL:$1|dina|dina}} kapungkur.",
        "activeusers-count": "$1 {{PLURAL:$1|laku|laku}} ing {{PLURAL:$3|dina|$3 dina}} pungkasan",
        "protect_expiry_old": "Wektu kadaluwarsané ana ing kala kawuri.",
        "protect-unchain-permissions": "Urubaké opsi rereksan lanjutan",
        "protect-text": "Ing kéné, panjenengan bisa ndeleng lan ngganti tataran kareksan tumrap kaca <strong>$1</strong>.",
-       "protect-locked-blocked": "Panjenengan ora bisa ngowahi tataran rereksan nalika diblokir.\nMangkéné setèlan saiki tumrap kaca <strong>$1</strong>:",
+       "protect-locked-blocked": "Kowé ora bisa ngowahi tataran rereksan nalika kapenggak.\nMangkéné setèlan saiki tumrap kaca <strong>$1</strong>:",
        "protect-locked-dblock": "Tataran rereksan ora bisa diowahi amarga sasana dhatané digembok.\nMangkéné setèlan saiki tumrap kaca <strong>$1</strong>:",
        "protect-locked-access": "Akuné panjenengan ora kawogan ngowahi tataran rereksan kaca.\nMangkéné setèlan saiki tumrap kaca <strong>$1</strong>:",
        "protect-cascadeon": "Kaca iki lagi direksa amarga disertakaké ing {{PLURAL:$1|kaca|kaca-kaca}} kang wis direksa mawa pilihan pangreksan runtun diaktifaké. Panjenengan bisa ngganti tingkat pangreksan kanggo kaca iki, nanging perkara iku ora awèh pengaruh pangreksan runtun.",
        "uctop": "saiki",
        "month": "Saka wulan (lan sadurungé):",
        "year": "Saka taun (lan sadurungé):",
-       "sp-contributions-blocklog": "log blokir",
+       "sp-contributions-blocklog": "log penggakan",
        "sp-contributions-deleted": "pasumbangé {{GENDER:$1|panganggo}} kang kabusek",
        "sp-contributions-uploads": "unggahan",
        "sp-contributions-logs": "log",
        "sp-contributions-talk": "rembug",
        "sp-contributions-userrights": "panataning hak {{GENDER:$1|panganggo}}",
-       "sp-contributions-blocked-notice": "Panganggo iki lagi diblokir.\nÈntri log blokiran pungkasan sumadhiya ing ngisor kanggo rujukan:",
-       "sp-contributions-blocked-notice-anon": "Alamat IP iki lagi diblokir.\nÈntri log blokiran pungkasan sumadhiya ing ngisor kanggo rujukan:",
+       "sp-contributions-blocked-notice": "Panganggo iki lagi kapenggak.\nÈntri log penggakan kang pungkasan cumawis ing sor iki minangka rujukan:",
+       "sp-contributions-blocked-notice-anon": "Alamat IP iki lagi kapenggak.\nÈntri log penggakan kang pungkasan cumawis ing sor iki minangka rujukan:",
        "sp-contributions-search": "Golèk pasumbang",
        "sp-contributions-username": "Alamat IP utawa jeneng panganggo:",
        "sp-contributions-toponly": "Tuduhaké besutan mligi révisi anyaran",
        "tooltip-t-info": "Katerangan liyané ngenani kaca iki",
        "tooltip-t-upload": "Unggah barkas",
        "tooltip-t-specialpages": "Pratélaning kabèh kaca mirunggan",
-       "tooltip-t-print": "Vèrsi céthak kaca iki",
+       "tooltip-t-print": "Vèrsi cithak kaca iki",
        "tooltip-t-permalink": "Pranala permanèn saka owahan iki",
        "tooltip-ca-nstab-main": "Deleng kaca kontèn",
        "tooltip-ca-nstab-user": "Deleng kaca panganggo",
        "tooltip-ca-nstab-category": "Deleng kaca kategori",
        "tooltip-minoredit": "Tandhani iki yèn besutan cilik",
        "tooltip-save": "Simpen owah-owahaning panjenengan",
-       "tooltip-publish": "Babar owahané panjenengan",
+       "tooltip-publish": "Babar owahanmu",
        "tooltip-preview": "Pratuduhana owah-owahaning panjenengan. Tulung ayahana iku sadurungé nyimpen.",
        "tooltip-diff": "Tuduhaké owahan endi kang panjenengan gawé tumrap tulisané",
        "tooltip-compareselectedversions": "Delengen prabédan antara rong vèrsi kaca iki kang dipilih.",
        "searchsuggest-containing": "ngemu...",
        "api-error-badtoken": "Masalah njero: Token ala.",
        "api-error-emptypage": "Nggawé kaca kosong anyar ora dilikaké.",
-       "api-error-publishfailed": "Masalah njero: Paladèn wurung mbabar barkas sawetara.",
+       "api-error-publishfailed": "Masalah njero: Paladèn wurung mbabar berkas sawetara.",
        "api-error-stashfailed": "Masalah njero: Paladèn wurung ndèkèk barkas sawetara.",
        "api-error-unknown-warning": "Pélik ora dingertèni: \"$1\".",
        "api-error-unknownerror": "Masalah ora dingertèni: \"$1\".",
-       "duration-seconds": "$1 {{PLURAL:$1|detik|detik}}",
+       "duration-seconds": "$1 {{PLURAL:$1|sekon|sekon}}",
        "duration-minutes": "$1 {{PLURAL:$1|menit|menit}}",
        "duration-hours": "$1 {{PLURAL:$1|jam|jam}}",
        "duration-days": "$1 {{PLURAL:$1|dina|dina}}",
        "duration-weeks": "$1 {{PLURAL:$1|minggu|minggu}}",
        "duration-years": "$1 {{PLURAL:$1|taun|taun}}",
-       "duration-decades": "$1 {{PLURAL:$1|dékade|dékade}}",
+       "duration-decades": "$1 {{PLURAL:$1|dasawarsa|dasawarsa}}",
        "duration-centuries": "$1 {{PLURAL:$1|abad|abad}}",
-       "duration-millennia": "$1 {{PLURAL:$1|milénium|milénium}}",
+       "duration-millennia": "$1 {{PLURAL:$1|miléniyum|miléniyum}}",
        "rotate-comment": "Gambar diubengaké $1 {{PLURAL:$1|drajat|drajat}} sak arah domé jam",
        "limitreport-title": "Parser profiling data:",
        "limitreport-cputime": "CPU time usage",
        "date-range-from": "Kawit tanggal:",
        "date-range-to": "Tumeka tanggal:",
        "randomrootpage": "Kaca wod sembarang",
-       "log-action-filter-block": "Jinis blokiran:",
+       "log-action-filter-block": "Jinis penggakan:",
        "log-action-filter-contentmodel": "Jinis owahan modhèl isi:",
        "log-action-filter-delete": "Jinis busakan:",
        "log-action-filter-import": "Jinis imporan:",
        "log-action-filter-rights": "Jinis owahan hak:",
        "log-action-filter-upload": "Jinis unggahan:",
        "log-action-filter-all": "Kabèh",
-       "log-action-filter-block-block": "Blokir",
+       "log-action-filter-block-block": "Penggak",
        "log-action-filter-block-reblock": "Modhifikasi blokiran",
        "log-action-filter-block-unblock": "Copot blokiran",
        "log-action-filter-contentmodel-change": "Owahan modhèl isi",
index 94aeafd..7f0cd37 100644 (file)
        "page_first": "პირველი",
        "page_last": "ბოლო",
        "histlegend": "ვერსიების შედარება: აირჩიეთ სასურველი ვერსიები რადიო-რგოლების მონიშვნით და დააწკაპუნეთ შედარების ღილაკზე.<br />\nლეგენდა: '''({{int:cur}})''' = სხვაობა მიმდინარე ვერსიასთან, '''({{int:last}})''' = სხვაობა წინა ვერსიასთან, '''{{int:minoreditletter}}''' = მცირე შესწორება.",
-       "history-fieldset-title": "á\83\95á\83\94á\83 á\83¡á\83\98á\83\94á\83\91á\83\98á\83¡ á\83«á\83\98á\83\94á\83\91ა",
+       "history-fieldset-title": "á\83ªá\83\95á\83\9aá\83\98á\83\9aá\83\94á\83\91á\83\94á\83\91á\83\98á\83¡ á\83\92á\83\90á\83¤á\83\98á\83\9aá\83¢á\83\95á\83 ა",
        "history-show-deleted": "მხოლოდ წაშლილი ვერსიები",
        "histfirst": "უძველესი",
        "histlast": "უახლესი",
        "filehist-filesize": "ფაილის ზომა",
        "filehist-comment": "კომენტარი",
        "imagelinks": "ფაილის გამოყენება",
-       "linkstoimage": "მომდევნო {{PLURAL:$1|გვერდი|გვერდები}} ებმის ამ ფაილს:",
+       "linkstoimage": "მომდევნო {{PLURAL:$1|გვერდი იყენებს|გვერდები იყენებენ}} ამ ფაილს:",
        "linkstoimage-more": "$1-ზე მეტი {{PLURAL:$1|გვერდები|გვერდების|გვერდები}} რომლებსაც აქვთ ბმულები ამ ფაილზე.\nმოცემულ სიაში {{PLURAL:$1|წარმოდგენილია მხოლოდ $1 ბმული|წარმოდგენილია მხოლოდ $1 ბმულები|წარმოდგენილია მხოლოდ $1 ბმულების}} ამ ფაილზე.\nშეგიძლიათ ნახოთ ასევე [[Special:WhatLinksHere/$2|სრული სია]].",
-       "nolinkstoimage": "á\83\90á\83  á\83\90á\83 á\83¡á\83\94á\83\91á\83\9dá\83\91á\83¡ á\83\90á\83\9b á\83¤á\83\90á\83\98á\83\9aá\83\97á\83\90á\83\9c á\83\93á\83\90á\83\99á\83\90á\83\95á\83¨á\83\98á\83 á\83\94á\83\91á\83£á\83\9aá\83\98 á\83\92á\83\95á\83\94á\83 á\83\93á\83\94á\83\91á\83\98.",
+       "nolinkstoimage": "á\83\94á\83¡ á\83¤á\83\90á\83\98á\83\9aá\83\98 á\83\90á\83 á\83ªá\83\94á\83 á\83\97 á\83\92á\83\95á\83\94á\83 á\83\93á\83\96á\83\94 á\83\90á\83  á\83\92á\83\90á\83\9bá\83\9dá\83\98á\83§á\83\94á\83\9cá\83\94á\83\91á\83\90.",
        "morelinkstoimage": "იხილეთ [[Special:WhatLinksHere/$1|სხვა ბმულები]] ამ ფაილზე.",
        "linkstoimage-redirect": "$1 (ფაილის გადამისამართება) $2",
        "duplicatesoffile": "{{PLURAL:$1|შემდეგი $1 ფაილი არის დუბლიკატი|შემდეგი $1 ფაილები არიან დუბლიკატები|შემდეგი $1 ფაილები არიან დუბლიკატები}} ამ ფაილისა ([[Special:FileDuplicateSearch/$2|დამატებითი ინფორმაცია]]):",
index 32ed1c2..7cc116e 100644 (file)
@@ -9,7 +9,8 @@
                        "Macofe",
                        "Kumkumuk",
                        "Asmen",
-                       "Gırd"
+                       "Gırd",
+                       "1917 Ekim Devrimi"
                ]
        },
        "tog-underline": "Bınê gırey de xete bonce:",
        "thumbnail_error": "Vıraştena resımê qıckeki de xeta: $1",
        "import-upload-filename": "Namê dosya:",
        "tooltip-pt-userpage": "Pela sımawa karberi",
-       "tooltip-pt-mytalk": "Pela sımawa hurênaişi",
+       "tooltip-pt-mytalk": "Pela {{GENDER:|toya}} werênayışi",
        "tooltip-pt-preferences": "Tercihê mı",
        "tooltip-pt-watchlist": "Lista pelunê ke to guretê şêrkerdene",
        "tooltip-pt-mycontris": "Lista iştıraqunê sıma",
index b56f065..9ac57a6 100644 (file)
@@ -21,7 +21,7 @@
                        "NoiX180"
                ]
        },
-       "tog-underline": "Garih bawah pautan:",
+       "tog-underline": "Garih bawahi pautan:",
        "tog-hideminor": "Suruakkan suntiangan ketek di parubahan baru",
        "tog-hidepatrolled": "Suruakkan suntiangan nan lah dipatroli di parubahan tabaru",
        "tog-newpageshidepatrolled": "Suruakkan laman nan lah dipatroli dari daftar laman baru",
        "tog-diffonly": "Jan tampilan isi laman di bawah pabedoan suntiangan",
        "tog-showhiddencats": "Tunjuakan kategori tasuruak",
        "tog-norollbackdiff": "Jan tampilan pabedoan sasudah malakukan pangambalian",
-       "tog-useeditwarning": "Ingekan denai jikok maninggakan laman suntiang sabalun manyimpan parubahan",
+       "tog-useeditwarning": "Ingekan ambo kok maninggakan laman suntiang sabalun manyimpan parubahan",
        "tog-prefershttps": "Selalu gunokan koneksi aman katiko masuak log",
        "tog-showrollbackconfirmation": "Tampilkan konfirmasi katiko mangklik pautan pangambalian",
+       "tog-requireemail": "Paralu email untuak maatua ulang kato sandi",
        "underline-always": "Taruih",
-       "underline-never": "Indak pernah",
+       "underline-never": "Indak panah",
        "underline-default": "Kulik atau pangaturan paramban web",
        "editfont-style": "Gaya tulisan komputer pado kotak panyuntiangan:",
        "editfont-monospace": "Tulisan Monospace",
        "virus-scanfailed": "Pamindaian gagal (kode $1)",
        "virus-unknownscanner": "Antivirus indak dikenal:",
        "logouttext": "<strong>Sanak alah kalua log</strong>\n\nMohon diingek kalau babarapo laman mungkin masih tampil cando Sanak alun kalua log. Silakan untuak mambarasiahan singgahan panjalajah web Sanak.",
+       "logging-out-notify": "Sanak sadang kalua log, mohon manunggu sabanta",
+       "logout-failed": "Indak bisa kalua kini:$1",
        "cannotlogoutnow-title": "Indak bisa kalua kini",
        "cannotlogoutnow-text": "Indak bisa kalua katiko manggunoan $1.",
        "welcomeuser": "Salamaik datang, $1!",
        "createacct-realname": "Namo asli (opsional)",
        "createacct-reason": "Alasan",
        "createacct-reason-ph": "Manga Sanak mambuek akun lain",
+       "createacct-reason-help": "Pasan yang ditunjuakan dalam log pambuatan akun",
        "createacct-submit": "Buek akun Sanak",
        "createacct-another-submit": "ګڼون جوړول",
        "createacct-continue-submit": "Lanjuikan mambuek akun",
        "createacct-benefit-body2": "{{PLURAL:$1|laman}}",
        "createacct-benefit-body3": "{{PLURAL:$1|panyuntiang}} tarakhia",
        "badretype": "Kato sandi nan Sanak masuakan salah.",
+       "usernameinprogress": "Pambuatan akun untuak namo pangguno ko sadang dalam proses. Mohon manunggu",
        "userexists": "Namo pangguno nan dipiliah alah tapakai.\nPiliah namo nan lain.",
        "createacct-normalization": "Namo pangguno sanak akan disasuaian manjadi \"$2\" karano batasan teknis.",
        "loginerror": "Kasalahan masuak log",
        "login-migrated-generic": "Akun sanak alah dipindahan, namo pangguno Sanak alah indak tadaftar ini wiki ko.",
        "loginlanguagelabel": "Baso: $1",
        "suspicious-userlogout": "Pamintaan Sanak untuak kalua log ditulak karano tampaknyo dikirim oleh paramban nan rusak atau proksi panyinggah.",
+       "createacct-another-realname-tip": "Namo usali basifaik opsional. Kok Sanak mamakainyo, namo tu digunoan untuak manandoan jariah pangguno Sanak.",
        "pt-login": "Masuak log",
        "pt-login-button": "Masuak log",
        "pt-login-continue-button": "Lanjuikan masuak log",
        "changepassword-success": "Kato sandi Sanak alah berhasil dituka!",
        "changepassword-throttled": "Sanak alah acok bana mancubo masuak log. Mohon tunggu $1 sabalun mancubo baliak.",
        "botpasswords": "Kato sandi bot",
+       "botpasswords-summary": "<em>Kato sandi bot</em> mamungkinkan akses ka akun pangguno manggunokan API jo indak manggunokan kredensial masuak log utamo akun tasabuik. Hak pangguno nan tasadio katiko masuak log jo kato sandi bot mungkin ka dibatasi.\n\nKok Sanak indak tau dek a Sanak ka malakukan hal ko, sarancaknyo jan lakukan. Samustinyo indak ado urang lain nan buliah mamintak Sanak untuak mambuek jo manyarahan kato sandi bot ko kapadonyo.",
        "botpasswords-disabled": "Kato sandi bot indak diaktifan.",
        "botpasswords-no-central-id": "Untuak manggunoan kato sandi bot, Sanak harus masuak log ka akun nan alah disentralisasi.",
        "botpasswords-existing": "Kato sandi bot tasadio",
        "botpasswords-label-cancel": "Batalan",
        "botpasswords-label-delete": "Hapuih",
        "botpasswords-label-resetpassword": "Setel ulang kato sandi",
+       "botpasswords-label-grants": "Akses nan dapek diagiah:",
+       "botpasswords-help-grants": "Izin ka akses tatantu alah dipunyoi akun pangguno Sanak. Maaktifkan sabuah hak di siko indak maagiah akses ka akses lain nan indak dimiliki dek akun pangguno Sanak. Caliak [[Special:ListGrants|daftar hak akses]] untuak informasi salangkoknyo.",
        "botpasswords-label-grants-column": "Izin diagiah",
        "botpasswords-bad-appid": "Namo bot \"$1\" indak sah.",
        "botpasswords-insert-failed": "Gagal manambah namo bot \"$1\". Alah ditambahan sabalun iko?",
        "autoblockedtext": "Alamaik IP Sanak alah kanai sakek sacaro otomatih dek dipakai jo pangguno lain, nan alah disakek dek $1. Alasannyo dek:\n\n:<em>$2</em>\n\n* Kanai sakek sajak: $8\n* Maso sakek habih pado: $6\n* Sasaran nan disakek: $7\n\nSanak dapek maubuangi $1 atau [[{{MediaWiki:Grouppage-sysop}}|panguruih lainnya]] untuak marundiangan pakaro ko.\n\nSanak indak dapek manggunoan pakakeh \"{{int:emailuser}}\" kacuali Sanak alah mamasuakan alamaik surel nan sah pado [[Special:Preferences|pangaturan akun]] dan Sanak indak sadang disakek untuak manggunoannyo.\n\nAlamaik IP Sanak adolah $3, dan ID panyakekan adolah $5.\nTolong saratoan informasi di ateh pado satiok patanyaan nan Sanak buek.",
        "systemblockedtext": "Namo pangguno atau alamaik IP Sanak alah disakek sacaro otomatis dek MediaWiki.\nAlasan nan diagiah adolah:\n\n:<em>$2</em>\n\n* Disakek sajak: $8\n* Sakek kadaluwarsa pado: $6\n* Sasaran panyakekan: $7\n\nAlamaik IP Sanak kini adolah $3\nMohon saratokan sadoalah parincian di ateh dalam satiok patanyoan nan Sanak ajukan.",
        "blockednoreason": "indak ado alasan nan diagiah.",
+       "blockedtext-composite": "Namo pangguno atau alamaik IP Sanak alah disakek sacaro otomatis dek MediaWiki.\nAlasan nan diagiah adolah:\n\n:<em>$2</em>\n\n* Disakek sajak: $8\n* Sakek kadaluwarsa pado: $6\n* Sasaran panyakekan: $7\n\nAlamaik IP Sanak kini adolah $3\nMohon saratokan sadoalah parincian di ateh dalam satiok patanyoan nan Sanak ajukan.",
        "blockedtext-composite-ids": "Panyakekan ID relevan: $1 (alamaik IP Sanak juo dapek dicekal)",
        "blockedtext-composite-no-ids": "Alamaik IP Sanak muncua dalam daftar itam gando",
        "blockedtext-composite-reason": "Ado panyakekan bagando ka bakeh akun Sanak dan/atau alamaik IP Sanak.",
        "unsupported-content-diff2": "Pabedaan antaro model konten $1 jo $2 indak didukuang di wiki ko.",
        "deprecated-self-close-category": "Laman nan menggunoan tag HTML tatutuik-surang indak sah",
        "deprecated-self-close-category-desc": "Laman ko manganduang tag HTML tatutuik-surang nan indak sah, sarupo <code>&lt;b/></code> atau <code>&lt;span/></code>.  Parilaku tag sarupo ko ka sagiro barubah supayo konsisten jo spesifikasi HTML5, jadi panggunoannyo dalam teks wiki indak lai disarankan.",
+       "duplicate-args-warning": "<strong>Paringatan:</strong> [[:$1]] maimbau [[:$2]] jo nilai labiah dari ciek untuak parameter \"$3\". Anyo nilai tarakhia nan tasadio nan ka digunokan.",
+       "duplicate-args-category": "Laman jo argumen gando di pamanggilan templat",
+       "duplicate-args-category-desc": "Laman ko barisi pamanggilan templat nan manggunokan argumen gando, sarupo <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> atau <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Paringatan:''' Laman ko manganduang talalu banyak panggilan fungsi parser.\n\nSeharusnyo kurang dari $2 {{PLURAL:$2|panggilan}}, tapi {{PLURAL:$1|kini ado $1 panggilan}}.",
        "expensive-parserfunction-category": "Laman nan talalu banyak panggilan fungsi parser",
        "post-expand-template-inclusion-warning": "'''Peringatan:''' Ukuran templat talalu gadang.\nBabarapo templat akan diabaikan.",
        "post-expand-template-argument-category": "Laman nan barisi uraian templat nan diabaikan",
        "parser-template-loop-warning": "Hubungan barulang templat tadeteksi: [[$1]]",
        "template-loop-category": "Laman jo templat barulang",
+       "template-loop-category-desc": "Laman ko manganduang templat malingka, yaitu templat nan maimbau dirinyo surang sacaro bolak-balik.",
+       "template-loop-warning": "<strong>Paringatan:</strong> Laman ko maimbau [[:$1]] nan manyababkan <i>template loop</i> (panggilan rekursif tak inggo).",
        "parser-template-recursion-depth-warning": "Limit kadalaman hubungan barulang templat lah talampau ($1)",
        "language-converter-depth-warning": "Bateh kadalaman pangonversi bahaso lah talampau ($1)",
        "node-count-exceeded-category": "Laman dimano hitungan-node talampaui",
+       "node-count-exceeded-category-desc": "Laman ko malampaui jumlah node maksimum.",
        "node-count-exceeded-warning": "Laman nan labiah jumlah node",
        "expansion-depth-exceeded-category": "Laman dima kadalaman ekspansi lah talampau",
+       "expansion-depth-exceeded-category-desc": "Laman nan malabiahi kadalaman laweh maksimum.",
        "expansion-depth-exceeded-warning": "Laman kadalaman ekspansi lah talampau",
        "parser-unstrip-loop-warning": "Unstrip loop detected",
        "unstrip-depth-warning": "Unstrip recursion limit exceeded ($1)",
+       "unstrip-depth-category": "Laman-laman di mano bateh kadalaman unstrip alah malabiahi bateh",
+       "unstrip-size-warning": "Bateh ukuran unstrip alah malabiahi bateh ($1)",
+       "unstrip-size-category": "Laman-laman di mano bateh ukuran unstrip alah malabiahi bateh",
        "converter-manual-rule-error": "Kasalahan tadeteksi di aturan manual konversi bahaso",
        "undo-success": "Suntiangan ko dapek dibatalan. \nTolong cek pabedoan di bawah untuak mayakinkan bahwa bana nan tu Sanak nio buek, lalu simpan parubahan tasabuik untuak manyalasaikan pambatalan suntiangan.",
        "undo-failure": "Suntiangan ko indak dapek dibatalan dek konflik panyuntiangan antaro.",
+       "undo-main-slot-only": "Suntiangan ko indak dapek dibatalkan dek tindakan ko malibaikkan konten di lua slot utamo.",
        "undo-norev": "Suntiangan ko indak dapek dibatalan dek laman indak ditamukan atau lah dihapuih.",
+       "undo-nochange": "Suntiangan ko nampaknyo alah dibatalkan.",
        "undo-summary": "Mambatalan revisi $1 oleh [[Special:Contributions/$2|$2]] ([[User talk:$2|maota]])",
        "undo-summary-anon": "Baliakan revisi $1 dek [[Special:Contributions/$2|$2]]",
+       "undo-summary-username-hidden": "Batalkan revisi $1 dek surang pangguno tasuruak",
        "cantcreateaccount-text": "Mambuek akun dari alamat IP ko ('''$1''') alah diblok jo [[User:$3|$3]].\n\nAlasan nan diagiah jo $3 adolah ''$2''",
+       "cantcreateaccount-range-text": "Pambuatan akun dari alamaik IP dalam rantang <strong>$1</strong>, nan mancakuik alamaik IP Sanak (<strong>$4</strong>), alah disakek dek [[User:$3|$3]].\n\nAlasan nan diagiah dek  $3  adolah <em>$2</em>",
        "viewpagelogs": "Caliak log untuak laman ko",
        "nohistory": "Indak ado sajarah panyuntiangan untuak laman ko",
        "currentrev": "Revisi tabaru",
        "history-feed-description": "Riwayaik revisi laman ko di wiki",
        "history-feed-item-nocomment": "$1 pado $2",
        "history-feed-empty": "Laman nan dicari indak ado.\nMungkin alah dihapuih dari wiki, atau diagiah namo baru.\nCuba [[Special:Search|cari dulu]] untuak laman lain nan relevan.",
+       "history-edit-tags": "Suntiang tag dari revisi nan tapiliah",
        "rev-deleted-comment": "(ikhtisar suntiangan dihapuih)",
        "rev-deleted-user": "(namo pangguno dihapuih)",
        "rev-deleted-event": "(rincian log dihapuih)",
        "rev-deleted-user-contribs": "[namo pangguno atau alamaik IP dihapuih - suntiangan disuruakan dari daftar jariah]",
        "rev-deleted-text-permission": "Revisi laman ko alah '''dihapuih'''.\nRinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pangapuihan]",
+       "rev-suppressed-text-permission": "Laman revisi ko alah '''dihapuih'''.\nSanak dapek mancaliaknyo; rinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pangapuihan].",
        "rev-deleted-text-unhide": "Revisi laman ko alah '''dihapuih'''.\nRinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pangapuihan].\nSanak masih dapek [$1 mancaliak revisi ko] ko' amuah.",
        "rev-suppressed-text-unhide": "Revisi laman ko alah '''tabanam'''.\nRinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} log pambanaman].\nAngku masih dapek [$1 maliek revisi ko] ko' amuah.",
        "rev-deleted-text-view": "Laman revisi ko alah '''dihapuih'''.\nSanak dapek mancaliaknyo; rinciannyo mungkin ado di [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pangapuihan].",
        "revdelete-no-file": "Berkas nan dituju indak basobok.",
        "revdelete-show-file-confirm": "Apokah Sanak yakin nio mancaliak revisi nan alah dihapuih dari berkas \"<nowiki>$1</nowiki>\" per $3, $2?",
        "revdelete-show-file-submit": "Yo",
+       "revdelete-selected-text": "{{PLURAL:$1|Revisi tapiliah|Revisi tapiliah}} dari [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|Versi berkas tapilih|Versi berkas tapiliah}} dari [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Log piliahan}}:",
+       "revdelete-text-text": "Revisi nan diapuik ka tatap muncua di laman riwayaik, tapi bagian dari kontennyo ka manjadi indak dapek diakses untuak umum.",
+       "revdelete-text-file": "Versi berkas nan diapuih ka tatap muncua di riwayaik berkas, tapi bagian dari kontennyo ka manjadi indak dapek diakses untuak umum.",
+       "logdelete-text": "Acara log nan diapuih ka tatap muncua di log, tapi bagian dari kontennyo manjadi indak dapek diakses untuak umum.",
+       "revdelete-text-others": "Panguruih lain masih dapek maakses konten tasuruak dan dapek mambatalkan pangapuihannyo, salain kok ado panarapan batasan tambahan.",
        "revdelete-confirm": "Tolong konfirmasi baso Sanak samemang bamakasuik malakuan iko, mamahami konsekuensinyo, dan baso Sanak malakuannyo sasuai jo [[{{MediaWiki:Policy-url}}|kabijakan]].",
        "revdelete-suppress-text": "Panyambunyian revisi <strong>hanyo</strong> buliah digunoan untuak kasus-kasus barikuik:\n* Informasi bapotensi pancemaran namo baiak\n* Informasi paribadi nan indak patuik\n*: <em>alamaik rumah jo nomor telepon, nomor kartu identitas, dll.</em>",
        "revdelete-legend": "Pangaturan bateh",
        "suppressionlog": "Log pambanaman",
        "suppressionlogtext": "Di bawah ko adolah daftar panghapuihan jo panyakekan, tamasuak isi nan disambunyian dari panguruih.\nCaliak [[Special:BlockList|daftar sakek]] untuak daftar nan paliang baru.",
        "mergehistory": "Gabuangan sijarah laman",
+       "mergehistory-header": "Laman ko mambuliahan Sanak untuak manggabuangkan revisi-revisi dari ciek laman sumber ka laman nan labiah baru.\nPastikan baso parubahan ko tatap mampatahankan kontinuitas versi laman tadahulu.",
        "mergehistory-box": "Gabuang parubahan-parubahan dari duo laman:",
        "mergehistory-from": "Laman sumber:",
        "mergehistory-into": "Laman tujuan:",
+       "mergehistory-list": "Mergeable edit history",
+       "mergehistory-merge": "Revisi-revisi barikuik dari [[:$1]] dapek digabuangkan ka [[:$2]]. Gunokan tombol radio untuak manggabuangkan revisi-revisi nan dibuek sabalun wakatu tatantu. Paratikan, manggunokan pautan navigasi ka mangeset ulang kolom.",
        "mergehistory-go": "Tampilan suntiangan nan dapek digabuang",
        "mergehistory-submit": "Gabuang revisi",
        "mergehistory-empty": "Indak ado parubahan nan dapek digabuang.",
        "mergehistory-done": "$3 {{PLURAL:$3|revision|revisions}} dari $1 {{PLURAL:$3|was|were}} berhasil digabuangan ka [[:$2]].",
        "mergehistory-fail": "Indak dapek digabuang, mohon pareso baliak laman jo parameter wakatu.",
+       "mergehistory-fail-bad-timestamp": "Stempel wakatu indak valid.",
        "mergehistory-fail-invalid-source": "Laman asal indak sah.",
        "mergehistory-fail-invalid-dest": "Laman tujuan indak sah.",
+       "mergehistory-fail-no-change": "Panggabuangan sijarah indak barhasil manggabuangkan revisi apo pun. Mohon pareso baliak parameter laman jo waktu.",
+       "mergehistory-fail-permission": "Izin panggabuangan sijarah laman indak mancukupi.",
        "mergehistory-fail-self-merge": "Laman sumber jo tujuannyo samo.",
+       "mergehistory-fail-timestamps-overlap": "Revisi asa tumpang tindih atau labiah baru dari revisi tujuan.",
+       "mergehistory-fail-toobig": "Indak dapek malakukan panggabuangan sabagai labiah dari bateh dari $1 {{PLURAL:$1|revisi|revisi}} ka dipindahkan.",
+       "mergehistory-no-source": "Laman sumber $1 indak ado.",
+       "mergehistory-no-destination": "Halaman tujuan $1 indak ado.",
+       "mergehistory-invalid-source": "Judul laman sumber harus judul nan balaku.",
+       "mergehistory-invalid-destination": "Judul halaman tujuan harus judul yang valid.",
+       "mergehistory-autocomment": "[[:$1]] alah digabuangkan ka [[:$2]]",
+       "mergehistory-comment": "[[:$1]] alah digabuangkan ka [[:$2]]: $3",
+       "mergehistory-same-destination": "Laman sumber jo tujuannyo indak samo.",
        "mergehistory-reason": "Alasan:",
        "mergelog": "Log panggabuangan",
        "revertmerge": "Batal gabuang",
        "diff-empty": "(Indak ado pabedaan)",
        "diff-multi-sameuser": "({{PLURAL:$1|Ciek parubahan antaro|$1 parubahan antaro}} dek pangguno nan samo indak ditampilkan)",
        "diff-multi-otherusers": "({{PLURAL:$1|Ciek parubahan antaro|$1 parubahan antaro}} dek {{PLURAL:$2|ciek pangguno lain|$2 pangguno}} indak ditampilkan)",
+       "diff-multi-manyusers": "({{PLURAL:$1|Ciek parubahan antaro|$1 parubahan antaro}} dek {{PLURAL:$2|ciek pangguno lain|$2 pangguno}} indak ditampakan)",
+       "diff-paragraph-moved-tonew": "Paragraf alah dipindahan. Klik untuak mamindahan ka lokasi baru.",
+       "diff-paragraph-moved-toold": "Paragraf dipindahkan. Klik untuak malumpek ka lokasi lamo.",
+       "difference-missing-revision": "{{PLURAL:$2|One revision|$2 revisions}} of this difference ($1) {{PLURAL:$2|was|were}} indak basuo.\n\nIko biasonyo dek karano pautan sijarah alah kadaluarsa. Rinciannyo dapek dicaliak di  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].",
        "searchresults": "Hasil pancarian",
+       "search-filter-title-prefix": "Anyo mancari laman nan judulnyo diawali dek \"$1\"",
        "search-filter-title-prefix-reset": "Cari kasado laman",
        "searchresults-title": "Hasil pancarian untuak \"$1\"",
        "titlematches": "Judul laman pas",
        "search-category": "(kategori $1)",
        "search-file-match": "(isi berkas nan sasuai)",
        "search-suggest": "Mungkin makasuiknyo: $1",
+       "search-rewritten": "Manampilan hasil untuak $1. Cari selain $2.",
        "search-interwiki-caption": "Hasil dari proyek lain",
        "search-interwiki-default": "Hasil dari $1:",
        "search-interwiki-more": "(salanjuiknyo)",
        "search-interwiki-more-results": "hasil lainnyo",
        "search-relatedarticle": "Bakaitan",
+       "search-invalid-sort-order": "Parintah manyortir $1 indak dikenali, panyortiran standar ka ditarapan. Parintah-parintah manyortir nan sah iolah: $2",
+       "search-unknown-profile": "Profil pancarian $1 tidak dikenali, profil pancarian standar ka diterapan.",
        "searchrelated": "bakaitan",
        "searchall": "sadonyo",
        "showingresults": "Di bawah ko dikaluaan sampai {{PLURAL:$1|'''$1''' hasil}}, dimulai dari #'''$2'''.",
        "showingresultsinrange": "Manampilkan {{PLURAL:$1|<strong>$1</strong> hasil}} dalam rantang #<strong>$2</strong> sampai #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Hasia <strong>$1</strong> dari <strong>$3</strong>|Hasia <strong>$1 - $2</strong> dari <strong>$3</strong>}}",
        "search-nonefound": "Indak ado hasil nan sasuai jo pamintaan",
+       "search-nonefound-thiswiki": "Indak ado hasil nan sasuai jo pamintaan",
        "powersearch-legend": "Pencarian lanjut",
        "powersearch-ns": "Mancari di ruangnamo:",
        "powersearch-togglelabel": "Piliah:",
        "powersearch-toggleall": "Sadonyo",
        "powersearch-togglenone": "Dak ado",
+       "powersearch-remember": "Ingek piliahan untuak pancarian salanjuiknyo",
        "search-external": "Pancarian lua",
        "searchdisabled": "Pancarian {{SITENAME}} dimatian.\nSanak samantaro dapek mancari lewaik Google.\nIngek indeks Google untuak {{SITENAME}} mungkin lah kadaluarsa.",
+       "search-error": "Kasalahan tajadi wakatu mancari: $1",
+       "search-warning": "Paringatan tajadi katiko mancari:$1",
        "preferences": "Pangaturan",
        "mypreferences": "Pangaturan",
        "prefs-edits": "Jumlah suntiangan:",
+       "prefsnologintext2": "Silakan masuak log untuak mangubah preferensi Sanak.",
        "prefs-skin": "Kulik",
        "skin-preview": "Caliak",
        "datedefault": "Indak usah diatua",
        "prefs-watchlist": "Daftar pantau",
        "prefs-editwatchlist": "Suntiang daftar pantauan",
        "prefs-editwatchlist-label": "Suntiang entri daftar pantauan Sanak:",
+       "prefs-editwatchlist-edit": "Caliak jo apuih judul di daftar pantauan Sanak",
+       "prefs-editwatchlist-raw": "Suntiang pantauan mantah",
+       "prefs-editwatchlist-clear": "Apuih daftar pantauan",
        "prefs-watchlist-days": "Jumlah hari dalam daftar pantau:",
        "prefs-watchlist-days-max": "Maksimum $1 {{PLURAL:$1|hari}}",
        "prefs-watchlist-edits": "Jumlah parubahan tabanyak nan ditunjuakan pado daftar pantau:",
        "prefs-watchlist-edits-max": "Nilai maksimum: 1000",
        "prefs-watchlist-token": "Token pantauan:",
+       "prefs-watchlist-managetokens": "Kalola token",
        "prefs-misc": "Lain-lain",
        "prefs-resetpass": "Tuka kato sandi",
        "prefs-changeemail": "Tuka atau hapuih alamaik surel",
        "recentchangesdays-max": "Maksimum $1 {{PLURAL:$1|hari}}",
        "recentchangescount": "Jumlah suntiangan nan ditunjuakan dalam parubahan baru, riwayaik laman, dan dalam log, sacaro baku:",
        "prefs-help-recentchangescount": "Nilai maksimum: 1000",
+       "prefs-help-watchlist-token2": "Iko adolah kunci rasio (token) ka umpan web dari daftar pantauan sanak.\nSia se nan tau dapek mancaliak daftar pantauan Sanak, jadi jan dibagian.\nKok diparaluan [[Special:ResetTokens|you can reset it]].",
+       "prefs-help-tokenmanagement": "Sanak dapek mancaliak jo maatua ulang kunci rahasio akun Sanak nan dapek maakses umpan Web dari daftar pantauan Sanak. Sia se nan tau bisa sajo mancaliak daftar pantauan Sanak, jadi jan dibagian.",
        "savedprefs": "Pangaturan lah tasimpan",
+       "savedrights": "Kalompok hak pangguno {{GENDER:$1|$1}} alah disimpan.",
        "timezonelegend": "Zona wakatu:",
        "localtime": "Wakatu satampaik:",
        "timezoneuseserverdefault": "Gunokan nan dari wiki ($1)",
        "timezoneuseoffset": "Lainnyo (tantuan pabedoannyo)",
+       "timezone-useoffset-placeholder": "Contoh nilai: \"-07:00\" atau \"01:00\"",
        "servertime": "Wakatu server:",
        "guesstimezone": "Isian dari paramban web",
        "timezoneregion-africa": "Afrika",
        "default": "baku",
        "prefs-files": "Berkas",
        "prefs-custom-css": "CSS surang",
+       "prefs-custom-json": "JSON kustom",
        "prefs-custom-js": "JS surang",
        "prefs-common-config": "CSS/JS babagi untuak kasado kulik:",
        "prefs-reset-intro": "Angku dapek manggunokan laman ko untuak mangambalikan pangaturan ka setelan baku situs ko.\nPangambalian pangaturan indak dapek dibatalan.",
        "prefs-displayrc": "Piliahan tampilan",
        "prefs-displaywatchlist": "Piliahan tampilan",
        "prefs-changesrc": "Parubahan ditampilkan",
+       "prefs-changeswatchlist": "Parubahan ditampilan",
+       "prefs-pageswatchlist": "Halaman nan dipantau",
        "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Pabedoan",
+       "prefs-help-prefershttps": "Preferensi ko akan diaktifkan salunjuiknyo katiko Sanak masuak log.",
+       "prefswarning-warning": "Parubahan preferensi Sanak alun tasimpan. Kok Sanak maninggaan halaman ko tanpa ma klik $1 preferensi Sanak indak akan dipabarui.",
+       "prefs-tabs-navigation-hint": "Tip: Sanak dapek manggunoan tombol panah kida jo suok untuak banavigasi antartab di dalam daftar tab.",
        "userrights": "Hak pangguno",
        "userrights-lookup-user": "Piliah pangguno",
        "userrights-user-editname": "Masuakan namo pangguno:",
        "editusergroup": "Muek kalompok pangguno",
        "editinguser": "Mangganti hak pangguno untuak {{GENDER:$1|pangguno}} <strong>[[User:$1|$1]]</strong> $2",
+       "viewinguserrights": "Mancaliak hak pengguna dari {{GENDER:$1|pengguno}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Suntiang kalompok {{GENDER:$1|pangguno}}",
        "userrights-viewusergroup": "Caliak kalompok {{GENDER:$1|pangguno}}",
        "saveusergroups": "Simpan kalompok {{GENDER:$1|pangguno}}",
        "userrights-expiry-options": "1 hari:1 hari,1 minggu:1 minggu,1 bulan:1 bulan,3 bulan:3 bulan,6 bulan:6bulan,1 taun:1 taun",
        "userrights-invalid-expiry": "Wakatu usang untuak kalompok \"$1\" indak sah.",
        "userrights-expiry-in-past": "Wakatu usang untuak kalompok \"$1\" alah balalu.",
+       "userrights-cannot-shorten-expiry": "Sanak indak dapek mamajuan wakatu kadaluarsa dari kaanggotaan dalam kalompok $1. Hanyo pangguno yang punyo hak akses manambahan jo mancabuik kalompok ko yang dapek mamajuan wakatu kadaluarsa.",
+       "userrights-conflict": "Konflik parubahan hak pangguno! Sila tinjau ulang jo konfirmasi parubahan Sanak.",
        "group": "Kalompok:",
        "group-user": "Pangguno",
        "group-autoconfirmed": "Pangguno takonfirmasi otomatih",
        "right-createpage": "Mambuek laman baru (nan bukan laman diskusi)",
        "right-createtalk": "Mambuek laman diskusi",
        "right-createaccount": "Mambuek akun baru",
+       "right-autocreateaccount": "Masuak log otomatis jo akun pangguno lua",
        "right-minoredit": "Manandoi suntiangan ketek",
        "right-move": "Mamindahan laman",
        "right-move-subpages": "Mamindahan laman jo kasado sublaman",
        "right-move-rootuserpages": "Mamindahan laman pangguno",
+       "right-move-categorypages": "Pindahan halaman kategori",
        "right-movefile": "Mamindahan berkas",
        "right-suppressredirect": "Indak mambuek pangaliahan wakatu mamindahan laman",
        "right-upload": "Mamuek berkas",
        "right-reupload": "Manimpo berkas lamo",
        "right-reupload-own": "Manimpo berkas nan dimuek surang",
+       "right-reupload-shared": "Manolak berkas-berkas pado panyimpanan media lokal basamo",
+       "right-upload_by_url": "Masuakan berkas dari alamat URL",
        "right-purge": "Mangapuih singgahan laman untuak laman",
        "right-autoconfirmed": "Indak dipangaruahi bateh limik babasis IP",
        "right-bot": "Dipalakuan sabagai proses otomatih",
        "right-apihighlimits": "Manggunoan bateh labiah tinggi dalam kueri API",
        "right-writeapi": "Manggunoan panulisan API",
        "right-delete": "Mangapuih laman",
+       "right-bigdelete": "Apuih halaman yang banyak versi terdahulunyo",
+       "right-deletelogentry": "Maapuih jo mambatalan pangapuihan entri log tatantu",
+       "right-deleterevision": "Maapuih jo mambatalan pangapuihan parubahan tatantu suatu halaman",
+       "right-deletedhistory": "Caliak revisi entri-entri yang diapuih, tanpa teks yang bahubuangan",
+       "right-deletedtext": "Caliak teks yang diapuih jo parubahan antaro revisi yang diapuih",
+       "right-browsearchive": "Cari laman nan dihapuih",
+       "right-undelete": "Mambaliakan halaman nan diapuih",
+       "right-suppressrevision": "Manampilan, manyambunyian jo mambatalan panyambunyian revisi tatantu suatu halaman dari pangguno",
+       "right-viewsuppressed": "Caliak parubahan yang disambunyian dari sadolah pangguno",
        "right-suppressionlog": "Mancaliak log privat",
+       "right-block": "Blokir pangguno lain dari panyuntingan",
+       "right-blockemail": "Mamblokir pangiriman surel dek pangguno",
+       "right-hideuser": "Mamblokir namo pangguno jo manyambunyiannyo dari publik",
+       "right-ipblock-exempt": "Mangabaikan pamblokiran IP, pamblokiran otomatis, jo jarak pamblokiran",
        "right-unblockself": "Malapehan sakek surang",
+       "right-protect": "Ubah tingkek palinduangan jo suntiang halaman yang dilinduangi baruntun",
+       "right-editprotected": "Manyuntiang halaman yang dilinduangi sabagai \"{{int:protect-level-sysop}}\"",
        "right-editinterface": "Manyuntiang antarmuko pangguno",
        "right-editusercss": "Manyuntiang berkas CSS pangguno lain",
        "right-edituserjson": "Manyuntiang berkas JSON pangguno lain",
index bcd51af..2607b72 100644 (file)
                        "RadioAzureus"
                ]
        },
-       "tog-underline": "Verwijzingen onderstrepen:",
+       "tog-underline": "Links onderstrepen:",
        "tog-hideminor": "Kleine bewerkingen in recente wijzigingen verbergen",
        "tog-hidepatrolled": "Gemarkeerde bewerkingen in recente wijzigingen verbergen",
        "tog-newpageshidepatrolled": "Gemarkeerde pagina's in de lijst met nieuwe pagina's verbergen",
        "diff-multi-sameuser": "({{PLURAL:$1|Een tussenliggende versie|$1 tussenliggende versies}} door dezelfde gebruiker niet weergegeven)",
        "diff-multi-otherusers": "({{PLURAL:$1|Een tussenliggende versie|$1 tussenliggende versies}} door {{PLURAL:$2|een andere gebruiker|$2 gebruikers}} niet weergegeven)",
        "diff-multi-manyusers": "($1 tussenliggende {{PLURAL:$1|versie|versies}} door meer dan $2 {{PLURAL:$2|gebruiker|gebruikers}}  worden niet weergegeven)",
-       "diff-paragraph-moved-tonew": "Deze paragraaf is verplaatst. Klik om naar de nieuwe locatie te springen.",
-       "diff-paragraph-moved-toold": "Deze paragraaf is verplaatst. Klik om naar de oude locatie te springen.",
+       "diff-paragraph-moved-tonew": "Deze alinea is verplaatst. Klik om naar de nieuwe locatie te springen.",
+       "diff-paragraph-moved-toold": "Deze alinea is verplaatst. Klik om naar de oude locatie te springen.",
        "difference-missing-revision": "{{PLURAL:$2|Eén versie|$2 versies}} van deze verschillen ($1) {{PLURAL:$2|is|zijn}} niet aangetroffen.\n\nDit wordt meestal veroorzaakt door het volgen van een verouderde koppeling verschillen voor een pagina die is verwijderd.\nMeer gegevens zijn mogelijk te vinden in het [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} verwijderingslogboek].",
        "searchresults": "Zoekresultaten",
        "search-filter-title-prefix": "Alleen pagina's doorzoeken waarvan de titel begint met \"$1\"",
index f474a8b..0870b19 100644 (file)
        "botpasswords-updated-body": "ߓߏߕ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߓߏߕ ߕߐ߮ ߦߋ߫ \"$1\" {{GENDER:$2|ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ}} ߦߋ߫ \"$2\" ߕߎ߲߬ ߓߘߊ߫ ߟߏ߲ߘߐߦߊ߫.",
        "botpasswords-deleted-title": "ߓߏߕ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߓߘߊ߫ ߖߏ߬ߛߌ߬",
        "botpasswords-deleted-body": "ߓߏߕ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߓߏߕ ߕߐ߮ ߦߋ߫ \"$1\" {{GENDER:$2|ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ}} ߦߋ߫ \"$2\" ߕߎ߲߬ ߓߘߊ߫ ߖߏ߬ߛߌ߬.",
+       "botpasswords-no-provider": "ߓߏߕ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߥߎ߬ߛߎ ߡߊߛߐߟߊ ߕߍ߫ ߊ߬ ߟߊ߫.",
+       "botpasswords-restriction-failed": "ߓߏߕ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߟߊ߬ߞߎ߲߬ߛߌ߲߬ߠߌ߲ ߓߘߊ߫ ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߣߌ߲߬ ߢߍߓߍ߲߬.",
+       "botpasswords-invalid-name": "ߓߏߕ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߕߍߝߘߊߟߌ (\"$1\") ߕߍ߫ ߟߊ߬ߓߊ߰ߙߊ߬ߕߐ߰ ߞߙߍߞߙߍߣߍ߲ ߠߊ߫.",
        "botpasswords-not-exist": "ߓߏߕ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߕߐ߯ߟߊߣߍ߲߫ \"$2\" ߕߍ߫ ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ  \"$1\" ߓߟߏ߫",
        "botpasswords-needs-reset": "ߓߏߕ ߕߊ߬ߡߌ߲߬ߞߊ߲  \"$1\" ߓߏߕ ߕߐ߯ \"$2\" ߦߋ߫ {{GENDER:$1|ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ}}  \"$1\" ߦߋ߫ ߡߊߦߟߍ߬ߡߊ߲߫.",
        "botpasswords-locked": "ߌ ߕߍߣߊ߬ ߛߋߟߴߌ ߜߊ߲߬ߞߎ߲߬ ߠߊ߫ ߓߏߕ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߘߌ߫ ߓߊ ߌ ߟߊ߫ ߖߊ߬ߕߋ߬ߘߊ ߛߐ߰ߣߍ߲߫ ߠߋ߫.",
        "resetpass-no-info": "ߌ ߦߴߌ ߜߊ߲߬ߞߎ߲߬ ߡߎߣߎ߲߬ ߞߣߊ߬ ߕߏ߫ ߞߐߜߍ ߣߌ߲߬ ߡߊߛߐ߬ߘߐ߲߬ ߠߊ߫.",
        "resetpass-submit-loggedin": "ߕߊ߬ߡߌ߲߬ߞߊ߲ ߡߊߝߊ߬ߟߋ߲߬",
        "resetpass-submit-cancel": "ߊ߬ ߘߐߛߊ߬",
+       "resetpass-wrong-oldpass": "ߥߊ߯ߕߌߟߊߕߊߡߌ߲߫ ߕߊߡߌ߲ߞߊ߲ ߥߟߊ߫ ߕߋ߲߭ߕߋ߲߭ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߓߍ߲߬ߓߊߟߌ.\nߕߎ߬ߡߊ߬ߘߐ߫ ߌ ߣߐ߬ ߘߌ߫ ߞߍ߫ ߌ ߟߊ߫ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߡߊߝߊ߬ߟߋ߲߬ ߠߊ߫ ߥߟߊ߫ ߌ ߓߘߊ߫ ߥߊ߯ߕߌߟߊߕߊߡߌ߲߫ ߕߊߡߌ߲ߞߊ߲߫ ߞߎߘߊ߫ ߡߊߞߟߌ߫.",
+       "resetpass-recycled": "ߖߊ߰ߣߌ߲߬ ߌ ߦߴߌ ߟߊ߫ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߡߊߝߊ߬ߟߋ߲߬ ߘߏ߫ ߜߘߍ߫ ߟߊ߫ ߡߍ߲ ߣߌ߫ ߘߐ ߣߌ߲߬ ߕߍ߫ ߞߋߟߋ߲߫ ߘߌ߫.",
+       "resetpass-temp-emailed": "ߌ ߓߘߴߌ ߜߊ߲߬ߞߎ߲߫ ߥߊ߯ߕߌߟߊߕߊߡߌ߲߫ ߗߋߛߓߍ ߘߏߝߙߍߕߍ ߟߊ߫.\nߖߐ߲߬ߛߊ߫ ߌ ߘߌ߫ ߓߊ߲߫ ߌ ߜߊ߲߬ߞߎ߲߬ ߠߊ߫߸ ߌ ߞߊߞߊ߲߫ ߞߊ߬ ߕߊ߬ߡߌ߲߬ߞߊ߲߬ ߞߎߘߊ߫ ߟߊߘߏ߲߬:",
        "resetpass-temp-password": "ߕߊߡߌ߲ߞߊ߲ ߕߎ߬ߡߊ߬ߞߎ߲߬ߡߊ",
+       "resetpass-abort-generic": "ߕߊ߬ߡߌ߲߬ߞߊ߲ ߡߊߝߊ߬ߟߋ߲߬ߠߌ߲ ߓߘߊ߫ ߘߐߛߊ߬ ߞߐߕߊ߲ߠߌ߲ ߘߏ߫ ߓߟߏ߫.",
+       "resetpass-expired": "ߌ ߟߊ߫ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߛߕߊ ߓߘߊ߫ ߝߊ߫. ߕߊ߬ߡߌ߲߬ߞߊ߲߬ ߞߎߘߊ߫ ߟߊߘߏ߲߬ ߖߊ߰ߣߌ߲߫ ߞߵߌ ߜߊ߲߬ߞߎ߲߫.",
+       "resetpass-expired-soft": "ߌ ߟߊ߫ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߛߕߊ ߓߘߊ߫ ߝߊ߫ ߊ߬ ߘߏ߲߬ ߡߊ߬ߞߏ ߦߋ߫ ߡߝߊ߬ߟߋ߲߬ߠߌ߲ ߠߊ߫.ߕߊ߬ߡߌ߲߬ߞߊ߲߬ ߞߎߘߊ߫ ߛߎߥߊ߲ߘߌ߫ ߖߊ߰ߣߌ߲߬߸ ߥߟߊ߫ ߌ ߦߋ߫ ߣߌ߲߬ ߛߐ߲߬ߞߌ߲߫  \"{{int:authprovider-resetpass-skip-label}}\" ߞߵߊ߬ ߡߊߝߊ߬ߟߋ߲߬ ߞߐߝߍ߬.",
+       "resetpass-validity": "ߌ ߟߊ߫ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߓߍ߲߬ߣߍ߲߬ ߕߍ߫: $1\n\nߕߊ߬ߡߌ߲߬ߞߊ߲߬ ߞߎߘߊ߫ ߟߊߘߏ߲߬ ߖߊ߰ߣߌ߲߫ ߞߵߌ ߜߊ߲߬ߞߎ߲߫.",
+       "resetpass-validity-soft": "ߌ ߟߊ߫ ߕߊ߬ߡߌ߲߬ߞߊ߲ ߓߍ߲߬ߣߍ߲߬ ߕߍ߫: $1\n\nߕߊ߬ߡߌ߲߬ߞߊ߲߬ ߞߎߘߊ߫ ߟߊߘߏ߲߬ ߛߌߣߍ߲߬ ߖߊ߰ߣߌ߲߫߸ ߥߟߊ߫ ߣߌ߲߬ ߛߐ߲߬ߞߌ߲߫ \"{{int:authprovider-resetpass-skip-label}}\" ߞߵߊ߬ ߡߊߝߊ߬ߟߋ߲߬ ߞߐߝߍ߬.",
        "passwordreset": "ߕߊ߬ߡߌ߲߬ߞߊ߲ ߡߊߦߟߍ߬ߡߊ߲߬",
+       "passwordreset-text-one": "ߖߙߎߡߎ߲ ߣߌ߲߬ ߘߝߊ߫ ߛߴߌ ߘߌ߫ ߥߊ߯ߕߌߟߊߕߊߡߌ߲߫ ߕߊߡߌ߲ߞߊ߲ ߘߏ߫ ߡߊߛߐ߬ߘߐ߲߬ ߢߎߡߍߙߋ߲ߞߏ߲ߘߏ ߟߊ߫.",
        "passwordreset-disabled": "ߕߊ߬ߡߌ߲߬ߞߊ߲߬ ߡߊߦߟߍ߬ߡߊ߲߬ߣߍ߲ ߓߘߊ߫ ߛߋ߲߬ߓߐ߫ ߥߞߌ ߣߌ߲߬ ߘߐ߫.",
        "passwordreset-username": "ߟߊ߬ߓߊ߰ߙߊ߬ߟߊ ߕߐ߮:",
        "passwordreset-domain": "ߡߊ߬ߘߎ߮:",
        "version-hook-name": "ߛߏ߲߭ߓߊ߬ߟߌ ߕߐ߮",
        "version-hook-subscribedby": "ߕߐ߮ ߛߓߍߣߍ߲߫ ߦߋ߫",
        "version-no-ext-name": "[ߕߐ߯ ߕߴߊ߬ ߟߊ߫]",
+       "version-ext-license": "ߕߌ߰ߦߊ",
+       "version-ext-colheader-name": "ߞߐߕߊ߲ߠߌ߲",
        "version-skin-colheader-name": "ߝߊ߬ߘߌ",
        "version-ext-colheader-version": "ߦߌߟߡߊ",
        "version-ext-colheader-license": "ߕߌ߰ߦߊ",
        "tags-create-reason": "ߊ߬ ߛߊߓߎ:",
        "tags-create-submit": "ߟߊ߬ߘߊ߲߬ߠߌ߲",
        "tags-create-no-name": "ߌ ߞߊߞߊ߲߫ ߞߊ߬ ߘߎ߲ߛߓߍ ߕߐ߮ ߘߏ߫ ߞߙߍߞߙߍ߫.",
+       "tags-delete-reason": "ߊ߬ ߛߊߓߎ:",
+       "tags-activate-reason": "ߊ߬ ߛߊߓߎ:",
+       "tags-deactivate-reason": "ߊ߬ ߛߊߓߎ:",
+       "compare-page1": "ߞߐߜߍ ߁߭",
+       "compare-page2": "ߞߐߜߍ ߂߲",
+       "compare-rev1": "ߟߢߊ߬ߟߌ ߁߭",
+       "compare-rev2": "ߟߢߊ߬ߟߌ ߂߲",
+       "compare-submit": "ߊ߬ ߟߊߢߐ߲߮ߡߊ߬",
+       "compare-invalid-title": "ߌ ߣߊ߬ ߞߎ߲߬ߕߐ߮ ߡߍ߲ ߞߙߍߞߙߍ߫ ߟߊ߫ ߏ߬ ߓߍ߲߬ߣߍ߲߬ ߕߍ߫.",
+       "compare-title-not-exists": "ߌ ߣߊ߬ ߞߎ߲߬ߕߐ߮ ߡߍ߲ ߞߙߍߞߙߍ߫ ߟߊ߫ ߏ߬ ߕߴߦߋ߲߬.",
+       "compare-revision-not-exists": "ߌ ߣߊ߬ ߟߢߊ߬ߟߌ ߡߍ߲ ߞߙߍߞߙߍ߫ ߟߊ߫ ߏ߬ ߕߴߦߋ߲߬.",
+       "diff-form": "ߓߐߣߍ߲ߢߐ߲߰ߡߊ ߟߎ߬",
+       "diff-form-oldid": "ߟߢߊ߬ߟߌ߬ ߞߘߐ ID (ߢߣߊߕߊߟߌ)",
+       "diff-form-revid": "ߓߐߣߍ߲ߢߐ߲߰ߡߊ ߟߎ߬ ߟߢߊ߬ߟߌ ID",
+       "diff-form-submit": "ߓߐߣߍ߲ߢߐ߲߰ߡߊ ߟߎ߬ ߦߌ߬ߘߊ߬",
+       "permanentlink": "ߛߘߌ߬ߜߋ߲߬ ߓߟߏߕߍ߰ߓߊߟߌ",
+       "permanentlink-revid": "ߟߢߊ߬ߟߌ ID",
+       "permanentlink-submit": "ߕߊ߯ ߟߢߊ߬ߟߌ ߘߐ߫",
+       "newsection": "ߕߍߕߍ߯ ߞߎߘߊ",
+       "newsection-page": "ߞߏ߲߭ ߞߐߜߍ",
+       "newsection-submit": "ߕߊ߯ ߞߐߜߍ ߞߊ߲߬",
        "logentry-delete-delete": "$1 {{GENDER:$2|deleted}} ߞߐߜߍ $3",
        "logentry-delete-restore": "$1 $3($4) ߞߐߜߍ {{GENDER:$2|ߓߘߊ߫ ߟߊߛߊ߬ߦߌ߬ ߞߐ߫}}",
        "logentry-delete-revision": "$1  {{GENDER:$2|ߓߘߊ߫ ߦߟߍ߬ߡߊ߲߬ߠߌ߲ ߞߍ߫}} ߣߌ߲߬ ߦߋߗߏ߮ ߟߊ߫ {{PLURAL:$5|a revision|$5 revisions}} ߞߐߜߍ ߣߌ߲߬ $3: $4 ߘߐ߫",
index 2ec2e44..069fc5a 100644 (file)
        "userlogin-resetpassword-link": "Nie pamiętasz hasła?",
        "userlogin-helplink2": "Pomoc przy logowaniu",
        "userlogin-loggedin": "Zalogowano jako {{GENDER:$1|$1}}.\nUżyj poniższego formularza, aby zalogować się jako inny użytkownik.",
-       "userlogin-reauth": "Musisz się ponownie zalogować, aby potwierdzić, że jesteś {{GENDER:$1|$1}}.",
+       "userlogin-reauth": "Musisz się ponownie zalogować, aby potwierdzić, że {{GENDER:$1|użytkownik|użytkowniczka}} $1 to Ty.",
        "userlogin-createanother": "Załóż nowe konto",
        "createacct-emailrequired": "Adres e‐mail",
        "createacct-emailoptional": "Adres e-mail (opcjonalnie)",
index d08a6bc..24d6719 100644 (file)
@@ -39,7 +39,8 @@
                        "WebSourceContentRO",
                        "MSClaudiu",
                        "Lucdrei",
-                       "Moyogo"
+                       "Moyogo",
+                       "GabiBil"
                ]
        },
        "tog-underline": "Sublinierea legăturilor:",
        "rcfilters-filter-showlinkedto-label": "Arată schimbările din paginile ce trimit la",
        "rcfilters-filter-showlinkedto-option-label": "<strong>Pages ce trimit la</strong> pagina selectată",
        "rcfilters-target-page-placeholder": "Introduceți numele unei pagini (sau categorii)",
+       "rcfilters-allcontents-label": "Tot conținutul",
+       "rcfilters-alldiscussions-label": "Toate discuțiile",
        "rcnotefrom": "Dedesubt {{PLURAL:$5|se află o modificare|sunt modificările}} începând cu <b>$3, $4</b> (maximum <b>$1</b> afișate).",
        "rclistfromreset": "Resetați selectarea datei",
        "rclistfrom": "Afișează modificările începând cu $3, ora $2",
        "sessionfailure": "Se pare că este o problemă cu sesiunea de autentificare; această acțiune a fost oprită ca o precauție împotriva furtului sesiunii. Vă rugăm să trimiteți formularul din nou.",
        "changecontentmodel": "Modificare model de conținut al unei pagini",
        "changecontentmodel-legend": "Modifică modelul de conținut",
-       "changecontentmodel-title-label": "Titlul paginii",
+       "changecontentmodel-title-label": "Titul paginii:",
        "changecontentmodel-current-label": "Modelul de conținut curent:",
-       "changecontentmodel-model-label": "Model de conținut nou",
+       "changecontentmodel-model-label": "Model de conținut nou:",
        "changecontentmodel-reason-label": "Motiv:",
        "changecontentmodel-submit": "Schimbă",
        "changecontentmodel-success-title": "Modelul de conținut a fost modificat",
index ceb5005..b7c17dc 100644 (file)
        "nocreate-loggedin": "Non ge tine le permesse pe ccreja pàggene nuève.",
        "sectioneditnotsupported-title": "Sezione de le cangiaminde none supportate",
        "sectioneditnotsupported-text": "Sezione de le cangiaminde non g'è supportate sus a sta pàgene de cangiaminde.",
+       "modeleditnotsupported-title": "'U cangiamende non g'è supportate",
+       "modeleditnotsupported-text": "'U cangiamende non g'è supportate pu modelle de condenute $1.",
        "permissionserrors": "Errore de permesse",
        "permissionserrorstext": "Tu non ge tine 'u permesse pe fà ste cose, pe {{PLURAL:$1|stu mutive|ste mutive}}:",
        "permissionserrorstext-withaction": "Tu non ge tine 'u permesse pe $2, pe {{PLURAL:$1|stu mutive|ste mutive}}:",
        "rcfilters-exclude-button-off": "Scitte le scacchiate",
        "rcfilters-exclude-button-on": "Scettanne le scacchiate",
        "rcfilters-view-tags": "Cangiaminde taggate",
+       "rcfilters-view-namespaces-tooltip": "Filtre le resultate pe namespace",
+       "rcfilters-view-tags-tooltip": "Filtre le resultate ausanne le tag de cangiamende",
+       "rcfilters-view-return-to-default-tooltip": "Tuèrne a 'u menu de le filtre prengepàle",
        "rcfilters-liveupdates-button": "Aggiornaminde in tiembe reale",
        "rcfilters-liveupdates-button-title-on": "Stute le aggiornaminde automatece",
        "rcfilters-watchlist-markseen-button": "Signe tutte le cangiaminde cumme 'ndrucate",
index 9a40d38..4b6d57b 100644 (file)
        "ipblocklist-legend": "Poišči blokiranega uporabnika",
        "blocklist-userblocks": "skrij blokade računov",
        "blocklist-tempblocks": "skrij začasne blokade",
+       "blocklist-indefblocks": "Skrij neomejene blokade",
        "blocklist-addressblocks": "skrij blokade posameznih IP-naslovov",
        "blocklist-type": "Vrsta:",
        "blocklist-type-opt-all": "Vse",
index 7dd965f..46362ae 100644 (file)
        "ipblocklist-legend": "Sök efter en blockerad användare",
        "blocklist-userblocks": "Dölj kontoblockeringar",
        "blocklist-tempblocks": "Dölj tillfälliga blockeringar",
+       "blocklist-indefblocks": "Dölj otydliga blockeringar",
        "blocklist-addressblocks": "Dölj enskilda IP-blockeringar",
        "blocklist-type": "Typ:",
        "blocklist-type-opt-all": "Alla",
index 31492ed..ac99d59 100644 (file)
@@ -66,9 +66,9 @@
        "underline-never": "Ńigdy",
        "underline-default": "Podug sztalowańo uoglůndarki",
        "editfont-style": "Styl czćůnki we placu sprowjyń:",
-       "editfont-monospace": "Monotypowe krojło",
-       "editfont-sansserif": "Bezszeryfowe krojło",
-       "editfont-serif": "Szeryfowe krojło",
+       "editfont-monospace": "Monotypowe pismo",
+       "editfont-sansserif": "Bezszeryfowe pismo",
+       "editfont-serif": "Szeryfowe pismo",
        "sunday": "Niydziela",
        "monday": "Pyńdziałek",
        "tuesday": "Wtorek",
        "virus-badscanner": "Felerno konfiguracyjo – ńyznany skaner antywirusowy ''$1''",
        "virus-scanfailed": "skanowańy ńyudone (feler $1)",
        "virus-unknownscanner": "ńyznajůmy průgram antywirusowy",
-       "logouttext": "'''Terozki jeżeś wylůgowany'''.\n\nDej pozůr, co na ńykerych zajtach przeglůndarka może dali pokozywać co jeżeś zalůgowany, a bydźe tak aże uodśwjyżysz jeij cache.",
+       "logouttext": "<strong>Używŏcz je wylogowany.</strong>\n\nDej pozōr, że podwiela niy ôdświyżysz cache przeglōndarki, niykere strōny mogōm sie durch pokazować choćby trwało zalogowanie.",
        "welcomeuser": "Witej, $1",
        "welcomecreation-msg": "Uotwarli my sam lo Ćebje kůnto.\nPamjyntej coby posztalować [[Special:Preferences|preferencyji]]",
        "yourname": "Miano ôd używŏcza:",
        "login": "Wloguj sie",
        "nav-login-createaccount": "Logowańy / Tworzyńy kůnta",
        "logout": "Wyloguj",
-       "userlogout": "Uodloguj śe",
+       "userlogout": "Ôdlogowanie",
        "notloggedin": "Niy je żeś wlogowany(ŏ)",
        "userlogin-noaccount": "Niy mŏsz kōnta?",
        "userlogin-joinproject": "Dołōncz do {{GRAMMAR:D.lp|{{SITENAME}}}}",
        "nosuchusershort": "Ńy mo sam użytkowńika uo mjańe \"$1\".",
        "nouserspecified": "Musisz podać miano ôd używŏcza.",
        "login-userblocked": "Tyn sprowjorz mo zawarte sprowjyńa. Ńy idźe śe zalogować.",
-       "wrongpassword": "Hasło kere żeś naszkryfloł je felerne. Poprůbůj naszkryflać je jeszcze roz.",
+       "wrongpassword": "Wkludzōny login abo hasło sōm felerne.\nSprōbuj zaś.",
        "wrongpasswordempty": "Hasło kere żeś podou je uostawjůne blank. Naszkryflej je jeszcze roz.",
        "passwordtooshort": "Hasło kere żeś podoł je felerne abo za krůtke.\nHasło muśi mjeć przinojmńij {{PLURAL:$1|1 buchsztaba|$1 buchsztabůw}} a być inksze uod mjana użytkowńika.",
        "password-name-match": "Hasło mo być inksze atoli mjano używocza.",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ôbejzdrzij tyż [[Special:NewPages|listã nowych strōn]])",
        "rcfilters-legend-heading": "<strong>Wykŏz skrōtōw:</strong>",
        "rcfilters-other-review-tools": "Inksze nŏrzyńdzia kōntrole",
+       "rcfilters-savedqueries-cancel-label": "Pociep",
+       "rcfilters-search-placeholder": "Filtruj zmiany (użyj myni abo wyszukej podle filtra)",
+       "rcfilters-filter-user-experience-level-unregistered-description": "Edytorzi, co niy sōm zalogowani.",
        "rcfilters-filter-humans-label": "Czowiek (niy bot)",
+       "rcfilters-filter-pageedits-label": "Edycyje strōny",
+       "rcfilters-filter-newpages-label": "Tworzynie strōn",
+       "rcfilters-filter-logactions-label": "Registrowane czyności",
        "rcfilters-liveupdates-button": "Aktualizacyje na żywo",
        "rcfilters-liveupdates-button-title-on": "Zastŏw aktualizacyje na żywo",
        "rcnotefrom": "Niżyj {{PLURAL:$5|je zmiana|sōm zmiany}} ôd <strong>$3, $4</strong> ({{PLURAL:$5|je pokŏzanŏ|sōm pokŏzane}} nojwyżyj <strong>$1</strong>).",
        "hist": "hist.",
        "hide": "Skryj",
        "show": "Pokŏż",
-       "minoreditletter": "d",
+       "minoreditletter": "m",
        "newpageletter": "N",
        "boteditletter": "b",
        "rc-change-size-new": "$1 {{PLURAL:$1|bajt|bajty|bajtōw}} po zmianie",
        "recentchangeslinked-to": "Pokŏż zmiany na strōnach, co linkujōm do podanyj strōny",
        "upload": "Zaladuj zbiōr",
        "uploadbtn": "Prziślij zbiōr",
-       "reuploaddesc": "Nazod do formulařa uod wćepywańo.",
+       "reuploaddesc": "Pociep przesyłanie i wrōć do formulara.",
        "uploadnologin": "Niy je żeś wlogowany(ŏ)",
        "uploadnologintext": "Muśyš śe [[Special:UserLogin|zalůgować]] ńim wćepńeš pliki.",
        "upload_directory_missing": "Katalog lo wćepywanych plikůw ($1) ńy istńeje a serwer WWW ńy poradźi go utwořić.",
        "upload_directory_read_only": "Serwer ńy može škryflać do katalůgu ($1) kery je přeznačůny na wćepywane pliki.",
        "uploaderror": "Feler při wćepywańu",
-       "uploadtext": "Ůžyj formulařa půńižej do wćepywańo plikůw.\nJak chceš přejřeć dotychčas wćepane pliki, abo w ńich šnupać, přeńdź do [[Special:FileList|listy douůnčůnych plikůw]]. Wšyjstke wćepańo uodnotowane sům we [[Special:Log/upload|rejeře přesůuanych plikůw]], a jygo wyćepańy we [[Special:Log/delete|rejeře wyćepanych]].\n\nPlik pojawi śe na zajće, jak užyješ linka wedle jydnygo s nastympujůncych wzorůw:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Plik.jpg]]</nowiki></code>''' pokože plik we pounyj postaći\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Plik.png|200px|thumb|left|tekst uopisu]]</nowiki></code>''' pokože šyroko na 200 pikseli mińjaturka umjyščůno při lewym margineśe, uotočůno bez ramka, s podpisym „podpis grafiki”\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Plik.ogg]]</nowiki></code>''' dowo bezpostředńi link do plika ńy pokozujůnc go",
+       "uploadtext": "Użyj formulara niżyj, żeby przisłać zbiory.\nŻeby przejzdrzeć abo szukać zaladowane zbiory, idź do [[Special:FileList|listy zaladowanych zbiorōw]], przisłania sōm tyż listowane we [[Special:Log/upload|regeście przisłań]], skasowania sōm we [[Special:Log/delete|regeście skasowań]].\n\nŻeby wrazić zbiōr na strōnã, użyj linka we jednyj ze formōw niżyj:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Zbiōr.jpg]]</nowiki></code></strong>, żeby użyć połnyj wersyje zbioru\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Zbiōr.png|200px|thumb|left|alt text]]</nowiki></code></strong>, żeby użyć 200 pikselōw szyrokõ miniaturã we rōmce przi lewym marginesie ze „alt text” za ôpis\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Zbiōr.ogg]]</nowiki></code></strong>, żeby bezpostrzednio linkować zbiōr bez jego pokazowaniŏ",
        "upload-permitted": "Dopuščalne formaty plikůw: $1.",
        "upload-preferred": "Zalecane formaty plikůw: $1.",
        "upload-prohibited": "Zakozane formaty plikůw: $1.",
        "booksources": "Zdrzōdła ksiōnżek",
        "booksources-search-legend": "Szukej informacyji ô ksiōnżkach",
        "booksources-search": "Szukej",
-       "booksources-text": "Půńiżyj je lista uodnośńikůw do inkszych witryn, kere pośredńiczům we sprzedaży nowych a używanych buchůw, a tyż můgům mjeć dolsze informacyje uo poszukiwanym bez ćebje buchu.",
+       "booksources-text": "Niżyj je wykŏz linkōw do inkszych strōn, co przedŏwajōm nowe i używane ksiōnżki, i mogōm mieć dalsze informacyje ô ksiōnżkach, co ich szukŏsz:",
        "booksources-invalid-isbn": "Podany numer ISBN zostoł rozpoznany kej felerny. Sprowdź aże podany numer je zgodny s numerym kery je we zdrzůdle.",
        "specialloguserlabel": "Fto:",
        "speciallogtitlelabel": "Cyl (nazwa abo {{ns:user}}:miano ôd używŏcza):",
        "table_pager_limit_submit": "Pokož",
        "table_pager_empty": "Brak wynikůw",
        "autosumm-blank": "POZŮR! Usůńjyńće treśći (zajta pozostoła pusto)!",
-       "autosumm-replace": "POZŮR! Zastůmpjyńy treśći hasua bardzo krůtkym tekstym: „$1”",
+       "autosumm-replace": "Zastōmpiynie zawartości tekstym „$1”",
        "autoredircomment": "Przekerowanie do [[$1]]",
        "autosumm-new": "Stworzōnŏ nowõ strōnã: \"$1\"",
        "lag-warn-normal": "Na tyj liśće zmjany nowsze jak {{PLURAL:$1|sekůnda|sekůnd}} můgům ńy być widoczne.",
index bda0a4f..7f242bf 100644 (file)
        "rcfilters-restore-default-filters": "Гадәттәге сөзгечләрне торгызу",
        "rcfilters-clear-all-filters": "Барлык сөзгечләрне бушату",
        "rcfilters-show-new-changes": "$1 башлап яңа үзгәрешләрне карау",
-       "rcfilters-search-placeholder": "ҮзгÓ\99Ñ\80еÑ\88лÓ\99Ñ\80не Ñ\81өзү (менÑ\8e ÐºÑ\83лланÑ\8bгÑ\8bз Ñ\8fки Ñ\81өзгеÑ\87 Ð°Ñ\82Ñ\8b Ð±Ñ\83енÑ\87а Ñ\8dзлигез)",
+       "rcfilters-search-placeholder": "ҮзгÓ\99Ñ\80еÑ\88лÓ\99Ñ\80не Ñ\81өзү (менÑ\8e ÐºÑ\83лланÑ\8bгÑ\8bз Ñ\8fки Ñ\81өзгеÑ\87 Ð¸Ñ\81еме Ð±Ñ\83енÑ\87а Ñ\8dзлÓ\99гез)",
        "rcfilters-search-placeholder-mobile": "Сөзгечләр",
        "rcfilters-invalid-filter": "Яраксыз сөзгеч",
        "rcfilters-filterlist-title": "Сөзгечләр",
        "notargettitle": "Максатсыз",
        "nopagetitle": "Мондый бит юк",
        "nopagetext": "Күрсәтелгән бит юк.",
-       "pager-newer-n": "{{PLURAL:$1|$1 яңарак}}",
-       "pager-older-n": "$1 {{PLURAL:$1|искерәк}}",
+       "pager-newer-n": "{{PLURAL:$1|1 яңарак|$1 яңарак}}",
+       "pager-older-n": "{{PLURAL:$1|1 искерәк|$1 искерәк}}",
        "suppress": "Яшерү",
        "apihelp": "API ярдәм",
        "apihelp-no-such-module": "«$1» модуле табылмады.",
        "apisandbox": "API комлыгы",
-       "apisandbox-reset": "Чистарту",
+       "apisandbox-submit": "Сорату ясарга",
+       "apisandbox-reset": "Бушату",
        "apisandbox-retry": "Кабатлау",
+       "apisandbox-helpurls": "Белешмәгә сылтамалар",
        "apisandbox-examples": "Мисаллар",
        "apisandbox-dynamic-parameters": "Өстәмә параметрлар",
+       "apisandbox-dynamic-parameters-add-label": "Параметр өстәргә:",
+       "apisandbox-dynamic-parameters-add-placeholder": "Параметр исеме",
+       "apisandbox-dynamic-error-exists": "«$1» исемле параметр бар инде.",
+       "apisandbox-templated-parameter-reason": "Бу [[Special:ApiHelp/main#main/templatedparams|калып параметры]] $2 исемлегенең {{PLURAL:$1|мәгънә}} нигезендә тәкъдим ителә.",
+       "apisandbox-deprecated-parameters": "Искергән параметрлар",
+       "apisandbox-fetch-token": "Торенны автотутыру",
+       "apisandbox-add-multi": "Өстәү",
+       "apisandbox-submit-invalid-fields-title": "Кайбер кырлар дөрес түгел",
+       "apisandbox-submit-invalid-fields-message": "Билгеләнгән кырларны төзәтегез һәм яңадан тырышып карагыз.",
        "apisandbox-results": "Нәтиҗәләр",
        "apisandbox-continue": "Дәвам итү",
-       "apisandbox-continue-clear": "ЧиÑ\81Ñ\82аÑ\80ту",
+       "apisandbox-continue-clear": "Ð\91Ñ\83Ñ\88ату",
        "apisandbox-multivalue-all-namespaces": "$1 (Барлык исемнәр киңлекләре)",
        "apisandbox-multivalue-all-values": "$1 (Барлык мәгънәләр)",
        "booksources": "Китап чыганаклары",
        "activeusers": "Актив кулланучылар исемлеге",
        "activeusers-noresult": "Кулланучылар табылмады.",
        "listgrouprights": "Кулланучы төркемнәренең хокуклары",
-       "listgrouprights-key": "Ð\9bегенда:\n* <span class=\"listgrouprights-granted\">Бирелгән хокуклар</span>\n* <span class=\"listgrouprights-revoked\">Алынган хокуклар</span>",
+       "listgrouprights-key": "Ð\90ңлаÑ\82ма:\n* <span class=\"listgrouprights-granted\">Бирелгән хокуклар</span>\n* <span class=\"listgrouprights-revoked\">Алынган хокуклар</span>",
        "listgrouprights-group": "Төркем",
        "listgrouprights-rights": "Хокуклар",
        "listgrouprights-helppage": "Help:Төркемнәрнең хокуклары",
        "confirm": "Раслау",
        "excontent": "эчтәлек: «$1»",
        "excontentauthor": "эчтәлеге: «$1», бердәнбер авторы [[Special:Contributions/$2|$2]] ([[User talk:$2|бәхәс]])",
-       "exbeforeblank": "чистартуга кадәр булган эчтәлек: «$1»",
+       "exbeforeblank": "бушатуга кадәр булган эчтәлек: «$1»",
        "delete-confirm": "«$1» бетерү",
        "delete-legend": "Бетерү",
        "historywarning": "<strong>Игътибар:</strong> Сез бетерергә теләгән биттә үзгәртү тарихы бар, ул $1 {{PLURAL:$1|юрамадан тора}}:",
        "delete_and_move_confirm": "Әйе, битне бетерү",
        "delete_and_move_reason": "Күчерүне мөмкин итәр өчен бетерелде «[[$1]]»",
        "move-leave-redirect": "Юнәлтү калдырылсын",
-       "export": "Битләрне чыгаруы",
+       "export": "Битләрне чыгару",
        "export-submit": "Экспортлау",
        "export-addcattext": "Бу төркемнән битләр өстәү:",
        "export-addcat": "Өстәү",
        "recreate": "Яңадан төзү",
        "unit-pixel": "нкт",
        "confirm_purge_button": "Ярар",
-       "confirm-purge-top": "Бу битнең кэшы чистартылсынмы?",
-       "confirm-purge-bottom": "Кэшны чистартудан соң аның соңгы юрамасы күрсәтеләчәк.",
+       "confirm-purge-top": "Бу битнең кэшын бушатыргамы?",
+       "confirm-purge-bottom": "Кэшны бушатудан соң аның соңгы юрамасы күрсәтеләчәк.",
        "confirm-watch-button": "Ярар",
        "confirm-unwatch-button": "Ярар",
        "confirm-rollback-button": "Ярар",
        "version-software": "Урнаштырылган программа белән тәэмин ителешне",
        "version-software-product": "Продукт",
        "version-software-version": "Версия",
+       "version-entrypoints-header-entrypoint": "Керү урыны",
        "version-entrypoints-header-url": "URL",
        "version-libraries-library": "Китапханә",
        "version-libraries-version": "Версия",
        "redirect-page": "Бит идентификаторы",
        "redirect-revision": "Бит юрамасы",
        "redirect-file": "Файл исеме",
-       "fileduplicatesearch": "Бер үк файлларны эзләү",
+       "redirect-logid": "Көндәлек ID",
+       "redirect-not-exists": "Мәгънәсе табылмады",
+       "redirect-not-numeric": "Мәгънәсе сан зурлыгы түгел",
+       "fileduplicatesearch": "Бердәй файлларны эзләү",
+       "fileduplicatesearch-summary": "Бердәй файлларны хэш-код буенча эзләү.",
        "fileduplicatesearch-filename": "Файл исеме:",
        "fileduplicatesearch-submit": "Эзләү",
        "fileduplicatesearch-info": "$1 × $2 нокта<br />Файл зурлыгы: $3<br />MIME төре: $4",
        "specialpages": "Махсус битләр",
+       "specialpages-note-top": "Аңлатма",
        "specialpages-note-restricted": "* Гади махсус битләр.\n* <span class=\"mw-specialpagerestricted\">Чикләнелгән махсус битләр.</span>",
        "specialpages-group-maintenance": "Техник карау хисапнамәсе",
        "specialpages-group-other": "Башка махсус битләр",
index 4ccd526..f4154b6 100644 (file)
        "datedefault": "預設值",
        "prefs-labs": "實驗中的功能",
        "prefs-user-pages": "使用者頁面",
-       "prefs-personal": "使用者基本資料",
+       "prefs-personal": "用戶資料",
        "prefs-rc": "近期變更",
        "prefs-watchlist": "監視清單",
        "prefs-editwatchlist": "編輯監視清單",
        "listgrouprights-group": "群組",
        "listgrouprights-rights": "權限",
        "listgrouprights-helppage": "Help:使用者群組權限",
-       "listgrouprights-members": "(成員清單)",
+       "listgrouprights-members": "(成員清單)",
        "listgrouprights-addgroup": "加入{{PLURAL:$2|群組}}:$1",
        "listgrouprights-removegroup": "移除{{PLURAL:$2|群組|群組}}:$1",
        "listgrouprights-addgroup-all": "加入所有群組",
index 68a0380..2334a83 100644 (file)
@@ -18,7 +18,8 @@
                        "Wxyveronica",
                        "和平至上",
                        "A2093064",
-                       "WQL"
+                       "WQL",
+                       "Sunny00217"
                ]
        },
        "tog-watchlisthidebots": "隱藏監視清單中機械人的編輯",
        "revdelete-suppress-text": "壓制'''只'''應用於以下的情況:\n* 不合適的個人資料\n*: ''地址、電話號碼、身份證號碼等。''",
        "editundo": "復原",
        "prefs-user-pages": "用戶頁面",
+       "prefs-personal": "用戶資料",
        "username": "{{GENDER:$1|用戶名稱}}:",
        "prefs-help-gender": "可選:用於軟件中的性別指定。此項資料將會被公開。",
        "group-user": "用戶",
index 1a5daca..6ea046e 100644 (file)
@@ -59,11 +59,6 @@ ALIASES                = "type{1}=<b> \1 </b>:" \
                          "codeCoverageIgnore=" \
                          "codingStandardsIgnoreEnd=" \
                          "codingStandardsIgnoreStart=" \
-                         "covers=" \
-                         "dataProvider=" \
-                         "expectedException=" \
-                         "expectedExceptionMessage=" \
-                         "group=" \
                          "phan=" \
                          "suppress="
 TCL_SUBST              =
@@ -112,8 +107,8 @@ SORT_GROUP_NAMES       = NO
 SORT_BY_SCOPE_NAME     = NO
 STRICT_PROTO_MATCHING  = NO
 GENERATE_TODOLIST      = YES
-GENERATE_TESTLIST      = YES
-GENERATE_BUGLIST       = YES
+GENERATE_TESTLIST      = NO
+GENERATE_BUGLIST       = NO
 GENERATE_DEPRECATEDLIST= YES
 ENABLED_SECTIONS       =
 MAX_INITIALIZER_LINES  = 30
index 6faeee8..98a2b59 100644 (file)
@@ -23,6 +23,8 @@
 
 require __DIR__ . '/../commandLine.inc';
 
+use Wikimedia\Rdbms\Database;
+
 /**
  * Maintenance script that upgrade for log_id/log_deleted fields in a
  * replication-safe way.
index 4cc52a4..60f3884 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 require_once __DIR__ . '/Maintenance.php';
 
index d4f9c2d..03035f7 100644 (file)
@@ -20,6 +20,7 @@
  *
  * @file
  * @ingroup Maintenance
+ * @phan-file-suppress PhanUndeclaredProperty Lots of custom properties
  */
 
 require_once __DIR__ . '/Maintenance.php';
index ca67c83..3b7ba63 100644 (file)
@@ -23,7 +23,7 @@
  * @ingroup Maintenance
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 require_once __DIR__ . '/Maintenance.php';
 
index 7a5e93e..7576781 100644 (file)
@@ -267,7 +267,7 @@ U+2B127𫄧|U+07D96綖|
 U+2B128𫄨|U+07D7A絺|
 U+2B137𫄷|U+07E76繶|
 U+2B138𫄸|U+07E81纁|
-U+2B1ED𫇭|U+0853F蔿|
+U+2B1ED𫇭|U+0848D蒍|U+0853F蔿|
 U+2B300𫌀|U+08940襀|
 U+2B363𫍣|U+08A77詷|
 U+2B36F𫍯|U+08AF4諴|
index e1016dc..43c7e61 100644 (file)
 聖吉斯納域斯     圣基茨和尼维斯
 聖克里斯多福及尼維斯 圣基茨和尼维斯
 聖文森及格瑞那丁       圣文森特和格林纳丁斯
+聖文森國   圣文森特和格林纳丁斯
 聖馬利諾   圣马力诺
 蓋亞那      圭亚那
 坦尚尼亞   坦桑尼亚
 提比里西   第比利斯
 巴斯拉      巴士拉
 杜拜 迪拜
+喬治亞字母        格鲁吉亚字母
 坚杜拜      坚杜拜
 堅杜拜      坚杜拜
 賽普勒斯   塞浦路斯
@@ -2728,3 +2730,7 @@ A型肝炎        甲型肝炎
 普立茲獎   普利策奖
 富比士      福布斯
 聖多美普林西比  圣多美和普林西比
+札格瑞布   萨格勒布
+溫荷克      温得和克
+普利托利亞        比勒陀利亚
+阿迪斯阿貝巴     亚的斯亚贝巴
\ No newline at end of file
index 915050b..1eaa387 100644 (file)
 镇里 鎮裏
 》里 》裏
 空里 空裏
+牢里 牢裏
 版本里      版本裏
 苑裡 苑裡
 霄裡 霄裡
 軟體動物   軟體動物
 軟體家具   軟體家具
 網路 網絡
+全角 全形
+全角度      全角度
+全角色      全角色
 人工智慧   人工智能
 航天飞机   穿梭機
 太空梭      穿梭機
 圣基茨和尼维斯  聖吉斯納域斯
 聖克里斯多福及尼維斯 聖吉斯納域斯
 聖文森及格瑞那丁       聖文森特和格林納丁斯
+聖文森國   聖文森特和格林納丁斯
 聖馬利諾   聖馬力諾
 蓋亞那      圭亞那
 坦尚尼亞   坦桑尼亞
 西臺人      赫梯人
 阿联酋      阿聯酋
 迪拜 杜拜
-格鲁吉亚   格魯吉亞
+喬治亞字母        格魯吉亞字母
 提比里西   第比利斯
 諾鲁 瑙魯
 玻里尼西亞        波利尼西亞
@@ -3092,3 +3097,7 @@ IP地址  IP位址
 普利策奖   普立茲獎
 聖多美普林西比  聖多美和普林西比
 塔希提      大溪地
+札格瑞布   薩格勒布
+溫荷克      溫得和克
+普利托利亞        比勒陀利亞
+阿迪斯阿貝巴     亞的斯亞貝巴
\ No newline at end of file
index 6329133..45fef1d 100644 (file)
 高陞 高升
 晉陞 晋升
 歷陞 历升
+尋陞 寻升
 官陞 官升
 榮陞 荣升
 又陞 又升
index 6b5ecdd..39fd1f3 100644 (file)
 三極管      三極體
 软件 軟體
 軟件 軟體
+全角 全形
+全角度      全角度
+全角色      全角色
 人工智能   人工智慧
 航天飞机   太空梭
 穿梭機      太空梭
 布隆迪      蒲隆地
 帕劳 帛琉
 意大利      義大利
+意大利面   義大利麵
 所罗门群岛        索羅門群島
 所羅門群島        索羅門群島
 文莱 汶萊
@@ -808,6 +812,7 @@ IP地址    IP位址
 残奥会      帕運會
 殘奧會      帕運會
 残疾人奥林匹克  帕拉林匹克
+殘疾人奧林匹克  帕拉林匹克
 不列颠哥伦比亚省       卑詩省
 登巴萨      丹帕沙
 登巴薩      丹帕沙
@@ -824,6 +829,12 @@ IP地址   IP位址
 格林納丁斯        格瑞那丁
 空中客车   空中巴士
 普利策奖   普立茲獎
-圣多美和普林西比       聖多美普林西比
-聖多美和普林西比       聖多美普林西比
+多美和普林西比  多美普林西比 #聖多美普林西比
 塔希提      大溪地
+萨格勒布   札格瑞布
+薩格勒布   札格瑞布
+温得和克   溫荷克
+溫得和克   溫荷克
+比勒陀利   普利托利 #普利托利亚
+亚的斯亚贝巴     阿迪斯阿貝巴
+亞的斯亞貝巴     阿迪斯阿貝巴
index 78b5a73..8bd2665 100644 (file)
@@ -6,6 +6,7 @@
 ’m   ’m
 ’t   ’t
 ’re  ’re
+𬞟   蘋
 手塚治虫   手塚治虫
 寇仇 寇讎
 往日无仇   往日無讎
@@ -78,6 +79,7 @@
 乾象曆      乾象曆
 乾象历      乾象曆
 不好干預   不好干預
+可能干預   可能干預
 范文瀾      范文瀾
 機械系      機械系
 頂多 頂多
@@ -97,6 +99,7 @@
 于帥 于帥
 于濤 于濤
 于贈 于贈
+于闐 于闐
 于會泳      于會泳
 于偉國      于偉國
 于光遠      于光遠
 于學忠      于學忠
 于小偉      于小偉
 于山國      于山國
+于山島      于山島
 于幼軍      于幼軍
 于廣洲      于廣洲
 于從濂      于從濂
 更钟情      更鍾情
 更钟爱      更鍾愛
 更钟意      更鍾意
+温嵐 温嵐
index 74064bb..5c30eb8 100644 (file)
@@ -586,6 +586,7 @@ U+08432萲|U+08431萱|
 U+08457著|U+08457著|U+07740着|
 U+08460葠|U+053C2参|
 U+0846F葯|U+0836F药|
+U+0848D蒍|U+2B1ED𫇭|
 U+08493蒓|U+083BC莼|
 U+084C6蓆|U+05E2D席|
 U+084E1蓡|U+053C2参|
index 2cf35ba..522ae31 100644 (file)
 併為一家
 併吞
 並吞下
+入侵並 #分詞用
 提摩太後書
 裏海
 不採
 捲葉蛾
 捲尾猴
 捲積雲
+被捲回
 夸父
 夸克
 夸特
 伊府麵
 藥麵兒
 意大利麵
+意大利面臨
 湯下麵
 茶麵
 麵團
 鹹豬
 甜鹹
 鹹甜
+鹹吃
 甜、鹹
 鹹、甜
 錦綉花園
 幹仗
 包幹
 幹過
+大幹一
 李連杰
 周杰
 杰倫
 不占算
 不好干涉
 不好干預
+可能干預
 不斗膽
 不每只
 不采聲
 詞裡
 》裡
 空裡
+牢裡
 版本裡
 裏白 #植物常用名
 烏蘇里 #分詞用
 于衡
 于贈
 于越
+於越南
 于靖
 于勒
 于格
+於格林
 鳳凰于飛
 于仁泰
 于會泳
 于小偉
 于小彤
 于山國
+于山島
 于幼軍
 于廣洲
 于康震
 關系科
 銹病
 嚐糞
+温嵐
index e48b6ab..1e73540 100644 (file)
@@ -21,7 +21,7 @@
  * @ingroup Maintenance
  */
 
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\Rdbms\IDatabase;
 
 require_once __DIR__ . '/Maintenance.php';
index fddac8a..ec759da 100644 (file)
@@ -26,7 +26,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 
 require_once __DIR__ . '/dumpIterator.php';
 
index 3f48abb..c1170fc 100644 (file)
@@ -22,7 +22,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use Wikimedia\Rdbms\IDatabase;
 
 require_once __DIR__ . '/Maintenance.php';
index 038ef23..5f7f9d5 100644 (file)
@@ -36,7 +36,7 @@ use Wikimedia\Rdbms\IMaintainableDatabase;
  */
 class UserDupes {
        /**
-        * @var Database
+        * @var IMaintainableDatabase
         */
        private $db;
        private $reassigned;
index 180ed65..c414c7b 100644 (file)
@@ -162,10 +162,6 @@ return [
                ],
                'targets' => [ 'mobile', 'desktop' ],
        ],
-       'jquery.checkboxShiftClick' => [
-               'scripts' => 'resources/src/jquery/jquery.checkboxShiftClick.js',
-               'targets' => [ 'desktop', 'mobile' ],
-       ],
        'jquery.chosen' => [
                'scripts' => 'resources/lib/jquery.chosen/chosen.jquery.js',
                'styles' => 'resources/lib/jquery.chosen/chosen.css',
@@ -1663,9 +1659,13 @@ return [
                ]
        ],
        'mediawiki.page.ready' => [
-               'scripts' => 'resources/src/mediawiki.page.ready.js',
+               'localBasePath' => "$IP/resources/src/mediawiki.page.ready",
+               'remoteBasePath' => "$wgResourceBasePath/resources/src/mediawiki.page.ready",
+               'packageFiles' => [
+                       'ready.js',
+                       'checkboxShift.js',
+               ],
                'dependencies' => [
-                       'jquery.checkboxShiftClick',
                        'mediawiki.util',
                        'mediawiki.notify',
                        'mediawiki.api'
diff --git a/resources/src/jquery/jquery.checkboxShiftClick.js b/resources/src/jquery/jquery.checkboxShiftClick.js
deleted file mode 100644 (file)
index 435e23f..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-/**
- * @class jQuery.plugin.checkboxShiftClick
- */
-( function () {
-
-       /**
-        * Enable checkboxes to be checked or unchecked in a row by clicking one,
-        * holding shift and clicking another one.
-        *
-        * @return {jQuery}
-        * @chainable
-        */
-       $.fn.checkboxShiftClick = function () {
-               var prevCheckbox = null,
-                       $box = this;
-               // When our boxes are clicked..
-               $box.on( 'click', function ( e ) {
-                       // And one has been clicked before...
-                       if ( prevCheckbox !== null && e.shiftKey ) {
-                               // Check or uncheck this one and all in-between checkboxes,
-                               // except for disabled ones
-                               $box
-                                       .slice(
-                                               Math.min( $box.index( prevCheckbox ), $box.index( e.target ) ),
-                                               Math.max( $box.index( prevCheckbox ), $box.index( e.target ) ) + 1
-                                       )
-                                       .filter( function () {
-                                               return !this.disabled;
-                                       } )
-                                       .prop( 'checked', !!e.target.checked );
-                       }
-                       // Either way, update the prevCheckbox variable to the one clicked now
-                       prevCheckbox = e.target;
-               } );
-               return $box;
-       };
-
-       /**
-        * @class jQuery
-        * @mixins jQuery.plugin.checkboxShiftClick
-        */
-
-}() );
diff --git a/resources/src/mediawiki.page.ready.js b/resources/src/mediawiki.page.ready.js
deleted file mode 100644 (file)
index 0e59da6..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-( function () {
-       mw.hook( 'wikipage.content' ).add( function ( $content ) {
-               var $sortable, $collapsible;
-
-               $collapsible = $content.find( '.mw-collapsible' );
-               if ( $collapsible.length ) {
-                       // Preloaded by Skin::getDefaultModules()
-                       mw.loader.using( 'jquery.makeCollapsible', function () {
-                               $collapsible.makeCollapsible();
-                       } );
-               }
-
-               $sortable = $content.find( 'table.sortable' );
-               if ( $sortable.length ) {
-                       // Preloaded by Skin::getDefaultModules()
-                       mw.loader.using( 'jquery.tablesorter', function () {
-                               $sortable.tablesorter();
-                       } );
-               }
-
-               // Run jquery.checkboxShiftClick
-               $content.find( 'input[type="checkbox"]:not(.noshiftselect)' ).checkboxShiftClick();
-       } );
-
-       // Things outside the wikipage content
-       $( function () {
-               var $nodes;
-
-               // Add accesskey hints to the tooltips
-               $( '[accesskey]' ).updateTooltipAccessKeys();
-
-               $nodes = $( '.catlinks[data-mw="interface"]' );
-               if ( $nodes.length ) {
-                       /**
-                        * Fired when categories are being added to the DOM
-                        *
-                        * It is encouraged to fire it before the main DOM is changed (when $content
-                        * is still detached).  However, this order is not defined either way, so you
-                        * should only rely on $content itself.
-                        *
-                        * This includes the ready event on a page load (including post-edit loads)
-                        * and when content has been previewed with LivePreview.
-                        *
-                        * @event wikipage_categories
-                        * @member mw.hook
-                        * @param {jQuery} $content The most appropriate element containing the content,
-                        *   such as .catlinks
-                        */
-                       mw.hook( 'wikipage.categories' ).fire( $nodes );
-               }
-
-               $( '#t-print a' ).on( 'click', function ( e ) {
-                       window.print();
-                       e.preventDefault();
-               } );
-
-               // Turn logout to a POST action
-               $( '#pt-logout a' ).on( 'click', function ( e ) {
-                       var api = new mw.Api(),
-                               returnUrl = $( '#pt-logout a' ).attr( 'href' );
-                       mw.notify(
-                               mw.message( 'logging-out-notify' ),
-                               { tag: 'logout', autoHide: false }
-                       );
-                       api.postWithToken( 'csrf', {
-                               action: 'logout'
-                       } ).then(
-                               function () {
-                                       location.href = returnUrl;
-                               },
-                               function ( e ) {
-                                       mw.notify(
-                                               mw.message( 'logout-failed', e ),
-                                               { type: 'error', tag: 'logout', autoHide: false }
-                                       );
-                               }
-                       );
-                       e.preventDefault();
-               } );
-       } );
-
-}() );
diff --git a/resources/src/mediawiki.page.ready/.eslintrc.json b/resources/src/mediawiki.page.ready/.eslintrc.json
new file mode 100644 (file)
index 0000000..ad8dbb3
--- /dev/null
@@ -0,0 +1,5 @@
+{
+       "parserOptions": {
+               "sourceType": "module"
+       }
+}
diff --git a/resources/src/mediawiki.page.ready/checkboxShift.js b/resources/src/mediawiki.page.ready/checkboxShift.js
new file mode 100644 (file)
index 0000000..86e0ec2
--- /dev/null
@@ -0,0 +1,33 @@
+/**
+ * @private
+ * @class mw.plugin.pageready
+ */
+/**
+ * Enable checkboxes to be checked or unchecked in a row by clicking one,
+ * holding shift and clicking another one.
+ *
+ * @method checkboxShift
+ * @param {jQuery} $box
+ */
+module.exports = function ( $box ) {
+       var prev;
+       // When our boxes are clicked..
+       $box.on( 'click', function ( e ) {
+               // And one has been clicked before...
+               if ( prev && e.shiftKey ) {
+                       // Check or uncheck this one and all in-between checkboxes,
+                       // except for disabled ones
+                       $box
+                               .slice(
+                                       Math.min( $box.index( prev ), $box.index( e.target ) ),
+                                       Math.max( $box.index( prev ), $box.index( e.target ) ) + 1
+                               )
+                               .filter( function () {
+                                       return !this.disabled;
+                               } )
+                               .prop( 'checked', e.target.checked );
+               }
+               // Either way, remember this as the last clicked one
+               prev = e.target;
+       } );
+};
diff --git a/resources/src/mediawiki.page.ready/ready.js b/resources/src/mediawiki.page.ready/ready.js
new file mode 100644 (file)
index 0000000..48d605d
--- /dev/null
@@ -0,0 +1,79 @@
+var checkboxShift = require( './checkboxShift.js' );
+mw.hook( 'wikipage.content' ).add( function ( $content ) {
+       var $sortable, $collapsible;
+
+       $collapsible = $content.find( '.mw-collapsible' );
+       if ( $collapsible.length ) {
+               // Preloaded by Skin::getDefaultModules()
+               mw.loader.using( 'jquery.makeCollapsible', function () {
+                       $collapsible.makeCollapsible();
+               } );
+       }
+
+       $sortable = $content.find( 'table.sortable' );
+       if ( $sortable.length ) {
+               // Preloaded by Skin::getDefaultModules()
+               mw.loader.using( 'jquery.tablesorter', function () {
+                       $sortable.tablesorter();
+               } );
+       }
+
+       checkboxShift( $content.find( 'input[type="checkbox"]:not(.noshiftselect)' ) );
+} );
+
+// Handle elements outside the wikipage content
+$( function () {
+       var $nodes;
+
+       // Add accesskey hints to the tooltips
+       $( '[accesskey]' ).updateTooltipAccessKeys();
+
+       $nodes = $( '.catlinks[data-mw="interface"]' );
+       if ( $nodes.length ) {
+               /**
+                * Fired when categories are being added to the DOM
+                *
+                * It is encouraged to fire it before the main DOM is changed (when $content
+                * is still detached).  However, this order is not defined either way, so you
+                * should only rely on $content itself.
+                *
+                * This includes the ready event on a page load (including post-edit loads)
+                * and when content has been previewed with LivePreview.
+                *
+                * @event wikipage_categories
+                * @member mw.hook
+                * @param {jQuery} $content The most appropriate element containing the content,
+                *   such as .catlinks
+                */
+               mw.hook( 'wikipage.categories' ).fire( $nodes );
+       }
+
+       $( '#t-print a' ).on( 'click', function ( e ) {
+               window.print();
+               e.preventDefault();
+       } );
+
+       // Turn logout to a POST action
+       $( '#pt-logout a' ).on( 'click', function ( e ) {
+               var api = new mw.Api(),
+                       url = this.href;
+               mw.notify(
+                       mw.message( 'logging-out-notify' ),
+                       { tag: 'logout', autoHide: false }
+               );
+               api.postWithToken( 'csrf', {
+                       action: 'logout'
+               } ).then(
+                       function () {
+                               location.href = url;
+                       },
+                       function ( err ) {
+                               mw.notify(
+                                       mw.message( 'logout-failed', err ),
+                                       { type: 'error', tag: 'logout', autoHide: false }
+                               );
+                       }
+               );
+               e.preventDefault();
+       } );
+} );
index 8fa0cd6..d34ba0a 100644 (file)
@@ -308,7 +308,16 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
                                throw new MWException( 'All service callbacks must have a return type defined, ' .
                                        "none found for $name" );
                        }
-                       $ret[$name] = [ $name, $fun->getReturnType()->__toString() ];
+
+                       $returnType = $fun->getReturnType();
+
+                       // ReflectionType::__toString() generates deprecation notices in PHP 7.4 and above
+                       // TODO: T228342 - remove this check after MediaWiki only supports PHP 7.1+
+                       if ( is_callable( [ $returnType, 'getName' ] ) ) {
+                               $ret[$name] = [ $name, $returnType->getName() ];
+                       } else {
+                               $ret[$name] = [ $name, $fun->getReturnType()->__toString() ];
+                       }
                }
                return $ret;
        }
index f4d324d..99332d2 100644 (file)
@@ -4,7 +4,6 @@ namespace MediaWiki\Tests\Revision;
 
 use ActorMigration;
 use CommentStore;
-use MediaWiki\Logger\Spi as LoggerSpi;
 use MediaWiki\Revision\RevisionStore;
 use MediaWiki\Revision\RevisionStoreFactory;
 use MediaWiki\Revision\SlotRoleRegistry;
@@ -35,7 +34,7 @@ class RevisionStoreFactoryTest extends \MediaWikiIntegrationTestCase {
                        $this->getMockCommentStore(),
                        ActorMigration::newMigration(),
                        MIGRATION_OLD,
-                       $this->getMockLoggerSpi(),
+                       new NullLogger(),
                        true
                );
                $this->assertTrue( true );
@@ -65,7 +64,7 @@ class RevisionStoreFactoryTest extends \MediaWikiIntegrationTestCase {
                $cache = $this->getHashWANObjectCache();
                $commentStore = $this->getMockCommentStore();
                $actorMigration = ActorMigration::newMigration();
-               $loggerProvider = $this->getMockLoggerSpi();
+               $logger = new NullLogger();
 
                $factory = new RevisionStoreFactory(
                        $lbFactory,
@@ -76,7 +75,7 @@ class RevisionStoreFactoryTest extends \MediaWikiIntegrationTestCase {
                        $commentStore,
                        $actorMigration,
                        $mcrMigrationStage,
-                       $loggerProvider,
+                       $logger,
                        $contentHandlerUseDb
                );
 
@@ -178,16 +177,4 @@ class RevisionStoreFactoryTest extends \MediaWikiIntegrationTestCase {
                return new WANObjectCache( [ 'cache' => new \HashBagOStuff() ] );
        }
 
-       /**
-        * @return \PHPUnit_Framework_MockObject_MockObject|LoggerSpi
-        */
-       private function getMockLoggerSpi() {
-               $mock = $this->getMock( LoggerSpi::class );
-
-               $mock->method( 'getLogger' )
-                       ->willReturn( new NullLogger() );
-
-               return $mock;
-       }
-
 }
index ed4a27f..249fa78 100644 (file)
@@ -850,8 +850,7 @@ class RevisionTest extends MediaWikiTestCase {
                );
 
                $cacheKey = $cache->makeGlobalKey(
-                       'BlobStore',
-                       'address',
+                       'SqlBlobStore-blob',
                        $lb->getLocalDomainID(),
                        'tt:7777'
                );
index 82ccb9a..608d590 100644 (file)
@@ -834,8 +834,23 @@ class TitleTest extends MediaWikiTestCase {
                return [
                        [ Title::makeTitle( NS_SPECIAL, 'Test' ) ],
                        [ Title::makeTitle( NS_MEDIA, 'Test' ) ],
-                       [ Title::makeTitle( NS_MAIN, '', 'Kittens' ) ],
-                       [ Title::makeTitle( NS_MAIN, 'Kittens', '', 'acme' ) ],
+               ];
+       }
+
+       public static function provideGetTalkPage_broken() {
+               // These cases *should* be bad, but are not treated as bad, for backwards compatibility.
+               // See discussion on T227817.
+               return [
+                       [
+                               Title::makeTitle( NS_MAIN, '', 'Kittens' ),
+                               Title::makeTitle( NS_TALK, '' ), // Section is lost!
+                               false,
+                       ],
+                       [
+                               Title::makeTitle( NS_MAIN, 'Kittens', '', 'acme' ),
+                               Title::makeTitle( NS_TALK, 'Kittens', '' ), // Interwiki prefix is lost!
+                               true,
+                       ],
                ];
        }
 
@@ -895,6 +910,23 @@ class TitleTest extends MediaWikiTestCase {
                $title->getTalkPage();
        }
 
+       /**
+        * @dataProvider provideGetTalkPage_broken
+        * @covers Title::getTalkPageIfDefined
+        */
+       public function testGetTalkPage_broken( Title $title, Title $expected, $valid ) {
+               $errorLevel = error_reporting( E_ERROR );
+
+               // NOTE: Eventually we want to throw in this case. But while there is still code that
+               // calls this method without checking, we want to avoid fatal errors.
+               // See discussion on T227817.
+               $result = $title->getTalkPage();
+               $this->assertTrue( $expected->equals( $result ) );
+               $this->assertSame( $valid, $result->isValid() );
+
+               error_reporting( $errorLevel );
+       }
+
        /**
         * @dataProvider provideGetTalkPage_good
         * @covers Title::getTalkPageIfDefined
index 0a2558a..dce1a5f 100644 (file)
@@ -79,15 +79,46 @@ class ApiQuerySiteinfoTest extends ApiTestCase {
                $this->assertSame( 'Need more donations', $data['readonlyreason'] );
        }
 
-       public function testNamespaces() {
-               $this->setMwGlobals( 'wgExtraNamespaces', [ '138' => 'Testing' ] );
+       public function testNamespacesBasic() {
+               $this->assertSame(
+                       array_keys( MediaWikiServices::getInstance()->getContentLanguage()->getFormattedNamespaces() ),
+                       array_keys( $this->doQuery( 'namespaces' ) )
+               );
+       }
 
+       public function testNamespacesExtraNS() {
+               $this->setMwGlobals( 'wgExtraNamespaces', [ '138' => 'Testing' ] );
                $this->assertSame(
                        array_keys( MediaWikiServices::getInstance()->getContentLanguage()->getFormattedNamespaces() ),
                        array_keys( $this->doQuery( 'namespaces' ) )
                );
        }
 
+       public function testNamespacesProtection() {
+               $this->setMwGlobals(
+                       'wgNamespaceProtection',
+                       [
+                               '0' => '',
+                               '2' => [ '' ],
+                               '4' => 'editsemiprotected',
+                               '8' => [
+                                       'editinterface',
+                                       'noratelimit'
+                               ],
+                               '14' => [
+                                       'move-categorypages',
+                                       ''
+                               ]
+                       ]
+               );
+               $data = $this->doQuery( 'namespaces' );
+               $this->assertArrayNotHasKey( 'namespaceprotection', $data['0'] );
+               $this->assertArrayNotHasKey( 'namespaceprotection', $data['2'] );
+               $this->assertSame( 'editsemiprotected', $data['4']['namespaceprotection'] );
+               $this->assertSame( 'editinterface|noratelimit', $data['8']['namespaceprotection'] );
+               $this->assertSame( 'move-categorypages', $data['14']['namespaceprotection'] );
+       }
+
        public function testNamespaceAliases() {
                global $wgNamespaceAliases;
 
index 6a00e67..230d36a 100644 (file)
@@ -6,6 +6,7 @@ use MediaWiki\Block\CompositeBlock;
 use MediaWiki\Block\SystemBlock;
 use MediaWiki\MediaWikiServices;
 use Wikimedia\TestingAccessWrapper;
+use Psr\Log\LoggerInterface;
 
 /**
  * @group Blocking
@@ -48,13 +49,15 @@ class BlockManagerTest extends MediaWikiTestCase {
        private function getBlockManagerConstructorArgs( $overrideConfig ) {
                $blockManagerConfig = array_merge( $this->blockManagerConfig, $overrideConfig );
                $this->setMwGlobals( $blockManagerConfig );
+               $logger = $this->getMockBuilder( LoggerInterface::class )->getMock();
                return [
                        new LoggedServiceOptions(
                                self::$serviceOptionsAccessLog,
                                BlockManager::$constructorOptions,
                                MediaWikiServices::getInstance()->getMainConfig()
                        ),
-                       MediaWikiServices::getInstance()->getPermissionManager()
+                       MediaWikiServices::getInstance()->getPermissionManager(),
+                       $logger
                ];
        }
 
index 3b30d7e..e344d57 100644 (file)
@@ -2422,7 +2422,7 @@ class FileBackendTest extends MediaWikiTestCase {
                        "$base/subdir2/subdir/sub/120-px-file.txt",
                ];
 
-               for ( $i = 0; $i < 25; $i++ ) {
+               for ( $i = 0; $i < 2; $i++ ) {
                        $status = $this->backend->lockFiles( $paths, LockManager::LOCK_EX );
                        $this->assertEquals( print_r( [], true ), print_r( $status->getErrors(), true ),
                                "Locking of files succeeded ($backendName) ($i)." );
index 35eca28..13f2b17 100644 (file)
@@ -13,7 +13,7 @@ use Wikimedia\TestingAccessWrapper;
  * @covers SwiftFileBackendList
  */
 class SwiftFileBackendTest extends MediaWikiTestCase {
-       /** @var TestingAccessWrapper Proxy to SwiftFileBackend */
+       /** @var TestingAccessWrapper|SwiftFileBackend */
        private $backend;
 
        protected function setUp() {
@@ -34,26 +34,28 @@ class SwiftFileBackendTest extends MediaWikiTestCase {
        }
 
        /**
-        * @dataProvider provider_testSanitizeHdrsStrict
+        * @covers SwiftFileBackend::extractMutableContentHeaders
+        * @dataProvider provider_testExtractPostableContentHeaders
         */
-       public function testSanitizeHdrsStrict( $raw, $sanitized ) {
-               $hdrs = $this->backend->sanitizeHdrsStrict( [ 'headers' => $raw ] );
+       public function testExtractPostableContentHeaders( $raw, $sanitized ) {
+               $hdrs = $this->backend->extractMutableContentHeaders( $raw );
 
-               $this->assertEquals( $hdrs, $sanitized, 'sanitizeHdrsStrict() has expected result' );
+               $this->assertEquals( $hdrs, $sanitized, 'Correct extractPostableContentHeaders() result' );
        }
 
-       public static function provider_testSanitizeHdrsStrict() {
+       public static function provider_testExtractPostableContentHeaders() {
                return [
                        [
                                [
                                        'content-length' => 345,
-                                       'content-type'   => 'image+bitmap/jpeg',
+                                       'content-type' => 'image+bitmap/jpeg',
                                        'content-disposition' => 'inline',
                                        'content-duration' => 35.6363,
                                        'content-Custom' => 'hello',
                                        'x-content-custom' => 'hello'
                                ],
                                [
+                                       'content-type' => 'image+bitmap/jpeg',
                                        'content-disposition' => 'inline',
                                        'content-duration' => 35.6363,
                                        'content-custom' => 'hello',
@@ -63,13 +65,14 @@ class SwiftFileBackendTest extends MediaWikiTestCase {
                        [
                                [
                                        'content-length' => 345,
-                                       'content-type'   => 'image+bitmap/jpeg',
+                                       'content-type' => 'image+bitmap/jpeg',
                                        'content-Disposition' => 'inline; filename=xxx; ' . str_repeat( 'o', 1024 ),
                                        'content-duration' => 35.6363,
                                        'content-custom' => 'hello',
                                        'x-content-custom' => 'hello'
                                ],
                                [
+                                       'content-type' => 'image+bitmap/jpeg',
                                        'content-disposition' => 'inline;filename=xxx',
                                        'content-duration' => 35.6363,
                                        'content-custom' => 'hello',
@@ -79,13 +82,14 @@ class SwiftFileBackendTest extends MediaWikiTestCase {
                        [
                                [
                                        'content-length' => 345,
-                                       'content-type'   => 'image+bitmap/jpeg',
+                                       'content-type' => 'image+bitmap/jpeg',
                                        'content-disposition' => 'filename=' . str_repeat( 'o', 1024 ) . ';inline',
                                        'content-duration' => 35.6363,
                                        'content-custom' => 'hello',
                                        'x-content-custom' => 'hello'
                                ],
                                [
+                                       'content-type' => 'image+bitmap/jpeg',
                                        'content-disposition' => '',
                                        'content-duration' => 35.6363,
                                        'content-custom' => 'hello',
@@ -96,75 +100,11 @@ class SwiftFileBackendTest extends MediaWikiTestCase {
        }
 
        /**
-        * @dataProvider provider_testSanitizeHdrs
-        */
-       public function testSanitizeHdrs( $raw, $sanitized ) {
-               $hdrs = $this->backend->sanitizeHdrs( [ 'headers' => $raw ] );
-
-               $this->assertEquals( $hdrs, $sanitized, 'sanitizeHdrs() has expected result' );
-       }
-
-       public static function provider_testSanitizeHdrs() {
-               return [
-                       [
-                               [
-                                       'content-length' => 345,
-                                       'content-type'   => 'image+bitmap/jpeg',
-                                       'content-disposition' => 'inline',
-                                       'content-duration' => 35.6363,
-                                       'content-Custom' => 'hello',
-                                       'x-content-custom' => 'hello'
-                               ],
-                               [
-                                       'content-type'   => 'image+bitmap/jpeg',
-                                       'content-disposition' => 'inline',
-                                       'content-duration' => 35.6363,
-                                       'content-custom' => 'hello',
-                                       'x-content-custom' => 'hello'
-                               ]
-                       ],
-                       [
-                               [
-                                       'content-length' => 345,
-                                       'content-type'   => 'image+bitmap/jpeg',
-                                       'content-Disposition' => 'inline; filename=xxx; ' . str_repeat( 'o', 1024 ),
-                                       'content-duration' => 35.6363,
-                                       'content-custom' => 'hello',
-                                       'x-content-custom' => 'hello'
-                               ],
-                               [
-                                       'content-type'   => 'image+bitmap/jpeg',
-                                       'content-disposition' => 'inline;filename=xxx',
-                                       'content-duration' => 35.6363,
-                                       'content-custom' => 'hello',
-                                       'x-content-custom' => 'hello'
-                               ]
-                       ],
-                       [
-                               [
-                                       'content-length' => 345,
-                                       'content-type'   => 'image+bitmap/jpeg',
-                                       'content-disposition' => 'filename=' . str_repeat( 'o', 1024 ) . ';inline',
-                                       'content-duration' => 35.6363,
-                                       'content-custom' => 'hello',
-                                       'x-content-custom' => 'hello'
-                               ],
-                               [
-                                       'content-type'   => 'image+bitmap/jpeg',
-                                       'content-disposition' => '',
-                                       'content-duration' => 35.6363,
-                                       'content-custom' => 'hello',
-                                       'x-content-custom' => 'hello'
-                               ]
-                       ]
-               ];
-       }
-
-       /**
+        * @covers SwiftFileBackend::extractMetadataHeaders
         * @dataProvider provider_testGetMetadataHeaders
         */
        public function testGetMetadataHeaders( $raw, $sanitized ) {
-               $hdrs = $this->backend->getMetadataHeaders( $raw );
+               $hdrs = $this->backend->extractMetadataHeaders( $raw );
 
                $this->assertEquals( $hdrs, $sanitized, 'getMetadataHeaders() has expected result' );
        }
@@ -188,10 +128,11 @@ class SwiftFileBackendTest extends MediaWikiTestCase {
        }
 
        /**
+        * @covers SwiftFileBackend::getMetadataFromHeaders
         * @dataProvider provider_testGetMetadata
         */
        public function testGetMetadata( $raw, $sanitized ) {
-               $hdrs = $this->backend->getMetadata( $raw );
+               $hdrs = $this->backend->getMetadataFromHeaders( $raw );
 
                $this->assertEquals( $hdrs, $sanitized, 'getMetadata() has expected result' );
        }
index 8eadb0e..ca71d32 100644 (file)
@@ -4,7 +4,7 @@ namespace MediaWiki\Tests\Maintenance;
 
 use ContentHandler;
 use FetchText;
-use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Revision\RevisionRecord;
 use MediaWikiTestCase;
 use MWException;
 use Title;
index 6b674b9..45c6e62 100644 (file)
@@ -3,6 +3,32 @@ const MWBot = require( 'mwbot' );
 // TODO: Once we require Node 7 or later, we can use async-await.
 
 module.exports = {
+       /**
+        * Get a logged-in instance of `MWBot` with edit token already set up.
+        * Default username, password and base URL is used unless specified.
+        *
+        * @since 0.5.0
+        * @param {string} username - Optional
+        * @param {string} password - Optional
+        * @param {string} baseUrl - Optional
+        * @return {Promise<MWBot>}
+        */
+       bot(
+               username = browser.options.username,
+               password = browser.options.password,
+               baseUrl = browser.options.baseUrl
+       ) {
+               const bot = new MWBot();
+
+               return bot.loginGetEditToken( {
+                       apiUrl: `${baseUrl}/api.php`,
+                       username: username,
+                       password: password
+               } ).then( function () {
+                       return bot;
+               } );
+       },
+
        /**
         * Shortcut for `MWBot#edit( .. )`.
         * Default username, password and base URL is used unless specified
@@ -22,15 +48,10 @@ module.exports = {
                password = browser.options.password,
                baseUrl = browser.options.baseUrl
        ) {
-               const bot = new MWBot();
-
-               return bot.loginGetEditToken( {
-                       apiUrl: `${baseUrl}/api.php`,
-                       username: username,
-                       password: password
-               } ).then( function () {
-                       return bot.edit( title, content, `Created or updated page with "${content}"` );
-               } );
+               return this.bot( username, password, baseUrl )
+                       .then( function ( bot ) {
+                               return bot.edit( title, content, `Created or updated page with "${content}"` );
+                       } );
        },
 
        /**
@@ -43,15 +64,10 @@ module.exports = {
         * @return {Object} Promise for API action=delete response data.
         */
        delete( title, reason ) {
-               const bot = new MWBot();
-
-               return bot.loginGetEditToken( {
-                       apiUrl: `${browser.options.baseUrl}/api.php`,
-                       username: browser.options.username,
-                       password: browser.options.password
-               } ).then( function () {
-                       return bot.delete( title, reason );
-               } );
+               return this.bot()
+                       .then( function ( bot ) {
+                               return bot.delete( title, reason );
+                       } );
        },
 
        /**
@@ -94,23 +110,17 @@ module.exports = {
         * @return {Object} Promise for API action=block response data.
         */
        blockUser( username, expiry ) {
-               const bot = new MWBot();
-
-               // Log in as admin
-               return bot.loginGetEditToken( {
-                       apiUrl: `${browser.options.baseUrl}/api.php`,
-                       username: browser.options.username,
-                       password: browser.options.password
-               } ).then( () => {
-                       // block user. default = admin
-                       return bot.request( {
-                               action: 'block',
-                               user: username || browser.options.username,
-                               reason: 'browser test',
-                               token: bot.editToken,
-                               expiry
+               return this.bot()
+                       .then( function ( bot ) {
+                               // block user. default = admin
+                               return bot.request( {
+                                       action: 'block',
+                                       user: username || browser.options.username,
+                                       reason: 'browser test',
+                                       token: bot.editToken,
+                                       expiry
+                               } );
                        } );
-               } );
        },
 
        /**
@@ -122,21 +132,15 @@ module.exports = {
         * @return {Object} Promise for API action=unblock response data.
         */
        unblockUser( username ) {
-               const bot = new MWBot();
-
-               // Log in as admin
-               return bot.loginGetEditToken( {
-                       apiUrl: `${browser.options.baseUrl}/api.php`,
-                       username: browser.options.username,
-                       password: browser.options.password
-               } ).then( () => {
-                       // unblock user. default = admin
-                       return bot.request( {
-                               action: 'unblock',
-                               user: username || browser.options.username,
-                               reason: 'browser test done',
-                               token: bot.editToken
+               return this.bot()
+                       .then( function ( bot ) {
+                               // unblock user. default = admin
+                               return bot.request( {
+                                       action: 'unblock',
+                                       user: username || browser.options.username,
+                                       reason: 'browser test done',
+                                       token: bot.editToken
+                               } );
                        } );
-               } );
        }
 };
index 5be1ed0..bedf171 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -524,7 +524,7 @@ function wfGenerateThumbnail( File $file, array $params, $thumbName, $thumbPath
  * /w/images/thumb/a/ab/Foo.png/120px-Foo.png. The $thumbRel parameter
  * of this function would be set to "a/ab/Foo.png/120px-Foo.png".
  * This method is responsible for turning that into an array
- * with the folowing keys:
+ * with the following keys:
  *  * f => the filename (Foo.png)
  *  * rel404 => the whole thing (a/ab/Foo.png/120px-Foo.png)
  *  * archived => 1 (If the request is for an archived thumb)