Merge "Create UserGetRightsRemove hook"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Sun, 30 Sep 2018 18:12:50 +0000 (18:12 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Sun, 30 Sep 2018 18:12:50 +0000 (18:12 +0000)
189 files changed:
RELEASE-NOTES-1.32
autoload.php
composer.json
docs/extension.schema.v1.json
docs/extension.schema.v2.json
docs/hooks.txt
docs/pageupdater.txt
includes/DefaultSettings.php
includes/EditPage.php
includes/EventRelayerGroup.php
includes/GlobalFunctions.php
includes/MWTimestamp.php
includes/MimeMagic.php [deleted file]
includes/OrderedStreamingForkController.php
includes/OutputPage.php
includes/Revision.php
includes/Revision/RevisionRenderer.php
includes/ServiceWiring.php
includes/SiteStats.php
includes/Storage/DerivedPageDataUpdater.php
includes/Storage/NameTableStore.php
includes/Storage/PageUpdater.php
includes/Storage/RevisionStore.php
includes/Storage/SlotRecord.php
includes/Title.php
includes/actions/McrRestoreAction.php [new file with mode: 0644]
includes/actions/McrUndoAction.php
includes/actions/RawAction.php
includes/api/ApiComparePages.php
includes/api/ApiFeedContributions.php
includes/api/ApiParse.php
includes/api/ApiQueryRevisionsBase.php
includes/api/ApiStashEdit.php
includes/api/i18n/ko.json
includes/api/i18n/uk.json
includes/api/i18n/zh-hant.json
includes/auth/LocalPasswordPrimaryAuthenticationProvider.php
includes/cache/MessageCache.php
includes/changes/OldChangesList.php
includes/changetags/ChangeTags.php
includes/debug/logger/LegacyLogger.php
includes/debug/logger/monolog/LegacyFormatter.php
includes/debug/logger/monolog/LegacyHandler.php
includes/diff/DifferenceEngine.php
includes/exception/MWException.php
includes/exception/MWExceptionHandler.php
includes/exception/MWExceptionRenderer.php
includes/filerepo/FileRepo.php
includes/filerepo/file/File.php
includes/filerepo/file/ForeignDBFile.php
includes/filerepo/file/LocalFile.php
includes/htmlform/fields/HTMLTitleTextField.php
includes/installer/Installer.php
includes/installer/WebInstallerDocument.php
includes/installer/WebInstallerOutput.php
includes/installer/WebInstallerWelcome.php
includes/interwiki/ClassicInterwikiLookup.php
includes/jobqueue/utils/PurgeJobUtils.php
includes/libs/rdbms/database/DatabaseMysqlBase.php
includes/libs/rdbms/loadbalancer/LoadBalancer.php
includes/page/Article.php
includes/page/ImageHistoryPseudoPager.php
includes/page/WikiPage.php
includes/parser/Parser.php
includes/poolcounter/PoolWorkArticleView.php
includes/registration/ExtensionDependencyError.php
includes/registration/ExtensionRegistry.php
includes/registration/VersionChecker.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderModule.php
includes/skins/Skin.php
includes/specials/SpecialExpandTemplates.php
includes/specials/SpecialExport.php
includes/specials/SpecialImport.php
includes/specials/SpecialLog.php
includes/specials/SpecialMostlinkedcategories.php
includes/specials/SpecialNewimages.php
includes/user/User.php
includes/utils/MWFileProps.php
includes/watcheditem/WatchedItemStore.php
languages/i18n/an.json
languages/i18n/ar.json
languages/i18n/arz.json
languages/i18n/ast.json
languages/i18n/be-tarask.json
languages/i18n/bg.json
languages/i18n/cdo.json
languages/i18n/da.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/en.json
languages/i18n/es.json
languages/i18n/fr.json
languages/i18n/ga.json
languages/i18n/gcr.json
languages/i18n/hif-latn.json
languages/i18n/hy.json
languages/i18n/io.json
languages/i18n/it.json
languages/i18n/jv.json
languages/i18n/kjp.json
languages/i18n/ko.json
languages/i18n/lb.json
languages/i18n/lez.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/mnw.json
languages/i18n/mr.json
languages/i18n/my.json
languages/i18n/ne.json
languages/i18n/nl.json
languages/i18n/pl.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/roa-tara.json
languages/i18n/scn.json
languages/i18n/sd.json
languages/i18n/sh.json
languages/i18n/sl.json
languages/i18n/sr-ec.json
languages/i18n/sv.json
languages/i18n/uk.json
languages/i18n/uz.json
languages/i18n/wa.json
languages/i18n/yue.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
maintenance/archives/patch-parsercache.sql
maintenance/dictionary/mediawiki.dic
maintenance/edit.php
maintenance/emptyUserGroup.php [new file with mode: 0644]
maintenance/parse.php
maintenance/populateArchiveRevId.php
maintenance/populateContentTables.php
maintenance/resources/foreign-resources.yaml
maintenance/storage/dumpRev.php
resources/Resources.php
resources/lib/jquery.cookie.js [deleted file]
resources/lib/jquery.cookie/CHANGELOG.md [new file with mode: 0644]
resources/lib/jquery.cookie/MIT-LICENSE.txt [new file with mode: 0644]
resources/lib/jquery.cookie/jquery.cookie.js [new file with mode: 0644]
resources/lib/mustache/mustache.js
resources/src/mediawiki.searchSuggest/searchSuggest.js
resources/src/mediawiki.widgets/mw.widgets.SearchInputWidget.js
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/includes/ExtraParserTest.php
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/Revision/RenderedRevisionTest.php
tests/phpunit/includes/Revision/RevisionRendererTest.php
tests/phpunit/includes/RevisionDbTestBase.php
tests/phpunit/includes/RevisionMcrDbTest.php
tests/phpunit/includes/RevisionMcrReadNewDbTest.php
tests/phpunit/includes/RevisionTest.php
tests/phpunit/includes/Storage/DerivedPageDataUpdaterTest.php
tests/phpunit/includes/Storage/MutableRevisionRecordTest.php
tests/phpunit/includes/Storage/MutableRevisionSlotsTest.php
tests/phpunit/includes/Storage/NoContentModelRevisionStoreDbTest.php
tests/phpunit/includes/Storage/PageUpdaterTest.php
tests/phpunit/includes/Storage/RevisionArchiveRecordTest.php
tests/phpunit/includes/Storage/RevisionQueryInfoTest.php
tests/phpunit/includes/Storage/RevisionRecordTests.php
tests/phpunit/includes/Storage/RevisionSlotsTest.php
tests/phpunit/includes/Storage/RevisionSlotsUpdateTest.php
tests/phpunit/includes/Storage/RevisionStoreDbTestBase.php
tests/phpunit/includes/Storage/RevisionStoreRecordTest.php
tests/phpunit/includes/Storage/RevisionStoreTest.php
tests/phpunit/includes/Storage/SlotRecordTest.php
tests/phpunit/includes/api/ApiErrorFormatterTest.php
tests/phpunit/includes/api/ApiParseTest.php
tests/phpunit/includes/api/ApiQueryWatchlistIntegrationTest.php
tests/phpunit/includes/changetags/ChangeTagsTest.php
tests/phpunit/includes/content/WikitextContentHandlerTest.php
tests/phpunit/includes/db/DatabasePostgresTest.php
tests/phpunit/includes/debug/DeprecationHelperTest.php
tests/phpunit/includes/diff/DifferenceEngineTest.php
tests/phpunit/includes/media/BitmapMetadataHandlerTest.php
tests/phpunit/includes/page/ArticleViewTest.php
tests/phpunit/includes/page/PageArchivePreMcrTest.php
tests/phpunit/includes/page/WikiPageDbTestBase.php
tests/phpunit/includes/parser/ParserMethodsTest.php
tests/phpunit/includes/poolcounter/PoolWorkArticleViewTest.php
tests/phpunit/includes/registration/ExtensionProcessorTest.php
tests/phpunit/includes/registration/VersionCheckerTest.php
tests/phpunit/includes/specials/SpecialLogTest.php [new file with mode: 0644]
tests/selenium/wdio-mediawiki/BlankPage.js
tests/selenium/wdio-mediawiki/LoginPage.js
tests/selenium/wdio-mediawiki/RunJobs.js
tests/selenium/wdio-mediawiki/specs/BlankPage.js

index 48b2be6..d875017 100644 (file)
@@ -111,7 +111,7 @@ production.
 * Updated mediawiki/mediawiki-codesniffer from v20.0.0 to v21.0.0.
 * Updated composer/spdx-licenses from 1.3.0 to 1.4.0.
 * Updated jquery.i18n from 1.0.4 to 1.0.5.
-* Updated wikimedia/timestamp from 1.0.0 to 2.0.0.
+* Updated wikimedia/timestamp from 1.0.0 to 2.2.0.
 * Updated wikimedia/remex-html from 1.0.3 to 2.0.0.
 * Updated jquery from v3.2.1 to v3.3.1.
 
@@ -170,13 +170,15 @@ production.
     content is not being preserved. 'fromsection-{slot}' and 'tosection-{slot}'
     instead expand the given text as if for a section edit. This effectively
     declines T183823 in favor of T185723.
+* (T198214) The 'disabletidy' parameter to action=parse has been
+  deprecated; untidy output will not be supported by future wikitext
+  parsers.
 
 === Action API internal changes in 1.32 ===
 * Added 'ApiParseMakeOutputPage' hook.
 * Parameter names may no longer contain '{' or '}', as these are now used for
   templated parameters.
 * (T194950) Added 'ApiMaxLagInfo' hook.
-* Added 'ApiParseMakeOutputPage' hook.
 * The following methods now take a RevisionRecord rather than a Revision. No
   external callers are known.
   * ApiFeedContributions::feedItemAuthor()
@@ -319,6 +321,13 @@ because of Phabricator reports.
   behaviour which has been deprecated since 1.24.
 * LBFactory, deprecated since 1.28, has been removed. Instead, use
   Wikimedia\Rdbms\LBFactory.
+* The MimeMagic class, deprecated since 1.28 has been removed. Get a
+  MimeAnalyzer instance from MediaWikiServices instead.
+* The '--tidy' option to maintenance/parse.php has been removed.  Tidying
+  the output is now the default.  Use '--no-tidy' to bypass the tidy
+  phase.
+* The global function wfErrorLog, deprecated since 1.25, has now been removed.
+  Use MWLoggerLegacyLogger::emit or UDPTransport.
 
 === Deprecations in 1.32 ===
 * HTMLForm::setSubmitProgressive() is deprecated. No need to call it. Submit
@@ -462,6 +471,9 @@ because of Phabricator reports.
 * QuickTemplate::msgHtml() and BaseTemplate::msgHtml() have been deprecated
   as they promote bad practises. I18n messages should always be properly
   escaped.
+* Skin::getDynamicStylesheetQuery() has been deprecated. It always
+  returns action=raw&ctype=text/css which callers should use directly.
+* Class LegacyFormatter is deprecated.
 
 === Other changes in 1.32 ===
 * (T198811) The following tables have had their UNIQUE indexes turned into
index 96a7dc3..33ee128 100644 (file)
@@ -449,6 +449,7 @@ $wgAutoloadLocalClasses = [
        'EmailNotification' => __DIR__ . '/includes/mail/EmailNotification.php',
        'EmaillingJob' => __DIR__ . '/includes/jobqueue/jobs/EmaillingJob.php',
        'EmptyBagOStuff' => __DIR__ . '/includes/libs/objectcache/EmptyBagOStuff.php',
+       'EmptyUserGroup' => __DIR__ . '/maintenance/emptyUserGroup.php',
        'EnConverter' => __DIR__ . '/languages/classes/LanguageEn.php',
        'EncryptedPassword' => __DIR__ . '/includes/password/EncryptedPassword.php',
        'EnhancedChangesList' => __DIR__ . '/includes/changes/EnhancedChangesList.php',
@@ -849,6 +850,7 @@ $wgAutoloadLocalClasses = [
        'MappedIterator' => __DIR__ . '/includes/libs/MappedIterator.php',
        'MarkpatrolledAction' => __DIR__ . '/includes/actions/MarkpatrolledAction.php',
        'McTest' => __DIR__ . '/maintenance/mctest.php',
+       'McrRestoreAction' => __DIR__ . '/includes/actions/McrRestoreAction.php',
        'McrUndoAction' => __DIR__ . '/includes/actions/McrUndoAction.php',
        'MediaHandler' => __DIR__ . '/includes/media/MediaHandler.php',
        'MediaHandlerFactory' => __DIR__ . '/includes/media/MediaHandlerFactory.php',
@@ -950,7 +952,6 @@ $wgAutoloadLocalClasses = [
        'MigrateFileRepoLayout' => __DIR__ . '/maintenance/migrateFileRepoLayout.php',
        'MigrateUserGroup' => __DIR__ . '/maintenance/migrateUserGroup.php',
        'MimeAnalyzer' => __DIR__ . '/includes/libs/mime/MimeAnalyzer.php',
-       'MimeMagic' => __DIR__ . '/includes/MimeMagic.php',
        'MinifyScript' => __DIR__ . '/maintenance/minify.php',
        'MostcategoriesPage' => __DIR__ . '/includes/specials/SpecialMostcategories.php',
        'MostimagesPage' => __DIR__ . '/includes/specials/SpecialMostimages.php',
index e99fe81..0707f04 100644 (file)
@@ -48,7 +48,7 @@
                "wikimedia/running-stat": "1.2.1",
                "wikimedia/scoped-callback": "2.0.0",
                "wikimedia/utfnormal": "2.0.0",
-               "wikimedia/timestamp": "2.1.1",
+               "wikimedia/timestamp": "2.2.0",
                "wikimedia/wait-condition-loop": "1.0.1",
                "wikimedia/wrappedstring": "3.0.1",
                "wikimedia/xmp-reader": "0.6.0",
@@ -74,7 +74,7 @@
                "wmde/hamcrest-html-matchers": "^0.1.0"
        },
        "suggest": {
-               "ext-apc": "Local data and opcode cache",
+               "ext-apcu": "Local data cache for greatly improved performance",
                "ext-curl": "Improved http communication abilities",
                "ext-fileinfo": "Improved mime magic detection",
                "ext-intl": "ICU integration",
index 0ff169c..e6ec971 100644 (file)
                },
                "requires": {
                        "type": "object",
-                       "description": "Indicates what versions of MediaWiki core or extensions are required. This syntax may be extended in the future, for example to check dependencies between other services.",
+                       "description": "Indicates what versions of PHP, MediaWiki core or extensions are required. This syntax may be extended in the future, for example to check dependencies between other services.",
                        "additionalProperties": false,
                        "properties": {
                                "MediaWiki": {
                                        "type": "string",
                                        "description": "Version constraint string against MediaWiki core."
                                },
+                               "platform": {
+                                       "type": "object",
+                                       "description": "Indicates version constraints against platform services.",
+                                       "additionalProperties": false,
+                                       "properties": {
+                                               "php": {
+                                                       "type": "string",
+                                                       "description": "Version constraint string against PHP."
+                                               }
+                                       }
+                               },
                                "extensions": {
                                        "type": "object",
                                        "description": "Set of version constraint strings against specific extensions."
index 7de5ed5..93bf0d9 100644 (file)
                },
                "requires": {
                        "type": "object",
-                       "description": "Indicates what versions of MediaWiki core or extensions are required. This syntax may be extended in the future, for example to check dependencies between other services.",
+                       "description": "Indicates what versions of PHP, MediaWiki core or extensions are required. This syntax may be extended in the future, for example to check dependencies between other services.",
                        "additionalProperties": false,
                        "properties": {
                                "MediaWiki": {
                                        "type": "string",
                                        "description": "Version constraint string against MediaWiki core."
                                },
+                               "platform": {
+                                       "type": "object",
+                                       "description": "Indicates version constraints against platform services.",
+                                       "additionalProperties": false,
+                                       "properties": {
+                                               "php": {
+                                                       "type": "string",
+                                                       "description": "Version constraint string against PHP."
+                                               }
+                                       }
+                               },
                                "extensions": {
                                        "type": "object",
                                        "description": "Set of version constraint strings against specific extensions."
index 3c3f0a8..d82f56e 100644 (file)
@@ -2353,7 +2353,7 @@ $title: title of the message (string)
 $code: code (string) denoting the language to try.
 
 'MimeMagicGuessFromContent': Allows MW extensions guess the MIME by content.
-$mimeMagic: Instance of MimeMagic.
+$mimeMagic: Instance of MimeAnalyzer.
 &$head: First 1024 bytes of the file in a string (in - Do not alter!).
 &$tail: More or equal than last 65558 bytes of the file in a string
   (in - Do not alter!).
@@ -2362,7 +2362,7 @@ $file: File path.
 
 'MimeMagicImproveFromExtension': Allows MW extensions to further improve the
 MIME type detected by considering the file extension.
-$mimeMagic: Instance of MimeMagic.
+$mimeMagic: Instance of MimeAnalyzer.
 $ext: File extension.
 &$mime: MIME type (in/out).
 
@@ -2370,7 +2370,7 @@ $ext: File extension.
 and the list mapping MIME types to file extensions.
 As an extension author, you are encouraged to submit patches to MediaWiki's
 core to add new MIME types to mime.types.
-$mimeMagic: Instance of MimeMagic.
+$mimeMagic: Instance of MimeAnalyzer.
   Use $mimeMagic->addExtraInfo( $stringOfInfo );
   for adding new MIME info to the list.
   Use $mimeMagic->addExtraTypes( $stringOfTypes );
index 4980c92..54eb91a 100644 (file)
@@ -61,7 +61,7 @@ Typical usage for programmatic revision creation (with $page being a WikiPage as
 replaced by a repository service later):
 
   $updater = $page->newPageUpdater( $user );
-  $updater->setContent( 'main', $content );
+  $updater->setContent( SlotRecord::MAIN, $content );
   $updater->setRcPatrolStatus( RecentChange::PRC_PATROLLED );
   $newRev = $updater->saveRevision( $comment );
 
@@ -69,8 +69,8 @@ Usage with content depending on the parent revision
 
   $updater = $page->newPageUpdater( $user );
   $parent = $updater->grabParentRevision();
-  $content = $parent->getContent( 'main' )->replaceSection( $section, $sectionContent );
-  $updater->setContent( 'main', $content );
+  $content = $parent->getContent( SlotRecord::MAIN )->replaceSection( $section, $sectionContent );
+  $updater->setContent( SlotRecord::MAIN, $content );
   $newRev = $updater->saveRevision( $comment, EDIT_UPDATE );
 
 In both cases, all secondary updates will be triggered automatically.
index d335dcc..96d2e22 100644 (file)
@@ -1380,14 +1380,14 @@ $wgAntivirusRequired = true;
 $wgVerifyMimeType = true;
 
 /**
- * Sets the MIME type definition file to use by MimeMagic.php.
+ * Sets the MIME type definition file to use by includes/libs/mime/MimeAnalyzer.php.
  * Set to null, to use built-in defaults only.
  * example: $wgMimeTypeFile = '/etc/mime.types';
  */
 $wgMimeTypeFile = 'includes/mime.types';
 
 /**
- * Sets the MIME type info file to use by MimeMagic.php.
+ * Sets the MIME type info file to use by includes/libs/mime/MimeAnalyzer.php.
  * Set to null, to use built-in defaults only.
  */
 $wgMimeInfoFile = 'includes/mime.info';
@@ -1931,7 +1931,7 @@ $wgDBprefix = '';
 /**
  * MySQL table options to use during installation or update
  */
-$wgDBTableOptions = 'ENGINE=InnoDB';
+$wgDBTableOptions = 'ENGINE=InnoDB, DEFAULT CHARSET=binary';
 
 /**
  * SQL Mode - default is turning off all modes, including strict, if set.
@@ -8017,6 +8017,7 @@ $wgActions = [
        'info' => true,
        'markpatrolled' => true,
        'mcrundo' => McrUndoAction::class,
+       'mcrrestore' => McrRestoreAction::class,
        'protect' => true,
        'purge' => true,
        'raw' => true,
index f1f0572..8c4b3c8 100644 (file)
@@ -1222,7 +1222,9 @@ class EditPage {
                                                !$undorev->isDeleted( Revision::DELETED_TEXT ) &&
                                                !$oldrev->isDeleted( Revision::DELETED_TEXT )
                                        ) {
-                                               if ( WikiPage::hasDifferencesOutsideMainSlot( $undorev, $oldrev ) ) {
+                                               if ( WikiPage::hasDifferencesOutsideMainSlot( $undorev, $oldrev )
+                                                       || !$this->isSupportedContentModel( $oldrev->getContentModel() )
+                                               ) {
                                                        // Hack for undo while EditPage can't handle multi-slot editing
                                                        $this->context->getOutput()->redirect( $this->mTitle->getFullURL( [
                                                                'action' => 'mcrundo',
@@ -1304,6 +1306,32 @@ class EditPage {
                                                $this->context->msg( 'undo-' . $undoMsg )->plain() . '</div>', true, /* interface */true );
                                }
 
+                               if ( $content === false ) {
+                                       // Hack for restoring old revisions while EditPage
+                                       // can't handle multi-slot editing.
+
+                                       $curRevision = $this->page->getRevision();
+                                       $oldRevision = $this->mArticle->getRevisionFetched();
+
+                                       if ( $curRevision
+                                               && $oldRevision
+                                               && $curRevision->getId() !== $oldRevision->getId()
+                                               && ( WikiPage::hasDifferencesOutsideMainSlot( $oldRevision, $curRevision )
+                                                       || !$this->isSupportedContentModel( $oldRevision->getContentModel() ) )
+                                       ) {
+                                               $this->context->getOutput()->redirect(
+                                                       $this->mTitle->getFullURL(
+                                                               [
+                                                                       'action' => 'mcrrestore',
+                                                                       'restore' => $oldRevision->getId(),
+                                                               ]
+                                                       )
+                                               );
+
+                                               return false;
+                                       }
+                               }
+
                                if ( $content === false ) {
                                        $content = $this->getOriginalContent( $user );
                                }
@@ -2688,7 +2716,7 @@ ERROR;
         *
         * @param string|null|bool $text Text to unserialize
         * @return Content|bool|null The content object created from $text. If $text was false
-        *   or null, false resp. null will be  returned instead.
+        *   or null, then false or null will be returned instead.
         *
         * @throws MWException If unserializing the text results in a Content
         *   object that is not an instance of TextContent and
index 18b1cd3..95d11d9 100644 (file)
@@ -44,6 +44,7 @@ class EventRelayerGroup {
         * @return EventRelayerGroup
         */
        public static function singleton() {
+               wfDeprecated( __METHOD__, '1.27' );
                return MediaWikiServices::getInstance()->getEventRelayerGroup();
        }
 
index 336cb89..c769b0a 100644 (file)
@@ -1147,26 +1147,6 @@ function wfLogWarning( $msg, $callerOffset = 1, $level = E_USER_WARNING ) {
        MWDebug::warning( $msg, $callerOffset + 1, $level, 'production' );
 }
 
-/**
- * Log to a file without getting "file size exceeded" signals.
- *
- * Can also log to TCP or UDP with the syntax udp://host:port/prefix. This will
- * send lines to the specified port, prefixed by the specified prefix and a space.
- * @since 1.25 support for additional context data
- *
- * @param string $text
- * @param string $file Filename
- * @param array $context Additional logging context data
- * @throws MWException
- * @deprecated since 1.25 Use \MediaWiki\Logger\LegacyLogger::emit or UDPTransport
- */
-function wfErrorLog( $text, $file, array $context = [] ) {
-       wfDeprecated( __METHOD__, '1.25' );
-       $logger = LoggerFactory::getInstance( 'wfErrorLog' );
-       $context['destination'] = $file;
-       $logger->info( trim( $text ), $context );
-}
-
 /**
  * @todo document
  * @todo Move logic to MediaWiki.php
index d28169f..02a3d2c 100644 (file)
@@ -93,9 +93,9 @@ class MWTimestamp extends ConvertibleTimestamp {
                        if ( $tz ) {
                                $this->timestamp->setTimezone( $tz );
                                return new DateInterval( 'P0Y' );
-                       } else {
-                               $data[0] = 'Offset';
                        }
+
+                       $data[0] = 'Offset';
                }
 
                $diff = 0;
@@ -189,9 +189,9 @@ class MWTimestamp extends ConvertibleTimestamp {
                $msg = wfMessage( $key );
                if ( $msg->exists() ) {
                        return $msg;
-               } else {
-                       return new RawMessage( $tzMsg );
                }
+
+               return new RawMessage( $tzMsg );
        }
 
        /**
diff --git a/includes/MimeMagic.php b/includes/MimeMagic.php
deleted file mode 100644 (file)
index 6152d22..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-<?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
- */
-use MediaWiki\MediaWikiServices;
-use Wikimedia\Assert\Assert;
-
-/**
- * @deprecated since 1.29
- * MimeAnalyzer should be used instead of MimeMagic
- */
-class MimeMagic extends MimeAnalyzer {
-       /**
-        * Get an instance of this class
-        * @return MimeMagic
-        * @deprecated since 1.28 get a MimeAnalyzer instance from MediaWikiServices
-        */
-       public static function singleton() {
-               wfDeprecated( __METHOD__, '1.28' );
-               // XXX: We know that the MimeAnalyzer is currently an instance of MimeMagic
-               $instance = MediaWikiServices::getInstance()->getMimeAnalyzer();
-               Assert::postcondition(
-                       $instance instanceof MimeMagic,
-                       __METHOD__ . ' should return an instance of ' . self::class
-               );
-               return $instance;
-       }
-}
index ff29cb5..11abc81 100644 (file)
@@ -134,9 +134,12 @@ class OrderedStreamingForkController extends ForkController {
         */
        protected function consumeNoFork() {
                while ( !feof( $this->input ) ) {
-                       $line = trim( fgets( $this->input ) );
-                       if ( $line ) {
-                               $result = call_user_func( $this->workCallback, $line );
+                       $data = fgets( $this->input );
+                       if ( $data[ strlen( $data ) - 1 ] == "\n" ) {
+                               $data = substr( $data, 0, -1 );
+                       }
+                       if ( strlen( $data ) !== 0 ) {
+                               $result = call_user_func( $this->workCallback, $data );
                                fwrite( $this->output, "$result\n" );
                        }
                }
@@ -160,8 +163,12 @@ class OrderedStreamingForkController extends ForkController {
                                        $this->updateAvailableSockets( $sockets, $used, $sockets ? 0 : 5 );
                                } while ( !$sockets );
                        }
-                       $data = trim( $data );
-                       if ( !$data ) {
+                       // Strip the trailing \n. The last line of a file might not have a trailing
+                       // \n though
+                       if ( $data[ strlen( $data ) - 1 ] == "\n" ) {
+                               $data = substr( $data, 0, -1 );
+                       }
+                       if ( strlen( $data ) === 0 ) {
                                continue;
                        }
                        $socket = array_pop( $sockets );
index 99a4c2b..2bfccda 100644 (file)
@@ -1766,7 +1766,8 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Add wikitext with a custom Title object
+        * Add wikitext with a custom Title object.
+        * Output is unwrapped.
         *
         * @param string $text Wikitext
         * @param Title $title
@@ -1793,6 +1794,7 @@ class OutputPage extends ContextSource {
 
                $this->addParserOutput( $parserOutput, [
                        'enableSectionEditLinks' => false,
+                       'wrapperDivClass' => '',
                ] );
        }
 
index 1e35dda..a55b1c4 100644 (file)
@@ -691,7 +691,7 @@ class Revision implements IDBAccessObject {
         * @return SlotRecord
         */
        private function getMainSlotRaw() {
-               return $this->mRecord->getSlot( 'main', RevisionRecord::RAW );
+               return $this->mRecord->getSlot( SlotRecord::MAIN, RevisionRecord::RAW );
        }
 
        /**
@@ -926,7 +926,7 @@ class Revision implements IDBAccessObject {
                }
 
                try {
-                       return $this->mRecord->getContent( 'main', $audience, $user );
+                       return $this->mRecord->getContent( SlotRecord::MAIN, $audience, $user );
                }
                catch ( RevisionAccessException $e ) {
                        return null;
index f71f9e7..c937376 100644 (file)
@@ -25,6 +25,7 @@ namespace MediaWiki\Revision;
 use Html;
 use InvalidArgumentException;
 use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Storage\SlotRecord;
 use ParserOptions;
 use ParserOutput;
 use Psr\Log\LoggerInterface;
@@ -165,15 +166,15 @@ class RevisionRenderer {
                $withHtml = $hints['generate-html'] ?? true;
 
                // short circuit if there is only the main slot
-               if ( array_keys( $slots ) === [ 'main' ] ) {
-                       return $rrev->getSlotParserOutput( 'main' );
+               if ( array_keys( $slots ) === [ SlotRecord::MAIN ] ) {
+                       return $rrev->getSlotParserOutput( SlotRecord::MAIN );
                }
 
                // TODO: put fancy layout logic here, see T200915.
 
                // move main slot to front
-               if ( isset( $slots['main'] ) ) {
-                       $slots = [ 'main' => $slots['main'] ] + $slots;
+               if ( isset( $slots[SlotRecord::MAIN] ) ) {
+                       $slots = [ SlotRecord::MAIN => $slots[SlotRecord::MAIN] ] + $slots;
                }
 
                $combinedOutput = new ParserOutput( null );
index b8bd5d2..cf2def2 100644 (file)
@@ -321,8 +321,7 @@ return [
                        };
                }
 
-               // XXX: MimeMagic::singleton currently requires this service to return an instance of MimeMagic
-               return new MimeMagic( $params );
+               return new MimeAnalyzer( $params );
        },
 
        'NameTableStoreFactory' => function ( MediaWikiServices $services ) : NameTableStoreFactory {
index 745c891..e3cb617 100644 (file)
@@ -149,11 +149,12 @@ class SiteStats {
         */
        public static function numberingroup( $group ) {
                $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
+               $fname = __METHOD__;
 
                return $cache->getWithSetCallback(
                        $cache->makeKey( 'SiteStats', 'groupcounts', $group ),
                        $cache::TTL_HOUR,
-                       function ( $oldValue, &$ttl, array &$setOpts ) use ( $group ) {
+                       function ( $oldValue, &$ttl, array &$setOpts ) use ( $group, $fname ) {
                                $dbr = self::getLB()->getConnection( DB_REPLICA );
                                $setOpts += Database::getCacheSetOptions( $dbr );
 
@@ -164,7 +165,7 @@ class SiteStats {
                                                'ug_group' => $group,
                                                'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() )
                                        ],
-                                       __METHOD__
+                                       $fname
                                );
                        },
                        [ 'pcTTL' => $cache::TTL_PROC_LONG ]
@@ -199,11 +200,12 @@ class SiteStats {
         */
        public static function pagesInNs( $ns ) {
                $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
+               $fname = __METHOD__;
 
                return $cache->getWithSetCallback(
                        $cache->makeKey( 'SiteStats', 'page-in-namespace', $ns ),
                        $cache::TTL_HOUR,
-                       function ( $oldValue, &$ttl, array &$setOpts ) use ( $ns ) {
+                       function ( $oldValue, &$ttl, array &$setOpts ) use ( $ns, $fname ) {
                                $dbr = self::getLB()->getConnection( DB_REPLICA );
                                $setOpts += Database::getCacheSetOptions( $dbr );
 
@@ -211,7 +213,7 @@ class SiteStats {
                                        'page',
                                        'COUNT(*)',
                                        [ 'page_namespace' => $ns ],
-                                       __METHOD__
+                                       $fname
                                );
                        },
                        [ 'pcTTL' => $cache::TTL_PROC_LONG ]
index e34e406..3f3b0cf 100644 (file)
@@ -659,7 +659,7 @@ class DerivedPageDataUpdater implements IDBAccessObject {
                }
 
                // TODO: MCR: ask all slots if they have links [SlotHandler/PageTypeHandler]
-               $mainContent = $this->getRawContent( 'main' );
+               $mainContent = $this->getRawContent( SlotRecord::MAIN );
                return $mainContent->isCountable( $hasLinks );
        }
 
@@ -668,7 +668,7 @@ class DerivedPageDataUpdater implements IDBAccessObject {
         */
        public function isRedirect() {
                // NOTE: main slot determines redirect status
-               $mainContent = $this->getRawContent( 'main' );
+               $mainContent = $this->getRawContent( SlotRecord::MAIN );
 
                return $mainContent->isRedirect();
        }
@@ -680,7 +680,7 @@ class DerivedPageDataUpdater implements IDBAccessObject {
         */
        private function revisionIsRedirect( RevisionRecord $rev ) {
                // NOTE: main slot determines redirect status
-               $mainContent = $rev->getContent( 'main', RevisionRecord::RAW );
+               $mainContent = $rev->getContent( SlotRecord::MAIN, RevisionRecord::RAW );
 
                return $mainContent->isRedirect();
        }
@@ -751,8 +751,8 @@ class DerivedPageDataUpdater implements IDBAccessObject {
                $stashedEdit = false;
 
                // TODO: MCR: allow output for all slots to be stashed.
-               if ( $useStash && $slotsUpdate->isModifiedSlot( 'main' ) ) {
-                       $mainContent = $slotsUpdate->getModifiedSlot( 'main' )->getContent();
+               if ( $useStash && $slotsUpdate->isModifiedSlot( SlotRecord::MAIN ) ) {
+                       $mainContent = $slotsUpdate->getModifiedSlot( SlotRecord::MAIN )->getContent();
                        $legacyUser = User::newFromIdentity( $user );
                        $stashedEdit = ApiStashEdit::checkCache( $title, $mainContent, $legacyUser );
                }
@@ -807,7 +807,7 @@ class DerivedPageDataUpdater implements IDBAccessObject {
                                // No PST for inherited slots! Note that "modified" slots may still be inherited
                                // from an earlier version, e.g. for rollbacks.
                                $pstSlot = $slot;
-                       } elseif ( $role === 'main' && $stashedEdit ) {
+                       } elseif ( $role === SlotRecord::MAIN && $stashedEdit ) {
                                // TODO: MCR: allow PST content for all slots to be stashed.
                                $pstSlot = SlotRecord::newUnsaved( $role, $stashedEdit->pstContent );
                        } else {
@@ -1223,11 +1223,11 @@ class DerivedPageDataUpdater implements IDBAccessObject {
 
                $preparedEdit->popts = $this->getCanonicalParserOptions();
                $preparedEdit->output = $this->getCanonicalParserOutput();
-               $preparedEdit->pstContent = $this->revision->getContent( 'main' );
+               $preparedEdit->pstContent = $this->revision->getContent( SlotRecord::MAIN );
                $preparedEdit->newContent =
-                       $slotsUpdate->isModifiedSlot( 'main' )
-                       ? $slotsUpdate->getModifiedSlot( 'main' )->getContent()
-                       : $this->revision->getContent( 'main' ); // XXX: can we just remove this?
+                       $slotsUpdate->isModifiedSlot( SlotRecord::MAIN )
+                       ? $slotsUpdate->getModifiedSlot( SlotRecord::MAIN )->getContent()
+                       : $this->revision->getContent( SlotRecord::MAIN ); // XXX: can we just remove this?
                $preparedEdit->oldContent = null; // unused. // XXX: could get this from the parent revision
                $preparedEdit->revid = $this->revision ? $this->revision->getId() : null;
                $preparedEdit->timestamp = $preparedEdit->output->getCacheTime();
@@ -1394,7 +1394,7 @@ class DerivedPageDataUpdater implements IDBAccessObject {
 
                // TODO: MCR: check if *any* changed slot supports categories!
                if ( $this->rcWatchCategoryMembership
-                       && $this->getContentHandler( 'main' )->supportsCategories() === true
+                       && $this->getContentHandler( SlotRecord::MAIN )->supportsCategories() === true
                        && ( $this->options['changed'] || $this->options['created'] )
                        && !$this->options['restored']
                ) {
@@ -1459,7 +1459,7 @@ class DerivedPageDataUpdater implements IDBAccessObject {
                ) );
 
                // TODO: make search infrastructure aware of slots!
-               $mainSlot = $this->revision->getSlot( 'main' );
+               $mainSlot = $this->revision->getSlot( SlotRecord::MAIN );
                if ( !$mainSlot->isInherited() && !$this->isContentDeleted() ) {
                        DeferredUpdates::addUpdate( new SearchUpdate( $id, $dbKey, $mainSlot->getContent() ) );
                }
@@ -1493,9 +1493,9 @@ class DerivedPageDataUpdater implements IDBAccessObject {
                }
 
                if ( $title->getNamespace() == NS_MEDIAWIKI
-                       && $this->getRevisionSlotsUpdate()->isModifiedSlot( 'main' )
+                       && $this->getRevisionSlotsUpdate()->isModifiedSlot( SlotRecord::MAIN )
                ) {
-                       $mainContent = $this->isContentDeleted() ? null : $this->getRawContent( 'main' );
+                       $mainContent = $this->isContentDeleted() ? null : $this->getRawContent( SlotRecord::MAIN );
 
                        $this->messageCache->updateMessageOverride( $title, $mainContent );
                }
index 6c7919d..c1dd09d 100644 (file)
@@ -262,11 +262,12 @@ class NameTableStore {
                if ( array_key_exists( $id, $table ) ) {
                        return $table[$id];
                }
+               $fname = __METHOD__;
 
                $table = $this->cache->getWithSetCallback(
                        $this->getCacheKey(),
                        $this->cacheTTL,
-                       function ( $oldValue, &$ttl, &$setOpts ) use ( $id ) {
+                       function ( $oldValue, &$ttl, &$setOpts ) use ( $id, $fname ) {
                                // Check if cached value is up-to-date enough to have $id
                                if ( is_array( $oldValue ) && array_key_exists( $id, $oldValue ) ) {
                                        // Completely leave the cache key alone
@@ -279,7 +280,7 @@ class NameTableStore {
                                        // Log a fallback to master
                                        if ( $source === DB_MASTER ) {
                                                $this->logger->info(
-                                                       __METHOD__ . 'falling back to master select from ' .
+                                                       $fname . ' falling back to master select from ' .
                                                        $this->table . ' with id ' . $id
                                                );
                                        }
index 1621213..29ce710 100644 (file)
@@ -388,7 +388,7 @@ class PageUpdater {
         * @param string $role A slot role name (but not "main")
         */
        public function removeSlot( $role ) {
-               if ( $role === 'main' ) {
+               if ( $role === SlotRecord::MAIN ) {
                        throw new InvalidArgumentException( 'Cannot remove the main slot!' );
                }
 
@@ -635,7 +635,7 @@ class PageUpdater {
 
                // Make sure the given content type is allowed for this page
                // TODO: decide: Extend check to other slots? Consider the role in check? [PageType]
-               $mainContentHandler = $this->getContentHandler( 'main' );
+               $mainContentHandler = $this->getContentHandler( SlotRecord::MAIN );
                if ( !$mainContentHandler->canBeUsedOn( $this->getTitle() ) ) {
                        $this->status = Status::newFatal( 'content-not-allowed-here',
                                ContentHandler::getLocalizedName( $mainContentHandler->getModelID() ),
@@ -701,7 +701,7 @@ class PageUpdater {
                 */
                $this->derivedDataUpdater->getCanonicalParserOutput();
 
-               $mainContent = $this->derivedDataUpdater->getSlots()->getContent( 'main' );
+               $mainContent = $this->derivedDataUpdater->getSlots()->getContent( SlotRecord::MAIN );
 
                // Trigger pre-save hook (using provided edit summary)
                $hookStatus = Status::newGood( [] );
@@ -1049,7 +1049,7 @@ class PageUpdater {
        private function doCreate( CommentStoreComment $summary, User $user, $flags ) {
                $wikiPage = $this->getWikiPage(); // TODO: use for legacy hooks only!
 
-               if ( !$this->derivedDataUpdater->getSlots()->hasSlot( 'main' ) ) {
+               if ( !$this->derivedDataUpdater->getSlots()->hasSlot( SlotRecord::MAIN ) ) {
                        throw new PageUpdateException( 'Must provide a main slot when creating a page!' );
                }
 
@@ -1186,7 +1186,7 @@ class PageUpdater {
                                $hints['causeAgent'] = $user->getName();
 
                                $newLegacyRevision = new Revision( $newRevisionRecord );
-                               $mainContent = $newRevisionRecord->getContent( 'main', RevisionRecord::RAW );
+                               $mainContent = $newRevisionRecord->getContent( SlotRecord::MAIN, RevisionRecord::RAW );
 
                                // Update links tables, site stats, etc.
                                $this->derivedDataUpdater->prepareUpdate( $newRevisionRecord, $hints );
index 61b428f..bab1b5e 100644 (file)
@@ -437,21 +437,25 @@ class RevisionStore
                $slotRoles = $rev->getSlotRoles();
 
                // Make sure the main slot is always provided throughout migration
-               if ( !in_array( 'main', $slotRoles ) ) {
+               if ( !in_array( SlotRecord::MAIN, $slotRoles ) ) {
                        throw new InvalidArgumentException(
                                'main slot must be provided'
                        );
                }
 
                // If we are not writing into the new schema, we can't support extra slots.
-               if ( !$this->hasMcrSchemaFlags( SCHEMA_COMPAT_WRITE_NEW ) && $slotRoles !== [ 'main' ] ) {
+               if ( !$this->hasMcrSchemaFlags( SCHEMA_COMPAT_WRITE_NEW )
+                       && $slotRoles !== [ SlotRecord::MAIN ]
+               ) {
                        throw new InvalidArgumentException(
                                'Only the main slot is supported when not writing to the MCR enabled schema!'
                        );
                }
 
                // As long as we are not reading from the new schema, we don't want to write extra slots.
-               if ( !$this->hasMcrSchemaFlags( SCHEMA_COMPAT_READ_NEW ) && $slotRoles !== [ 'main' ] ) {
+               if ( !$this->hasMcrSchemaFlags( SCHEMA_COMPAT_READ_NEW )
+                       && $slotRoles !== [ SlotRecord::MAIN ]
+               ) {
                        throw new InvalidArgumentException(
                                'Only the main slot is supported when not reading from the MCR enabled schema!'
                        );
@@ -519,7 +523,7 @@ class RevisionStore
                // Technically, this could go away after MCR migration: while
                // calling code may require a main slot to exist, RevisionStore
                // really should not know or care about that requirement.
-               $rev->getSlot( 'main', RevisionRecord::RAW );
+               $rev->getSlot( SlotRecord::MAIN, RevisionRecord::RAW );
 
                foreach ( $slotRoles as $role ) {
                        $slot = $rev->getSlot( $role, RevisionRecord::RAW );
@@ -594,7 +598,7 @@ class RevisionStore
                                $newSlots[$role] = $slot;
 
                                // Write the main slot's text ID to the revision table for backwards compatibility
-                               if ( $slot->getRole() === 'main'
+                               if ( $slot->getRole() === SlotRecord::MAIN
                                        && $this->hasMcrSchemaFlags( SCHEMA_COMPAT_WRITE_OLD )
                                ) {
                                        $blobAddress = $slot->getAddress();
@@ -672,7 +676,7 @@ class RevisionStore
                $contentId = null;
 
                // Write the main slot's text ID to the revision table for backwards compatibility
-               if ( $protoSlot->getRole() === 'main'
+               if ( $protoSlot->getRole() === SlotRecord::MAIN
                        && $this->hasMcrSchemaFlags( SCHEMA_COMPAT_WRITE_OLD )
                ) {
                        // If SCHEMA_COMPAT_WRITE_NEW is also set, the fake content ID is overwritten
@@ -876,7 +880,7 @@ class RevisionStore
 
                if ( $this->hasMcrSchemaFlags( SCHEMA_COMPAT_WRITE_OLD ) ) {
                        // In non MCR mode this IF section will relate to the main slot
-                       $mainSlot = $rev->getSlot( 'main' );
+                       $mainSlot = $rev->getSlot( SlotRecord::MAIN );
                        $model = $mainSlot->getModel();
                        $format = $mainSlot->getFormat();
 
@@ -1209,7 +1213,7 @@ class RevisionStore
         */
        private function emulateMainSlot_1_29( $row, $queryFlags, Title $title ) {
                $mainSlotRow = new stdClass();
-               $mainSlotRow->role_name = 'main';
+               $mainSlotRow->role_name = SlotRecord::MAIN;
                $mainSlotRow->model_name = null;
                $mainSlotRow->slot_revision_id = null;
                $mainSlotRow->slot_content_id = null;
@@ -1358,7 +1362,7 @@ class RevisionStore
                        $mainSlotRow->slot_content_id =
                                function ( SlotRecord $slot ) use ( $queryFlags, $mainSlotRow ) {
                                        $db = $this->getDBConnectionRefForQueryFlags( $queryFlags );
-                                       return $this->findSlotContentId( $db, $mainSlotRow->slot_revision_id, 'main' );
+                                       return $this->findSlotContentId( $db, $mainSlotRow->slot_revision_id, SlotRecord::MAIN );
                                };
                }
 
@@ -1609,7 +1613,7 @@ class RevisionStore
                        $slots[$row->role_name] = new SlotRecord( $row, $contentCallback );
                }
 
-               if ( !isset( $slots['main'] ) ) {
+               if ( !isset( $slots[SlotRecord::MAIN] ) ) {
                        throw new RevisionAccessException(
                                'Main slot of revision ' . $revId . ' not found in database!'
                        );
@@ -1640,7 +1644,7 @@ class RevisionStore
        ) {
                if ( !$this->hasMcrSchemaFlags( SCHEMA_COMPAT_READ_NEW ) ) {
                        $mainSlot = $this->emulateMainSlot_1_29( $revisionRow, $queryFlags, $title );
-                       $slots = new RevisionSlots( [ 'main' => $mainSlot ] );
+                       $slots = new RevisionSlots( [ SlotRecord::MAIN => $mainSlot ] );
                } else {
                        // XXX: do we need the same kind of caching here
                        // that getKnownCurrentRevision uses (if $revId == page_latest?)
@@ -2346,7 +2350,7 @@ class RevisionStore
                        $ret['fields']['slot_revision_id'] = 'slots.rev_id';
                        $ret['fields']['slot_content_id'] = 'NULL';
                        $ret['fields']['slot_origin'] = 'slots.rev_id';
-                       $ret['fields']['role_name'] = $db->addQuotes( 'main' );
+                       $ret['fields']['role_name'] = $db->addQuotes( SlotRecord::MAIN );
 
                        if ( in_array( 'content', $options, true ) ) {
                                $ret['fields']['content_size'] = 'slots.rev_len';
index c7eb735..ee36d44 100644 (file)
@@ -37,6 +37,8 @@ use Wikimedia\Assert\Assert;
  */
 class SlotRecord {
 
+       const MAIN = 'main';
+
        /**
         * @var object database result row, as a raw object. Callbacks are supported for field values,
         *      to enable on-demand emulation of these values. This is primarily intended for use
index bbc1d63..5b0c3bc 100644 (file)
@@ -3354,11 +3354,12 @@ class Title implements LinkTarget {
                $id = $this->getArticleID();
                if ( $id ) {
                        $cache = ObjectCache::getMainWANInstance();
+                       $fname = __METHOD__;
                        $rows = $cache->getWithSetCallback(
                                // Page protections always leave a new null revision
                                $cache->makeKey( 'page-restrictions', $id, $this->getLatestRevID() ),
                                $cache::TTL_DAY,
-                               function ( $curValue, &$ttl, array &$setOpts ) {
+                               function ( $curValue, &$ttl, array &$setOpts ) use ( $fname ) {
                                        $dbr = wfGetDB( DB_REPLICA );
 
                                        $setOpts += Database::getCacheSetOptions( $dbr );
@@ -3368,7 +3369,7 @@ class Title implements LinkTarget {
                                                        'page_restrictions',
                                                        [ 'pr_type', 'pr_expiry', 'pr_level', 'pr_cascade' ],
                                                        [ 'pr_page' => $this->getArticleID() ],
-                                                       __METHOD__
+                                                       $fname
                                                )
                                        );
                                }
@@ -4427,7 +4428,7 @@ class Title implements LinkTarget {
                                $revQuery['joins']
                        );
                        if ( $row ) {
-                               return new Revision( $row );
+                               return new Revision( $row, 0, $this );
                        }
                }
                return null;
@@ -4777,7 +4778,39 @@ class Title implements LinkTarget {
        }
 
        /**
-        * Get the default message text or false if the message doesn't exist
+        * Get the default (plain) message contents for an page that overrides an
+        * interface message key.
+        *
+        * Primary use cases:
+        *
+        * - Article:
+        *    - Show default when viewing the page. The Article::getSubstituteContent
+        *      method displays the default message content, instead of the
+        *      'noarticletext' placeholder message normally used.
+        *
+        * - EditPage:
+        *    - Title of edit page. When creating an interface message override,
+        *      the editor is told they are "Editing the page", instead of
+        *      "Creating the page". (EditPage::setHeaders)
+        *    - Edit notice. The 'translateinterface' edit notice is shown when creating
+        *      or editing a an interface message override. (EditPage::showIntro)
+        *    - Opening the editor. The contents of the localisation message are used
+        *      as contents of the editor when creating a new page in the MediaWiki
+        *      namespace. This simplifies the process for editors when "changing"
+        *      an interface message by creating an override. (EditPage::getContentObject)
+        *    - Showing a diff. The left-hand side of a diff when an editor is
+        *      previewing their changes before saving the creation of a page in the
+        *      MediaWiki namespace. (EditPage::showDiff)
+        *    - Disallowing a save. When attempting to create a a MediaWiki-namespace
+        *      page with the proposed content matching the interface message default,
+        *      the save is rejected, the same way we disallow blank pages from being
+        *      created. (EditPage::internalAttemptSave)
+        *
+        * - ApiEditPage:
+        *    - Default content, when using the 'prepend' or 'append' feature.
+        *
+        * - SkinTemplate:
+        *    - Label the create action as "Edit", if the page can be an override.
         *
         * @return string|bool
         */
diff --git a/includes/actions/McrRestoreAction.php b/includes/actions/McrRestoreAction.php
new file mode 100644 (file)
index 0000000..fbc39d7
--- /dev/null
@@ -0,0 +1,55 @@
+<?php
+/**
+ * Temporary action for restoring multi-content revisions
+ * @file
+ * @ingroup Actions
+ */
+
+/**
+ * Temporary action for restoring multi-content revisions.
+ *
+ * This is intended to go away when real MCR support is added to EditPage and
+ * the standard revert-by-edit behavior can be implemented there instead.
+ *
+ * @ingroup Actions
+ * @since 1.32
+ * @deprecated since 1.32
+ */
+class McrRestoreAction extends McrUndoAction {
+
+       public function getName() {
+               return 'mcrrestore';
+       }
+
+       public function getDescription() {
+               return '';
+       }
+
+       protected function initFromParameters() {
+               $curRev = $this->page->getRevision();
+               if ( !$curRev ) {
+                       throw new ErrorPageError( 'mcrundofailed', 'nopagetext' );
+               }
+               $this->curRev = $curRev->getRevisionRecord();
+               $this->cur = $this->getRequest()->getInt( 'cur', $this->curRev->getId() );
+
+               $this->undo = $this->cur;
+               $this->undoafter = $this->getRequest()->getInt( 'restore' );
+
+               if ( $this->undo == 0 || $this->undoafter == 0 ) {
+                       throw new ErrorPageError( 'mcrundofailed', 'mcrundo-missingparam' );
+               }
+       }
+
+       protected function addStatePropagationFields( HTMLForm $form ) {
+               $form->addHiddenField( 'restore', $this->undoafter );
+               $form->addHiddenField( 'cur', $this->curRev->getId() );
+       }
+
+       protected function alterForm( HTMLForm $form ) {
+               parent::alterForm( $form );
+
+               $form->setWrapperLegendMsg( 'confirm-mcrrestore-title' );
+       }
+
+}
index 90d1f68..6309362 100644 (file)
@@ -28,10 +28,10 @@ use MediaWiki\Storage\SlotRecord;
  */
 class McrUndoAction extends FormAction {
 
-       private $undo = 0, $undoafter = 0, $cur = 0;
+       protected $undo = 0, $undoafter = 0, $cur = 0;
 
        /** @param RevisionRecord|null */
-       private $curRev = null;
+       protected $curRev = null;
 
        public function getName() {
                return 'mcrundo';
@@ -90,9 +90,7 @@ class McrUndoAction extends FormAction {
                parent::show();
        }
 
-       protected function checkCanExecute( User $user ) {
-               parent::checkCanExecute( $user );
-
+       protected function initFromParameters() {
                $this->undoafter = $this->getRequest()->getInt( 'undoafter' );
                $this->undo = $this->getRequest()->getInt( 'undo' );
 
@@ -106,6 +104,12 @@ class McrUndoAction extends FormAction {
                }
                $this->curRev = $curRev->getRevisionRecord();
                $this->cur = $this->getRequest()->getInt( 'cur', $this->curRev->getId() );
+       }
+
+       protected function checkCanExecute( User $user ) {
+               parent::checkCanExecute( $user );
+
+               $this->initFromParameters();
 
                $revisionLookup = MediaWikiServices::getInstance()->getRevisionLookup();
 
@@ -219,7 +223,7 @@ class McrUndoAction extends FormAction {
                return $newRev;
        }
 
-       private function generateDiff() {
+       private function generateDiffOrPreview() {
                $newRev = $this->getNewRevision();
                if ( $newRev->hasSameContent( $this->curRev ) ) {
                        throw new ErrorPageError( 'mcrundofailed', 'undo-nochange' );
@@ -232,7 +236,7 @@ class McrUndoAction extends FormAction {
                $newtitle = $this->context->msg( 'yourtext' )->parse();
 
                if ( $this->getRequest()->getCheck( 'wpPreview' ) ) {
-                       $diffEngine->renderNewRevision();
+                       $this->showPreview( $newRev );
                        return '';
                } else {
                        $diffText = $diffEngine->getDiff( $oldtitle, $newtitle );
@@ -241,6 +245,56 @@ class McrUndoAction extends FormAction {
                }
        }
 
+       private function showPreview( RevisionRecord $rev ) {
+               // Mostly copied from EditPage::getPreviewText()
+               $out = $this->getOutput();
+
+               try {
+                       $previewHTML = '';
+
+                       # provide a anchor link to the form
+                       $continueEditing = '<span class="mw-continue-editing">' .
+                               '[[#mw-mcrundo-form|' .
+                               $this->context->getLanguage()->getArrow() . ' ' .
+                               $this->context->msg( 'continue-editing' )->text() . ']]</span>';
+
+                       $note = $this->context->msg( 'previewnote' )->plain() . ' ' . $continueEditing;
+
+                       $parserOptions = $this->page->makeParserOptions( $this->context );
+                       $parserOptions->setIsPreview( true );
+                       $parserOptions->setIsSectionPreview( false );
+                       $parserOptions->enableLimitReport();
+
+                       $parserOutput = MediaWikiServices::getInstance()->getRevisionRenderer()
+                               ->getRenderedRevision( $rev, $parserOptions, $this->context->getUser() )
+                               ->getRevisionParserOutput();
+                       $previewHTML = $parserOutput->getText( [ 'enableSectionEditLinks' => false ] );
+
+                       $out->addParserOutputMetadata( $parserOutput );
+                       if ( count( $parserOutput->getWarnings() ) ) {
+                               $note .= "\n\n" . implode( "\n\n", $parserOutput->getWarnings() );
+                       }
+               } catch ( MWContentSerializationException $ex ) {
+                       $m = $this->context->msg(
+                               'content-failed-to-parse',
+                               $ex->getMessage()
+                       );
+                       $note .= "\n\n" . $m->parse();
+                       $previewHTML = '';
+               }
+
+               $previewhead = "<div class='previewnote'>\n" .
+                       '<h2 id="mw-previewheader">' . $this->context->msg( 'preview' )->escaped() . "</h2>" .
+                       $out->parse( $note, true, /* interface */true ) . "<hr /></div>\n";
+
+               $pageViewLang = $this->getTitle()->getPageViewLanguage();
+               $attribs = [ 'lang' => $pageViewLang->getHtmlCode(), 'dir' => $pageViewLang->getDir(),
+                       'class' => 'mw-content-' . $pageViewLang->getDir() ];
+               $previewHTML = Html::rawElement( 'div', $attribs, $previewHTML );
+
+               $out->addHtml( $previewhead . $previewHTML );
+       }
+
        public function onSubmit( $data ) {
                global $wgUseRCPatrol;
 
@@ -306,7 +360,7 @@ class McrUndoAction extends FormAction {
                                'vertical-label' => true,
                                'raw' => true,
                                'default' => function () {
-                                       return $this->generateDiff();
+                                       return $this->generateDiffOrPreview();
                                }
                        ],
                        'summary' => [
@@ -343,6 +397,7 @@ class McrUndoAction extends FormAction {
 
                $labelAsPublish = $this->context->getConfig()->get( 'EditSubmitButtonLabelPublish' );
 
+               $form->setId( 'mw-mcrundo-form' );
                $form->setSubmitName( 'wpSave' );
                $form->setSubmitTooltip( $labelAsPublish ? 'publish' : 'save' );
                $form->setSubmitTextMsg( $labelAsPublish ? 'publishchanges' : 'savechanges' );
@@ -361,6 +416,10 @@ class McrUndoAction extends FormAction {
                        'attribs' => Linker::tooltipAndAccesskeyAttribs( 'diff' ),
                ] );
 
+               $this->addStatePropagationFields( $form );
+       }
+
+       protected function addStatePropagationFields( HTMLForm $form ) {
                $form->addHiddenField( 'undo', $this->undo );
                $form->addHiddenField( 'undoafter', $this->undoafter );
                $form->addHiddenField( 'cur', $this->curRev->getId() );
index 817c9fd..b5a6d3a 100644 (file)
@@ -163,47 +163,35 @@ class RawAction extends FormlessAction {
                $title = $this->getTitle();
                $request = $this->getRequest();
 
-               // If it's a MediaWiki message we can just hit the message cache
-               if ( $request->getBool( 'usemsgcache' ) && $title->getNamespace() == NS_MEDIAWIKI ) {
-                       // The first "true" is to use the database, the second is to use
-                       // the content langue and the last one is to specify the message
-                       // key already contains the language in it ("/de", etc.).
-                       $text = MessageCache::singleton()->get( $title->getDBkey(), true, true, true );
-                       // If the message doesn't exist, return a blank
-                       if ( $text === false ) {
-                               $text = '';
-                       }
-               } else {
-                       // Get it from the DB
-                       $rev = Revision::newFromTitle( $title, $this->getOldId() );
-                       if ( $rev ) {
-                               $lastmod = wfTimestamp( TS_RFC2822, $rev->getTimestamp() );
-                               $request->response()->header( "Last-modified: $lastmod" );
+               // Get it from the DB
+               $rev = Revision::newFromTitle( $title, $this->getOldId() );
+               if ( $rev ) {
+                       $lastmod = wfTimestamp( TS_RFC2822, $rev->getTimestamp() );
+                       $request->response()->header( "Last-modified: $lastmod" );
 
-                               // Public-only due to cache headers
-                               $content = $rev->getContent();
+                       // Public-only due to cache headers
+                       $content = $rev->getContent();
 
-                               if ( $content === null ) {
-                                       // revision not found (or suppressed)
+                       if ( $content === null ) {
+                               // revision not found (or suppressed)
+                               $text = false;
+                       } elseif ( !$content instanceof TextContent ) {
+                               // non-text content
+                               wfHttpError( 415, "Unsupported Media Type", "The requested page uses the content model `"
+                                       . $content->getModel() . "` which is not supported via this interface." );
+                               die();
+                       } else {
+                               // want a section?
+                               $section = $request->getIntOrNull( 'section' );
+                               if ( $section !== null ) {
+                                       $content = $content->getSection( $section );
+                               }
+
+                               if ( $content === null || $content === false ) {
+                                       // section not found (or section not supported, e.g. for JS, JSON, and CSS)
                                        $text = false;
-                               } elseif ( !$content instanceof TextContent ) {
-                                       // non-text content
-                                       wfHttpError( 415, "Unsupported Media Type", "The requested page uses the content model `"
-                                               . $content->getModel() . "` which is not supported via this interface." );
-                                       die();
                                } else {
-                                       // want a section?
-                                       $section = $request->getIntOrNull( 'section' );
-                                       if ( $section !== null ) {
-                                               $content = $content->getSection( $section );
-                                       }
-
-                                       if ( $content === null || $content === false ) {
-                                               // section not found (or section not supported, e.g. for JS, JSON, and CSS)
-                                               $text = false;
-                                       } else {
-                                               $text = $content->getNativeData();
-                                       }
+                                       $text = $content->getNativeData();
                                }
                        }
                }
index 02cadbd..c5a2234 100644 (file)
@@ -23,6 +23,7 @@ use MediaWiki\MediaWikiServices;
 use MediaWiki\Storage\MutableRevisionRecord;
 use MediaWiki\Storage\RevisionRecord;
 use MediaWiki\Storage\RevisionStore;
+use MediaWiki\Storage\SlotRecord;
 
 class ApiComparePages extends ApiBase {
 
@@ -271,7 +272,7 @@ class ApiComparePages extends ApiBase {
                }
 
                $guessedTitle = $this->guessTitle();
-               if ( $guessedTitle && $role === 'main' ) {
+               if ( $guessedTitle && $role === SlotRecord::MAIN ) {
                        // @todo: Use SlotRoleRegistry and do this for all slots
                        return $guessedTitle->getContentModel();
                }
@@ -283,7 +284,7 @@ class ApiComparePages extends ApiBase {
                        return $params["tocontentmodel-$role"];
                }
 
-               if ( $role === 'main' ) {
+               if ( $role === SlotRecord::MAIN ) {
                        if ( isset( $params['fromcontentmodel'] ) ) {
                                return $params['fromcontentmodel'];
                        }
@@ -315,7 +316,7 @@ class ApiComparePages extends ApiBase {
                $this->requireMaxOneParameter( $params, "{$prefix}text", "{$prefix}slots" );
                $this->requireMaxOneParameter( $params, "{$prefix}section", "{$prefix}slots" );
                if ( $params["{$prefix}text"] !== null ) {
-                       $params["{$prefix}slots"] = [ 'main' ];
+                       $params["{$prefix}slots"] = [ SlotRecord::MAIN ];
                        $params["{$prefix}text-main"] = $params["{$prefix}text"];
                        $params["{$prefix}section-main"] = null;
                        $params["{$prefix}contentmodel-main"] = $params["{$prefix}contentmodel"];
@@ -378,10 +379,11 @@ class ApiComparePages extends ApiBase {
                                if ( isset( $params["{$prefix}section"] ) ) {
                                        $section = $params["{$prefix}section"];
                                        $newRev = MutableRevisionRecord::newFromParentRevision( $rev );
-                                       $content = $rev->getContent( 'main', RevisionRecord::FOR_THIS_USER, $this->getUser() );
+                                       $content = $rev->getContent( SlotRecord::MAIN, RevisionRecord::FOR_THIS_USER,
+                                               $this->getUser() );
                                        if ( !$content ) {
                                                $this->dieWithError(
-                                                       [ 'apierror-missingcontent-revid-role', $rev->getId(), 'main' ], 'missingcontent'
+                                                       [ 'apierror-missingcontent-revid-role', $rev->getId(), SlotRecord::MAIN ], 'missingcontent'
                                                );
                                        }
                                        $content = $content ? $content->getSection( $section ) : null;
@@ -391,7 +393,7 @@ class ApiComparePages extends ApiBase {
                                                        "nosuch{$prefix}section"
                                                );
                                        }
-                                       $newRev->setContent( 'main', $content );
+                                       $newRev->setContent( SlotRecord::MAIN, $content );
                                }
 
                                return [ $newRev, $rev, $rev ];
@@ -412,8 +414,8 @@ class ApiComparePages extends ApiBase {
                foreach ( $params["{$prefix}slots"] as $role ) {
                        $text = $params["{$prefix}text-{$role}"];
                        if ( $text === null ) {
-                               // The 'main' role can't be deleted
-                               if ( $role === 'main' ) {
+                               // The SlotRecord::MAIN role can't be deleted
+                               if ( $role === SlotRecord::MAIN ) {
                                        $this->dieWithError( [ 'apierror-compare-maintextrequired', $prefix ] );
                                }
 
@@ -439,7 +441,7 @@ class ApiComparePages extends ApiBase {
                        if ( !$model && $rev && $rev->hasSlot( $role ) ) {
                                $model = $rev->getSlot( $role, RevisionRecord::RAW )->getModel();
                        }
-                       if ( !$model && $title && $role === 'main' ) {
+                       if ( !$model && $title && $role === SlotRecord::MAIN ) {
                                // @todo: Use SlotRoleRegistry and do this for all slots
                                $model = $title->getContentModel();
                        }
@@ -494,7 +496,7 @@ class ApiComparePages extends ApiBase {
                        }
 
                        // Deprecated 'fromsection'/'tosection'
-                       if ( $role === 'main' && isset( $params["{$prefix}section"] ) ) {
+                       if ( $role === SlotRecord::MAIN && isset( $params["{$prefix}section"] ) ) {
                                $section = $params["{$prefix}section"];
                                $content = $content->getSection( $section );
                                if ( !$content ) {
@@ -581,8 +583,8 @@ class ApiComparePages extends ApiBase {
 
        public function getAllowedParams() {
                $slotRoles = MediaWikiServices::getInstance()->getSlotRoleStore()->getMap();
-               if ( !in_array( 'main', $slotRoles, true ) ) {
-                       $slotRoles[] = 'main';
+               if ( !in_array( SlotRecord::MAIN, $slotRoles, true ) ) {
+                       $slotRoles[] = SlotRecord::MAIN;
                }
                sort( $slotRoles, SORT_STRING );
 
index 92d504e..2b2b32c 100644 (file)
@@ -24,6 +24,7 @@ use MediaWiki\MediaWikiServices;
 use MediaWiki\Storage\RevisionAccessException;
 use MediaWiki\Storage\RevisionRecord;
 use MediaWiki\Storage\RevisionStore;
+use MediaWiki\Storage\SlotRecord;
 
 /**
  * @ingroup API
@@ -174,7 +175,7 @@ class ApiFeedContributions extends ApiBase {
                if ( $revision ) {
                        $msg = wfMessage( 'colon-separator' )->inContentLanguage()->text();
                        try {
-                               $content = $revision->getContent( 'main' );
+                               $content = $revision->getContent( SlotRecord::MAIN );
                        } catch ( RevisionAccessException $e ) {
                                $content = null;
                        }
index 5c25b5a..a78cb7f 100644 (file)
@@ -868,7 +868,10 @@ class ApiParse extends ApiBase {
                        ],
                        'disablelimitreport' => false,
                        'disableeditsection' => false,
-                       'disabletidy' => false,
+                       'disabletidy' => [
+                               ApiBase::PARAM_DFLT => false,
+                               ApiBase::PARAM_DEPRECATED => true, // Since 1.32
+                       ],
                        'disablestylededuplication' => false,
                        'generatexml' => [
                                ApiBase::PARAM_DFLT => false,
index 600c89e..e5d7748 100644 (file)
@@ -307,7 +307,7 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                        }
                        if ( $this->slotRoles === null ) {
                                try {
-                                       $slot = $revision->getSlot( 'main', RevisionRecord::RAW );
+                                       $slot = $revision->getSlot( SlotRecord::MAIN, RevisionRecord::RAW );
                                } catch ( RevisionAccessException $e ) {
                                        // Back compat: If there's no slot, there's no content, so set 'textmissing'
                                        // @todo: Gergő says to mention T198099 as a "todo" here.
@@ -621,8 +621,8 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
 
        public function getAllowedParams() {
                $slotRoles = MediaWikiServices::getInstance()->getSlotRoleStore()->getMap();
-               if ( !in_array( 'main', $slotRoles, true ) ) {
-                       $slotRoles[] = 'main';
+               if ( !in_array( SlotRecord::MAIN, $slotRoles, true ) ) {
+                       $slotRoles[] = SlotRecord::MAIN;
                }
                sort( $slotRoles, SORT_STRING );
 
index ab9ae8e..17c8040 100644 (file)
@@ -174,6 +174,7 @@ class ApiStashEdit extends ApiBase {
 
                $title = $page->getTitle();
                $key = self::getStashKey( $title, self::getContentHash( $content ), $user );
+               $fname = __METHOD__;
 
                // Use the master DB to allow for fast blocking locks on the "save path" where this
                // value might actually be used to complete a page edit. If the edit submission request
@@ -182,13 +183,13 @@ class ApiStashEdit extends ApiBase {
                // need to duplicate parsing of the same content/user/summary bundle, so try to avoid
                // blocking at all here.
                $dbw = wfGetDB( DB_MASTER );
-               if ( !$dbw->lock( $key, __METHOD__, 0 ) ) {
+               if ( !$dbw->lock( $key, $fname, 0 ) ) {
                        // De-duplicate requests on the same key
                        return self::ERROR_BUSY;
                }
                /** @noinspection PhpUnusedLocalVariableInspection */
-               $unlocker = new ScopedCallback( function () use ( $dbw, $key ) {
-                       $dbw->unlock( $key, __METHOD__ );
+               $unlocker = new ScopedCallback( function () use ( $dbw, $key, $fname ) {
+                       $dbw->unlock( $key, $fname );
                } );
 
                $cutoffTime = time() - self::PRESUME_FRESH_TTL_SEC;
index 3f31f9c..631e681 100644 (file)
        "apihelp-query+watchlist-paramvalue-prop-loginfo": "적절한 곳에 로그 정보를 추가합니다.",
        "apihelp-query+watchlistraw-summary": "현재 사용자의 주시문서 목록의 모든 문서를 가져옵니다.",
        "apihelp-removeauthenticationdata-summary": "현재 사용자의 인증 데이터를 제거합니다.",
+       "apihelp-removeauthenticationdata-example-simple": "<kbd>FooAuthenticationRequest</kbd>에 대한 현재 사용자의 데이터의 제거를 시도합니다.",
        "apihelp-resetpassword-summary": "비밀번호 재설정 이메일을 사용자에게 보냅니다.",
        "apihelp-resetpassword-param-user": "재설정할 사용자입니다.",
        "apihelp-resetpassword-param-email": "재설정할 사용자의 이메일 주소입니다.",
index c9eb3b4..4bff7ef 100644 (file)
        "apihelp-compare-param-fromid": "Перший ID сторінки для порівняння.",
        "apihelp-compare-param-fromrev": "Перша версія для порівняння.",
        "apihelp-compare-param-frompst": "Зробити трансформацію перед збереженням на <var>fromtext-&#x7B;slot}</var>.",
-       "apihelp-compare-param-fromtext": "Використати цей текст замість контенту версії, вказаної через <var>fromtitle</var>, <var>fromid</var> або <var>fromrev</var>.",
-       "apihelp-compare-param-fromcontentmodel": "Контентна модель <var>fromtext</var>. Якщо не вказано, буде використано припущення на основі інших параметрів.",
-       "apihelp-compare-param-fromcontentformat": "Формат серіалізації контенту <var>fromtext</var>.",
+       "apihelp-compare-param-fromslots": "Обійти вміст версії, заданої за допомогою <var>fromtitle</var>, <var>fromid</var> або <var>fromrev</var>.\n\nЦей параметр задає слоти, які буде змінено. Використовуйте <var>fromtext-&#x7B;slot}</var>, <var>fromcontentmodel-&#x7B;slot}</var>, та <var>fromcontentformat-&#x7B;slot}</var>, щоб вказувати вміст для кожного слота.",
+       "apihelp-compare-param-fromtext-{slot}": "Текст вказаного слоту. Якщо пропущено, слот буде вилучено з версії.",
+       "apihelp-compare-param-fromsection-{slot}": "Коли <var>fromtext-&#x7B;slot}</var> є вмістом єдиного розділу, це — номер розділу. Його буде вбудовано у версію, задану за допомогою <var>fromtitle</var>, <var>fromid</var> або <var>fromrev</var> — так, як для редагувнання розділу.",
+       "apihelp-compare-param-fromcontentmodel-{slot}": "Контентна модель <var>fromtext-&#x7B;slot}</var>. Якщо не вказано, буде використано припущення на основі інших параметрів.",
+       "apihelp-compare-param-fromcontentformat-{slot}": "Формат серіалізації контенту <var>fromtext-&#x7B;slot}</var>.",
+       "apihelp-compare-param-fromtext": "Вкажіть <kbd>fromslots=main</kbd> і використайте <var>fromtext-main</var> натомість.",
+       "apihelp-compare-param-fromcontentmodel": "Вкажіть <kbd>fromslots=main</kbd> і використайте <var>fromcontentmodel-main</var> натомість.",
+       "apihelp-compare-param-fromcontentformat": "Вкажіть <kbd>fromslots=main</kbd> і використайте <var>fromcontentformat-main</var> натомість.",
        "apihelp-compare-param-fromsection": "Використовувати лише вказану секцію із заданого вмісту «from».",
        "apihelp-compare-param-totitle": "Другий заголовок для порівняння.",
        "apihelp-compare-param-toid": "Другий ID сторінки для порівняння.",
        "apihelp-compare-param-torev": "Друга версія для порівняння.",
        "apihelp-compare-param-torelative": "Використати версію, яка стосується версії, визначеної через <var>fromtitle</var>, <var>fromid</var> або <var>fromrev</var>. Усі інші опції 'to' буде проігноровано.",
        "apihelp-compare-param-topst": "Виконати трансформацію перед збереженням на <var>totext</var>.",
-       "apihelp-compare-param-totext": "Використати цей текст замість контенту версії, вказаної через <var>totitle</var>, <var>toid</var> або <var>torev</var>.",
-       "apihelp-compare-param-tocontentmodel": "Контентна модель <var>totext</var>. Якщо не вказано, буде використано припущення на основі інших параметрів.",
-       "apihelp-compare-param-tocontentformat": "Формат серіалізації контенту <var>totext</var>.",
+       "apihelp-compare-param-toslots": "Обійти вміст версії, заданої за допомогою <var>totitle</var>, <var>toid</var> або <var>torev</var>.\n\nЦей параметр задає слоти, які буде змінено. Використовуйте <var>totext-&#x7B;slot}</var>, <var>tocontentmodel-&#x7B;slot}</var>, та <var>tocontentformat-&#x7B;slot}</var>, щоб вказувати вміст для кожного слота.",
+       "apihelp-compare-param-totext-{slot}": "Текст вказаного слота. Якщо пропущено, цей слот буде вилучено з версії.",
+       "apihelp-compare-param-tosection-{slot}": "Коли <var>totext-&#x7B;slot}</var> є вмістом єдиного розділу, це — номер цього розділу. Його буде вбудовано у версію, задану за допомогою <var>totitle</var>, <var>toid</var> або <var>torev</var> — так, як для редагування розділу.",
+       "apihelp-compare-param-tocontentmodel-{slot}": "Контентна модель <var>totext-&#x7B;slot}</var>. Якщо не вказано, буде використано припущення на основі інших параметрів.",
+       "apihelp-compare-param-tocontentformat-{slot}": "Формат серіалізації контенту <var>totext-&#x7B;slot}</var>.",
+       "apihelp-compare-param-totext": "Вкажіть <kbd>toslots=main</kbd> і використайте <var>totext-main</var> натомість.",
+       "apihelp-compare-param-tocontentmodel": "Вкажіть <kbd>toslots=main</kbd> і використайте <var>tocontentmodel-main</var> натомість.",
+       "apihelp-compare-param-tocontentformat": "Вкажіть <kbd>toslots=main</kbd> і використайте <var>tocontentformat-main</var> натомість.",
        "apihelp-compare-param-tosection": "Використовувати лише вказану секцію із заданого вмісту «to».",
        "apihelp-compare-param-prop": "Які уривки інформації отримати.",
        "apihelp-compare-paramvalue-prop-diff": "HTML різниці версій.",
        "apihelp-compare-paramvalue-prop-comment": "Опис редагування версій 'from' і 'to'.",
        "apihelp-compare-paramvalue-prop-parsedcomment": "Опрацьований опис редагування версій 'from' і 'to'.",
        "apihelp-compare-paramvalue-prop-size": "Розмір версій 'from' і 'to'.",
+       "apihelp-compare-param-slots": "Повернути окремі дифи для цих слотів замість єдиного спільного дифу для всіх слотів.",
        "apihelp-compare-example-1": "Створити порівняння версій 1 і 2.",
        "apihelp-createaccount-summary": "Створити новий обліковий запис користувача.",
        "apihelp-createaccount-param-preservestate": "Якщо запит <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> повернув істину для <samp>hasprimarypreservedstate</samp>, запити позначені як <samp>primary-required</samp> повинні бути пропущені. Якщо він повернув не порожнє значення для <samp>preservedusername</samp>, це ім'я користувача повинно бути використано для параметру <var>username</var>.",
        "apihelp-query+filerepoinfo-paramvalue-prop-articlepath": "<var>[[mw:Special:MyLanguage/Manual:$wgArticlePath|$wgArticlePath]]</var> вікі-сайту репозиторію, або еквівалент.",
        "apihelp-query+filerepoinfo-paramvalue-prop-canUpload": "Чи можна завантажувати файли в цей репозиторій, напр., через CORS та спільну автентифікацію.",
        "apihelp-query+filerepoinfo-paramvalue-prop-displayname": "Назва вікі-сайту репозиторію, читабельна для людини.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-favicon": "URL-адреса значка вікіпроекту репозиторію, із <var>[[mw:Special:MyLanguage/Manual:$wgFavicon|$wgFavicon]]</var>.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-fetchDescription": "Чи сторінки опису беруться з цього репозиторію при перегляді локальних сторінок опису файлів.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-initialCapital": "Чи назви файлів неявно починаються з великої літери.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-local": "Чи той репозиторій є локальним, чи ні.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-name": "Ключ репозиторію — використовується, наприклад, у повернутих значеннях <var>[[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> та[[Special:ApiHelp/query+imageinfo|imageinfo]].",
+       "apihelp-query+filerepoinfo-paramvalue-prop-rootUrl": "Кореневий URL-шлях для шляхів до зображень.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-scriptDirUrl": "Кореневий URL-шлях для інсталяції MediaWiki у вікіпроекті репозиторію.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-server": "<var>[[mw:Special:MyLanguage/Manual:$wgServer|$wgServer]]</var> (чи його еквівалент) вікіпроекту репозиторію.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-thumbUrl": "Кореневий URL-шлях для шляхів до мініатюр.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-url": "URL-шлях публічної зони.",
        "apihelp-query+filerepoinfo-example-simple": "Отримати інформацію про репозиторії файлів.",
        "apihelp-query+fileusage-summary": "Знайти всі сторінки, що використовують дані файли.",
        "apihelp-query+fileusage-param-prop": "Які властивості отримати:",
        "apihelp-query+info-paramvalue-prop-readable": "Чи користувач може редагувати цю сторінку.",
        "apihelp-query+info-paramvalue-prop-preload": "Дає текст, виданий EditFormPreloadText.",
        "apihelp-query+info-paramvalue-prop-displaytitle": "Дає спосіб, у який відображається назва сторінки.",
+       "apihelp-query+info-paramvalue-prop-varianttitles": "Видає вигляд заголовка всіма варіантами мов контенту цього сайту.",
        "apihelp-query+info-param-testactions": "Перевірити, чи поточний користувач може виконувати певні дії на сторінці.",
        "apihelp-query+info-param-token": "Використати натомість [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
        "apihelp-query+info-example-simple": "Отримати інформацію про сторінку <kbd>Main Page</kbd>.",
        "apihelp-query+prefixsearch-summary": "Виконати пошук назв сторінок за префіксом.",
        "apihelp-query+prefixsearch-extended-description": "Незважаючи на подібність назв, цей модуль не призначений для того, аби бути еквівалентом [[Special:PrefixIndex]]; щодо цього, перегляньте <kbd>[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd> із параметром <kbd>apprefix</kbd>. Мета цього модуля така ж, як і <kbd>[[Special:ApiHelp/opensearch|action=opensearch]]</kbd>: взяти текст, введений користувачем, і вивести найбільш відповідні назви. Залежно від програмної підоснови пошукової системи, сюди можуть також входити виправлення орфографії, уникнення перенаправлень чи інша евристика.",
        "apihelp-query+prefixsearch-param-search": "Рядок пошуку.",
-       "apihelp-query+prefixsearch-param-namespace": "Простори назв, у яких шукати.",
+       "apihelp-query+prefixsearch-param-namespace": "Простори назв, у яких шукати. Ігнорується, якщо <var>$1search</var> починається з коректного префіксу простору назв.",
        "apihelp-query+prefixsearch-param-limit": "Максимальна кількість результатів для виведення.",
        "apihelp-query+prefixsearch-param-offset": "Кількість результатів, які пропустити.",
        "apihelp-query+prefixsearch-example-simple": "Шукати назви сторінок, які починаються з <kbd>meaning</kbd>.",
        "apihelp-query+recentchanges-paramvalue-prop-sizes": "Додає нову і стару довжину сторінки в байтах.",
        "apihelp-query+recentchanges-paramvalue-prop-redirect": "Помічає редагування, якщо сторінка є перенаправленням.",
        "apihelp-query+recentchanges-paramvalue-prop-patrolled": "Помічає редагування як відпатрульвані чи невідпатрульовані.",
+       "apihelp-query+recentchanges-paramvalue-prop-autopatrolled": "Позначає доступні до патрулювання редагування або як автопатрульовані, або як невідпатрульовані.",
        "apihelp-query+recentchanges-paramvalue-prop-loginfo": "Додає інформацію журналу (ID журналу, тип журналу тощо) до записів журналу.",
        "apihelp-query+recentchanges-paramvalue-prop-tags": "Виводить мітки запису.",
        "apihelp-query+recentchanges-paramvalue-prop-sha1": "Додає контрольну суму вмісту для записів, пов'язаних з версією.",
index 55c0671..f559711 100644 (file)
@@ -68,6 +68,7 @@
        "apihelp-compare-param-toid": "要比對的第二個頁面 ID。",
        "apihelp-compare-param-torev": "要比對的第二個修訂。",
        "apihelp-compare-param-topst": "在 <var>totext</var> 執行預先保存轉換。",
+       "apihelp-compare-param-tocontentformat-{slot}": "<var>totext-&#x7B;slot}</var> 的內容序列化格式。",
        "apihelp-compare-param-totext": "指定 <kbd>toslots=main</kbd> 並改用 <var>totext-main</var>。",
        "apihelp-compare-param-tocontentmodel": "指定 <kbd>toslots=main</kbd> 並改使用 <var>tocontentmodel-main</var>。",
        "apihelp-compare-param-tocontentformat": "指定 <kbd>toslots=main</kbd> 並改使用 <var>tocontentformat-main</var>。",
        "apihelp-expandtemplates-summary": "展開所有於 wikitext 中模板。",
        "apihelp-expandtemplates-param-title": "頁面標題。",
        "apihelp-expandtemplates-param-text": "要轉換的 Wikitext。",
+       "apihelp-expandtemplates-param-revid": "修訂 ID,用於 <code><nowiki>{{REVISIONID}}</nowiki></code> 和相似變數。",
        "apihelp-expandtemplates-paramvalue-prop-wikitext": "展開的 wiki 文字。",
        "apihelp-expandtemplates-paramvalue-prop-jsconfigvars": "指定頁面的 JavaScript 設置變量。",
        "apihelp-expandtemplates-paramvalue-prop-encodedjsconfigvars": "指定頁面的 JavaScript 設置變量為 JSON 字串。",
        "apihelp-feedwatchlist-summary": "返回監視清單 feed。",
        "apihelp-feedwatchlist-param-feedformat": "Feed 的格式。",
        "apihelp-feedwatchlist-param-linktosections": "若可以的話,直接連結至更改過的段落。",
+       "apihelp-feedwatchlist-example-all6hrs": "顯示過去 6 小時在監視頁面的所有更改。",
        "apihelp-filerevert-summary": "回退檔案至舊的版本。",
        "apihelp-filerevert-param-filename": "目標檔案名稱,不需包含「File:」這樣的前綴字元。",
        "apihelp-filerevert-param-comment": "上載意見。",
+       "apihelp-filerevert-example-revert": "回退 <kbd>Wiki.png</kbd> 至 <kbd>2011-03-05T15:27:40Z</kbd> 的版本。",
        "apihelp-help-summary": "顯示指定模組的說明。",
        "apihelp-help-example-main": "主模組使用說明",
        "apihelp-help-example-recursive": "一個頁面中的所有說明。",
        "apihelp-managetags-param-ignorewarnings": "是否在處理期間發生問題時忽略任何警告。",
        "apihelp-managetags-param-tags": "在標籤管理日誌裡更改套用到項目的標籤。",
        "apihelp-mergehistory-summary": "合併頁面歷史",
+       "apihelp-mergehistory-param-to": "要合併歷史的頁面標題。不能與 <var>$1toid</var> 一起使用。",
+       "apihelp-mergehistory-param-toid": "要合併歷史的頁面之頁面 ID。不能與 <var>$1to</var> 一起使用。",
        "apihelp-mergehistory-param-reason": "合併歷史的原因。",
        "apihelp-mergehistory-example-merge": "將<kbd>Oldpage</kbd>的整個歷史合併至<kbd>Newpage</kbd>。",
        "apihelp-mergehistory-example-merge-timestamp": "將<kbd>Oldpage</kbd>直至<kbd>2015-12-31T04:37:41Z</kbd>的頁面修訂版本合併至<kbd>Newpage</kbd>。",
        "apihelp-paraminfo-example-2": "顯示 <kbd>[[Special:ApiHelp/query|action=query]]</kbd> 所有子模組的資訊。",
        "apihelp-parse-summary": "解析內容併回傳解析器輸出。",
        "apihelp-parse-param-text": "要解析的文字。使用 <var>$1title</var> 或 <var>$1contentmodel</var> 來控制內容模組。",
+       "apihelp-parse-param-revid": "修訂 ID,用於 <code><nowiki>{{REVISIONID}}</nowiki></code> 和相似變數。",
        "apihelp-parse-param-summary": "解析摘要。",
+       "apihelp-parse-param-page": "解析此頁面的內容。不能與 <var>$1text</var> 和 <var>$1title</var> 一起使用。",
        "apihelp-parse-param-pageid": "解析此頁面的內容。覆蓋 <var>$1page</var>。",
        "apihelp-parse-param-redirects": "若 <var>$1page</var> 或者 <var>$1pageid</var> 被設定成重新導向,則解析它。",
+       "apihelp-parse-param-oldid": "解析此修訂的內容。覆蓋 <var>$1page</var> 與 <var>$1pageid</var>。",
        "apihelp-parse-param-prop": "要取得的資訊部份:",
        "apihelp-parse-paramvalue-prop-text": "提供 wiki 文字的解析文字。",
        "apihelp-parse-paramvalue-prop-langlinks": "在已解析的 wiki 文字提供語言連結。",
        "apihelp-parse-paramvalue-prop-displaytitle": "添加已解析 wiki 文字的標題。",
        "apihelp-parse-paramvalue-prop-headitems": "提供放置頁面裡的 <code>&lt;head&gt;</code> 之項目。",
        "apihelp-parse-paramvalue-prop-headhtml": "取得頁面已解析的 <code>&lt;head&gt;</code>。",
+       "apihelp-parse-paramvalue-prop-encodedjsconfigvars": "指定頁面的 JavaScript 設置變量為 JSON 字串。",
        "apihelp-parse-paramvalue-prop-iwlinks": "在已解析的 wiki 文字提供跨 wiki 連結。",
+       "apihelp-parse-paramvalue-prop-wikitext": "指定被解析的原始 wiki 文字。",
+       "apihelp-parse-paramvalue-prop-properties": "指定多項定義在已解析原始 wiki 文字的屬性。",
        "apihelp-parse-param-disablepp": "請改用<var>$1disablelimitreport</var>。",
+       "apihelp-parse-param-disabletidy": "不要在解析輸出裡執行 HTML 內容清理(例如使用 tidy 軟體工具)",
        "apihelp-parse-param-preview": "在預覽模式下解析。",
        "apihelp-parse-example-page": "解析頁面。",
        "apihelp-parse-example-text": "解析 wikitext。",
        "apihelp-query+allcategories-param-limit": "要回傳的分類數量。",
        "apihelp-query+allcategories-param-prop": "要取得的屬性。",
        "apihelp-query+allcategories-paramvalue-prop-size": "在分類裡添加頁面數。",
+       "apihelp-query+allcategories-paramvalue-prop-hidden": "標記由 <code>_&#95;HIDDENCAT_&#95;</code> 隱藏的分類。",
        "apihelp-query+alldeletedrevisions-summary": "依使用者或所在命名空間來列出所有已刪除的修訂。",
        "apihelp-query+alldeletedrevisions-paraminfo-useronly": "僅與 <var>$3user</var> 一同使用。",
        "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "不能與 <var>$3user</var> 一同使用。",
        "apihelp-query+alllinks-example-unique-generator": "取得所有已連結標題,標記為遺失。",
        "apihelp-query+alllinks-example-generator": "取得包含連結的頁面。",
        "apihelp-query+allmessages-summary": "返回來自該網站的訊息。",
+       "apihelp-query+allmessages-param-messages": "要輸出的訊息。<kbd>*</kbd>(預設)代表著所有訊息。",
        "apihelp-query+allmessages-param-prop": "要取得的屬性。",
        "apihelp-query+allmessages-param-nocontent": "若有設定,請不要包含在輸出裡的訊息內容。",
        "apihelp-query+allmessages-param-args": "要替代訊息的引數。",
        "apihelp-query+allrevisions-param-user": "此列出由該使用者作出的修訂。",
        "apihelp-query+allrevisions-param-excludeuser": "不要列出由該使用者作出的修訂。",
        "apihelp-query+allrevisions-param-namespace": "僅列出此命名空間的頁面。",
+       "apihelp-query+allrevisions-param-generatetitles": "當作為產生器時使用,產生標題而非修訂 ID。",
        "apihelp-query+allrevisions-example-user": "列出由使用者 <kbd>Example</kbd> 做出的最近 50 個貢獻。",
        "apihelp-query+allrevisions-example-ns-main": "列出在主命名空間的前 50 個修訂。",
        "apihelp-query+mystashedfiles-param-prop": "要索取的檔案屬性。",
        "apihelp-query+categoryinfo-summary": "回傳有關指定分類的資訊。",
        "apihelp-query+categoryinfo-example-simple": "取得有關 <kbd>Category:Foo</kbd> 與 <kbd>Category:Bar</kbd> 的資訊。",
        "apihelp-query+categorymembers-summary": "在指定的分類中列出所有頁面。",
+       "apihelp-query+categorymembers-param-title": "所要列舉的分類(必要)。必須包含 <kbd>{{ns:category}}:</kbd> 前綴。不可與 <var>$1pageid</var> 一同使用。",
+       "apihelp-query+categorymembers-param-pageid": "要列舉的分類之頁面 ID。不能與 <var>$1title</var> 同時使用。",
        "apihelp-query+categorymembers-param-prop": "要包含的資訊部份:",
        "apihelp-query+categorymembers-paramvalue-prop-ids": "添加頁面 ID。",
        "apihelp-query+categorymembers-paramvalue-prop-title": "添加標題與頁面的命名空間 ID。",
        "apihelp-query+embeddedin-param-dir": "列出時所採用的方向。",
        "apihelp-query+embeddedin-param-filterredir": "如何過濾重新導向。",
        "apihelp-query+embeddedin-param-limit": "要回傳的頁面總數。",
+       "apihelp-query+embeddedin-example-simple": "顯示嵌入 <kbd>Template:Stub</kbd> 的頁面。",
+       "apihelp-query+embeddedin-example-generator": "取得有關嵌入 <kbd>Template:Stub</kbd> 的頁面之資訊。",
        "apihelp-query+extlinks-summary": "回傳所有指定頁面的外部 URL (非 interwiki)。",
        "apihelp-query+extlinks-param-limit": "要回傳的連結數量。",
        "apihelp-query+extlinks-example-simple": "取得 <kbd>Main Page</kbd> 的外部連結清單。",
        "apihelp-query+info-summary": "取得基本頁面訊息。",
        "apihelp-query+info-param-prop": "要取得的額外屬性:",
        "apihelp-query+info-paramvalue-prop-protection": "列出各頁面的保護層級。",
+       "apihelp-query+info-paramvalue-prop-talkid": "各非對話頁的對話頁頁面 ID。",
        "apihelp-query+info-paramvalue-prop-watched": "列出各頁面的監視狀態。",
        "apihelp-query+info-paramvalue-prop-watchers": "監視者的數目,如有允許的話。",
        "apihelp-query+info-paramvalue-prop-visitingwatchers": "有訪問頁面近期編輯數的各頁面監視者數目,如有允許的話。",
+       "apihelp-query+info-paramvalue-prop-notificationtimestamp": "各頁面的監視清單通知時間戳記。",
+       "apihelp-query+info-paramvalue-prop-subjectid": "各對話頁的父頁面頁面 ID。",
        "apihelp-query+info-paramvalue-prop-readable": "使用者是否可閱讀此頁面。",
        "apihelp-query+info-param-testactions": "測試目前使用者是否可執行頁面上的某項操作。",
        "apihelp-query+info-param-token": "請改用 [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]。",
        "apihelp-query+info-example-simple": "取得有關頁面 <kbd>Main Page</kbd> 的資訊。",
        "apihelp-query+iwbacklinks-summary": "找出連結至指定跨 wiki 連結的所有頁面。",
        "apihelp-query+iwbacklinks-param-prefix": "跨 wiki 前綴。",
+       "apihelp-query+iwbacklinks-param-title": "要搜尋的跨 wiki 連結。必須與 <var>$1blprefix</var> 一起使用。",
        "apihelp-query+iwbacklinks-param-limit": "要回傳的頁面總數。",
        "apihelp-query+iwbacklinks-param-prop": "要取得的屬性。",
        "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "添加跨 wiki 前綴。",
        "apihelp-query+iwbacklinks-example-generator": "取得連結至 [[wikibooks:Test]] 的頁面相關資訊。",
        "apihelp-query+iwlinks-summary": "回傳指定頁面的所有 interwiki 連結。",
        "apihelp-query+iwlinks-param-url": "是否取得完整的 URL(不能與 $1prop 一同使用)。",
+       "apihelp-query+iwlinks-param-prop": "為各跨語言連結所要取得的額外屬性:",
        "apihelp-query+iwlinks-paramvalue-prop-url": "添加完整的 URL。",
        "apihelp-query+iwlinks-param-limit": "要回傳的跨 Wiki 連結數量。",
        "apihelp-query+iwlinks-param-prefix": "僅回傳帶有此前綴的跨 wiki 連結。",
        "apihelp-query+langlinks-paramvalue-prop-url": "添加完整的 URL。",
        "apihelp-query+langlinks-paramvalue-prop-autonym": "添加本地語言名稱。",
        "apihelp-query+langlinks-param-lang": "僅回傳帶有此語言代碼的語言連結。",
+       "apihelp-query+langlinks-param-title": "要搜尋的連結。必須與 <var>$1lang</var> 一起使用。",
        "apihelp-query+langlinks-param-dir": "列出時所採用的方向。",
        "apihelp-query+langlinks-param-inlanguagecode": "用於本地化語言名稱的語言代碼。",
        "apihelp-query+langlinks-example-simple": "從頁面 <kbd>Main Page</kbd> 取得跨語言連結。",
        "apihelp-query+querypage-example-ancientpages": "回傳來自 [[Special:Ancientpages]] 的結果。",
        "apihelp-query+random-summary": "取得隨機頁面集合",
        "apihelp-query+random-param-namespace": "僅回傳在這些命名空間的頁面。",
+       "apihelp-query+random-param-limit": "限制所回傳的隨機頁面數量。",
        "apihelp-query+random-param-redirect": "請改用 <kbd>$1filterredir=redirects</kbd>。",
        "apihelp-query+random-param-filterredir": "如何過濾重新導向。",
        "apihelp-query+random-example-simple": "從主命名空間回傳兩個隨機頁面。",
        "apihelp-query+recentchanges-param-excludeuser": "不要列出由該使用者作出的更改。",
        "apihelp-query+recentchanges-param-tag": "僅列出以此標籤所標記的更改。",
        "apihelp-query+recentchanges-param-prop": "包含的額外資訊部份:",
+       "apihelp-query+recentchanges-paramvalue-prop-userid": "添加承擔編輯的使用者。",
        "apihelp-query+recentchanges-paramvalue-prop-comment": "添加編輯的註釋。",
        "apihelp-query+recentchanges-paramvalue-prop-parsedcomment": "添加編輯的解析註釋。",
        "apihelp-query+recentchanges-paramvalue-prop-flags": "添加編輯的標籤。",
        "apihelp-query+recentchanges-paramvalue-prop-timestamp": "添加編輯的時間戳記。",
        "apihelp-query+recentchanges-paramvalue-prop-title": "添加編輯的頁面標題。",
+       "apihelp-query+recentchanges-paramvalue-prop-ids": "添加頁面 ID、最近更改 ID 以及新舊修訂 ID。",
+       "apihelp-query+recentchanges-paramvalue-prop-sizes": "添加新舊頁面長度(位元組)。",
        "apihelp-query+recentchanges-paramvalue-prop-redirect": "若頁面為重新導向則標記編輯。",
        "apihelp-query+recentchanges-paramvalue-prop-tags": "列出項目的標籤。",
        "apihelp-query+recentchanges-param-token": "請改用 <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>。",
        "apihelp-query+usercontribs-example-ipprefix": "顯示所有來自於前綴為 <kbd>192.0.2.</kbd> 的 IP 地址貢獻。",
        "apihelp-query+userinfo-summary": "取得目前使用者的資訊。",
        "apihelp-query+userinfo-param-prop": "要包含的資訊部份:",
+       "apihelp-query+userinfo-paramvalue-prop-hasmsg": "若目前使用者有等待訊息,添加 <samp>messages</samp> 標籤。",
        "apihelp-query+userinfo-paramvalue-prop-groups": "列出目前使用者所隸屬的所有群組。",
        "apihelp-query+userinfo-paramvalue-prop-rights": "列出目前使用者所擁有的權限。",
        "apihelp-query+userinfo-paramvalue-prop-options": "列出目前使用者已設定過的所有偏好設定。",
        "apihelp-query+users-param-users": "要獲取的使用者清單。",
        "apihelp-query+users-param-userids": "要獲取的使用者 ID 清單。",
        "apihelp-query+users-param-token": "請改用 <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>。",
+       "apihelp-query+users-example-simple": "返回使用者 <kbd>Example</kbd> 的資訊。",
        "apihelp-query+watchlist-param-start": "起始列舉的時間戳記。",
        "apihelp-query+watchlist-param-end": "結束列舉的時間戳記。",
        "apihelp-query+watchlist-param-user": "此列出由該使用者作出的更改。",
        "apihelp-query+watchlistraw-example-simple": "列出在目前使用者的監視清單裡頭頁面。",
        "apihelp-removeauthenticationdata-summary": "為目前使用者移除身分核對資料。",
        "apihelp-resetpassword-summary": "寄送重新設定密碼的電子郵件給使用者。",
+       "apihelp-resetpassword-param-email": "正被重新設定使用者的電子郵件地址。",
        "apihelp-resetpassword-example-user": "向使用者 <kbd>Example</kbd> 寄送重新設定密碼用的電子郵件。",
        "apihelp-revisiondelete-summary": "刪除和取消刪除修訂。",
        "apihelp-revisiondelete-param-hide": "各修訂所要隱藏的內容。",
        "apihelp-revisiondelete-param-reason": "刪除或取消刪除的原因。",
        "apihelp-revisiondelete-param-tags": "在刪除日誌裡套用到項目的標籤。",
        "apihelp-rollback-summary": "撤修頁面的最後一次編輯。",
+       "apihelp-rollback-param-title": "要回退的頁面標題。不可與 <var>$1pageid</var> 同時使用。",
+       "apihelp-rollback-param-pageid": "要回退的頁面 ID。不可與 <var>$1title</var> 同時使用。",
        "apihelp-rollback-param-tags": "套用到回退的標籤。",
        "apihelp-rollback-param-summary": "自定義編輯摘要。若為空,則使用預設摘要。",
        "apihelp-rollback-param-watchlist": "無條件使用設置將頁面加入或移除目前使用者的監視清單或者是不更改監視清單。",
+       "apihelp-setnotificationtimestamp-summary": "更新監視頁面的通知時間戳記。",
        "apihelp-setnotificationtimestamp-param-entirewatchlist": "在所有已監視頁面運作。",
        "apihelp-setnotificationtimestamp-example-page": "重新設定用於 <kbd>Main page</kbd> 的通知狀態。",
        "apihelp-setnotificationtimestamp-example-allpages": "重新設定在 <kbd>{{ns:user}}</kbd> 命名空間裡頁面的通知狀態。",
index 86a6aae..c538ee7 100644 (file)
@@ -136,7 +136,8 @@ class LocalPasswordPrimaryAuthenticationProvider
                // @codeCoverageIgnoreStart
                if ( $this->getPasswordFactory()->needsUpdate( $pwhash ) ) {
                        $newHash = $this->getPasswordFactory()->newFromPlaintext( $req->password );
-                       \DeferredUpdates::addCallableUpdate( function () use ( $newHash, $oldRow ) {
+                       $fname = __METHOD__;
+                       \DeferredUpdates::addCallableUpdate( function () use ( $newHash, $oldRow, $fname ) {
                                $dbw = wfGetDB( DB_MASTER );
                                $dbw->update(
                                        'user',
@@ -145,7 +146,7 @@ class LocalPasswordPrimaryAuthenticationProvider
                                                'user_id' => $oldRow->user_id,
                                                'user_password' => $oldRow->user_password
                                        ],
-                                       __METHOD__
+                                       $fname
                                );
                        } );
                }
index 7a1b988..aa929bc 100644 (file)
@@ -582,10 +582,11 @@ class MessageCache {
                        // Ignore $wgMaxMsgCacheEntrySize so the process cache is up to date
                        $this->cache->setField( $code, $title, ' ' . $text );
                }
+               $fname = __METHOD__;
 
                // (b) Update the shared caches in a deferred update with a fresh DB snapshot
                DeferredUpdates::addCallableUpdate(
-                       function () use ( $title, $msg, $code ) {
+                       function () use ( $title, $msg, $code, $fname ) {
                                global $wgMaxMsgCacheEntrySize;
                                // Allow one caller at a time to avoid race conditions
                                $scopedLock = $this->getReentrantScopedLock(
@@ -593,7 +594,7 @@ class MessageCache {
                                );
                                if ( !$scopedLock ) {
                                        LoggerFactory::getInstance( 'MessageCache' )->error(
-                                               __METHOD__ . ': could not acquire lock to update {title} ({code})',
+                                               $fname . ': could not acquire lock to update {title} ({code})',
                                                [ 'title' => $title, 'code' => $code ] );
                                        return;
                                }
@@ -1029,14 +1030,15 @@ class MessageCache {
         * @return string Either " <MESSAGE>" or "!NONEXISTANT"
         */
        private function loadCachedMessagePageEntry( $dbKey, $code, $hash ) {
+               $fname = __METHOD__;
                return $this->srvCache->getWithSetCallback(
                        $this->srvCache->makeKey( 'messages-big', $hash, $dbKey ),
                        IExpiringStore::TTL_MINUTE,
-                       function () use ( $code, $dbKey, $hash ) {
+                       function () use ( $code, $dbKey, $hash, $fname ) {
                                return $this->wanCache->getWithSetCallback(
                                        $this->bigMessageCacheKey( $hash, $dbKey ),
                                        $this->mExpiry,
-                                       function ( $oldValue, &$ttl, &$setOpts ) use ( $dbKey, $code ) {
+                                       function ( $oldValue, &$ttl, &$setOpts ) use ( $dbKey, $code, $fname ) {
                                                // Try loading the message from the database
                                                $dbr = wfGetDB( DB_REPLICA );
                                                $setOpts += Database::getCacheSetOptions( $dbr );
@@ -1053,7 +1055,7 @@ class MessageCache {
                                                        $message = $this->getMessageTextFromContent( $content );
                                                } else {
                                                        LoggerFactory::getInstance( 'MessageCache' )->warning(
-                                                               __METHOD__ . ': failed to load page text for \'{titleKey}\'',
+                                                               $fname . ': failed to load page text for \'{titleKey}\'',
                                                                [ 'titleKey' => $dbKey, 'code' => $code ]
                                                        );
                                                        $message = null;
index a2af01c..a26f5b6 100644 (file)
@@ -60,7 +60,10 @@ class OldChangesList extends ChangesList {
                ) {
                        return false;
                }
-               $attribs = wfArrayFilterByKey( $attribs, [ Sanitizer::class, 'isReservedDataAttribute' ] );
+               $attribs = array_filter( $attribs,
+                       [ Sanitizer::class, 'isReservedDataAttribute' ],
+                       ARRAY_FILTER_USE_KEY
+               );
 
                $dateheader = ''; // $html now contains only <li>...</li>, for hooks' convenience.
                $this->insertDateHeader( $dateheader, $rc->mAttribs['rc_timestamp'] );
index 45a35c0..8dc63e5 100644 (file)
@@ -928,13 +928,14 @@ class ChangeTags {
                        );
                }
 
-               $dbw->replace(
-                       'valid_tag',
-                       [ 'vt_tag' ],
-                       [ 'vt_tag' => $tag ],
-                       __METHOD__
-               );
-
+               if ( $wgChangeTagsSchemaMigrationStage < MIGRATION_NEW ) {
+                       $dbw->replace(
+                               'valid_tag',
+                               [ 'vt_tag' ],
+                               [ 'vt_tag' => $tag ],
+                               __METHOD__
+                       );
+               }
                // clear the memcache of defined tags
                self::purgeTagCacheAll();
        }
@@ -967,7 +968,9 @@ class ChangeTags {
                        );
                }
 
-               $dbw->delete( 'valid_tag', [ 'vt_tag' => $tag ], __METHOD__ );
+               if ( $wgChangeTagsSchemaMigrationStage < MIGRATION_NEW ) {
+                       $dbw->delete( 'valid_tag', [ 'vt_tag' => $tag ], __METHOD__ );
+               }
 
                // clear the memcache of defined tags
                self::purgeTagCacheAll();
@@ -1458,7 +1461,7 @@ class ChangeTags {
        /**
         * Lists tags explicitly defined in the `valid_tag` table of the database.
         * Tags in table 'change_tag' which are not in table 'valid_tag' are not
-        * included.
+        * included. In case of new backend loads the data from `change_tag_def` table.
         *
         * Tries memcached first.
         *
@@ -1473,11 +1476,16 @@ class ChangeTags {
                        $cache->makeKey( 'valid-tags-db' ),
                        WANObjectCache::TTL_MINUTE * 5,
                        function ( $oldValue, &$ttl, array &$setOpts ) use ( $fname ) {
+                               global $wgChangeTagsSchemaMigrationStage;
                                $dbr = wfGetDB( DB_REPLICA );
 
                                $setOpts += Database::getCacheSetOptions( $dbr );
 
-                               $tags = $dbr->selectFieldValues( 'valid_tag', 'vt_tag', [], $fname );
+                               if ( $wgChangeTagsSchemaMigrationStage > MIGRATION_WRITE_BOTH ) {
+                                       $tags = self::listExplicitlyDefinedTagsNewBackend();
+                               } else {
+                                       $tags = $dbr->selectFieldValues( 'valid_tag', 'vt_tag', [], $fname );
+                               }
 
                                return array_filter( array_unique( $tags ) );
                        },
@@ -1489,6 +1497,22 @@ class ChangeTags {
                );
        }
 
+       /**
+        * Lists tags explicitly user defined tags. When ctd_user_defined is true.
+        *
+        * @return string[] Array of strings: tags
+        * @since 1.25
+        */
+       private static function listExplicitlyDefinedTagsNewBackend() {
+               $dbr = wfGetDB( DB_REPLICA );
+               return $dbr->selectFieldValues(
+                       'change_tag_def',
+                       'ctd_name',
+                       [ 'ctd_user_defined' => 1 ],
+                       __METHOD__
+               );
+       }
+
        /**
         * Lists tags defined by core or extensions using the ListDefinedTags hook.
         * Extensions need only define those tags they deem to be in active use.
index d4a79d9..9d0789c 100644 (file)
@@ -29,7 +29,7 @@ use Psr\Log\LogLevel;
 use UDPTransport;
 
 /**
- * PSR-3 logger that mimics the historic implementation of MediaWiki's
+ * PSR-3 logger that mimics the historic implementation of MediaWiki's former
  * wfErrorLog logging implementation.
  *
  * This logger is configured by the following global configuration variables:
@@ -145,10 +145,6 @@ class LegacyLogger extends AbstractLogger {
                        // specfied.
                        $shouldEmit = (bool)$wgDBerrorLog;
 
-               } elseif ( $channel === 'wfErrorLog' ) {
-                       // All messages on the wfErrorLog channel should be emitted.
-                       $shouldEmit = true;
-
                } elseif ( $channel === 'wfDebug' ) {
                        // wfDebug messages are emitted if a catch all logging file has
                        // been specified. Checked explicitly so that 'private' flagged
@@ -192,10 +188,9 @@ class LegacyLogger extends AbstractLogger {
        /**
         * Format a message.
         *
-        * Messages to the 'wfDebug', 'wfLogDBError' and 'wfErrorLog' channels
-        * receive special formatting to mimic the historic output of the functions
-        * of the same name. All other channel values are formatted based on the
-        * historic output of the `wfDebugLog()` global function.
+        * Messages to the 'wfDebug' and 'wfLogDBError' channels receive special formatting to mimic the
+        * historic output of the functions of the same name. All other channel values are formatted
+        * based on the historic output of the `wfDebugLog()` global function.
         *
         * @param string $channel
         * @param string $message
@@ -211,9 +206,6 @@ class LegacyLogger extends AbstractLogger {
                } elseif ( $channel === 'wfLogDBError' ) {
                        $text = self::formatAsWfLogDBError( $channel, $message, $context );
 
-               } elseif ( $channel === 'wfErrorLog' ) {
-                       $text = "{$message}\n";
-
                } elseif ( $channel === 'profileoutput' ) {
                        // Legacy wfLogProfilingData formatitng
                        $forward = '';
index 92624a0..e16dd4c 100644 (file)
@@ -24,10 +24,11 @@ use MediaWiki\Logger\LegacyLogger;
 use Monolog\Formatter\NormalizerFormatter;
 
 /**
- * Log message formatter that mimics the legacy log message formatting of
- * `wfDebug`, `wfDebugLog`, `wfLogDBError` and `wfErrorLog` global functions by
- * delegating the formatting to \MediaWiki\Logger\LegacyLogger.
+ * Log message formatter that mimics the legacy log message formatting of `wfDebug`, `wfDebugLog`,
+ * `wfLogDBError` and the former `wfErrorLog` global functions by delegating the formatting to
+ * \MediaWiki\Logger\LegacyLogger.
  *
+ * @deprecated since 1.32
  * @since 1.25
  * @copyright © 2013 Wikimedia Foundation and contributors
  * @see \MediaWiki\Logger\LegacyLogger
index dbeb136..258a9a8 100644 (file)
@@ -27,7 +27,7 @@ use Monolog\Logger;
 use UnexpectedValueException;
 
 /**
- * Log handler that replicates the behavior of MediaWiki's wfErrorLog()
+ * Log handler that replicates the behavior of MediaWiki's former wfErrorLog()
  * logging service. Log output can be directed to a local file, a PHP stream,
  * or a udp2log server.
  *
index 9602bd2..936f6bf 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Storage\SlotRecord;
 
 /**
  * DifferenceEngine is responsible for rendering the difference between two revisions as HTML.
@@ -273,7 +274,7 @@ class DifferenceEngine extends ContextSource {
        protected function getSlotContents() {
                if ( $this->isContentOverridden ) {
                        return [
-                               'main' => [
+                               SlotRecord::MAIN => [
                                        'old' => $this->mOldContent,
                                        'new' => $this->mNewContent,
                                ]
@@ -302,8 +303,8 @@ class DifferenceEngine extends ContextSource {
                        ];
                }
                // move main slot to front
-               if ( isset( $slots['main'] ) ) {
-                       $slots = [ 'main' => $slots['main'] ] + $slots;
+               if ( isset( $slots[SlotRecord::MAIN] ) ) {
+                       $slots = [ SlotRecord::MAIN => $slots[SlotRecord::MAIN] ] + $slots;
                }
                return $slots;
        }
@@ -1053,7 +1054,7 @@ class DifferenceEngine extends ContextSource {
                foreach ( $this->getSlotDiffRenderers() as $role => $slotDiffRenderer ) {
                        $slotDiff = $slotDiffRenderer->getDiff( $slotContents[$role]['old'],
                                $slotContents[$role]['new'] );
-                       if ( $slotDiff && $role !== 'main' ) {
+                       if ( $slotDiff && $role !== SlotRecord::MAIN ) {
                                // TODO use human-readable role name at least
                                $slotTitle = $role;
                                $difftext .= $this->getSlotHeader( $slotTitle );
@@ -1100,7 +1101,7 @@ class DifferenceEngine extends ContextSource {
                        return false;
                }
 
-               if ( $role !== 'main' ) {
+               if ( $role !== SlotRecord::MAIN ) {
                        // TODO use human-readable role name at least
                        $slotTitle = $role;
                        $slotDiff = $this->getSlotHeader( $slotTitle ) . $slotDiff;
@@ -1640,7 +1641,7 @@ class DifferenceEngine extends ContextSource {
                        $this->mOldPage = Title::newFromLinkTarget( $oldRevision->getPageAsLinkTarget() );
                        // This method is meant for edit diffs and such so there is no reason to provide a
                        // revision that's not readable to the user, but check it just in case.
-                       $this->mOldContent = $oldRevision ? $oldRevision->getContent( 'main',
+                       $this->mOldContent = $oldRevision ? $oldRevision->getContent( SlotRecord::MAIN,
                                RevisionRecord::FOR_THIS_USER, $this->getUser() ) : null;
                } else {
                        $this->mOldPage = null;
@@ -1649,7 +1650,7 @@ class DifferenceEngine extends ContextSource {
                $this->mNewRev = new Revision( $newRevision );
                $this->mNewid = $newRevision->getId();
                $this->mNewPage = Title::newFromLinkTarget( $newRevision->getPageAsLinkTarget() );
-               $this->mNewContent = $newRevision->getContent( 'main',
+               $this->mNewContent = $newRevision->getContent( SlotRecord::MAIN,
                        RevisionRecord::FOR_THIS_USER, $this->getUser() );
 
                $this->mRevisionsIdsLoaded = $this->mRevisionsLoaded = true;
index 652a87d..af835e4 100644 (file)
@@ -76,6 +76,7 @@ class MWException extends Exception {
                global $wgSitename;
                $args = array_slice( func_get_args(), 2 );
 
+               // FIXME: Keep logic in sync with MWExceptionRenderer::msg.
                $res = false;
                if ( $this->useMessageCache() ) {
                        try {
@@ -87,7 +88,9 @@ class MWException extends Exception {
                        $res = wfMsgReplaceArgs( $fallback, $args );
                        // If an exception happens inside message rendering,
                        // {{SITENAME}} sometimes won't be replaced.
-                       $res = preg_replace( '/\{\{SITENAME\}\}/', $wgSitename, $res );
+                       $res = strtr( $res, [
+                               '{{SITENAME}}' => $wgSitename,
+                       ] );
                }
                return $res;
        }
index bd823b5..0e81a43 100644 (file)
@@ -35,12 +35,35 @@ class MWExceptionHandler {
         * @var string $reservedMemory
         */
        protected static $reservedMemory;
+
        /**
+        * Error types that, if unhandled, are fatal to the request.
+        *
+        * On PHP 7, these error types may be thrown as Error objects, which
+        * implement Throwable (but not Exception).
+        *
+        * On HHVM, these invoke the set_error_handler callback, similar to how
+        * (non-fatal) warnings and notices are reported, except that after this
+        * handler runs for fatal error tpyes, script execution stops!
+        *
+        * The user will be shown an HTTP 500 Internal Server Error.
+        * As such, these should be sent to MediaWiki's "fatal" or "exception"
+        * channel. Normally, the error handler logs them to the "error" channel.
+        *
         * @var array $fatalErrorTypes
         */
        protected static $fatalErrorTypes = [
-               E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR,
-               /* HHVM's FATAL_ERROR level */ 16777217,
+               E_ERROR,
+               E_PARSE,
+               E_CORE_ERROR,
+               E_COMPILE_ERROR,
+               E_USER_ERROR,
+
+               // E.g. "Catchable fatal error: Argument X must be Y, null given"
+               E_RECOVERABLE_ERROR,
+
+               // HHVM's FATAL_ERROR constant
+               16777217,
        ];
        /**
         * @var bool $handledFatalCallback
@@ -192,10 +215,6 @@ class MWExceptionHandler {
                // behaviour given the null was not part of the code and is likely not
                // accounted for.
                switch ( $level ) {
-                       case E_RECOVERABLE_ERROR:
-                               $levelName = 'Error';
-                               $severity = LogLevel::ERROR;
-                               break;
                        case E_WARNING:
                        case E_CORE_WARNING:
                        case E_COMPILE_WARNING:
@@ -231,9 +250,9 @@ class MWExceptionHandler {
                self::logError( $e, 'error', $severity );
 
                // If $wgPropagateErrors is true return false so PHP shows/logs the error normally.
-               // Ignore $wgPropagateErrors if the error should break execution, or track_errors is set
+               // Ignore $wgPropagateErrors if track_errors is set
                // (which means someone is counting on regular PHP error handling behavior).
-               return !( $wgPropagateErrors || $level == E_RECOVERABLE_ERROR || ini_get( 'track_errors' ) );
+               return !( $wgPropagateErrors || ini_get( 'track_errors' ) );
        }
 
        /**
index 1f1cabe..de2af6b 100644 (file)
@@ -199,13 +199,17 @@ class MWExceptionRenderer {
        private static function msg( $key, $fallback /*[, params...] */ ) {
                global $wgSitename;
                $args = array_slice( func_get_args(), 2 );
+
+               // FIXME: Keep logic in sync with MWException::msg.
                try {
                        $res = wfMessage( $key, $args )->text();
                } catch ( Exception $e ) {
                        $res = wfMsgReplaceArgs( $fallback, $args );
                        // If an exception happens inside message rendering,
                        // {{SITENAME}} sometimes won't be replaced.
-                       $res = preg_replace( '/\{\{SITENAME\}\}/', $wgSitename, $res );
+                       $res = strtr( $res, [
+                               '{{SITENAME}}' => $wgSitename,
+                       ] );
                }
                return $res;
        }
index 858e124..455d38f 100644 (file)
@@ -810,8 +810,9 @@ class FileRepo {
         */
        public function getDescriptionStylesheetUrl() {
                if ( isset( $this->scriptDirUrl ) ) {
-                       return $this->makeUrl( 'title=MediaWiki:Filepage.css&' .
-                               wfArrayToCgi( Skin::getDynamicStylesheetQuery() ) );
+                       // Must match canonical query parameter order for optimum caching
+                       // See Title::getCdnUrls
+                       return $this->makeUrl( 'title=MediaWiki:Filepage.css&action=raw&ctype=text/css' );
                }
 
                return false;
index 5a0cf6a..a30d213 100644 (file)
@@ -2071,13 +2071,14 @@ abstract class File implements IDBAccessObject {
                                $lang->getCode(),
                                md5( $this->getName() )
                        );
+                       $fname = __METHOD__;
 
                        return $cache->getWithSetCallback(
                                $key,
                                $this->repo->descriptionCacheExpiry ?: $cache::TTL_UNCACHEABLE,
-                               function ( $oldValue, &$ttl, array &$setOpts ) use ( $renderUrl ) {
+                               function ( $oldValue, &$ttl, array &$setOpts ) use ( $renderUrl, $fname ) {
                                        wfDebug( "Fetching shared description from $renderUrl\n" );
-                                       $res = Http::get( $renderUrl, [], __METHOD__ );
+                                       $res = Http::get( $renderUrl, [], $fname );
                                        if ( !$res ) {
                                                $ttl = WANObjectCache::TTL_UNCACHEABLE;
                                        }
index ee4df1d..1869967 100644 (file)
@@ -152,6 +152,7 @@ class ForeignDBFile extends LocalFile {
                }
 
                $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
+               $fname = __METHOD__;
 
                return $cache->getWithSetCallback(
                        $this->repo->getLocalCacheKey(
@@ -161,9 +162,9 @@ class ForeignDBFile extends LocalFile {
                                $touched
                        ),
                        $this->repo->descriptionCacheExpiry ?: $cache::TTL_UNCACHEABLE,
-                       function ( $oldValue, &$ttl, array &$setOpts ) use ( $renderUrl ) {
+                       function ( $oldValue, &$ttl, array &$setOpts ) use ( $renderUrl, $fname ) {
                                wfDebug( "Fetching shared description from $renderUrl\n" );
-                               $res = Http::get( $renderUrl, [], __METHOD__ );
+                               $res = Http::get( $renderUrl, [], $fname );
                                if ( !$res ) {
                                        $ttl = WANObjectCache::TTL_UNCACHEABLE;
                                }
index fa6e180..36a44dc 100644 (file)
@@ -63,7 +63,7 @@ class LocalFile extends File {
        /** @var string MEDIATYPE_xxx (bitmap, drawing, audio...) */
        protected $media_type;
 
-       /** @var string MIME type, determined by MimeMagic::guessMimeType */
+       /** @var string MIME type, determined by MimeAnalyzer::guessMimeType */
        protected $mime;
 
        /** @var int Size in bytes (loadFromXxx) */
@@ -1696,6 +1696,7 @@ class LocalFile extends File {
                # Defer purges, page creation, and link updates in case they error out.
                # The most important thing is that files and the DB registry stay synced.
                $dbw->endAtomic( __METHOD__ );
+               $fname = __METHOD__;
 
                # Do some cache purges after final commit so that:
                # a) Changes are more likely to be seen post-purge
@@ -1706,7 +1707,7 @@ class LocalFile extends File {
                                __METHOD__,
                                function () use (
                                        $reupload, $wikiPage, $newPageContent, $comment, $user,
-                                       $logEntry, $logId, $descId, $tags
+                                       $logEntry, $logId, $descId, $tags, $fname
                                ) {
                                        # Update memcache after the commit
                                        $this->invalidateCache();
@@ -1758,7 +1759,7 @@ class LocalFile extends File {
                                                'logging',
                                                $update,
                                                [ 'log_id' => $logId ],
-                                               __METHOD__
+                                               $fname
                                        );
                                        $this->getRepo()->getMasterDB()->insert(
                                                'log_search',
@@ -1767,7 +1768,7 @@ class LocalFile extends File {
                                                        'ls_value' => $logEntry->getAssociatedRevId(),
                                                        'ls_log_id' => $logId,
                                                ],
-                                               __METHOD__
+                                               $fname
                                        );
 
                                        # Add change tags, if any
index 93d09e7..dd9f793 100644 (file)
@@ -1,6 +1,5 @@
 <?php
 
-use MediaWiki\MediaWikiServices;
 use MediaWiki\Widget\TitleInputWidget;
 
 /**
@@ -57,17 +56,10 @@ class HTMLTitleTextField extends HTMLTextField {
                                $title = Title::newFromTextThrow( $value );
                        } else {
                                // Can't use Title::makeTitleSafe(), because it doesn't throw useful exceptions
-                               $namespaceName = MediaWikiServices::getInstance()->getContentLanguage()->
-                                       getNsText( $this->mParams['namespace'] );
-                               $title = Title::newFromTextThrow( $namespaceName . ':' . $value );
+                               $title = Title::newFromTextThrow( Title::makeName( $this->mParams['namespace'], $value ) );
                        }
                } catch ( MalformedTitleException $e ) {
-                       $msg = $this->msg( $e->getErrorMessage() );
-                       $params = $e->getErrorMessageParameters();
-                       if ( $params ) {
-                               $msg->params( $params );
-                       }
-                       return $msg;
+                       return $this->msg( $e->getErrorMessage(), $e->getErrorMessageParameters() );
                }
 
                $text = $title->getPrefixedText();
index 367149d..0f8a5b0 100644 (file)
@@ -454,6 +454,7 @@ abstract class Installer {
 
                $this->parserTitle = Title::newFromText( 'Installer' );
                $this->parserOptions = new ParserOptions( $wgUser ); // language will be wrong :(
+               $this->parserOptions->setTidy( true );
                // Don't try to access DB before user language is initialised
                $this->setParserLanguage( Language::factory( 'en' ) );
        }
index fc1c33f..43fe748 100644 (file)
@@ -29,7 +29,7 @@ abstract class WebInstallerDocument extends WebInstallerPage {
        public function execute() {
                $text = $this->getFileContents();
                $text = InstallDocFormatter::format( $text );
-               $this->parent->output->addWikiText( $text );
+               $this->parent->output->addWikiTextInterface( $text );
                $this->startForm();
                $this->endForm( false );
        }
index cb0092d..dd76ce9 100644 (file)
@@ -89,8 +89,17 @@ class WebInstallerOutput {
 
        /**
         * @param string $text
+        * @deprecated since 1.32; use addWikiTextInterface instead
         */
        public function addWikiText( $text ) {
+               wfDeprecated( __METHOD__, '1.32' );
+               $this->addWikiTextInterface( $text );
+       }
+
+       /**
+        * @param string $text
+        */
+       public function addWikiTextInterface( $text ) {
                $this->addHTML( $this->parent->parse( $text ) );
        }
 
index 44ff0bb..0d79484 100644 (file)
@@ -30,12 +30,12 @@ class WebInstallerWelcome extends WebInstallerPage {
                                return 'continue';
                        }
                }
-               $this->parent->output->addWikiText( wfMessage( 'config-welcome' )->plain() );
+               $this->parent->output->addWikiTextInterface( wfMessage( 'config-welcome' )->plain() );
                $status = $this->parent->doEnvironmentChecks();
                if ( $status->isGood() ) {
                        $this->parent->output->addHTML( '<span class="success-message">' .
                                wfMessage( 'config-env-good' )->escaped() . '</span>' );
-                       $this->parent->output->addWikiText( wfMessage( 'config-copyright',
+                       $this->parent->output->addWikiTextInterface( wfMessage( 'config-copyright',
                                SpecialVersion::getCopyrightAndAuthorList() )->plain() );
                        $this->startForm();
                        $this->endForm();
index 05cf933..cdf4cde 100644 (file)
@@ -279,10 +279,11 @@ class ClassicInterwikiLookup implements InterwikiLookup {
                        }
                }
 
+               $fname = __METHOD__;
                $iwData = $this->objectCache->getWithSetCallback(
                        $this->objectCache->makeKey( 'interwiki', $prefix ),
                        $this->objectCacheExpiry,
-                       function ( $oldValue, &$ttl, array &$setOpts ) use ( $prefix ) {
+                       function ( $oldValue, &$ttl, array &$setOpts ) use ( $prefix, $fname ) {
                                $dbr = wfGetDB( DB_REPLICA ); // TODO: inject LoadBalancer
 
                                $setOpts += Database::getCacheSetOptions( $dbr );
@@ -291,7 +292,7 @@ class ClassicInterwikiLookup implements InterwikiLookup {
                                        'interwiki',
                                        self::selectFields(),
                                        [ 'iw_prefix' => $prefix ],
-                                       __METHOD__
+                                       $fname
                                );
 
                                return $row ? (array)$row : '!NONEXISTENT';
index 5d8a6cf..ef364b5 100644 (file)
@@ -36,11 +36,12 @@ class PurgeJobUtils {
                if ( $dbkeys === [] ) {
                        return;
                }
+               $fname = __METHOD__;
 
                DeferredUpdates::addUpdate( new AutoCommitUpdate(
                        $dbw,
                        __METHOD__,
-                       function () use ( $dbw, $namespace, $dbkeys ) {
+                       function () use ( $dbw, $namespace, $dbkeys, $fname ) {
                                $services = MediaWikiServices::getInstance();
                                $lbFactory = $services->getDBLoadBalancerFactory();
                                // Determine which pages need to be updated.
@@ -55,7 +56,7 @@ class PurgeJobUtils {
                                                'page_title' => $dbkeys,
                                                'page_touched < ' . $dbw->addQuotes( $now )
                                        ],
-                                       __METHOD__
+                                       $fname
                                );
 
                                if ( !$ids ) {
@@ -63,7 +64,7 @@ class PurgeJobUtils {
                                }
 
                                $batchSize = $services->getMainConfig()->get( 'UpdateRowsPerQuery' );
-                               $ticket = $lbFactory->getEmptyTransactionTicket( __METHOD__ );
+                               $ticket = $lbFactory->getEmptyTransactionTicket( $fname );
                                foreach ( array_chunk( $ids, $batchSize ) as $idBatch ) {
                                        $dbw->update(
                                                'page',
@@ -72,9 +73,9 @@ class PurgeJobUtils {
                                                        'page_id' => $idBatch,
                                                        'page_touched < ' . $dbw->addQuotes( $now ) // handle races
                                                ],
-                                               __METHOD__
+                                               $fname
                                        );
-                                       $lbFactory->commitAndWaitForReplication( __METHOD__, $ticket );
+                                       $lbFactory->commitAndWaitForReplication( $fname, $ticket );
                                }
                        }
                ) );
index 0f57551..8d82965 100644 (file)
@@ -824,11 +824,12 @@ abstract class DatabaseMysqlBase extends Database {
                        // Using one key for all cluster replica DBs is preferable
                        $this->getLBInfo( 'clusterMasterHost' ) ?: $this->getServer()
                );
+               $fname = __METHOD__;
 
                return $cache->getWithSetCallback(
                        $key,
                        $cache::TTL_INDEFINITE,
-                       function () use ( $cache, $key ) {
+                       function () use ( $cache, $key, $fname ) {
                                // Get and leave a lock key in place for a short period
                                if ( !$cache->lock( $key, 0, 10 ) ) {
                                        return false; // avoid master connection spike slams
@@ -841,7 +842,7 @@ abstract class DatabaseMysqlBase extends Database {
 
                                // Connect to and query the master; catch errors to avoid outages
                                try {
-                                       $res = $conn->query( 'SELECT @@server_id AS id', __METHOD__ );
+                                       $res = $conn->query( 'SELECT @@server_id AS id', $fname );
                                        $row = $res ? $res->fetchObject() : false;
                                        $id = $row ? (int)$row->id : 0;
                                } catch ( DBError $e ) {
@@ -1043,11 +1044,12 @@ abstract class DatabaseMysqlBase extends Database {
         * @throws DBQueryError If the variable doesn't exist for some reason
         */
        protected function getServerId() {
+               $fname = __METHOD__;
                return $this->srvCache->getWithSetCallback(
                        $this->srvCache->makeGlobalKey( 'mysql-server-id', $this->getServer() ),
                        self::SERVER_ID_CACHE_TTL,
-                       function () {
-                               $res = $this->query( "SELECT @@server_id AS id", __METHOD__ );
+                       function () use ( $fname ) {
+                               $res = $this->query( "SELECT @@server_id AS id", $fname );
                                return intval( $this->fetchObject( $res )->id );
                        }
                );
index 00b4130..f36d98e 100644 (file)
@@ -1256,10 +1256,11 @@ class LoadBalancer implements ILoadBalancer {
        }
 
        public function closeAll() {
-               $this->forEachOpenConnection( function ( IDatabase $conn ) {
+               $fname = __METHOD__;
+               $this->forEachOpenConnection( function ( IDatabase $conn ) use ( $fname ) {
                        $host = $conn->getServer();
                        $this->connLogger->debug(
-                               __METHOD__ . ": closing connection to database '$host'." );
+                               $fname . ": closing connection to database '$host'." );
                        $conn->close();
                } );
 
@@ -1447,6 +1448,7 @@ class LoadBalancer implements ILoadBalancer {
                } );
 
                $e = null; // first exception
+               $fname = __METHOD__;
                // Loop until callbacks stop adding callbacks on other connections
                do {
                        // Run any pending callbacks for each connection...
@@ -1464,13 +1466,13 @@ class LoadBalancer implements ILoadBalancer {
                                }
                        );
                        // Clear out any active transactions left over from callbacks...
-                       $this->forEachOpenMasterConnection( function ( Database $conn ) use ( &$e ) {
+                       $this->forEachOpenMasterConnection( function ( Database $conn ) use ( &$e, $fname ) {
                                if ( $conn->writesPending() ) {
                                        // A callback from another handle wrote to this one and DBO_TRX is set
-                                       $this->queryLogger->warning( __METHOD__ . ": found writes pending." );
+                                       $this->queryLogger->warning( $fname . ": found writes pending." );
                                        $fnames = implode( ', ', $conn->pendingWriteAndCallbackCallers() );
                                        $this->queryLogger->warning(
-                                               __METHOD__ . ": found writes pending ($fnames).",
+                                               $fname . ": found writes pending ($fnames).",
                                                [
                                                        'db_server' => $conn->getServer(),
                                                        'db_name' => $conn->getDBname()
@@ -1479,10 +1481,10 @@ class LoadBalancer implements ILoadBalancer {
                                } elseif ( $conn->trxLevel() ) {
                                        // A callback from another handle read from this one and DBO_TRX is set,
                                        // which can easily happen if there is only one DB (no replicas)
-                                       $this->queryLogger->debug( __METHOD__ . ": found empty transaction." );
+                                       $this->queryLogger->debug( $fname . ": found empty transaction." );
                                }
                                try {
-                                       $conn->commit( __METHOD__, $conn::FLUSHING_ALL_PEERS );
+                                       $conn->commit( $fname, $conn::FLUSHING_ALL_PEERS );
                                } catch ( Exception $ex ) {
                                        $e = $e ?: $ex;
                                }
index 6a42d58..b6f5dce 100644 (file)
@@ -22,6 +22,7 @@
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Storage\MutableRevisionRecord;
 use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Storage\SlotRecord;
 
 /**
  * Class for viewing MediaWiki article and history.
@@ -524,7 +525,7 @@ class Article implements Page {
        private function applyContentOverride( Content $override ) {
                // Construct a fake revision
                $rev = new MutableRevisionRecord( $this->getTitle() );
-               $rev->setContent( 'main', $override );
+               $rev->setContent( SlotRecord::MAIN, $override );
 
                $this->mRevision = new Revision( $rev );
 
@@ -870,7 +871,7 @@ class Article implements Page {
                // TODO: find a *good* place for the code that determines the redirect target for
                // a given revision!
                // NOTE: Use main slot content. Compare code in DerivedPageDataUpdater::revisionIsRedirect.
-               $content = $revision->getContent( 'main' );
+               $content = $revision->getContent( SlotRecord::MAIN );
                return $content ? $content->getRedirectTarget() : null;
        }
 
index 20bc614..799c33a 100644 (file)
@@ -18,6 +18,8 @@
  * @file
  */
 
+use Wikimedia\Timestamp\TimestampException;
+
 class ImageHistoryPseudoPager extends ReverseChronologicalPager {
        protected $preventClickjacking = false;
 
@@ -138,6 +140,14 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
                if ( !$this->mImg->exists() ) {
                        return;
                }
+               // Make sure the date (probably from user input) is valid; if not, drop it.
+               if ( $this->mOffset !== null ) {
+                       try {
+                               $sadlyWeCannotPassThisTimestampDownTheStack = $this->mDb->timestamp( $this->mOffset );
+                       } catch ( TimestampException $e ) {
+                               $this->mOffset = null;
+                       }
+               }
                $queryLimit = $this->mLimit + 1; // limit plus extra row
                if ( $this->mIsBackwards ) {
                        // Fetch the file history
index 74e3179..7c97465 100644 (file)
@@ -1494,7 +1494,7 @@ class WikiPage implements Page, IDBAccessObject {
                $bSlots = $b->getRevisionRecord()->getSlots();
                $changedRoles = $aSlots->getRolesWithDifferentContent( $bSlots );
 
-               return ( $changedRoles !== [ 'main' ] && $changedRoles !== [] );
+               return ( $changedRoles !== [ SlotRecord::MAIN ] && $changedRoles !== [] );
        }
 
        /**
@@ -1853,13 +1853,13 @@ class WikiPage implements Page, IDBAccessObject {
                }
 
                $slotsUpdate = new RevisionSlotsUpdate();
-               $slotsUpdate->modifyContent( 'main', $content );
+               $slotsUpdate->modifyContent( SlotRecord::MAIN, $content );
 
                // NOTE: while doEditContent() executes, callbacks to getDerivedDataUpdater and
                // prepareContentForEdit will generally use the DerivedPageDataUpdater that is also
                // used by this PageUpdater. However, there is no guarantee for this.
                $updater = $this->newPageUpdater( $user, $slotsUpdate );
-               $updater->setContent( 'main', $content );
+               $updater->setContent( SlotRecord::MAIN, $content );
                $updater->setOriginalRevisionId( $originalRevId );
                $updater->setUndidRevisionId( $undidRevId );
 
@@ -1966,7 +1966,7 @@ class WikiPage implements Page, IDBAccessObject {
                        $revision = $revision->getRevisionRecord();
                }
 
-               $slots = RevisionSlotsUpdate::newFromContent( [ 'main' => $content ] );
+               $slots = RevisionSlotsUpdate::newFromContent( [ SlotRecord::MAIN => $content ] );
                $updater = $this->getDerivedDataUpdater( $user, $revision, $slots );
 
                if ( !$updater->isUpdatePrepared() ) {
@@ -3069,8 +3069,8 @@ class WikiPage implements Page, IDBAccessObject {
                }
 
                // TODO: MCR: also log model changes in other slots, in case that becomes possible!
-               $currentContent = $current->getContent( 'main' );
-               $targetContent = $target->getContent( 'main' );
+               $currentContent = $current->getContent( SlotRecord::MAIN );
+               $targetContent = $target->getContent( SlotRecord::MAIN );
                $changingContentModel = $targetContent->getModel() !== $currentContent->getModel();
 
                if ( in_array( 'mw-rollback', ChangeTags::getSoftwareTags() ) ) {
@@ -3290,7 +3290,7 @@ class WikiPage implements Page, IDBAccessObject {
        ) {
                // TODO: move this into a PageEventEmitter service
 
-               if ( $slotsChanged === null || in_array( 'main',  $slotsChanged ) ) {
+               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]
@@ -3578,7 +3578,7 @@ class WikiPage implements Page, IDBAccessObject {
                } elseif ( $rev instanceof Content ) {
                        wfDeprecated( __METHOD__ . ' with a Content object instead of a RevisionRecord', '1.32' );
 
-                       $slotContent = [ 'main' => $rev ];
+                       $slotContent = [ SlotRecord::MAIN => $rev ];
                } else {
                        $slotContent = array_map( function ( SlotRecord $slot ) {
                                return $slot->getContent( Revision::RAW );
index dc2bb0c..90ef335 100644 (file)
@@ -5143,24 +5143,18 @@ class Parser {
                                                                break;
                                                        case 'gallery-internal-link':
                                                                $linkValue = strip_tags( $this->replaceLinkHoldersText( $match ) );
-                                                               $chars = self::EXT_LINK_URL_CLASS;
-                                                               $addr = self::EXT_LINK_ADDR;
-                                                               $prots = $this->mUrlProtocols;
-                                                               // check to see if link matches an absolute url, if not then it must be a wiki link.
                                                                if ( preg_match( '/^-{R|(.*)}-$/', $linkValue ) ) {
                                                                        // Result of LanguageConverter::markNoConversion
                                                                        // invoked on an external link.
                                                                        $linkValue = substr( $linkValue, 4, -2 );
                                                                }
-                                                               if ( preg_match( "/^($prots)$addr$chars*$/u", $linkValue ) ) {
-                                                                       $link = $linkValue;
-                                                                       $this->mOutput->addExternalLink( $link );
-                                                               } else {
-                                                                       $localLinkTitle = Title::newFromText( $linkValue );
-                                                                       if ( $localLinkTitle !== null ) {
-                                                                               $this->mOutput->addLink( $localLinkTitle );
-                                                                               $link = $localLinkTitle->getLinkURL();
-                                                                       }
+                                                               list( $type, $target ) = $this->parseLinkParameter( $linkValue );
+                                                               if ( $type === 'link-url' ) {
+                                                                       $link = $target;
+                                                                       $this->mOutput->addExternalLink( $target );
+                                                               } elseif ( $type === 'link-title' ) {
+                                                                       $link = $target->getLinkURL();
+                                                                       $this->mOutput->addLink( $target );
                                                                }
                                                                break;
                                                        default:
@@ -5342,29 +5336,16 @@ class Parser {
                                                                $value = $this->stripAltText( $value, $holders );
                                                                break;
                                                        case 'link':
-                                                               $chars = self::EXT_LINK_URL_CLASS;
-                                                               $addr = self::EXT_LINK_ADDR;
-                                                               $prots = $this->mUrlProtocols;
-                                                               if ( $value === '' ) {
-                                                                       $paramName = 'no-link';
-                                                                       $value = true;
+                                                               list( $paramName, $value ) = $this->parseLinkParameter( $value );
+                                                               if ( $paramName ) {
                                                                        $validated = true;
-                                                               } elseif ( preg_match( "/^((?i)$prots)/", $value ) ) {
-                                                                       if ( preg_match( "/^((?i)$prots)$addr$chars*$/u", $value, $m ) ) {
-                                                                               $paramName = 'link-url';
-                                                                               $this->mOutput->addExternalLink( $value );
+                                                                       if ( $paramName === 'no-link' ) {
+                                                                               $value = true;
+                                                                       }
+                                                                       if ( $paramName === 'link-url' ) {
                                                                                if ( $this->mOptions->getExternalLinkTarget() ) {
                                                                                        $params[$type]['link-target'] = $this->mOptions->getExternalLinkTarget();
                                                                                }
-                                                                               $validated = true;
-                                                                       }
-                                                               } else {
-                                                                       $linkTitle = Title::newFromText( $value );
-                                                                       if ( $linkTitle ) {
-                                                                               $paramName = 'link-title';
-                                                                               $value = $linkTitle;
-                                                                               $this->mOutput->addLink( $linkTitle );
-                                                                               $validated = true;
                                                                        }
                                                                }
                                                                break;
@@ -5459,6 +5440,48 @@ class Parser {
                return $ret;
        }
 
+       /**
+        * Parse the value of 'link' parameter in image syntax (`[[File:Foo.jpg|link=<value>]]`).
+        *
+        * Adds an entry to appropriate link tables.
+        *
+        * @since 1.32
+        * @return array of `[ type, target ]`, where:
+        *   - `type` is one of:
+        *     - `null`: Given value is not a valid link target, use default
+        *     - `'no-link'`: Given value is empty, do not generate a link
+        *     - `'link-url'`: Given value is a valid external link
+        *     - `'link-title'`: Given value is a valid internal link
+        *   - `target` is:
+        *     - When `type` is `null` or `'no-link'`: `false`
+        *     - When `type` is `'link-url'`: URL string corresponding to given value
+        *     - When `type` is `'link-title'`: Title object corresponding to given value
+        */
+       public function parseLinkParameter( $value ) {
+               $chars = self::EXT_LINK_URL_CLASS;
+               $addr = self::EXT_LINK_ADDR;
+               $prots = $this->mUrlProtocols;
+               $type = null;
+               $target = false;
+               if ( $value === '' ) {
+                       $type = 'no-link';
+               } elseif ( preg_match( "/^((?i)$prots)/", $value ) ) {
+                       if ( preg_match( "/^((?i)$prots)$addr$chars*$/u", $value, $m ) ) {
+                               $this->mOutput->addExternalLink( $value );
+                               $type = 'link-url';
+                               $target = $value;
+                       }
+               } else {
+                       $linkTitle = Title::newFromText( $value );
+                       if ( $linkTitle ) {
+                               $this->mOutput->addLink( $linkTitle );
+                               $type = 'link-title';
+                               $target = $linkTitle;
+                       }
+               }
+               return [ $type, $target ];
+       }
+
        /**
         * @param string $caption
         * @param LinkHolderArray|bool $holders
index 286494e..157b508 100644 (file)
@@ -23,6 +23,7 @@ use MediaWiki\Revision\RevisionRenderer;
 use MediaWiki\Storage\MutableRevisionRecord;
 use MediaWiki\Storage\RevisionRecord;
 use MediaWiki\Storage\RevisionStore;
+use MediaWiki\Storage\SlotRecord;
 
 class PoolWorkArticleView extends PoolCounterWork {
        /** @var WikiPage */
@@ -81,7 +82,7 @@ class PoolWorkArticleView extends PoolCounterWork {
                        $revision = new MutableRevisionRecord( $page->getTitle() );
                        $revision->setId( $revid );
                        $revision->setPageId( $page->getId() );
-                       $revision->setContent( 'main', $content );
+                       $revision->setContent( SlotRecord::MAIN, $content );
                }
 
                if ( $revision ) {
index d380d07..dfd5985 100644 (file)
@@ -48,6 +48,11 @@ class ExtensionDependencyError extends Exception {
         */
        public $incompatibleCore = false;
 
+       /**
+        * @var bool
+        */
+       public $incompatiblePhp = false;
+
        /**
         * @param array $errors Each error has a 'msg' and 'type' key at minimum
         */
@@ -59,6 +64,9 @@ class ExtensionDependencyError extends Exception {
                                case 'incompatible-core':
                                        $this->incompatibleCore = true;
                                        break;
+                               case 'incompatible-php':
+                                       $this->incompatiblePhp = true;
+                                       break;
                                case 'missing-skins':
                                        $this->missingSkins[] = $info['missing'];
                                        break;
index 1f8a27e..3138b37 100644 (file)
@@ -213,7 +213,8 @@ class ExtensionRegistry {
                $autoloadNamespaces = [];
                $autoloaderPaths = [];
                $processor = new ExtensionProcessor();
-               $versionChecker = new VersionChecker( $wgVersion );
+               $phpVersion = PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION . '.' . PHP_RELEASE_VERSION;
+               $versionChecker = new VersionChecker( $wgVersion, $phpVersion );
                $extDependencies = [];
                $incompatible = [];
                $warnings = false;
index 1569e08..93b4a14 100644 (file)
@@ -35,6 +35,11 @@ class VersionChecker {
         */
        private $coreVersion = false;
 
+       /**
+        * @var Constraint|bool representing PHP version
+        */
+       private $phpVersion = false;
+
        /**
         * @var array Loaded extensions
         */
@@ -48,9 +53,10 @@ class VersionChecker {
        /**
         * @param string $coreVersion Current version of core
         */
-       public function __construct( $coreVersion ) {
+       public function __construct( $coreVersion, $phpVersion ) {
                $this->versionParser = new VersionParser();
                $this->setCoreVersion( $coreVersion );
+               $this->setPhpVersion( $phpVersion );
        }
 
        /**
@@ -82,6 +88,21 @@ class VersionChecker {
                }
        }
 
+       /**
+        * Set PHP version.
+        *
+        * @param string $phpVersion Current PHP version. Must be well-formed.
+        * @throws UnexpectedValueException
+        */
+       private function setPhpVersion( $phpVersion ) {
+               // normalize to make this throw an exception if the version is invalid
+               $this->phpVersion = new Constraint(
+                       '==',
+                       $this->versionParser->normalize( $phpVersion )
+               );
+               $this->phpVersion->setPrettyString( $phpVersion );
+       }
+
        /**
         * Check all given dependencies if they are compatible with the named
         * installed extensions in the $credits array.
@@ -90,6 +111,9 @@ class VersionChecker {
         *     {
         *       'FooBar' => {
         *         'MediaWiki' => '>= 1.25.0',
+        *         'platform': {
+        *           'php': '>= 7.0.0'
+        *         },
         *         'extensions' => {
         *           'FooBaz' => '>= 1.25.0'
         *         },
@@ -108,14 +132,47 @@ class VersionChecker {
                        foreach ( $dependencies as $dependencyType => $values ) {
                                switch ( $dependencyType ) {
                                        case ExtensionRegistry::MEDIAWIKI_CORE:
-                                               $mwError = $this->handleMediaWikiDependency( $values, $extension );
+                                               $mwError = $this->handleDependency(
+                                                       $this->coreVersion,
+                                                       $values,
+                                                       $extension
+                                               );
                                                if ( $mwError !== false ) {
                                                        $errors[] = [
-                                                               'msg' => $mwError,
+                                                               'msg' =>
+                                                                       "{$extension} is not compatible with the current MediaWiki "
+                                                                       . "core (version {$this->coreVersion->getPrettyString()}), "
+                                                                       . "it requires: $values."
+                                                               ,
                                                                'type' => 'incompatible-core',
                                                        ];
                                                }
                                                break;
+                                       case 'platform':
+                                               foreach ( $values as $dependency => $constraint ) {
+                                                       if ( $dependency === 'php' ) {
+                                                               $phpError = $this->handleDependency(
+                                                                       $this->phpVersion,
+                                                                       $constraint,
+                                                                       $extension
+                                                               );
+                                                               if ( $phpError !== false ) {
+                                                                       $errors[] = [
+                                                                               'msg' =>
+                                                                                       "{$extension} is not compatible with the current PHP "
+                                                                                       . "version {$this->phpVersion->getPrettyString()}), "
+                                                                                       . "it requires: $constraint."
+                                                                               ,
+                                                                               'type' => 'incompatible-php',
+                                                                       ];
+                                                               }
+                                                       } else {
+                                                               // add other platform dependencies here
+                                                               throw new UnexpectedValueException( 'Dependency type ' . $dependency .
+                                                                       ' unknown in ' . $extension );
+                                                       }
+                                               }
+                                               break;
                                        case 'extensions':
                                        case 'skins':
                                                foreach ( $values as $dependency => $constraint ) {
@@ -138,29 +195,27 @@ class VersionChecker {
        }
 
        /**
-        * Handle a dependency to MediaWiki core. It will check, if a MediaWiki version constraint was
-        * set with self::setCoreVersion before this call (if not, it will return an empty array) and
-        * checks the version constraint given against it.
+        * Handle a simple dependency to MediaWiki core or PHP. See handleMediaWikiDependency and
+        * handlePhpDependency for details.
         *
+        * @param Constraint|bool $version The version installed
         * @param string $constraint The required version constraint for this dependency
         * @param string $checkedExt The Extension, which depends on this dependency
-        * @return bool|string false if no error, or a string with the message
+        * @return bool false if no error, true else
         */
-       private function handleMediaWikiDependency( $constraint, $checkedExt ) {
-               if ( $this->coreVersion === false ) {
-                       // Couldn't parse the core version, so we can't check anything
+       private function handleDependency( $version, $constraint, $checkedExt ) {
+               if ( $version === false ) {
+                       // Couldn't parse the version, so we can't check anything
                        return false;
                }
 
                // if the installed and required version are compatible, return an empty array
                if ( $this->versionParser->parseConstraints( $constraint )
-                       ->matches( $this->coreVersion ) ) {
+                       ->matches( $version ) ) {
                        return false;
                }
-               // otherwise mark this as incompatible.
-               return "{$checkedExt} is not compatible with the current "
-                       . "MediaWiki core (version {$this->coreVersion->getPrettyString()}), it requires: "
-                       . "$constraint.";
+
+               return true;
        }
 
        /**
index 604a140..fe9ba74 100644 (file)
@@ -37,7 +37,7 @@ use Wikimedia\WrappedString;
  */
 class ResourceLoader implements LoggerAwareInterface {
        /** @var int */
-       protected static $filterCacheVersion = 8;
+       const CACHE_VERSION = 8;
 
        /** @var bool */
        protected static $debugMode = null;
@@ -199,7 +199,8 @@ class ResourceLoader implements LoggerAwareInterface {
                        'resourceloader',
                        'filter',
                        $filter,
-                       self::$filterCacheVersion, md5( $data )
+                       self::CACHE_VERSION,
+                       md5( $data )
                );
 
                $result = $cache->get( $key );
@@ -1583,6 +1584,9 @@ MESSAGE;
         * Global state and $wgRequest are evil, but we're using it right
         * now and sometimes we need to be able to force ResourceLoader to
         * re-evaluate the context because it has changed (e.g. in the test suite).
+        *
+        * @internal For use by unit tests
+        * @codeCoverageIgnore
         */
        public static function clearCache() {
                self::$debugMode = null;
index a507ad3..30b2aa7 100644 (file)
@@ -813,7 +813,7 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
                        } else {
                                // Infer changes based on definition and other metrics
                                $summary = $this->getDefinitionSummary( $context );
-                               if ( !isset( $summary['_cacheEpoch'] ) ) {
+                               if ( !isset( $summary['_class'] ) ) {
                                        throw new LogicException( 'getDefinitionSummary must call parent method' );
                                }
                                $str = json_encode( $summary );
@@ -883,7 +883,9 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
        public function getDefinitionSummary( ResourceLoaderContext $context ) {
                return [
                        '_class' => static::class,
-                       '_cacheEpoch' => $this->getConfig()->get( 'CacheEpoch' ),
+                       // Make sure that when filter cache for minification is invalidated,
+                       // we also change the HTTP urls and mw.loader.store keys (T176884).
+                       '_cacheVersion' => ResourceLoader::CACHE_VERSION,
                ];
        }
 
index e426f7f..ed4045d 100644 (file)
@@ -414,17 +414,13 @@ abstract class Skin extends ContextSource {
        /**
         * Get the query to generate a dynamic stylesheet
         *
+        * @deprecated since 1.32 Use action=raw&ctype=text/css directly.
         * @return array
         */
        public static function getDynamicStylesheetQuery() {
-               global $wgSquidMaxage;
-
                return [
                                'action' => 'raw',
-                               'maxage' => $wgSquidMaxage,
-                               'usemsgcache' => 'yes',
                                'ctype' => 'text/css',
-                               'smaxage' => $wgSquidMaxage,
                        ];
        }
 
index 73ca76b..4587d40 100644 (file)
@@ -115,7 +115,7 @@ class SpecialExpandTemplates extends SpecialPage {
                        }
 
                        $config = $this->getConfig();
-                       if ( $config->get( 'UseTidy' ) && $options->getTidy() ) {
+                       if ( MWTidy::isEnabled() && $options->getTidy() ) {
                                $tmp = MWTidy::tidy( $tmp );
                        }
 
index be79cae..3a7e9cd 100644 (file)
@@ -24,6 +24,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Logger\LoggerFactory;
 
 /**
  * A special page that allows users to export pages in a XML file
@@ -98,6 +99,15 @@ class SpecialExport extends SpecialPage {
                        $page = '';
                        $history = '';
                } elseif ( $request->wasPosted() && $par == '' ) {
+                       // Log to see if certain parameters are actually used.
+                       // If not, we could deprecate them and do some cleanup, here and in WikiExporter.
+                       LoggerFactory::getInstance( 'export' )->debug(
+                               'Special:Export POST, dir: [{dir}], offset: [{offset}], limit: [{limit}]', [
+                               'dir' => $request->getRawVal( 'dir' ),
+                               'offset' => $request->getRawVal( 'offset' ),
+                               'limit' => $request->getRawVal( 'limit' ),
+                       ] );
+
                        $page = $request->getText( 'pages' );
                        $this->curonly = $request->getCheck( 'curonly' );
                        $rawOffset = $request->getVal( 'offset' );
index 3ef64f8..153b7d1 100644 (file)
@@ -179,8 +179,8 @@ class SpecialImport extends SpecialPage {
 
                $out = $this->getOutput();
                if ( !$source->isGood() ) {
-                       $out->addWikiText( "<p class=\"error\">\n" .
-                               $this->msg( 'importfailed', $source->getWikiText() )->parse() . "\n</p>" );
+                       $out->addWikiText( "<div class=\"error\">\n" .
+                               $this->msg( 'importfailed', $source->getWikiText() )->parse() . "\n</div>" );
                } else {
                        $importer = new WikiImporter( $source->value, $this->getConfig() );
                        if ( !is_null( $this->namespace ) ) {
@@ -189,7 +189,7 @@ class SpecialImport extends SpecialPage {
                                $statusRootPage = $importer->setTargetRootPage( $this->rootpage );
                                if ( !$statusRootPage->isGood() ) {
                                        $out->wrapWikiMsg(
-                                               "<p class=\"error\">\n$1\n</p>",
+                                               "<div class=\"error\">\n$1\n</div>",
                                                [
                                                        'import-options-wrong',
                                                        $statusRootPage->getWikiText(),
@@ -224,13 +224,13 @@ class SpecialImport extends SpecialPage {
                        if ( $exception ) {
                                # No source or XML parse error
                                $out->wrapWikiMsg(
-                                       "<p class=\"error\">\n$1\n</p>",
+                                       "<div class=\"error\">\n$1\n</div>",
                                        [ 'importfailed', $exception->getMessage() ]
                                );
                        } elseif ( !$result->isGood() ) {
                                # Zero revisions
                                $out->wrapWikiMsg(
-                                       "<p class=\"error\">\n$1\n</p>",
+                                       "<div class=\"error\">\n$1\n</div>",
                                        [ 'importfailed', $result->getWikiText() ]
                                );
                        } else {
index d700c39..54afde1 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use Wikimedia\Timestamp\TimestampException;
+
 /**
  * A special page that lists log entries
  *
@@ -63,10 +65,18 @@ class SpecialLog extends SpecialPage {
                // Set date values
                $dateString = $this->getRequest()->getVal( 'wpdate' );
                if ( !empty( $dateString ) ) {
-                       $dateStamp = MWTimestamp::getInstance( $dateString . ' 00:00:00' );
-                       $opts->setValue( 'year', (int)$dateStamp->format( 'Y' ) );
-                       $opts->setValue( 'month', (int)$dateStamp->format( 'm' ) );
-                       $opts->setValue( 'day', (int)$dateStamp->format( 'd' ) );
+                       try {
+                               $dateStamp = MWTimestamp::getInstance( $dateString . ' 00:00:00' );
+                       } catch ( TimestampException $e ) {
+                               // If users provide an invalid date, silently ignore it
+                               // instead of letting an exception bubble up (T201411)
+                               $dateStamp = false;
+                       }
+                       if ( $dateStamp ) {
+                               $opts->setValue( 'year', (int)$dateStamp->format( 'Y' ) );
+                               $opts->setValue( 'month', (int)$dateStamp->format( 'm' ) );
+                               $opts->setValue( 'day', (int)$dateStamp->format( 'd' ) );
+                       }
                }
 
                # Don't let the user get stuck with a certain date
index 52300f9..56a701a 100644 (file)
@@ -85,7 +85,7 @@ class MostlinkedCategoriesPage extends QueryPage {
                }
 
                $text = MediaWikiServices::getInstance()->getContentLanguage()
-                       ->convert( new HtmlArmor( $nt->getText() ) );
+                       ->convert( htmlspecialchars( $nt->getText() ) );
                $plink = $this->getLinkRenderer()->makeLink( $nt, new HtmlArmor( $text ) );
                $nlinks = $this->msg( 'nmembers' )->numParams( $result->value )->escaped();
 
index 7526c3e..e88162e 100644 (file)
@@ -218,16 +218,15 @@ class SpecialNewFiles extends IncludableSpecialPage {
                $message = $this->msg( 'newimagestext' )->inContentLanguage();
                if ( !$message->isDisabled() ) {
                        $contLang = MediaWikiServices::getInstance()->getContentLanguage();
-                       $this->getOutput()->addWikiText(
-                               Html::rawElement( 'p',
+                       $this->getOutput()->addWikiTextTidy(
+                               Html::rawElement( 'div',
                                        [
+
                                                'lang' => $contLang->getHtmlCode(),
                                                'dir' => $contLang->getDir()
                                        ],
                                        "\n" . $message->plain() . "\n"
-                               ),
-                               /* $lineStart */ false,
-                               /* $interface */ false
+                               )
                        );
                }
        }
index 44cee50..a29fbf8 100644 (file)
@@ -1051,7 +1051,7 @@ class User implements IDBAccessObject, UserIdentity {
                // Certain names may be reserved for batch processes.
                foreach ( $reservedUsernames as $reserved ) {
                        if ( substr( $reserved, 0, 4 ) == 'msg:' ) {
-                               $reserved = wfMessage( substr( $reserved, 4 ) )->inContentLanguage()->text();
+                               $reserved = wfMessage( substr( $reserved, 4 ) )->inContentLanguage()->plain();
                        }
                        if ( $reserved == $name ) {
                                return false;
@@ -4390,7 +4390,7 @@ class User implements IDBAccessObject, UserIdentity {
                                        'user',
                                        'user_id',
                                        [ 'user_name' => $this->mName ],
-                                       __METHOD__,
+                                       $fname,
                                        [ 'LOCK IN SHARE MODE' ]
                                );
                                $loaded = false;
@@ -4400,7 +4400,7 @@ class User implements IDBAccessObject, UserIdentity {
                                        }
                                }
                                if ( !$loaded ) {
-                                       throw new MWException( __METHOD__ . ": hit a key conflict attempting " .
+                                       throw new MWException( $fname . ": hit a key conflict attempting " .
                                                "to insert user '{$this->mName}' row, but it was not present in select!" );
                                }
                                return Status::newFatal( 'userexists' );
index 9d05c6a..a20435e 100644 (file)
@@ -26,7 +26,7 @@
  * @since 1.28
  */
 class MWFileProps {
-       /** @var MimeMagic */
+       /** @var MimeAnalyzer */
        private $magic;
 
        /**
index 6b0c2aa..1b92f51 100644 (file)
@@ -823,7 +823,7 @@ class WatchedItemStore implements WatchedItemStoreInterface, StatsdAwareInterfac
 
                                        $dbw = $this->getConnectionRef( DB_MASTER );
                                        $factory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
-                                       $ticket = $factory->getEmptyTransactionTicket( __METHOD__ );
+                                       $ticket = $factory->getEmptyTransactionTicket( $fname );
 
                                        $watchersChunks = array_chunk( $watchers, $wgUpdateRowsPerQuery );
                                        foreach ( $watchersChunks as $watchersChunk ) {
@@ -838,7 +838,7 @@ class WatchedItemStore implements WatchedItemStoreInterface, StatsdAwareInterfac
                                                );
                                                if ( count( $watchersChunks ) > 1 ) {
                                                        $factory->commitAndWaitForReplication(
-                                                               __METHOD__, $ticket, [ 'domain' => $dbw->getDomainID() ]
+                                                               $fname, $ticket, [ 'domain' => $dbw->getDomainID() ]
                                                        );
                                                }
                                        }
index 6e2147d..528d128 100644 (file)
@@ -15,7 +15,8 @@
                        "Carlos Cristia",
                        "MarcoAurelio",
                        "Matma Rex",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "ديفيد"
                ]
        },
        "tog-underline": "Subrayar os vinclos:",
index 0f250d6..00e5ab9 100644 (file)
        "october-gen": "أكتوبر",
        "november-gen": "نوفمبر",
        "december-gen": "ديسمبر",
-       "jan": "Ù\83اÙ\86Ù\88Ù\86 Ø§Ù\84ثاÙ\86Ù\8a",
-       "feb": "شباط",
-       "mar": "آذار",
-       "apr": "نيسان",
-       "may": "أيار",
-       "jun": "حزيران",
-       "jul": "تموز",
-       "aug": "آب",
-       "sep": "Ø£Ù\8aÙ\84Ù\88Ù\84",
-       "oct": "تشرÙ\8aÙ\86 Ø§Ù\84Ø£Ù\88Ù\84",
-       "nov": "تشرين الثاني",
-       "dec": "كانون الأول",
+       "jan": "Ù\8aÙ\86اÙ\8aر",
+       "feb": "فبراير",
+       "mar": "مارس",
+       "apr": "أبريل",
+       "may": "مايو",
+       "jun": "يونيو",
+       "jul": "يوليو",
+       "aug": "أغسطس",
+       "sep": "سبتÙ\85بر",
+       "oct": "Ø£Ù\83تÙ\88بر",
+       "nov": "نوفمبر",
+       "dec": "ديسمبر",
        "january-date": "$1 يناير",
        "february-date": "$1 فبراير",
        "march-date": "$1 مارس",
        "pool-errorunknown": "خطأ غير معروف",
        "pool-servererror": "خدمة العداد غير متاحة ( $1 ).",
        "poolcounter-usage-error": "خطأ الاستخدام: $1",
-       "aboutsite": "عÙ\86 {{SITENAME}}",
+       "aboutsite": "Ø­Ù\88Ù\84 {{SITENAME}}",
        "aboutpage": "Project:عن",
        "copyright": "المحتوى منشور وفق $1 إن لم يرد خلاف ذلك.",
        "copyrightpage": "{{ns:project}}:حقوق التأليف والنشر",
        "exif-photometricinterpretation-4": "قناع الشفافية",
        "exif-photometricinterpretation-5": "مفصول (ربما CMYK)",
        "exif-photometricinterpretation-6": "واي سب سر",
+       "exif-photometricinterpretation-9": "CIE L*a*b* (تكويد ICC)",
+       "exif-photometricinterpretation-10": "CIE L*a*b* (تكويد ITU)",
        "exif-photometricinterpretation-32803": "مصفوفة فلترة الألوان",
        "exif-photometricinterpretation-34892": "خام خطي",
        "exif-unknowndate": "تاريخ غير معروف",
        "confirm-unwatch-top": "إزالة هذه الصفحة من قائمة مراقبتك؟",
        "confirm-rollback-button": "موافق",
        "confirm-rollback-top": "استرجاع التعديلات لهذه الصفحة؟",
+       "confirm-mcrrestore-title": "استرجاع مراجعة",
        "confirm-mcrundo-title": "الرجوع عن تغيير",
        "mcrundofailed": "الرجوع فشل",
        "mcrundo-missingparam": "وسائط مطلوبة مفقودة عند الطلب.",
        "mcrundo-changed": "لقد تم تغيير الصفحة منذ عرضت الفرق; يُرجَى مراجعة التغيير الجديد.",
+       "mcrundo-parse-failed": "فشل في تحليل المراجعة الجديدة: $1",
        "semicolon-separator": "؛&#32;",
        "comma-separator": "،&#32;",
        "quotation-marks": "«$1»",
index 3e789b3..2435640 100644 (file)
@@ -12,7 +12,8 @@
                        "Oldstoneage",
                        "Macofe",
                        "Abdelrhaman Eid",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "AHmed Khaled"
                ]
        },
        "tog-underline": "حط خط تحت اللينكات:",
        "ncategories": "$1 {{PLURAL:$1|تصنيف واحد|تصنيفين|تصنيفات|تصنيف}}",
        "nlinks": "{{PLURAL:$1|وصله واحده|وصلتين|$1 وصلات|$1 وصله}}",
        "nmembers": "$1 {{PLURAL:$1|عضو|اعضاء}}",
-       "nrevisions": "{{PLURAL:$1|تعديل وحيد|تعديلين|$1 تعديلات|$1 تعديل|$1}}",
+       "nrevisions": "{{PLURAL:$1|مفيش ولا مراجعه|مراجعه واحده|مراجعتين|$1 مراجعه}}",
        "specialpage-empty": "مافيش نتايج للتقرير دا.",
        "lonelypages": "صفحات يتيمه",
        "lonelypagestext": "الصفحات دى ماعندهاش لينكات أو تضمينات من الصفحات التانية فى {{SITENAME}}.",
index 920ae6b..70fb915 100644 (file)
        "botpasswords-invalid-name": "El nome d'usuariu especificáu nun contien el separador de contraseña de bot («$1»).",
        "botpasswords-not-exist": "L'usuariu «$1» nun tien una contraseña de bot llamada «$2».",
        "botpasswords-needs-reset": "Tien de reniciase la contraseña del robot «$2», propiedá {{GENDER:$1|del usuariu|de la usuaria}} «$1».",
+       "botpasswords-locked": "Nun puedes aniciar sesión con una contraseña de bot porque la to cuenta ta bloquiada.",
        "resetpass_forbidden": "Nun puen camudase les contraseñes",
        "resetpass_forbidden-reason": "Les contraseñes nun pueden camudase: $1",
        "resetpass-no-info": "Tienes d'aniciar sesión pa entrar direutamente a esta páxina.",
index a22860a..350f733 100644 (file)
        "uploadstash-nofiles": "Вы ня маеце схаваных файлаў.",
        "uploadstash-badtoken": "Не атрымалася выканаць гэтае дзеяньне. Верагодна, скончыўся тэрмін дзеяньня вашых уліковых зьвестак. Калі ласка, паспрабуйце зноў.",
        "uploadstash-errclear": "Не атрымалася ачысьціць файлы.",
-       "uploadstash-refresh": "Абнавіць сьпіс файлаў.",
+       "uploadstash-refresh": "Абнавіць сьпіс файлаў",
        "uploadstash-thumbnail": "прагляд мініятуры",
        "uploadstash-exception": "Не магу захаваць загрузку ў сховішчы ($1): «$2».",
        "uploadstash-bad-path": "Шлях не існуе.",
        "confirm-unwatch-top": "Выдаліць гэтую старонку з Вашага сьпісу назіраньня?",
        "confirm-rollback-button": "Так",
        "confirm-rollback-top": "Адкаціць праўкі на гэтай старонцы?",
+       "confirm-mcrrestore-title": "Аднавіць вэрсію",
        "confirm-mcrundo-title": "Адмяніць зьмену",
        "mcrundofailed": "Адмена не атрымалася",
        "mcrundo-missingparam": "Адсутнічаюць абавязковыя парамэтры для запыту.",
index 8c637b3..1f87fc3 100644 (file)
@@ -80,7 +80,7 @@
        "tog-watchlisthideminor": "Скриване на малките промени в списъка ми за наблюдение",
        "tog-watchlisthideliu": "Скриване на редакциите от влезли потребители от списъка за наблюдение",
        "tog-watchlistreloadautomatically": "Обновяване на списъка за наблюдение всеки път, когато е сменен филтър (изисква се JavaScript)",
-       "tog-watchlistunwatchlinks": "Ð\94обавÑ\8fне Ð½Ð° Ð¿Ñ\80еки Ð²Ñ\80Ñ\8aзки Ð·Ð° Ð½Ð°Ð±Ð»Ñ\8eдение/Ñ\81пиÑ\80ане Ð½Ð° Ð½Ð°Ð±Ð»Ñ\8eдениеÑ\82о ÐºÑ\8aм Ð·Ð°Ð¿Ð¸Ñ\81иÑ\82е Ð² Ñ\81пиÑ\81Ñ\8aка Ð·Ð° Ð½Ð°Ð±Ð»Ñ\8eдение (нужен е JavaScript за да се включи функционалността)",
+       "tog-watchlistunwatchlinks": "Ð\94обавÑ\8fне Ð½Ð° Ð´Ð¸Ñ\80екÑ\82ни Ð¼Ð°Ñ\80кеÑ\80и ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) Ð·Ð° Ð½Ð°Ð±Ð»Ñ\8eдение/Ñ\81пиÑ\80ане Ð½Ð° Ð½Ð°Ð±Ð»Ñ\8eдениеÑ\82о ÐºÑ\8aм Ð½Ð°Ð±Ð»Ñ\8eдаваниÑ\82е Ñ\81Ñ\82Ñ\80аниÑ\86и Ñ\81 Ð¿Ñ\80омени (нужен е JavaScript за да се включи функционалността)",
        "tog-watchlisthideanons": "Скриване на редакциите от анонимни потребители в списъка за наблюдение",
        "tog-watchlisthidepatrolled": "Скриване на патрулираните редакции от списъка за наблюдение",
        "tog-watchlisthidecategorization": "Скриване на категоризацията на статии",
        "password-login-forbidden": "Използването на това потребителско име и парола е забранено.",
        "mailmypassword": "Възстановяване на парола",
        "passwordremindertitle": "Напомняне за парола от {{SITENAME}}",
-       "passwordremindertext": "Някой (най-вероятно вие, от IP-адрес $1) е пожелал нова парола за влизане в {{SITENAME}} ($4).\nЗа потребител „$2“ е създадена временната парола „$3“.\nСега би трябвало да влезете в системата и да си изберете нова парола.\nНовата временна парола ще бъде активна {{PLURAL:$5|един ден|$5 дни}}.\n\nАко заявката е направена от друг или пък сте си спомнили паролата и не искате да я променяте, можете да пренебрегнете това съобщение и да продължите да използвате старата си парола.",
+       "passwordremindertext": "Някой (най-вероятно вие, от IP-адрес $1) е пожелал нова\nпарола за влизане в {{SITENAME}} ($4). За потребител „$2“ е създадена временната парола\n„$3“. Ако това е било вашето\nнамерение, трябва да влезете в системата и да си изберете нова парола.\nНовата временна парола ще бъде активна {{PLURAL:$5|един ден|$5 дни}}.\n\nАко заявката е направена от друг или пък сте си спомнили паролата\nи не искате да я променяте, можете да пренебрегнете това съобщение и\nда продължите да използвате старата си парола.",
        "noemail": "Няма записана електронна поща за потребителя „$1“.",
        "noemailcreate": "Необходимо е да въведете валиден адрес за ел. поща",
        "passwordsent": "Нова парола беше изпратена на електронната поща на „$1“.\nСлед като я получите, влезте отново.",
        "previewerrortext": "Възникна грешка при опита за преглед на промените.",
        "blockedtitle": "Потребителят е блокиран",
        "blockedtext": "'''Вашето потребителско име (или IP-адрес) беше блокирано.'''\n\nБлокирането е извършено от $1. Посочената причина е: ''$2''\n\n*Начало на блокирането: $8\n*Край на блокирането: $6\n*Блокирането се отнася за: $7\n\nМожете да се свържете с $1 или с някой от останалите [[{{MediaWiki:Grouppage-sysop}}|администратори]], за да обсъдите блокирането.\n\nМожете да използвате услугата „{{int:emailuser}}“ само ако не ви е забранена употребата ѝ и ако сте посочили валидна електронна поща в [[Special:Preferences|настройките]] си.\n\nВашият IP адрес е $3, а номерът на блокирането е $5. Включвайте едно от двете или и двете във всяко запитване, което правите.",
-       "autoblockedtext": "IP-адресът ви беше блокиран автоматично, защото е бил използван от друг потребител, който е бил блокиран от $1.\nПосочената причина е:\n\n:''$2''\n\n* Начало на блокирането: $8\n* Край на блокирането: $6\n* Блокирането се отнася за: $7\n\nМожете да се свържете с $1 или с някой от останалите [[{{MediaWiki:Grouppage-sysop}}|администратори]], за да обсъдите блокирането.\n\nМожете да използвате услугата „Пращане писмо на потребител“ само ако не ви е забранена употребата ѝ и ако сте посочили валидна електронна поща в [[Special:Preferences|настройките]] си.\n\nТекущият ви IP-адрес е $3, а номерът на блокирането ви е $5. Включвайте ги във всяко питане, което правите.",
+       "autoblockedtext": "IP-адресът ви беше блокиран автоматично, защото е бил използван от друг потребител, който е бил блокиран от $1.\nПосочената причина е:\n\n:<em>$2</em>\n\n* Начало на блокирането: $8\n* Край на блокирането: $6\n* Блокирането се отнася за: $7\n\nМожете да се свържете с $1 или с някой от останалите [[{{MediaWiki:Grouppage-sysop}}|администратори]], за да обсъдите блокирането.\n\nМожете да използвате услугата „{{int:emailuser}}“ само ако не ви е забранена употребата ѝ и ако сте посочили валидна електронна поща в [[Special:Preferences|настройките]] си.\n\nТекущият Ви IP-адрес е $3, а номерът на блокирането ви е $5.\nВключвайте ги във всяка заявка, която правите.",
        "systemblockedtext": "Вашето потребителско име или IP адрес беше автоматично блокирано от Медия Уики.\nПосочената причина е:\n\n:<em>$2</em>\n\n* Начало на блокирането: $8\n* Край на блокирането: $6\n* Блокирането се отнася за: $7\n\nВашият текущ IP адрес е $3.\nМоля, включете всичките детайли по-горе, ако правите каквито и да е запитвания.",
        "blockednoreason": "не е указана причина",
        "whitelistedittext": "Редактирането на страници изисква $1 в системата.",
        "longpageerror": "<strong>Грешка: Изпратеният текст е с големина {{PLURAL:$1|един килобайт|$1 килобайта}}, което надвишава позволения максимум от {{PLURAL:$2|един килобайт|$2 килобайта}}.</strong>\nПоради тази причина той не може да бъде съхранен.",
        "readonlywarning": "<strong>Внимание: Базата данни беше затворена за поддръжка, затова в момента промените няма да могат да бъдат съхранени.</strong>\nАко желаете, можете да съхраните страницата като текстов файл и да се опитате да я публикувате по-късно.\n\nСистемният администратор, който е затворил базата данни, е посочил следната причина: $1",
        "protectedpagewarning": "<strong>Внимание: Страницата е защитена и само потребители със статут на администратори могат да я редактират.</strong>\nЗа справка по-долу е показан последният запис от дневниците.",
-       "semiprotectedpagewarning": "<strong>Забележка:</strong> Тази страница е защитена и само регистрирани потребители могат да я редактират.\nЗа справка по-долу е показан последният запис от дневниците.",
+       "semiprotectedpagewarning": "<strong>Забележка:</strong> Тази страница е защитена и само автоматично одобрени потребители могат да я редактират.\nЗа справка по-долу е показан последният запис от дневниците.",
        "cascadeprotectedwarning": "<strong>Внимание:</strong> Страницата е защитена, като само потребители със [[Special:ListGroupRights|нужните права]] могат да я редактират, тъй като е включена в {{PLURAL:$1|следната страница|следните страници}} с каскадна защита:",
        "titleprotectedwarning": "<strong>Внимание: Тази страница е защитена и са необходими [[Special:ListGroupRights|специални права]], за да бъде създадена.</strong>\nЗа справка по-долу е показан последният запис от дневниците.",
        "templatesused": "{{PLURAL:$1|Шаблон, използван|Шаблони, използвани}} на страницата:",
        "diff-multi-manyusers": "({{PLURAL:$1|Не е показана една междинна версия|Не са показани $1 междинни версии}} от повече от $2 {{PLURAL:$2|потребител|потребители}})",
        "difference-missing-revision": "{{PLURAL:$2|Не беше открита|Не бяха открити}} {{PLURAL:$2|една версия|$2 версии}} от тази разликова препратка ($1).\n\nТова обикновено се случва, когато е последвана остаряла разликова препратка на страница, която е била изтрита.\nПовече подробности могат да бъдат открити в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневника на изтриванията].",
        "searchresults": "Резултати от търсенето",
+       "search-filter-title-prefix-reset": "Търсене във всички страници",
        "searchresults-title": "Резултати от търсенето за „$1“",
        "titlematches": "Съответствия в заглавията на страници",
        "textmatches": "Съответствия в текста на страници",
        "stub-threshold-disabled": "Изключено",
        "recentchangesdays": "Брой дни в последни промени:",
        "recentchangesdays-max": "(най-много $1 {{PLURAL:$1|ден|дни}})",
-       "recentchangescount": "Брой показвани редакции по подразбиране:",
+       "recentchangescount": "Ð\91Ñ\80ой Ð¿Ð¾ÐºÐ°Ð·Ð²Ð°Ð½Ð¸ Ñ\80едакÑ\86ии Ð² Ð¿Ð¾Ñ\81ледниÑ\82е Ð¿Ñ\80омени, Ð¸Ñ\81Ñ\82оÑ\80иÑ\8fÑ\82а Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86и Ð¸ Ð»Ð¾Ð³Ð¾Ð²Ðµ Ð¿Ð¾ Ð¿Ð¾Ð´Ñ\80азбиÑ\80ане:",
        "prefs-help-recentchangescount": "Максимален брой: 1000",
        "prefs-help-watchlist-token2": "Това е секретният ключ към уеб хранилката на вашия списък за наблюдение.\nВсеки, който го знае, би могъл да прегледа списъка ви за наблюдение, така че не го споделяйте.\nПри нужда можете да го [[Special:ResetTokens|изчистите]].",
        "prefs-help-tokenmanagement": "Можете да видите и нулирате тайния ключ за Вашата сметка, който може да има достъп до уеб хранилката на Вашия списък за наблюдение. Всеки, който знае ключа, ще може да види Вашия списък за наблюдение, така че не го споделяйте.",
        "default": "по подразбиране",
        "prefs-files": "Файлове",
        "prefs-custom-css": "Личен CSS",
+       "prefs-custom-json": "Потребителски JSON",
        "prefs-custom-js": "Личен JS",
        "prefs-common-config": "Общи настройки на CSS/JSON/JavaScript за всички облици:",
        "prefs-reset-intro": "Тази страница може да се използва за възстановяване на потребителските настройки към стандартните за сайта.\nТова действие е необратимо.",
        "right-block": "Спиране на достъпа до редактиране",
        "right-blockemail": "Блокиране на потребители да изпращат писма по е-поща",
        "right-hideuser": "Блокиране и скриване на потребителско име",
-       "right-ipblock-exempt": "Пренебрегване на блокирания по IP, автоматични блокирания и блокирани IP интервали",
+       "right-ipblock-exempt": "Пренебрегване на блокирания по IP, автоматични блокирания и блокирани IP-диапазони",
        "right-unblockself": "Собствено отблокиране",
        "right-protect": "Променяне на нивото на защита и редактиране на каскадно-защитените страници",
        "right-editprotected": "Редактиране на страници защитени като „{{int:protect-level-sysop}}“",
        "upload-form-label-own-work-message-generic-local": "Потвърждавам, че качвам този файл в съответствие с правилата и лицензионната политика на сайта {{SITENAME}}.",
        "upload-form-label-not-own-work-message-generic-local": "Ако не можете да заредите този файл в съответствие с правилата на сайта {{SITENAME}}, моля, затворете този прозорец и опитайте друг метод.",
        "upload-form-label-not-own-work-message-generic-foreign": "Ако не можете да качите този файл в съответствие с правилата на споделеното хранилище, моля, затворете този прозорец и опитайте друг метод.",
+       "backend-fail-backup": "Файлът „$1“ не можа да бъде архивиран.",
        "backend-fail-notexists": "Файлът „$1“ не съществува.",
        "backend-fail-delete": "Файлът „$1“ не може да бъде изтрит.",
        "backend-fail-describe": "Метаданните не могат да бъдат променени за файл „$1“.",
        "uploadstash-errclear": "Изчистването на файловете беше неуспешно.",
        "uploadstash-refresh": "Обновяване на списъка с файлове",
        "uploadstash-thumbnail": "преглед на миниатюра",
+       "uploadstash-bad-path-unknown-type": "Неизвестен тип „$1“.",
        "img-auth-accessdenied": "Достъпът е отказан",
        "img-auth-nopathinfo": "Липсва информация за пътя.\nВашият сървър трябва да бъде настроен да предава променливите REQUEST_URI и PATH_INFO .\nАко това е така, опитайте да активирате $wgUsePathInfo.\n\nВижте https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Търсеният път не е в настроената директория за качвания.",
        "deadendpages": "Задънени страници",
        "deadendpagestext": "Следните страници нямат препратки към други страници от {{SITENAME}}.",
        "protectedpages": "Защитени страници",
+       "protectedpages-filters": "Филтри:",
        "protectedpages-indef": "Само безсрочни защити",
        "protectedpages-summary": "Списък на страниците, които са защитени. За списък на заглавията, които са защитени от създаване, вижте [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Само каскадни защити",
        "apisandbox-dynamic-error-exists": "Параметър с име „$1“ вече съществува.",
        "apisandbox-deprecated-parameters": "Остарели параметри",
        "apisandbox-fetch-token": "Автоматично попълване на маркера",
+       "apisandbox-add-multi": "Добавяне",
        "apisandbox-submit-invalid-fields-title": "Някои полета са невалидни",
        "apisandbox-submit-invalid-fields-message": "Моля, поправете маркираните полета и опитайте пак.",
        "apisandbox-results": "Резултати",
        "block-log-flags-nousertalk": "забрана за редактиране на личната беседа",
        "block-log-flags-angry-autoblock": "разширената автоблокировка е включена",
        "block-log-flags-hiddenname": "скрито потребителско име",
-       "range_block_disabled": "Ð\92Ñ\8aзможноÑ\81Ñ\82Ñ\82а Ð½Ð° Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80иÑ\82е Ð´Ð° Ð·Ð°Ð´Ð°Ð²Ð°Ñ\82 Ð¸Ð½Ñ\82еÑ\80вали при IP-адресите е изключена.",
+       "range_block_disabled": "Ð\92Ñ\8aзможноÑ\81Ñ\82Ñ\82а Ð½Ð° Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80иÑ\82е Ð´Ð° Ð·Ð°Ð´Ð°Ð²Ð°Ñ\82 Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½и при IP-адресите е изключена.",
        "ipb_expiry_invalid": "Невалиден срок на изтичане.",
        "ipb_expiry_old": "Срокът на изтичане е минал.",
        "ipb_expiry_temp": "Скритите потребителски имена трябва да се блокират безсрочно.",
        "unblock-hideuser": "Не можете да отблокирате този потребител, тъй като потребителското му име е скрито.",
        "ipb_cant_unblock": "Грешка: Не е намерен блок с номер $1. Вероятно потребителят е вече отблокиран.",
        "ipb_blocked_as_range": "Грешка: IP-адресът $1 не може да бъде разблокиран, тъй като е част от блокирания регистър $2. Можете да разблокирате адреса, като разблокирате целия регистър.",
-       "ip_range_invalid": "Ð\9dевалиден Ð¸Ð½Ñ\82еÑ\80вал Ð·а IP-адреси.",
+       "ip_range_invalid": "Ð\9dевалиден Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½ Ð½а IP-адреси.",
        "ip_range_toolarge": "Забранено е блокиране на диапазони от IP адреси по-големи от /$1.",
        "ip_range_exceeded": "IP диапазонът превишава максималния диапазон. Позволен диапазон: /$1.",
        "proxyblocker": "Блокировач на проксита",
        "pageinfo-category-subcats": "Брой подкатегории",
        "pageinfo-category-files": "Брой файлове",
        "pageinfo-user-id": "Потребителски номер",
+       "pageinfo-file-hash": "Хеш-стойност",
        "markaspatrolleddiff": "Отбелязване като проверена редакция",
        "markaspatrolledtext": "Отбелязване на редакцията като проверена",
        "markaspatrolledtext-file": "Отбелязване на версията на файла като проверена",
        "newimages-newbies": "Показване на приносите само на нови потребители",
        "newimages-showbots": "Показване на качвания от ботове",
        "newimages-hidepatrolled": "Скриване на проверените качвания",
+       "newimages-mediatype": "Файлов тип:",
        "noimages": "Няма нищо.",
        "ilsubmit": "Търсене",
        "bydate": "по дата",
        "exif-source": "Източник",
        "exif-urgency": "Спешност",
        "exif-contact": "Информация за контакти",
+       "exif-writer": "Автор на текста",
        "exif-languagecode": "Език",
        "exif-iimversion": "IIM версия",
        "exif-iimcategory": "Категория",
        "version-specialpages": "Специални страници",
        "version-parserhooks": "Куки в парсера",
        "version-variables": "Променливи",
+       "version-editors": "Редактори",
        "version-antispam": "Предотвратяване на спам",
        "version-other": "Други",
        "version-mediahandlers": "Обработчици на медия",
        "linkaccounts-success-text": "Сметката беше свързана.",
        "linkaccounts-submit": "Свързване на сметки",
        "restrictionsfield-badip": "Невалиден IP-адрес или интервал от адреси: $1",
+       "restrictionsfield-label": "Позволени IP-диапазони:",
        "edit-error-short": "Грешка: $1",
        "edit-error-long": "Грешки:\n\n$1",
        "revid": "версия $1",
+       "pageid": "ID на страницата $1",
+       "gotointerwiki": "Напускане на {{SITENAME}}",
+       "gotointerwiki-invalid": "Указаното заглавие е невалидно.",
+       "pagedata-title": "Данни за страницата",
        "pagedata-bad-title": "Невалидно заглавие: $1.",
        "passwordpolicies": "Правила за паролите",
        "passwordpolicies-summary": "Това е списъкът на действащите правила за паролите на потребителските групи дефинирани в това уики.",
+       "passwordpolicies-group": "Група",
+       "passwordpolicies-policies": "Правила",
        "passwordpolicies-policy-minimalpasswordlength": "Паролата трябва да бъде от поне $1 {{PLURAL:$1|знак|знака}}",
        "passwordpolicies-policy-minimumpasswordlengthtologin": "Паролата трябва да бъде поне $1 {{PLURAL:$1|знак|знака}} за да можете да влезете",
        "passwordpolicies-policy-passwordcannotmatchusername": "Паролата не може да бъде същата като потребителското име",
index 5ad34f9..3240ff7 100644 (file)
@@ -14,7 +14,8 @@
                        "Macofe",
                        "GnuDoyng",
                        "Davidzdh",
-                       "Suzukaze-c"
+                       "Suzukaze-c",
+                       "ديفيد"
                ]
        },
        "tog-underline": "Â-hĕk-siáng lièng-giék",
index 7a2358c..3f09838 100644 (file)
        "versionrequired": "Kræver version $1 af MediaWiki",
        "versionrequiredtext": "Version $1 af MediaWiki er nødvendig for at bruge denne side. Se [[Special:Version|Versionssiden]]",
        "ok": "OK",
+       "backlinksubtitle": "← $1",
        "retrievedfrom": "Hentet fra \"$1\"",
        "youhavenewmessages": "Du har $1 ($2).",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|Du har}} $1 fra {{PLURAL:$3|en anden bruger|$3 brugere}} ($2).",
        "site-atom-feed": "$1 Atom-feed",
        "page-rss-feed": "\"$1\" RSS-feed",
        "page-atom-feed": "\"$1\" Atom-feed",
+       "feed-atom": "Atom",
+       "feed-rss": "RSS",
        "red-link-title": "$1 (siden findes ikke)",
        "sort-descending": "Sorter faldende",
        "sort-ascending": "Sorter stigende",
index 5790fe4..208fb49 100644 (file)
        "confirm-unwatch-top": "Diese Seite von der persönlichen Beobachtungsliste entfernen?",
        "confirm-rollback-button": "Okay",
        "confirm-rollback-top": "Bearbeitungen an dieser Seite zurücksetzen?",
+       "confirm-mcrrestore-title": "Eine Version wiederherstellen",
        "confirm-mcrundo-title": "Eine Änderung rückgängig machen",
        "mcrundofailed": "Rückgängigmachung fehlgeschlagen",
        "mcrundo-missingparam": "Erforderliche Parameter fehlen bei der Anfrage.",
        "mcrundo-changed": "Die Seite wurde verändert, seit du dir den Versionsunterschied ansiehst. Bitte überprüfe die neue Änderung.",
+       "mcrundo-parse-failed": "Die neue Version konnte nicht geparst werden: $1",
        "ellipsis": "…",
        "percent": "$1&#160;%",
        "quotation-marks": "„$1“",
index 1ba6eec..b886c37 100644 (file)
@@ -30,7 +30,8 @@
                        "Gambollar",
                        "Dılmıc",
                        "Archaeodontosaurus",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "ديفيد"
                ]
        },
        "tog-underline": "Bınê gırey de xete bance:",
index 4d28bd6..30a9699 100644 (file)
        "previousdiff": "← Older edit",
        "nextdiff": "Newer edit →",
        "mediawarning": "<strong>Warning:</strong> This file type may contain malicious code.\nBy executing it, your system may be compromised.",
-       "imagemaxsize": "Image size limit:<br /><em>(for file description pages)</em>",
+       "imagemaxsize": "Image size limit on file description pages:",
        "thumbsize": "Thumbnail size:",
        "widthheight": "$1 × $2",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|page|pages}}",
        "confirm-unwatch-top": "Remove this page from your watchlist?",
        "confirm-rollback-button": "OK",
        "confirm-rollback-top": "Revert edits to this page?",
+       "confirm-mcrrestore-title": "Restore a revision",
        "confirm-mcrundo-title": "Undo a change",
        "mcrundofailed": "Undo failed",
        "mcrundo-missingparam": "Missing required parameters on request.",
        "mcrundo-changed": "The page has been changed since you viewed the diff. Please review the new change.",
+       "mcrundo-parse-failed": "Failed to parse the new revision: $1",
        "semicolon-separator": ";&#32;",
        "comma-separator": ",&#32;",
        "colon-separator": ":&#32;",
index 76962ef..5852c55 100644 (file)
                        "Astroemi",
                        "Jelou",
                        "Ktranz",
-                       "AVIADOR71"
+                       "AVIADOR71",
+                       "AHmed Khaled",
+                       "Caleidoscopic",
+                       "ديفيد"
                ]
        },
        "tog-underline": "Subrayar los enlaces:",
        "redirect-file": "Nombre del archivo",
        "redirect-logid": "Identificador de registro",
        "redirect-not-exists": "No se encontró el valor",
+       "redirect-not-numeric": "Valor no numérico",
        "fileduplicatesearch": "Búsqueda de archivos duplicados",
        "fileduplicatesearch-summary": "Búsqueda de archivos duplicados en base a su valor hash.",
        "fileduplicatesearch-filename": "Nombre de archivo:",
index 45929a7..f34d6db 100644 (file)
        "confirm-unwatch-top": "Supprimer cette page de votre liste de suivi ?",
        "confirm-rollback-button": "OK",
        "confirm-rollback-top": "Révoquer les modifications de cette page ?",
+       "confirm-mcrrestore-title": "Restaurer une version",
        "confirm-mcrundo-title": "Annuler une modification",
        "mcrundofailed": "L’annulation a échoué",
        "mcrundo-missingparam": "Paramètres obligatoires absents dans la requête.",
        "mcrundo-changed": "La page a été modifiée depuis que vous avez affiché le diff. Veuillez revoir la nouvelle modification.",
+       "mcrundo-parse-failed": "Echec dans l'analyse de la nouvelle version : $1",
        "semicolon-separator": "&nbsp;;&#32;",
        "colon-separator": "&nbsp;:&#32;",
        "percent": "$1&#160;%",
index 703d080..e37a2ca 100644 (file)
@@ -21,7 +21,8 @@
                        "SeoMac",
                        "Macofe",
                        "Tem",
-                       "Nmacu"
+                       "Nmacu",
+                       "ديفيد"
                ]
        },
        "tog-underline": "Folínte faoi naisc:",
index 974ddf4..58e464d 100644 (file)
@@ -18,9 +18,9 @@
        "tog-watchcreations": "Ajouté à mo lis di swivi paj-ya ki mo kréyé é fiché-ya ki mo ka enpòrté",
        "tog-watchdefault": "Ajouté à mo lis di swivi paj-ya ké fiché-ya ki mo ka modifyé",
        "tog-watchmoves": "Ajouté paj-ya ké fiché-ya ki mo ka déplasé annan mo lis di swivi",
-       "tog-watchdeletion": "Ajouté à mo lis di swivi paj-ya ké fiché-ya ki mo ka souprimé",
+       "tog-watchdeletion": "Ajouté à mo lis di swivi paj-ya ké fiché-ya ki mo ka siprimen",
        "tog-watchuploads": "Ajouté nouvèl fiché ki mo ka enpòrté à mo lis di swivi",
-       "tog-watchrollback": "Ajouté à mo lis di swivi paj-ya asou lakèl mo éfèktchwé roun révokasyon",
+       "tog-watchrollback": "Ajouté à mo lis di swivi paj-ya asou lakèl mo éfègtchwé roun révokasyon",
        "tog-minordefault": "Marké tout mo modifikasyon kou minò pa défo",
        "tog-previewontop": "Afiché prévizwalizasyon-an laro di zonn di modifikasyon",
        "tog-previewonfirst": "Afiché prévizwalizasyon-an lò di pronmyé modifikasyon",
        "namespaces": "Lèspas di non",
        "variants": "Varyant",
        "navigation-heading": "Ménou di navigasyon",
-       "errorpagetitle": "Érò",
+       "errorpagetitle": "rò",
        "returnto": "Rouvini kot paj-a $1.",
        "tagline": "Di {{SITENAME}}",
        "help": "Lèd",
        "edit-local": "Modifyé dèskripsyon lokal",
        "create": "Kréyé",
        "create-local": "Ajouté roun dèskripsyon lokal",
-       "delete": "Souprimé",
+       "delete": "Siprimen",
        "undelete_short": "Rèstoré {{PLURAL:$1|roun modifikasyon|$1 modifikasyon}}",
-       "viewdeleted_short": "Wè {{PLURAL:$1|roun modifikasyon souprimé|$1 modifikasyon souprimé}}",
+       "viewdeleted_short": "Wè {{PLURAL:$1|roun modifikasyon ki siprimen|$1 modifikasyon ki siprimen}}",
        "protect": "Protéjé",
        "protect_change": "modifyé",
        "unprotect": "Chanjé protègsyon-an",
        "generic-pool-error": "Dézolé, sèrvò-ya sa sircharjé pou moman-an.\nTròp itilizatò ka sasé konsilté sa rousours.\nSouplé, atann enpé anvan di tanté òkò d'aksédé à sala.",
        "pool-timeout": "Délè di atant di vérou dépasé",
        "pool-queuefull": "Fil dé processus sa plen",
-       "pool-errorunknown": "Éròr enkonèt",
-       "pool-servererror": "Sèrvis di rézèrvasyon pa disponib ($1).",
-       "poolcounter-usage-error": "Éròr di itilizasyon : $1",
+       "pool-errorunknown": "Lérò enkonnèt",
+       "pool-servererror": "Sèrvis-a di rézèrvasyon pa disponnib ($1).",
+       "poolcounter-usage-error": "Lérò di litilizasyon : $1",
        "aboutsite": "Apropo di {{SITENAME}}",
        "aboutpage": "Project:Apropo di",
        "copyright": "Kontni-a sa disponib anba lisans $1 sof mansyon kontrèr.",
        "portal-url": "Project:Pòrtay kouminotèr",
        "privacy": "Politik di konfidansyalité",
        "privacypage": "Project:Politik di konfidansyalité",
-       "badaccess": "Éròr di pèrmisyon",
+       "badaccess": "Lérò di pèrmisyon",
        "badaccess-group0": "Zòt pa gen drwè sifizan pou réyalizé laksyon doumandé.",
        "badaccess-groups": "Aksyon-an ki zòt ka éséyé di réyalizé sa pèrmi yenk pou itilizatò-ya {{PLURAL:$2|di group|di roun dé group}} : $1.",
        "versionrequired": "Vèrsyon $1 di MediaWiki nésésèr",
        "restorelink": "Wè {{PLURAL:$1|roun modifikasyon éfasé|$1 modifikasyon éfasé}}",
        "feedlinks": "Flux :",
        "feed-invalid": "Tip di flux d'abonnman pa valid.",
-       "feed-unavailable": "Flux-ya di sendikasyon pa disponib",
+       "feed-unavailable": "Fligs-ya di sendikasyon pa disponnib",
        "site-rss-feed": "Flux RSS di $1",
        "site-atom-feed": "Flux Atom di $1",
        "page-rss-feed": "Flux RSS di « $1 »",
        "nstab-help": "Lèd",
        "nstab-category": "Katégori",
        "mainpage-nstab": "Paj prensipal",
-       "nosuchaction": "Aksyon enkonèt",
+       "nosuchaction": "Agsyon enkonnèt",
        "nosuchactiontext": "Agsyon-an ki èspésifyé annan URL-a sa envalid.\nZòt pitèt mal antré URL-a oben swivi roun lyannaj éronnen.\nLi pouvé égalman endiké oun annonmanli annan logisyèl-a ki itilizé pa {{SITENAME}}.",
        "nosuchspecialpage": "Paj èspésyal inègzistant",
        "nospecialpagetext": "<strong>Zòt doumandé oun paj èspésyal ki pa ka ègzisté.</strong>\n\nOun lis dé paj èspésyal valid ka trouvé so kò asou [[Special:SpecialPages|{{int:specialpages}}]].",
-       "error": "Érò",
-       "databaseerror": "Érò di baz-a di data",
+       "error": "rò",
+       "databaseerror": "rò di baz-a di data",
        "databaseerror-text": "Oun lérò di rékèt di baz di data prodjwi so kò.\nSala pouvé provini di roun annomali annan lojisyèl-a.",
        "databaseerror-textcl": "Oun lérò di rékèt di baz di data prodjwi so kò.",
        "databaseerror-query": "Rékèt : $1",
        "databaseerror-function": "Fonksyon : $1",
-       "databaseerror-error": "Érò : $1",
+       "databaseerror-error": "rò : $1",
        "transaction-duration-limit-exceeded": "Pou évité roun tròp fò ogmantasyon di délè di réplikasyon, sa tranzagsyon té annilé pas douré-a di ékritir ($1) dépasé limit-a di $2 ségonn. Si zòt ka sasé à modifyé oun gran nonm di éléman similtanéman, éséyé plito di éfègtchwé lopérasyon-an an plizyò létap pli piti.",
-       "laggedslavemode": "Panga, sa paj pa pouvé kontni tout dannyé modifikasyon éfèktchwé",
+       "laggedslavemode": "Panga, sa paj pa pouvé kontni tout dannyé modifikasyon-yan ki éfègtchwé",
        "readonly": "Baz di data vérouyé",
        "enterlockreason": "Endiké rézon-an di vérouyaj ensi ki roun èstimasyon di so douré",
        "readonlytext": "Ajou ké mizajou di baz di data sa atchwèlman bloké, probabman pou pèrmèt mentnans di baz-a, aprè sa, tout bagaj ké rantré annan lòrd.\n\nAdministratò sistenm-an ki vérouyé baz di data fourni èsplikasyon-an ki ka swiv :<br /> $1",
        "missingarticle-diff": "(diff : $1, $2)",
        "readonly_lag": "Baz-a di data té otonmatikman vérouyé pannan ki sèrvò-ya ségondèr ka réyaligné yé kò asou sèrvò prensipal-a",
        "nonwrite-api-promise-error": "Ankèt-a HTTP « <code>Promise-Non-Write-API-Action:</code> » té voyé mè rékèt-a té fè à oun modjoul di ékritir di API-a.",
-       "internalerror": "Érò entèrn",
-       "internalerror_info": "Érò entèrn : $1",
-       "internalerror-fatal-exception": "Érò fatal di tip « $1 »",
+       "internalerror": "rò entèrn",
+       "internalerror_info": "rò entèrn : $1",
+       "internalerror-fatal-exception": "rò fatal di tip « $1 »",
        "filecopyerror": "Enposib di kopyé fiché-a « $1 » bò'd « $2 ».",
        "filerenameerror": "Enposib di rounonmen fiché-a « $1 » an « $2 ».",
-       "filedeleteerror": "Enposib di souprimé fiché-a « $1 ».",
+       "filedeleteerror": "Enposib di siprimen fiché-a « $1 ».",
        "directorycreateerror": "Enposib di kréyé répèrtwar-a « $1 ».",
        "directoryreadonlyerror": "Répèrtwar-a « $1 » sa an lèktir sèl.",
        "directorynotreadableerror": "Répèrtwar-a « $1 » pa lizib.",
        "filenotfound": "Enposib di trouvé fiché-a « $1 ».",
        "unexpected": "Valò ki pa nòrmal : « $1 » = « $2 ».",
-       "formerror": "Érò : enposib di soumèt fòrmilèr-a.",
-       "badarticleerror": "Sa aksyon pa pouvé fika éfèktchwé asou sa paj.",
-       "cannotdelete": "Enposib di souprimé paj-a oben fiché-a « $1 ».\nSouprésyon-an pitèt ja té éfèktchwé pa rounòt moun.",
-       "cannotdelete-title": "Enposib di souprimé paj-a « $1 »",
-       "delete-hook-aborted": "Souprésyon annilé pa roun ègstansyon.\nPyès èsplikasyon té bay.",
+       "formerror": "rò : enposib di soumèt fòrmilèr-a.",
+       "badarticleerror": "Sa agsyon pa pouvé fika éfègtchwé asou sa paj.",
+       "cannotdelete": "Enposib di siprimen paj-a oben fiché-a « $1 ».\nSiprésyon-an pitèt ja té éfègtchwé pa rounòt moun.",
+       "cannotdelete-title": "Enposib di siprimen paj-a « $1 »",
+       "delete-hook-aborted": "Siprésyon annilé pa roun ègstansyon.\nPyès lèsplikasyon té fourni.",
        "no-null-revision": "Enposib di kréyé roun nouvèl révizyon vid pou paj-a « $1 »",
        "badtitle": "Movè tit",
        "badtitletext": "Tit di paj doumandé pa valid, vid, oben mal fòrmé si a roun tit entèr-lanng oben entèr-projè.\nI ka kontni pitèt oun oben plizyò karaktèr ki pa pouvé fika itilizé annan tit-ya.",
        "title-invalid-magic-tilde": "Tit di paj doumandé ka kontni roun sékans di tilde majik ki pa valid (<nowiki>~~~</nowiki>).",
        "title-invalid-too-long": "Tit di paj doumandé sa tròp lonng. Li pa divèt dépasé $1 {{PLURAL:$1|ògtè}} annan lankodaj-a UTF-8.",
        "title-invalid-leading-colon": "Tit di paj doumandé ka kontni roun dé-pwen envalid o koumansman.",
-       "perfcached": "Data-ya ki ka swiv sa an kach é pa pouvé fika mizajou. Oun magsimonm di {{PLURAL:$1|1=roun rézilta|$1 rézilta}} sa disponib annan kach-a.",
-       "perfcachedts": "Data-ya ki ka swiv sa an kach é té mizajou pou dannyè fwè-a $1-a. Oun magsimonm di {{PLURAL:$4|1=roun rézilta sa disponib|$4 rézilta sa disponib}} annan kach-a.",
+       "perfcached": "Data-ya ki ka swiv sa an kach é pa pouvé fika mizajou. Oun magsimonm di {{PLURAL:$1|1=roun rézilta|$1 rézilta}} sa disponnib annan kach-a.",
+       "perfcachedts": "Data-ya ki ka swiv sa an kach é té mizajou pou dannyè fwè-a $1-a. Oun magsimonm di {{PLURAL:$4|1=roun rézilta sa disponnib|$4 rézilta sa disponnib}} annan kach-a.",
        "querypage-no-updates": "Mizajou-ya pou sa paj sa atchwèlman dézagtivé.\nData-ya ki anba pa ké fika mizajou.",
        "viewsource": "Wè tègs sours-a",
        "viewsource-title": "Wè sours-a di $1",
        "actionthrottled": "Aksyon limité",
-       "actionthrottledtext": "Pou briga kont abi-ya, itilizasyon-an di sa aksyon sa limité à roun sèrten nonm di fwè annan roun laps di tan asé kourt é zòt dépasé sa limit.\nSouplé, éséyé òkò annan tchèk minout.",
+       "actionthrottledtext": "Pou briga kont abi-ya, litilizasyon-an di sa agsyon sa limité à roun sèrten nonm di fwè annan roun laps di tan asé kourt é zòt dépasé sa limit.\nSouplé, éséyé òkò annan tchèk minout.",
        "protectedpagetext": "Sa paj té protéjé pou anpéché so modifikasyon oben dé ròt aksyon.",
        "viewsourcetext": "Zòt pouvé wè é kopyé kontni-a di sa paj.",
        "viewyourtext": "Zòt pouvé wè ké kopyé kontni-a di <strong>zòt modifikasyon</strong> à sa paj.",
        "filereadonlyerror": "Enposib di modifyé fiché-a « $1 » pas répèrtwar-a di fiché « $2 » sa an lèktir sèl.\n\nAdministratò sistèm ki li vérouyé té fourni sa motif : « $3 ».",
        "invalidtitle": "Tit pa valid",
        "invalidtitle-knownnamespace": "Tit pa valid ké lèspas di non « $2 » é entitilé-a « $3 »",
-       "invalidtitle-unknownnamespace": "Tit pa valid ké niméro-a di lèspas di non $1 enkonèt é entitilé-a « $2 »",
+       "invalidtitle-unknownnamespace": "Tit pa valid ké niméro-a di lèspas di non $1 enkonnèt é entitilé-a « $2 »",
        "exception-nologin": "Pa konnègté",
        "exception-nologin-text": "Souplé, konnègté zòt kò pou agsédé à sa paj oben sa agsyon.",
        "exception-nologin-text-manual": "Souplé zòt $1 pou aksédé à sa paj oben sa aksyon.",
-       "virus-badscanner": "Movèz konfigirasyon : analizò di viris enkonèt : <em>$1</em>",
+       "virus-badscanner": "Mové konfigirasyon : analizò di viris enkonnèt : <em>$1</em>",
        "virus-scanfailed": "échèk di analiz-a (kod $1)",
-       "virus-unknownscanner": "antiviris enkonèt :",
+       "virus-unknownscanner": "antiviris enkonnèt :",
        "logouttext": "<strong>Zòt atchwèlman dékonnègté.</strong>\n\nNoté ki sèrten paj pouvé fika òkò afiché kou si zòt toujou konnègté, jouk zòt désidé di éfasé kach-a di zòt navigatò.",
        "cannotlogoutnow-title": "Enposib di dékonnègté so kò atchwèlman",
        "cannotlogoutnow-text": "Dékonnègsyon-an pa posib an itilizan $1.",
        "usernameinprogress": "Oun kréyasyon di kont pou sa non d'itilizatò ja an kour.\nSouplé, pasyanté.",
        "userexists": "Non d'itilizatò sézi ja itilizé.\nSouplé, chwézi roun non diféran.",
        "loginerror": "Lérò di konnègsyon",
-       "createacct-error": "Érò lò kréyasyon-an di kont",
+       "createacct-error": "Lérò lò di kréyasyon-an di kont",
        "createaccounterror": "Enposib di kréyé kont-a : $1",
        "nocookiesnew": "Kont itilizatò-a kréyé, mé zòt pa konnègté.\n{{SITENAME}} ka itilizé dé témwen (''cookies'') pou konsèrvé konnègsyon-an mé zòt dézagtivé yé.\nSouplé, agtivé yé é rikonnègté zòt kò ké menm non é menm modipas.",
        "nocookieslogin": "{{SITENAME}} itilizé dé témwen (''cookies'') pou konsèrvé konnègsyon-an mé zòt dézagtivé yé.\nSouplé, agtivé yé é rikonnègté zòt kò.",
        "passwordtoolong": "Mo di pas pa pouvé dépasé $1 karaktèr{{PLURAL:$1|}}.",
        "passwordtoopopular": "Mo di pas ki tròp kouran pa pouvé fika itilizé. Souplé, chwézi roun mo di pas pli difisil à douviné.",
        "password-name-match": "Zòt mo di pas divèt fika diféran di zòt non d'itilizatò.",
-       "password-login-forbidden": "Itilizasyon-an di sa non d'itilizatò oben di sa mo di pas té entèrdit.",
+       "password-login-forbidden": "Litilizasyon-an di sa non d'itilizatò oben di sa modipas sa entèrdi.",
        "mailmypassword": "Réyinisyalizé modipas-a",
        "passwordremindertitle": "Nouvèl mo di pas tanporèr pou {{SITENAME}}",
        "passwordremindertext": "Tchèk moun (dipi adrès IP-a $1) doumandé roun modipas nòv pou {{SITENAME}} ($4). Oun modipas tanporèr pou itilizatò-a\n« $2 » té kréyé é sa « $3 ». Si sala té zòt entansyon,\nzòt divèt konnègté zòt kò é chwézi roun modipas nòv.\nZòt modipas tanporèr ké èspiré annan $5 jou{{PLURAL:}}.\n\nSi zòt pa lotò di sa doumann, oben si zòt ka souvni zòt kò atchwèlman di zòt modipas é zòt pli ka swété an chanjé, zòt pouvé ignoré sa mésaj é kontinwé di itilizé zòt ansyen modipas.",
        "blocked-mailpassword": "Zòt adrès IP bloké an modifikasyon. Pou évité abi-ya, i pa otorizé di itilizé rékipérasyon-an di mo à partir di sa adrès IP.",
        "eauthentsent": "Roun kouryé di konfirmasyon té voyé à adrès-a ki endiké.\nAnvan ki rounòt kouryé ka fika voyé à sa kont, zòt divèt swiv enstriksyon di kouryé é konfirmé ki kont-a byen di zòt.",
        "throttled-mailpassword": "Roun kouryé di réyinisyalizasyon di zòt mo di pas té ja voyé douran {{PLURAL:$1|dannyé lò|$1 dannyé lò}}. \nAfen di évité abi-ya, roun sèl kouryé di réyinisyalizasyon di zòt mo di pas ké fika voyé pa {{PLURAL:$1|lò|entèrval di $1 lò}}.",
-       "mailerror": "Érò lò di voyé di kouryé : $1",
+       "mailerror": "Lérò lò di voyé-a di kouryé : $1",
        "acct_creation_throttle_hit": "Vizitò-ya di sa wiki ki ka itilizé zòt adrès IP kréyé {{PLURAL:$1|roun kont|$1 kont}} douran dannyé $2, sa ki sa limit maksimal otorizé andan sa entèrval di tan.\nPa konsékan, kréyasyon di kont pou vizitò-ya ki ka itilizé sa adrès IP sa tanporèrman enposib.",
        "emailauthenticated": "Zòt adrès di kouryé té konfirmé $2 à $3.",
        "emailnotauthenticated": "Zòt adrès di kouryé pa òkò konfirmé.\nPyès kouryé ké fika voyé pou chaken dé fonksyon swivant.",
        "accountcreated": "Kont kréyé",
        "accountcreatedtext": "Kont itilizatò pou [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|diskisyon]]) té kréyé.",
        "createaccount-title": "Kréyasyon di roun kont pou {{SITENAME}}",
-       "createaccount-text": "Tchèk moun kréyé roun kont pou zòt adrès di kouryé asou {{SITENAME}} ($4) entitilé « $2 », ké mo di pas « $3 ».\nZòt divèt ouvri roun sésyon é atchwèlman modifyé zòt mo di pas.\n\nIgnoré sa mésaj si sa kont té kréyé pa érò.",
+       "createaccount-text": "Tchèk moun kréyé roun kont pou zòt adrès di kouryé asou {{SITENAME}} ($4) ki entitilé « $2 », ké modipas « $3 ».\nZòt divèt ouvri roun sésyon é modifyé atchwèlman zòt modipas.\n\nIgnoré sa mésaj si sa kont té kréyé pa lérò.",
        "login-throttled": "Zòt tanté dannyéman roun nonm tròp élvé di konnègsyon.\nSouplé, antann $1 anvan di éséyé òkò.",
        "login-abort-generic": "Zòt échwé zòt tantativ di konnègsyon",
        "login-migrated-generic": "Zòt kont té migré, é zòt non d'itilizatò pa ka ègzisté òkò asou sa wiki.",
        "pt-login-continue-button": "Kontinwé konnègsyon-an",
        "pt-createaccount": "Kréyé roun kont",
        "pt-userlogout": "Dékonnègté so kò",
-       "php-mail-error-unknown": "Érò enkonèt annan fonksyon-an <code>mail()</code> di PHP.",
+       "php-mail-error-unknown": "Lérò enkonnèt annan fongsyon-an <kod>mail()</kod> di PHP.",
        "user-mail-no-addy": "Enposib di voyé roun kouryé san adrès di kouryé.",
        "user-mail-no-body": "Ésè di voyé di roun kouryé ké roun kò vid oben anòrmalman kour.",
        "changepassword": "Chanjé di mo di pas",
        "changepassword-success": "Zòt modipas modifyé !",
        "changepassword-throttled": "Zòt fè tròp di tantativ di konnègsyon résaman. \nSouplé, antann $1 anvan di réyéséyé.",
        "botpasswords": "Mo di pas di robo",
-       "botpasswords-summary": "<em>Modipas-ya di robo</em> ka pèrmèt di agsédé à roun kont itilizatò vya API-a san itilizé idantifyan-yan di konnègsyon prensipal. Drwè itilizatò disponib lò to konnègté ké roun modipas robo pouvé fika rédjwi.\n\nSi zòt pa ka wè poukisa zòt ké lé fè sa, a ki zòt pa benzwen di fè sa. Pésonn divèt janmen doumandé zòt di an jénéré roun é di bay li.",
+       "botpasswords-summary": "<em>Modipas-ya di robo</em> ka pèrmèt di agsédé à roun kont itilizatò vya API-a san itilizé idantifyan-yan di konnègsyon prensipal. Drwè itilizatò-ya ki disponnib lò to konnègté ké roun modipas robo pouvé fika rédjwi.\n\nSi zòt pa ka wè poukisa zòt ké lé fè sa, a ki zòt pa benzwen di fè sa. Pésonn divèt janmen doumandé zòt di an jénéré roun é di bay li.",
        "botpasswords-disabled": "Mo di pas di robo sa dézaktivé.",
        "botpasswords-no-central-id": "Pou itilizé modipas-ya di robo, zòt divèt fika konnègté à roun kont ki santralizé.",
        "botpasswords-existing": "Mo di pas di robo ègzistan",
        "botpasswords-label-create": "Kréyé",
        "botpasswords-label-update": "Mété à jou",
        "botpasswords-label-cancel": "Annilé",
-       "botpasswords-label-delete": "Souprimé",
+       "botpasswords-label-delete": "Siprimen",
        "botpasswords-label-resetpassword": "Réyinisyalizé mo di pas",
        "botpasswords-label-grants": "Drwè aplikab :",
        "botpasswords-help-grants": "Lotorizasyon-yan ka pèrmèt di agsédé o drwè ki déja akòrdé à zòt kont itilizatò. Agtivé roun lotorizasyon isi ka fourni lagsè à pyès drwè ki zòt kont itilizatò péké ganyen dayò. Wè [[Special:ListGrants|tablo dé lotorizasyon]] pou plis di lenfòrmasyon.",
        "botpasswords-label-grants-column": "Akòrdé",
        "botpasswords-bad-appid": "Non-an di robo « $1 » pa valid.",
        "botpasswords-insert-failed": "Échèk di ajou-a di non di robo « $1 ». Ès i té ja ajouté ?",
-       "botpasswords-update-failed": "Échèk di mizajou-a di non di robo « $1 ». Ès i té ja souprimé ?",
+       "botpasswords-update-failed": "Léchèk di mizajou di non di robo « $1 ». Ès i té ja siprimen ?",
        "botpasswords-created-title": "Mo di pas di robo kréyé",
        "botpasswords-created-body": "Mo di pas pou robo-a « $1 » di {{GENDER:$2|itilizatò|itilizatris}}-a « $2 » té kréyé.",
        "botpasswords-updated-title": "Mo di pas di robo mizajou",
        "botpasswords-updated-body": "Mo di pas pou robo-a « $1 » di {{GENDER:$2|itilizatò|itilizatris}}-a « $2 » té mizajou.",
-       "botpasswords-deleted-title": "Mo di pas di robo souprimé",
-       "botpasswords-deleted-body": "Mo di pas pou robo-a « $1 » di {{GENDER:$2|itilizatò|itilizatris}}-a « $2 » té souprimé.",
-       "botpasswords-newpassword": "Nouvèl modipas-a pou konnègté so kò Ã <strong>$1</strong> sa <strong>$2</strong>. <em>Souplé, anréjistré li pou fè référans asou li iltèryèrman.</em><br> (Pou ansyen robo ki ka nésésité ki non fourni pou konnègsyon-an ka fika menm-an ki non di itilizasyon évantchwèl, zòt pouvé osi itilizé <strong>$3</strong> kou non di itilizatò é <strong>$4</strong> kou modipas).",
-       "botpasswords-no-provider": "BotPasswordsSessionProvider pa disponib.",
+       "botpasswords-deleted-title": "Modipas di robo siprimen",
+       "botpasswords-deleted-body": "Modipas-a pou robo-a « $1 » di {{GENDER:$2|itilizatò|itilizatris}}-a « $2 » té siprimen.",
+       "botpasswords-newpassword": "Nouvèl modipas-a pou konnègté so kò Ã <strong>$1</strong> sa <strong>$2</strong>. <em>Souplé, anréjistré li pou fè référans asou li iltèryòrman.</em><br> (Pou ansyen robo-ya ki ka nésésité ki non-an ki fourni pou konnègsyon-an ka fika menm-an ki non-an di itilizatò évantchwèl, zòt pouvé osi itilizé <strong>$3</strong> kou non di itilizatò é <strong>$4</strong> kou modipas).",
+       "botpasswords-no-provider": "BotPasswordsSessionProvider pa disponnib.",
        "botpasswords-restriction-failed": "Rèstrigsyon-yan di modipas di robo ka anpéché sa konnègsyon.",
        "botpasswords-invalid-name": "Non-an d'itilizatò spésifyé pa ka kontni di séparatò di mo di pas di robo (« $1 »).",
        "botpasswords-not-exist": "{{GENDER:$1|Itilizatò|Itilizatris}}-a « $1 » pa gen di mo di pas di robo nonmen « $2 ».",
        "passwordreset-nosuchcaller": "Apélan-an pa ka ègzisté : $1",
        "passwordreset-invalidemail": "Adrès di mésajri envalid",
        "passwordreset-nodata": "Pyès non d'itilizatò oben adrès di mésajri té fourni",
-       "changeemail": "Chanjé oben souprimé adrès di kouryé",
+       "changeemail": "Chanjé oben siprimen adrès-a di kouryé",
        "changeemail-no-info": "Zòt divèt fika konnègté pou agsédé dirèkman à sa paj.",
        "changeemail-oldemail": "Adrès di kouryé atchwèl :",
        "changeemail-newemail": "Nouvèl adrès di kouryé :",
        "showpreview": "Prévizwalizé",
        "showdiff": "Wè modifikasyon-yan",
        "anoneditwarning": "<strong>Panga :</strong> zòt pa konnègté. Zòt adrès IP ké vizib pa tout moun si zòt ka fè dé modifikasyon. Si zòt <strong>[$1 ka konnègté zòt kò]</strong> oben <strong>[$2 kréyé roun kont]</strong>, zòt modifikasyon ké fika atribiyé à zòt pròp non di itilizatò é zòt ké gen ròt avantaj.",
-       "blockedtext": "<strong>Zòt kont itilizatò oben zòt adrès IP bloké.</strong>\n\nBlokaj té éfèktchwé pa $1.\nRézon-an ki évoké ka swiv : <em>$2</em>.\n\n* Koumansman di blokaj : $8\n* Èspirasyon di blokaj : $6\n* Kont bloké : $7.\n\nZòt pouvé kontakté $1 oben rounòt [[{{MediaWiki:Grouppage-sysop}}|administratò]] pou an diskité.\nZòt pa pouvé itilizé fonksyon-an « {{int:emailuser}} » rounso si oun adrès di kouryé valid sa èspésifyé andan zòt [[Special:Preferences|préférans]] é rounso si sa fonksyonalité pa bloké.\nZòt adrès IP atchwèl sa $3 é zòt idantifyan di blokaj sa $5.\nSouplé, enkli tout détay-ya lasou'l annan chakin dé rékèt ki zòt ké fè.",
+       "blockedtext": "<strong>Zòt kont itilizatò oben zòt adrès IP bloké.</strong>\n\nBlokaj té éfègtchwé pa $1.\nRézon-an ki évoké ka swiv : <em>$2</em>.\n\n* Koumansman di blokaj : $8\n* Lèspirasyon di blokaj : $6\n* Kont bloké : $7.\n\nZòt pouvé kontagté $1 oben rounòt [[{{MediaWiki:Grouppage-sysop}}|administratò]] pou an diskité.\nZòt pouvé itilizé fongsyon-an « {{int:emailuser}} » rounso si roun adrès di kouryé valid sa èspésifyé annan zòt [[Special:Preferences|préférans]] é rounso si sa fongsyonnalité pa bloké pou zòt.\nZòt adrès IP atchwèl sa $3 é zòt idantifyan di blokaj sa $5.\nSouplé, enkli tout détay-ya lasou'l annan chaken dé rékèt ki zòt ké fè.",
        "loginreqlink": "konnègté so kò",
        "newarticletext": "Zòt té ka swiv roun lyannaj bò'd roun paj ki pa ka ègzisté òkò. \nAfen di kréyé sa paj, antré zòt tègs annan bwèt-a ki apré (zòt pouvé konsilté [$1 paj di lèd-a] pou plis di lenfòrmasyon).\nSi zòt vini{{GENDER:|}} isi pa lérò, kliké asou bouton-an <strong>Routour</strong> di zòt navigatò.",
        "anontalkpagetext": "----\n<em>Zòt asou paj di diskisyon di roun itilizatò annonnim ki pa òkò kréyé di kont oben ki pa ka an itilizé</em>.\nPou sa rézon, nou divèt itilizé so adrès IP pou idantifyé li.\nOun adrès IP pouvé fika patajé pa plizyò itilizatò.\nSi zòt roun itiliza{{GENDER:|ò}} annonnim é si zòt ka kontasté ki dé koumantèr ki pa ka konsèrné zòt sa adrèsé pou zòt, zòt pouvé [[Special:CreateAccount|kréyé roun kont]] oben [[Special:UserLogin|konnègté zòt kò]] atò di évité tout konfizyon fitir ké ròt kontribitò annonnim.",
        "template-protected": "(protéjé)",
        "template-semiprotected": "(sémi-protéjé)",
        "hiddencategories": "{{PLURAL:$1|Katégori kaché}} don sa paj ka fè parti :",
-       "permissionserrors": "Éròr di pèrmisyon",
+       "permissionserrors": "Lérò di pèrmisyon",
        "permissionserrorstext-withaction": "Zòt pa pouvé $2, pou {{PLURAL:$1|rézon swivant}} :",
-       "recreate-moveddeleted-warn": "<strong>Panga : zòt ka roukréyé oun paj ki té présédaman souprimé.</strong>\n\nAsouré-zòt ki li sa pertinan di pourswiv modifikasyon-yan asou sa paj.\nJournal dé souprésyon é dé déplasman pou sa paj sa afiché anba à tit di enfòrmasyon :",
+       "recreate-moveddeleted-warn": "<strong>Panga : zòt ka roukréyé roun paj ki té présédanman siprimen.</strong>\n\nAsouré-zòt ki i sa pèrtinan di pourswiv modifikasyon-yan asou sa paj.\nJournal-ya dé siprésyon é dé déplasman pou sa paj sa fourni isi pou lenfòrmasyon :",
        "moveddeleted-notice": "Sa paj té siprimen. \nJournal-ya dé siprésyon, dé protègsyon é dé déplasman pou paj-a sa afiché anba pou référans.",
        "content-model-wikitext": "wikitèks",
        "undo-failure": "Sa modifikasyon pa pouvé défèt : sala ké antré an konfli ké modifikasyon entèrmédjèr-ya.",
        "recentchanges-label-plusminus": "Tay di paj-a chanjé di sa nonm d'oktè.",
        "recentchanges-legend-heading": "<strong>Léjann :</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (wè osi [[Special:NewPages|lis dé nouvèl paj]]).",
-       "rcnotefrom": "Anba {{PLURAL:$5|modifikasyon éfèktchwé}} dipi <strong>$3, $4</strong> (afiché jouk à <strong>$1</strong>).",
+       "rcnotefrom": "Anba {{PLURAL:$5|modifikasyon-an ki éfègtchwé|modifikasyon-yan ki éfègtchwé}} dipi <strong>$3, $4</strong> (afiché jouk <strong>$1</strong>).",
        "rclistfrom": "Afiché nouvèl modifikasyon-yan dipi $3, $2",
        "rcshowhideminor": "$1 modifikasyon minò",
        "rcshowhideminor-show": "Afiché",
        "rcshowhidemine": "$1 mo modifikasyon-yan",
        "rcshowhidemine-show": "Afiché",
        "rcshowhidemine-hide": "Maské",
-       "rclinks": "Afiché $1 dannyé modifikasyon éfèktchwé o kour dé $2 dannyé jou.",
+       "rclinks": "Afiché $1 dannyé modifikasyon-yan ki éfègtchwé o kour dé $2 dannyé jou.",
        "diff": "dif",
        "hist": "ist",
        "hide": "Maské",
        "uploadlogpage": "Journal di enpo di fiché",
        "filedesc": "Dèskripsyon",
        "license": "Lisans",
-       "license-header": "Kondisyon di itilizasyon",
+       "license-header": "Kondisyon di litilizasyon",
        "imgfile": "fiché",
        "listfiles": "Lis di fiché",
        "file-anchor-link": "Fiché",
        "filehist-user": "Itilizatò",
        "filehist-dimensions": "Dimansyon",
        "filehist-comment": "Koumantèr",
-       "imagelinks": "Itilizasyon di fiché",
+       "imagelinks": "Litilizasyon di fiché",
        "linkstoimage": "{{PLURAL:$1|Paj ki ka swiv ka itilizé|$1 paj-ya ki ka swiv ka itilizé}} sa fiché :",
        "linkstoimage-more": "Pli {{PLURAL:$1|di roun paj ka itilizé|di $1 paj ka itilizé}} sa fiché.\nLis-a ki ka swiv ka afiché rounso {{PLURAL:$1|pronmyé paj-a ki ka itilizé|$1 pronmyé paj-ya ki ka itilizé}} sa fiché.\nOun [[Special:WhatLinksHere/$2|lis konplèt]] sa disponnib.",
        "nolinkstoimage": "Pyès paj ka itilizé sa fiché.",
        "speciallogtitlelabel": "Sib (tit oben {{ns:user}}:non di itilizatò) :",
        "log": "Journal d’opérasyon",
        "all-logs-page": "Tout journal piblik",
-       "alllogstext": "Afichaj konbiné di tout journal disponib asou {{SITENAME}}.\nZòt pouvé pèrsonalizé afichaj an sélèksyonnan tip di journal, non di itilizatò oben paj-a ki konsèrné (sa Dé dannyé sa sansib à lakas).",
+       "alllogstext": "Lafichaj konbinen di tout journal-ya ki disponnib asou {{SITENAME}}.\nZòt pouvé pèrsonalizé lafichaj an sélègsyonnan tip di journal-a, non di itilizatò-a oben paj-a ki konsèrnen (sa Dé dannyé sa sansib à lakas).",
        "logempty": "Pyès opérasyon korèspondant andan journal-ya.",
        "allpages": "Tout paj-ya",
        "allarticles": "Tout paj-ya",
        "unwatch": "Pli swiv òkò",
        "watchlist-details": "{{PLURAL:$1|$1 paj sa|$1}} annan zòt lis di swivi (plis paj-ya di diskisyon).",
        "wlheader-showupdated": "Paj-ya ki modifyé dipi zòt dannyé vizit sa afiché an <strong>gra</strong>.",
-       "wlnote": "Anba {{PLURAL:$1|figir dannyé modifikasyon-an éfèktchwé|figir <strong>$1</strong> dannyé modifikasyon-yan éfèktchwé}} douran {{PLURAL:$2|dannyé lò| <strong>$2</strong>}}, jouk o $3, $4.",
+       "wlnote": "Anba {{PLURAL:$1|ka figiré dannyé modifikasyon-an ki éfègtchwé|ka figiré <strong>$1</strong> dannyé modifikasyon-yan ki éfègtchwé}} douran {{PLURAL:$2|dannyé lèr-a|<strong>$2</strong> dannyé lèr-ya}}, jouk $3, $4.",
        "wlshowlast": "Montré dannyé $1 lò, dannyé $2 jou",
        "watchlist-options": "Opsyon di lis di swivi",
        "enotif_reset": "Marké tout paj-ya kou vizité",
-       "dellogpage": "Journal dé souprésyon",
+       "dellogpage": "Journal dé siprésyon",
        "rollbacklink": "révoké",
        "rollbacklinkcount": "révoké $1 {{PLURAL:$1|modifikasyon}}",
        "protectlogpage": "Journal dé protègsyon",
        "tooltip-ca-viewsource": "Sa paj sa protéjé.\nZòt pouvé toutfwè vizwalizé sours-a.",
        "tooltip-ca-history": "Listorik dé vèrsyon di sa paj",
        "tooltip-ca-protect": "Protéjé sa paj",
-       "tooltip-ca-delete": "Souprimé sa paj",
+       "tooltip-ca-delete": "Siprimen sa paj",
        "tooltip-ca-move": "Rounonmen sa paj",
        "tooltip-ca-watch": "Ajouté sa paj annan zòt lis di swivi",
        "tooltip-ca-unwatch": "Routiré sa paj di zòt lis di swivi",
        "widthheightpage": "$1 × $2, $3 paj{{PLURAL:$3|}}",
        "file-info-size": "$1 × $2 piksèl, tay di fiché : $3, tip MIME : $4",
        "file-info-size-pages": "$1 × $2 piksèl ; tay di fiché : $3 ; tip MIME : $4 ; $5 paj{{PLURAL:$5|}}",
-       "file-nohires": "Pa di pli rot rézolisyon disponib.",
+       "file-nohires": "Pa di pli rot rézolisyon disponnib.",
        "svg-long-desc": "Fiché SVG, rézolisyon di $1 × $2 piksèl, tay : $3",
        "show-big-image": "Fiché d’orijin",
        "show-big-image-preview": "Tay di sa apèrsou : $1.",
        "watchlisttools-raw": "Modifyé lis di swivi an mòd brout",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskisyon]])",
        "redirect": "Roudirijé pa ID di fiché, itilizatò, paj, révizyon oben journal",
-       "redirect-summary": "Sa paj èspésyal ka roudirijé bò'd roun fiché (non di fiché fourni), oun paj (ID di révizyon oben di paj fourni), oun paj di itilizatò (idantifyan nimérik di itilizatò fourni), oben roun antré di journal (ID di journal fourni). Itilizasyon : [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], oben [[{{#Special:Redirect}}/logid/186]].",
+       "redirect-summary": "Sa paj èspésyal ka roudirijé bò'd roun fiché (non di fiché fourni), oun paj (ID di révizyon oben di paj fourni), oun paj di itilizatò (idantifyan nimérik di itilizatò-a ki fourni), oben roun antré di journal (ID di journal fourni). Litilizasyon : [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], oben [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "Validé",
        "redirect-lookup": "Sasé :",
        "redirect-value": "Valò :",
        "tags-active-yes": "Wi",
        "tags-active-no": "Awa",
        "tags-hitcount": "$1 modifikasyon{{PLURAL:$1|}}",
-       "logentry-delete-delete": "$1 souprimé paj-a $3",
+       "logentry-delete-delete": "$1 siprimen paj-a $3",
        "logentry-delete-restore": "$1 rèstoré paj-a $3 ($4)",
        "logentry-delete-revision": "$1 {{GENDER:$2|modifyé}} vizibilité {{PLURAL:$5|di oun révizyon|di $5 révizyon}} asou paj $3 : $4",
        "revdelete-content-hid": "kontni maské",
index bce4509..9a1d234 100644 (file)
        "grouppage-user": "{{ns:project}}:Sadasya",
        "grouppage-autoconfirmed": "{{ns:project}}:Autoconfirmed sadasya",
        "grouppage-bot": "{{ns:project}}:Bots",
-       "grouppage-sysop": "{{ns:project}}:Администраторар",
+       "grouppage-sysop": "{{ns:project}}:Administrators",
        "grouppage-bureaucrat": "{{ns:project}}:Bureaucrats",
        "grouppage-suppress": "{{ns:project}}:Suppress",
        "right-read": "Panna ke parrho",
index d759491..ab57a67 100644 (file)
@@ -32,7 +32,8 @@
                        "Narek",
                        "23artashes",
                        "Fitoschido",
-                       "Սահակ"
+                       "Սահակ",
+                       "ديفيد"
                ]
        },
        "tog-underline": "ընդգծել հղումները՝",
        "toolbox": "Գործիքներ",
        "tool-link-userrights": "Փոփոխել {{GENDER:$1|մասնակից}} խմբեր",
        "tool-link-userrights-readonly": "Տեսնել {{GENDER:$1|մասնակից}} խումբը",
-       "tool-link-emailuser": "Ուղարկել էլ այս նամակ {{GENDER:$1|մասնակցին}}",
+       "tool-link-emailuser": "Ուղարկել էլ. նամակ այս {{GENDER:$1|մասնակցին}}",
        "imagepage": "Դիտել նիշքի էջը",
        "mediawikipage": "Դիտել հաղորդագրության էջը",
        "templatepage": "Դիտել կաղապարի էջը",
        "emptyfile": "Ձեր բեռնած նիշքը ըստ երևույթին դատարկ է։ Հնարավոր է սա նիշքի անվանման մեջ տառասխալի հետևանք է։ Խնդրում ենք ստուգել, թե արդյոք իսկապես ուզում եք բեռնել այս նիշքը։",
        "fileexists": "Այսպիսի անվանմամբ նիշք արդեն գոյություն ունի։ Խնդրում ենք ստուգել <strong>[[:$1]]</strong>, եթե դուք համոզված չեք, որ ուզում եք այն փոխարինել։\n[[$1|thumb]]",
        "fileexists-extension": "Գոյություն ունի համանման անվանմամբ նիշք՝ [[$2|thumb]]\n* Բեռնված նիշքի անվանում՝ <strong>[[:$1]]</strong>\n* Գոյություն ունեցող նիշքի անվանում՝ <strong>[[:$2]]</strong>\nԽնդրում ենք ընտրել մեկ այլ անվանում։",
-       "fileexists-thumbnail-yes": "Õ\86Õ«Õ·Ö\84Õ¨ Õ¨Õ½Õ¿ Õ¥Ö\80Ö\87Õ¸Ö\82ÕµÕ©Õ«Õ¶ Ö\83Õ¸Ö\84Ö\80Õ¡Ö\81Õ¾Õ¡Õ® ÕºÕ¡Õ¿Õ³Õ¥Õ¶ Õ§ ''(ÕºÕ¡Õ¿Õ¯Õ¥Ö\80Õ«Õ¯)''Ö\89 [[$1|thumb]]\nÔ½Õ¶Õ¤Ö\80Õ¸Ö\82Õ´ Õ¥Õ¶Ö\84 Õ½Õ¿Õ¸Ö\82Õ£Õ¥Õ¬ <strong>[[:$1]]</strong> Õ¶Õ«Õ·Ö\84Õ¨Ö\89\nÔµÕ©Õ¥ Õ¶Õ·Õ¾Õ¡Õ® Õ¶Õ«Õ·Ö\84Õ¨ Õ¶Õ¸Ö\82ÕµÕ¶ ÕºÕ¡Õ¿Õ¯Õ¥Ö\80Õ¶ Õ§ Õ¢Õ¶Ö\85Ö\80Õ«Õ¶Õ¡Õ¯ Õ¹Õ¡Ö\83Õ¸Õ¾, Õ¡ÕºÕ¡ Õ°Õ¡Ö\80Õ¯Õ¸վոր չէ բեռնել նրա փոքրացված պատճենը։",
+       "fileexists-thumbnail-yes": "Õ\86Õ«Õ·Ö\84Õ¨ Õ¨Õ½Õ¿ Õ¥Ö\80Ö\87Õ¸Ö\82ÕµÕ©Õ«Õ¶ Ö\83Õ¸Ö\84Ö\80Õ¡Ö\81Õ¾Õ¡Õ® ÕºÕ¡Õ¿Õ³Õ¥Õ¶ Õ§ ''(ÕºÕ¡Õ¿Õ¯Õ¥Ö\80Õ«Õ¯)''Ö\89 [[$1|thumb]]\nÔ½Õ¶Õ¤Ö\80Õ¸Ö\82Õ´ Õ¥Õ¶Ö\84 Õ½Õ¿Õ¸Ö\82Õ£Õ¥Õ¬ <strong>[[:$1]]</strong> Õ¶Õ«Õ·Ö\84Õ¨Ö\89\nÔµÕ©Õ¥ Õ¶Õ·Õ¾Õ¡Õ® Õ¶Õ«Õ·Ö\84Õ¨ Õ¶Õ¸Ö\82ÕµÕ¶ ÕºÕ¡Õ¿Õ¯Õ¥Ö\80Õ¶ Õ§ Õ¢Õ¶Ö\85Ö\80Õ«Õ¶Õ¡Õ¯ Õ¹Õ¡Ö\83Õ¸Õ¾, Õ¡ÕºÕ¡ Õ°Õ¡Ö\80Õ¯Õ¡վոր չէ բեռնել նրա փոքրացված պատճենը։",
        "file-thumbnail-no": "Նիշքի անվանման սկիզբն է՝ <strong>$1</strong>։ \nՀավանաբար սա փոքրացված պատճեն է ''(պատկերիկ)''։ \nԵթե դուք այս պատկերը ամբողջական լուծաչափով ունեք, ապա խնդրում ենք բեռնել այն, հակառակ դեպքում՝ խնդրում ենք փոխել նիշքի անվանումը։",
        "fileexists-forbidden": "Այսպիսի անվանմամբ նիշք արդեն գոյություն ունի։ Խնդրում ենք հետ վերադառնալ և բեռնել նիշքը նոր անվանմամբ։ [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Այսպիսի անվանմամբ նիշք արդեն գոյություն ունի նիշքերի ընդհանուր զետեղարանում։ Խնդրում ենք հետ վերադառնալ և բեռնել նիշքը նոր անվանմամբ։ [[File:$1|thumb|center|$1]]",
        "emailuser": "էլ-նամակ ուղարկել այս մասնակցին",
        "emailuser-title-target": "Ուղարկել էլ․ նամակ {{GENDER:$1|մասնակցին}}",
        "emailuser-title-notarget": "Ուղարկել էլ․ նամակ",
-       "emailpagetext": "Ô´Õ¸Ö\82Ö\84 Õ¯Õ¡Ö\80Õ¸Õ² Õ¥Ö\84 Ö\85Õ£Õ¿Õ¡Õ£Õ¸Ö\80Õ®Õ¥Õ¬ Õ¶Õ¥Ö\80Ö\84Ö\87Õ« Õ±Ö\87Õ¨ Õ¡ÕµÕ½ {{GENDER:$1|Õ´Õ¡Õ½Õ¶Õ¡Õ¯Ö\81Õ«Õ¶}} Õ§Õ¬-Õ¶Õ¡Õ´Õ¡Õ¡Õ¯ Õ¸Ö\82Õ²Õ¡Ö\80Õ¯Õ¥Õ¬Õ¸Ö\82 Õ°Õ¡Õ´Õ¡Ö\80Ö\89\n\nÕ\81Õ¥Ö\80 Õ¶Õ¡Õ­Õ¨Õ¶Õ¿Ö\80Õ¡Õ¶Ö\84Õ¶Õ¥Ö\80Õ¸Ö\82Õ´ Õ¶Õ·Õ¾Õ¡Õ® Õ§Õ¬-Õ°Õ¡Õ½Ö\81Õ¥Õ¶ Õ¯Õ¥Ö\80Ö\87Õ¡ Â«Õ\88Ö\82Õ´Õ«Ö\81» Õ¤Õ¡Õ·Õ¿Õ¸Ö\82Õ´ Ö\87 Õ½Õ¿Õ¡Ö\81Õ¸Õ²Õ¨ Õ¯Õ¡Ö\80Õ¸Õ² Õ§ Õ¡Õ¶Õ´Õ«Õ»Õ¡ÕºÕ¥Õ½ ÕºÕ¡Õ¿Õ¡Õ½Õ­Õ¡Õ¶Õ¥Õ¬ Õ±Õ¥Õ¦Ö\89",
+       "emailpagetext": "Դուք կարող եք օգտագործել ներքևի ձևը այս {{GENDER:$1|մասնակցին}} էլ-նամակ ուղարկելու համար։\n\nՁեր նախընտրանքներում նշված էլ-հասցեն կերևա «Ումից» դաշտում և ստացողը կարող է անմիջապես պատասխանել ձեզ։",
        "defemailsubject": "{{SITENAME}} էլ-նամակ",
        "usermaildisabled": "Էլ․ նամակ ուղարկելը թույլատրված չէ։",
        "usermaildisabledtext": "Այս վիքիում չեք կարղ էլ․ նամակ ուղարկել այլ մասնակիցների",
        "emailsubject": "Թեմա.",
        "emailmessage": "Ուղերձ.",
        "emailsend": "Ուղարկել",
-       "emailccme": "Ուղարկել ինձ իմ նամակի պատճեն։",
-       "emailccsubject": "Ձեր՝ $1 մասնակցին նամակի պատճեն. $2",
+       "emailccme": "Ուղարկել ինձ իմ նամակի պատճենը։",
+       "emailccsubject": "$1 մասնակցին ուղարկված Ձեր նամակի պատճենը. $2",
        "emailsent": "Էլեկտրոնային նամակն ուղարկված է",
        "emailsenttext": "Ձեր էլ-ուղերձն ուղարկված է։",
        "usermessage-editor": "Համակարգի սուրհանդակ",
index 7df629b..62f1dcd 100644 (file)
        "tag-filter": "[[Special:Tags|etiketo]] filtrilo:",
        "tag-filter-submit": "Filtrez",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Etikedo|Etikedi}}]]: $2)",
+       "tag-mw-contentmodelchange": "Modifiko di la kontenajo di ula modelo",
+       "tag-mw-contentmodelchange-description": "Redakturi qui [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel modifikas la modelo di kontenajo] di ula pagino",
+       "tag-mw-new-redirect": "Nova ridirekto",
+       "tag-mw-blank-description": "Redakturi qui efacas pagini",
+       "tag-mw-replace-description": "Redakturi qui removas plua kam 90% de la kontenajo di ula pagino",
        "tags-title": "Etiketi",
+       "tags-intro": "Ica pagino montras l'etiketi qui povas uzesar dal informatik-programo por markizar ula redakturo, e lia signifiko.",
+       "tags-tag": "Nomo dil etiketo",
+       "tags-display-header": "Aspekto en chanjebla listi",
        "tags-description-header": "Kompleta deskripto dil senco",
+       "tags-hitcount-header": "Modifikuri indikita",
+       "tags-actions-header": "Agadi",
        "tags-active-yes": "Yes",
        "tags-active-no": "No",
+       "tags-source-extension": "Definita dal informatikoprogramo",
        "tags-edit": "redaktar",
        "tags-hitcount": "$1 {{PLURAL:$1|chanjo|chanji}}",
+       "tags-create-heading": "Krear nova etiketo",
        "tags-create-explanation": "Segun predefino, la nova etiketi kreita divenos disponebla por uzado, sive da uzeri, sive da informatikoprogrami 'bot'.",
        "tags-create-tag-name": "Nomo dil etiketo:",
+       "tags-create-reason": "Motivo:",
+       "tags-create-submit": "Krear",
        "tags-create-warnings-above": "La sequanta {{PLURAL:$2|avizo|avizi}} renkontresis, probante kreir l'etiketo \"$1\":",
+       "tags-delete-reason": "Motivo:",
        "tags-delete-not-found": "L'etiketo \"$1\" ne existas.",
        "tags-delete-too-many-uses": "L'etiketo \"$1\" uzesas en plua kam $2 {{PLURAL:$2|revizo|revizi}}, do ol ne povas eskartesar.",
        "tags-delete-warnings-after-delete": "L'etiketo \"$1\" efacesis, ma la sequanta {{PLURAL:$2|avizo|avizi}} renkontresis:",
+       "tags-activate-reason": "Motivo:",
        "tags-activate-not-found": "L'etiketo \"$1\" ne existas.",
+       "tags-deactivate-reason": "Motivo:",
        "tags-update-blocked": "Dum ke {{GENDER:$1|vu}} blokusabos, vu ne povos modifikar od efacar etiketi.",
+       "tags-edit-chosen-no-results": "Trovesis nula etiketo qua koincidas kun to",
+       "tags-edit-reason": "Motivo:",
        "dberr-problems": "Pardonez! Ica retopagino subisas teknikala problemi.",
        "dberr-again": "Voluntez vartar kelka minuti, e riprobez acesar ol.",
        "dberr-info": "(Ne povis acesar la datumaro: $1)",
        "sessionprovider-nocookies": "''Bisquiti'' forsan esas desacendita. Certigez ke vu acendar ''bisquiti'' e riprobez.",
        "randomrootpage": "Hazarda radikopagino",
        "log-action-filter-delete": "Tipo di efacado:",
+       "log-action-filter-contentmodel-change": "Modifiko di la kontenajo di ula modelo",
        "log-action-filter-suppress-reblock": "User suppression by reblock"
 }
index b6541f8..0216ef2 100644 (file)
        "confirm-unwatch-top": "Rimuovere questa pagina dalla tua lista degli osservati speciali?",
        "confirm-rollback-button": "OK",
        "confirm-rollback-top": "Ripristinare le modifiche di questa pagina?",
+       "confirm-mcrrestore-title": "Ripristina una versione",
        "confirm-mcrundo-title": "Annulla una modifica",
        "mcrundofailed": "Annullamento fallito",
        "mcrundo-missingparam": "Parametri obbligatori mancanti nella richiesta.",
index c6c0db7..1591257 100644 (file)
        "jumptosearch": "golèk",
        "view-pool-error": "Nyuwun ngapura, peladèn lagi sibuk wektu iki.\nKakèhan panganggo kang nyoba mbukak kaca iki.\nEntèni sedhéla sadurungé nyoba ngaksès kaca iki manèh .\n\n$1",
        "generic-pool-error": "Ngapunten, paladèné lagi kabotan momotan.\nPanganggo akèh kang péngin ndeleng sumber iki.\nEntènana sadhéla sadurungé panjenengan marani sumber iki manèh.",
-       "pool-timeout": "Kelangkung wekdal nengga kunci",
+       "pool-timeout": "Kaladuk suwé anggoné ngentèni gembok",
        "pool-queuefull": "Kempalan antrian kebak",
        "pool-errorunknown": "Kalepata ingkang mboten dipun mangertosi",
        "poolcounter-usage-error": "Masalah pangguna: $1",
        "privacypage": "Project:Niti privasi",
        "badaccess": "Aksès ora olèh",
        "badaccess-group0": "Panjenengan ora pareng nglakokaké tindhakan kang panjenengan gayuh.",
-       "badaccess-groups": "Tumindak kang panjenengan péngini winates marang panganggo ing {{PLURAL:$2|golongan|golongan}}: $1.",
+       "badaccess-groups": "Laku kang panjenengan karsakaké mung kanggo panganggo ing {{PLURAL:$2|golongan|golongan}}: $1.",
        "versionrequired": "Dibutuhaké MediaWiki vèrsi $1",
        "versionrequiredtext": "MediaWiki vèrsi $1 dibutuhaké kanggo nggunakaké kaca iki. Mangga mirsani [[Special:Version|kaca iki]]",
        "ok": "Oké",
        "confirmable-no": "Ora",
        "thisisdeleted": "Deleng utawa pulihaké $1?",
        "viewdeleted": "Deleng $1?",
-       "restorelink": "$1 {{PLURAL:$1|besutan}} kang wis dibusak",
+       "restorelink": "$1 besutan kang wis binusek",
        "feedlinks": "Asupan:",
        "feed-invalid": "Tipe permintaan asupan ora bener.",
        "feed-unavailable": "Umpan sindikasi (''syndication feeds'') ora kasedyakaké",
        "nstab-help": "Kaca pitulung",
        "nstab-category": "Kategori",
        "mainpage-nstab": "Tepas",
-       "nosuchaction": "Ora ana tumindak mangkono",
-       "nosuchactiontext": "Tumindak kang dikarepaké déning URL ora trep.\nPanjenengan bokmanawa salah ngetik URL-é, utawa salah nurut pranala.\nIki bokmanawa uga nuduhaké yèn ana ama ing piranti alus kang dianggo déning {{SITENAME}}.",
+       "nosuchaction": "Ora ana laku mangkono",
+       "nosuchactiontext": "Laku kang dikarepaké URL ora trep.\nPanjenengan bokmanawa salah nulis URL-é, utawa salah mènèhi pranala.\nIki bokmanawa uga nuduhaké yèn ana ama ing piranti alus kang dianggo {{SITENAME}}.",
        "nosuchspecialpage": "Ora ana kaca mirunggan mangkono",
        "nospecialpagetext": "<strong>Panjenengan nyuwun kaca mirunggan kang ora trep.</strong>\n\nPratélan kaca mirunggan kang trep bisa tinemu ing [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Masalah",
        "databaseerror": "Masalah sasana dhata",
-       "databaseerror-text": "Ana kerusakan ing basis data (query error).\n\nMungkin ana masalah ing software-e.",
-       "databaseerror-textcl": "Ana kerusakan ing basis data (query error).",
-       "databaseerror-query": "Query: $1",
-       "databaseerror-function": "Function: $1",
+       "databaseerror-text": "Ana masalah ing kuwèri basis dhatah.\nBokmanawa iki nuduhaké yèn ana ama ing piranti alusé.",
+       "databaseerror-textcl": "Ana masalah kuwèri basis dhatah.",
+       "databaseerror-query": "Kuwèri: $1",
+       "databaseerror-function": "Fungsi: $1",
        "databaseerror-error": "Masalah: $1",
-       "laggedslavemode": "Pènget: Kaca iki mbokmenawa isiné dudu pangowahan pungkasan.",
+       "laggedslavemode": "Pènget: Kaca iki bokmanawa isiné dudu pangowahan pungkasan.",
        "readonly": "Umpak data kagembok",
        "enterlockreason": "Isi alesan ngreksa, kalebu rencana kapan pareksané bakal dibukak",
        "readonlytext": "Juru administrasi sistem kang ngunci iku medhar mangkéné: $1",
-       "missing-article": "Basish dhatahé ora bisa nemokaké tulisan ing siji kaca kang kuduné ana, ya iku \"$1\" $2.\n\nMasalah iki sok ana amarga panjenengan ngeklik pranala sajarah kang lawas ing kaca kang wis kabusek.\n\nManawa ora amarga iku, panjenengan bokmanawa nemu ama ing piranti alusé.\nSumangga lapuraké ama mau menyang [[Special:ListUsers/sysop|pangurus]], kanthi nulisaké URL-é.",
+       "missing-article": "Basis dhatahé ora bisa nemu tulisan ing siji kaca kang kuduné ana, ya iku \"$1\" $2.\n\nMasalah iki sok ana amarga panjenengan ngeklik pranala sajarah kang lawas ing kaca kang wis kabusek.\n\nManawa ora amarga iku, panjenengan bokmanawa nemu ama ing piranti alusé.\nSumangga lapuraké ama mau menyang [[Special:ListUsers/sysop|pangurus]], kanthi nulisaké URL-é.",
        "missingarticle-rev": "(owahan#: $1)",
        "missingarticle-diff": "(Béda: $1, $2)",
        "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 nulad berkas \"$1\" menyang \"$2\".",
+       "filecopyerror": "Ora bisa nurun barkas \"$1\" dadi \"$2\".",
        "filerenameerror": "Ora bisa ngowahi saka \"$1\" dadi \"$2\".",
-       "filedeleteerror": "Ora bisa mbusak berkas \"$1\".",
+       "filedeleteerror": "Ora bisa mbusek barkas \"$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 nemokaké berkas \"$1\".",
+       "filenotfound": "Ora bisa nemu barkas \"$1\".",
        "unexpected": "Biji (''nilai'') ing njabaning jangkauan: \"$1\"=\"$2\".",
        "formerror": "Masalah: Ora bisa ngirim formulir",
-       "badarticleerror": "Tumindak iki ora bisa diayahi ing kaca iki.",
-       "cannotdelete": "Kaca utawa berkas \"$1\" ora bisa dibusak.\nManawa wis dibusak déning wong liya.",
-       "cannotdelete-title": "Ora bisa mbusak kaca \"$1\"",
+       "badarticleerror": "Laku iki ora bisa kalakokaké ing kaca iki.",
+       "cannotdelete": "Kaca utawa barkas \"$1\" ora bisa panjenengan busak.\nBokmanawa kaca utawa barkasé 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\"",
        "badtitle": "Sesirah ala",
        "viewsource": "Deleng sumber",
        "viewsource-title": "Deleng sumberé $1",
        "actionthrottled": "Tindakan diwatesi",
-       "actionthrottledtext": "Minangka upaya lumawan tumindak salah-guna, panjenengan diwatesi nalika ngayahi iki ping bola-bali tur rikat, lan panjenengan wis munjuli watesané.\nMangga jajalen manèh mengko.",
+       "actionthrottledtext": "Minangka upaya nglawan laku salah-guna, panjenengan ora bisa nglakokaké iki ping bola-bali ing dalem waktu sadhéla, lan panjenengan wis munjuli watesané.\nSumangga jajal manèh mengko.",
        "protectedpagetext": "Kaca iki wis direksa supaya ora dibesut lan diapa-apakaké.",
        "viewsourcetext": "Panjenengan bisa ndeleng lan nurun sumberé kaca iki.",
        "viewyourtext": "Panjenengan bisa ndeleng lan nurun sumberé <strong>besutané panjenengan</strong> menyang kaca iki.",
        "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\".",
+       "invalidtitle": "Sesirah ora trep",
        "invalidtitle-knownnamespace": "Irah-irahan ora sah mawa bilik jeneng \"$2\" lan tèks \"$3\"",
        "invalidtitle-unknownnamespace": "Judhul ora trep mawa angka $1 lan tèks \"$2\" bilik jeneng kang ora dingertèni",
        "exception-nologin": "Durung mlebu log",
-       "exception-nologin-text": "Mangga mlebua log supaya bisa ngaksès kaca utawa tumindak iki.",
+       "exception-nologin-text": "Sumangga panjenengan mlebu log supaya bisa ngaksès kaca utawa laku iki.",
        "exception-nologin-text-manual": "Tulung $1 kanggo ngakses kaca utawa kelakon iki.",
        "virus-badscanner": "Kasalahan konfigurasi: pamindai virus ora dikenal: ''$1''",
        "virus-scanfailed": "''Pemindaian'' utawa ''scan'' gagal (kode $1)",
        "virus-unknownscanner": "antivirus buhbuhan:",
-       "logouttext": "<strong>Panjenengan wis metu log.</strong>\n\nTulung gatèkaké yèn sawenèh kaca bokmanawa bakal isih katon kaya déné yèn panjenengan isih mlebu log, kajaba panjenengan mbusak ''cache'' pangluruné panjenengan.",
+       "logouttext": "<strong>Panjenengan wis metu log.</strong>\n\nTulung gatèkaké yèn sawenèh kaca bokmanawa bakal isih katon kaya déné yèn panjenengan isih mlebu log, kajaba panjenengan mbusek telih pangluruné panjenengan.",
        "cannotlogoutnow-title": "Ora bisa metu saiki",
-       "cannotlogoutnow-text": "Metu ora mungkin menawa nganggo $1.",
+       "cannotlogoutnow-text": "Mokal metu log nalika nganggo $1.",
        "welcomeuser": "Sugeng Rawuh, $1!",
        "welcomecreation-msg": "Akun panjenengan wis kacipta. Aja lali nata konfigurasi [[Special:Preferences|preferensi {{SITENAME}}]] panjenengan.",
        "yourname": "Jeneng panganggo:",
        "userlogin-resetpassword-link": "Lali tembung wadiné panjenengan?",
        "userlogin-helplink2": "Tulungi mlebu log",
        "userlogin-loggedin": "Panjenengan wis mlebu log minangka {{GENDER:$1|$1}}.\nAnggonen formulir ngisor iki saperlu mlebu log minangka panganggo liya.",
+       "userlogin-reauth": "Panjenengan kudu mlebu log manèh saperlu vèrifikasi yèn panjenengan bener {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Gawé akun liya",
        "createacct-emailrequired": "Alamat layang-èl",
        "createacct-emailoptional": "Alamat layang-èl (manasuka)",
        "createacct-email-ph": "Isi layang-èl panjenengan",
        "createacct-another-email-ph": "Isi alamat layang-èl",
        "createaccountmail": "Nganggo tembung wadi sauntara kang dikirimaké menyang alamat layang-èl",
+       "createaccountmail-help": "Bisa kanggo nggawèkaké wong liya akun tanpa ngurusi tembung wadiné.",
        "createacct-realname": "Jeneng asli (manasuka)",
        "createacct-reason": "Alesan",
        "createacct-reason-ph": "Alesané panjenengan nggawé akun liya",
+       "createacct-reason-help": "Layang kang kapacak ing log gawéan akun",
        "createacct-submit": "Gawé akun panjenengan",
        "createacct-another-submit": "Gawé akun",
        "createacct-continue-submit": "Banjuraké gawé akun",
        "nocookiesnew": "Akun panganggoné wis digawé, nanging panjenengan durung mlebu log.\n{{SITENAME}} nganggo kuki kanggo nglebokaké panganggo ing log.\nÉwadéné, kukiné panjenengan dipatèni.\nMangga urubaké iku, banjur mlebua log kanthi nganggo jeneng panganggo lan tembung wadiné panjenengan kang anyar.",
        "nocookieslogin": "{{SITENAME}} nggunakaké ''cookies'' kanggo log panganggoné. ''Cookies'' ing panjlajah wèb panjenengan dipatèni. Mangga ngaktifaké manèh lan coba manèh.",
        "nocookiesfornew": "Akun panganggoné wurung digawé amarga awak dhéwé ora bisa mesthèkaké sumberé.\nPesthèkaké panjenengan wis ngurubaké kuki, banjur ambalana ngamot kaca iki lan njajalana manèh.",
+       "nocookiesforlogin": "{{int:nocookieslogin}}",
        "createacct-loginerror": "Akuné wis kasil digawe nanging panjenengan ora bisa otomatis mlebu log. Mangga [[Special:UserLogin|mlebua log kanthi manual]].",
        "noname": "Panjenengan durung awèh jeneng panganggo kang trep.",
        "loginsuccesstitle": "Kasil mlebu log",
        "noemail": "Ora ana alamat layang-èl kang kacathet tumrap ing panganggo \"$1\".",
        "noemailcreate": "Panjenengan kudu maringi alamat e-mail kang trep",
        "passwordsent": "Tembung sandi anyar wis dikirim menyang alamat layang èlèktronik tumrap \"$1\". \nMangga mlebu log manèh sawisé panjenengan nampa iku.",
-       "blocked-mailpassword": "Alamat IP-né panjenengan diblokir saka mbesut. Kanggo ngéndhani tumindak salah-guna, ora diparengaké nganggo pamulihan tembung wadi saka alamat IP iki.",
+       "blocked-mailpassword": "Alamat IP-né panjenengan kablokir saka mbesut. Kanggo ngéndhani laku salah-guna, ora kena nganggo pamulih tembung wadi saka alamat IP iki.",
        "eauthentsent": "Layang-èl konfirmasi wis dikirim menyang alamat layang-èl kang diisèkaké. Sadurungé ana layang-èl liyané kang dikirim menyang akun iku, panjenengan kudu nuruti arahan ana ing layang-èl iku saperlu ngonfirmasi yèn akun iku pancèn duwèké panjenengan.",
        "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",
        "accountcreated": "Akun wis kagawé",
        "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 digawé awit kaluputan.",
+       "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.",
        "passwordreset-disabled": "Setèl ulang tembung wadi dipatèni ing wiki iki.",
        "passwordreset-emaildisabled": "Fitur layang elektronik wis dipateni ing wiki iki.",
        "passwordreset-username": "Jeneng panganggo:",
-       "passwordreset-domain": "Domain:",
+       "passwordreset-domain": "Dhomain:",
        "passwordreset-email": "Alamat layang-èl:",
        "passwordreset-emailtitle": "Rerincèné akun ing {{SITENAME}}",
        "passwordreset-emailtext-ip": "Ana wong (bokmanawa panjenengan, saka alamat IP $1) nyuwun tembung wadiné panjenengan disetèl ulang mungguh ing {{SITENAME}} ($4). {{PLURAL:$3|Akun}} ing ngisor iki ana gayutané karo layang-èl iki:\n\n$2\n\n{{PLURAL:$3|Tembung wadi sauntara iki}} bakal kadaluwarsa sawisé {{PLURAL:$5|sadina|$5 dina}}.\nPanjenengan kudu mlebu log lan milih tembung wadi anyar saiki. Yèn wong liya kang nyuwun iki, utawa yèn panjenengan pranyata wis kèlingan tembung wadiné panjenengan kang lawas banjur panjenengan ora nedya ngganti, panjenengan bisa nglirwakaké layang iki lan mbanjuraké nganggo tembung wadiné panjenengan kang lawas.",
        "resettokens-no-tokens": "Ora ana token kang bisa direset.",
        "resettokens-tokens": "Token:",
        "resettokens-token-label": "$1 (biji saiki: $2)",
-       "resettokens-watchlist-token": "Token kangge sindikasi web (Atom/RSS) saking [[Special:Watchlist|pangowahan ing daptar pangawasan sampeyan]]",
+       "resettokens-watchlist-token": "Token kangge sindikasi web (Atom/RSS) saking [[Special:Watchlist|pangowahan ing pawawangané panjenengan]]",
        "resettokens-done": "Reset token.",
        "resettokens-resetbutton": "Reset token kang dipilih",
        "bold_sample": "Tulisan kandel",
        "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.",
-       "confirmedittext": "Panjenengan kudu ndhedhes alamat e-mail dhisik sadurungé pareng nyunting sawijining kaca. Mangga nglebokaké lan validasi alamat e-mail panjenengan sadurungé nglakoni panyuntingan. Alamat e-mail sawisé bisa diowahi liwat [[Special:Preferences|kaca préférènsi]]",
+       "confirmedittext": "Panjenengan kudu ndhedhes alamat e-mail dhisik sadurungé pareng mbesut kaca. Mangga nglebokaké lan validasi alamat e-mail panjenengan sadurungé nggawé besutan. Alamat e-mail sawisé bisa diowahi liwat [[Special:Preferences|kaca préférènsi]]",
        "nosuchsectiontitle": "Pérangan ora katemu",
-       "nosuchsectiontext": "Panjenengan nyoba nyunting sawijining bagéan kang ora ana.\nBagéan iki manawa wis dipindhah utawa dibusak nalika panjenengan buka.",
+       "nosuchsectiontext": "Panjenengan njajal mbesut pérangan kang ora ana.\nPérangan iki bokmanawa wis ingalihaké utawa binusek nalika panjenengan bukak.",
        "loginreqtitle": "Kudu mlebu log",
        "loginreqlink": "mlebu log",
        "loginreqpagetext": "Panjenengan kudu $1 kanggo bisa mirsani kaca liyané.",
        "anontalkpagetext": "----\n<em>Iki kaca parembugané panganggo anonim kang durung gawé akun, utawa kang ora nganggo akuné.</em>\nMula, awak dhéwé kudu nganggo alamat IP-né awujud angka kanggo nglacak dhèwèké.\nAlamat IP mangkono bisa dianggo déning sawenèh panganggo.\nManawa panjenengan panganggo anonim lan rumasa yèn ana tanggepan kang ora ilok dieneraké marang panjenengan, mangga [[Special:CreateAccount|gawéa akun]] utawa [[Special:UserLogin|mlebua log]] kanggo ngéndhani salah pangira karo panganggo anonim liyané ing tembé buri.",
        "noarticletext": "Saiki kaca iki durung ana tulisané.\nPanjenengan bisa (1) [[Special:Search/{{PAGENAME}}|nggolèki sesirahing kaca iki]] ing kaca liyané, (2)\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} nggolèki log kang magepokan],\nutawa (3) [{{fullurl:{{FULLPAGENAME}}|action=edit}} nggawé kaca iki]</span>.",
        "noarticletext-nopermission": "Saiki lagi ora ana tèks ing kaca iki. \nPanjenengan bisa [[Special:Search/{{PAGENAME}}|nggolèk sesirah kaca iki]] ing kaca liyané, \nutawa <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{urlencode:{{FULLPAGENAME}}}}}} nggolèk ing log kang gegayutan]</span>, nanging panjenengan ora kawogan nggawé kaca iki.",
-       "missing-revision": "Révisi #$1 saka kaca ajeneng \"{{FULLPAGENAME}}\" ora ana.\n\nIki biyasané kasababaké awit nututi pranala sajarah kang wis lawas saka sawijiné kaca kang wis dibusak.\nRerincèné bisa digolèki ing [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log busak].",
+       "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:",
-       "clearyourcache": "<strong>Cathetan:</strong> Nalika rampung nyimpen, panjenengan kudu mbusak 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>.",
+       "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.",
        "usercsspreview": "'''Pèngeten yèn panjenengan namung mirsani pratilik CSS panjenengan.''''\n'''Pratilik iku durung kasimpen!'''",
-       "userjspreview": "'''Pèngeten yèn kang panjenengan pirsani namung pratilik JavaScript panjenengan, lan menawa pratilik iku dèrèng kasimpen!'''",
+       "userjspreview": "<strong>Élinga yèn panjenengan mung njajal/mratuduh JavaScript panganggo panjenengan. Kacané durung kasimpen!</strong>",
        "sitecsspreview": "<strong>Élinga yèn panjenengan mung mratuduh CSS iki.\nIki durung kasimpen!</strong>",
        "sitejspreview": "<strong>Élinga yèn panjenengan mung mratuduh kodhé JavaScript iki.\nIki durung kasimpen!</strong>",
        "userinvalidconfigtitle": "<strong>Pènget:</strong> Ora ana ules \"$1\".\nKaca .css lan .js padatan nganggo sesirah mawa huruf cilik, contoné {{ns:user}}:Foo/vector.css, dudu {{ns:user}}:Foo/Vector.css.",
        "continue-editing": "Menyang pambesutan",
        "previewconflict": "Pratuduh iki nuduhaké tèksé ing pérangan ndhuwur kothak besutan tèks lan nuduhaké wujudé kaya déné yèn wis disimpen.",
        "session_fail_preview": "Ngapunten! Kita ora bisa ngayahi besutané panjenengan amarga ilangé sèsi dhata.\n\nPanjenengan bokmanawa wis metu log. <strong>Mangga vèrifikasi manawa panjenengan isih mlebu log lan jajalen manèh</strong>.\nManawa isih durung kena, jajalen [[Special:UserLogout|metu log]] lan mlebu log manèh, banjur priksanen apa pangluruné panjenengan ngidinaké kuki saka situs iki.",
-       "session_fail_preview_html": "'''Nuwun sèwu! Kita ora bisa prosès suntingan panjenengan amerga data sési ilang.'''\n\n''Amerga wiki iki ngidinaké panrapan HTML mentah, pratayang didelikaké minangka penggakan marang serangan Javascript.''\n\n'''Yèn iki sawijining upaya suntingan kang trep, mangga dicoba manèh. Yèn isih tetep ora kasil, cobanen metu log utawa oncat lan mlebua manèh.'''",
+       "session_fail_preview_html": "'''Nuwun sèwu! Kita ora bisa prosès suntingan panjenengan amarga data sési ilang.'''\n\n''Amarga wiki iki ngidinaké panrapan HTML mentah, pratayang didelikaké minangka penggakan marang serangan Javascript.''\n\n'''Yèn iki upaya suntingan kang trep, mangga dicoba manèh. Yèn isih tetep ora kasil, cobanen metu log utawa oncat lan mlebua manèh.'''",
        "token_suffix_mismatch": "<strong>Besutané panjenengan ditulak amarga aplikasi klièné panjenengan ngowahi karakter tandha waca ing token besutané.</strong>\nBesutané wis ditulak kanggo nyegah rusaké tèks kaca.\nKang mangkono biyasané kadadéan nalika panjenengan nganggo paladenan proksi anonim kang lelandhesan jaringan.",
        "edit_form_incomplete": "<strong>Sawenèh pérangan formulir besut ora nyandhak paladèné; priksanen manèh yèn besutané panjenengan isih wutuh banjur jajalen manèh.</strong>",
        "editing": "Mbesut $1",
        "editingsection": "Mbesut $1 (pérangan)",
        "editingcomment": "Mbesut $1 (pérangan anyar)",
        "editconflict": "Cengkah besutan: $1",
-       "explainconflict": "Wong liya wis nyunting kaca iki wiwit panjenengan mau nyunting.\nBagian dhuwur tèks iki ngamot tèks kaca vèrsi saiki.\nPangowahan kang panjenengan lakoni dituduhaké ing bagian ngisor tèks.\nPanjenengan namung prelu nggabungaké pangowahan panjenengan karo tèks kang wis ana.\n'''Namung''' tèks ing bagian dhuwur kaca kang bakal kasimpen menawa panjenengan mencèt \"$1\".",
+       "explainconflict": "Wong liya wis mbesut kaca iki wiwit panjenengan lekas mbesut.\nBagian dhuwur tèks iki ngamot tèks kaca vèrsi saiki.\nPangowahan kang panjenengan lakoni dituduhaké ing bagian ngisor tèks.\nPanjenengan namung prelu nggabungaké pangowahan panjenengan karo tèks kang wis ana.\n'''Namung''' tèks ing bagian dhuwur kaca kang bakal kasimpen manawa panjenengan mencèt \"$1\".",
        "yourtext": "Tèksé panjenengan",
        "storedversion": "Owahan kasimpen",
-       "editingold": "'''PÈNGET:''' Panjenengan nyunting revisi lawas sawijining kaca. Yèn versi iki panjenengan simpen, mengko pangowahan-pangowahan kang wis digawé wiwit revisi iki bakal ilang.",
+       "editingold": "'''PÈNGET:''' Panjenengan mbesut revisi lawas saka siji kaca. Yèn versi iki panjenengan simpen, mengko pangowahan-pangowahan kang wis digawé wiwit revisi iki bakal ilang.",
        "yourdiff": "Béda",
-       "copyrightwarning": "Tulung dipun-gatèkaké menawa kabèh sumbangsih utawa kontribusi kanggo {{SITENAME}} iku dianggep wis diluncuraké miturut $2 GNU (mangga priksanen $1 kanggo ditèlé).\nMenawa panjenengan ora karsa menawa tulisan panjenengan bakal disunting karo disebar, aja didokok ing kéné.<br />\nPanjenengan uga janji menawa 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 dibusak déning 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!'''",
+       "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": "'''PÈNGET: Basis data lagi dikunci amerga ana pangopènan, dadi saiki panjenengan ora bisa nyimpen kasil panyuntingan panjenengan. Panjenengan mbokmenawa prelu mindhahaké kasil panyuntingan panjenengan iki menyang panggonan liya kanggo disimpen bésuk.'''\n\nPangurus kang ngunci basis data mènèhi katrangan kaya mengkéné: $1",
+       "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",
        "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:",
        "edittools-upload": "-",
        "nocreatetext": "{{SITENAME}} matesi bisané panjenengan nggawé kaca anyar.\nPanjenengan bisa bali lan mbesut kaca kang ana, utawa [[Special:UserLogin|mlebu log utawa nggawé akun]].",
        "nocreate-loggedin": "Panjenengan ora kagungan idin kanggo nggawé kaca anyar.",
-       "sectioneditnotsupported-title": "Panyuntingan bagéyan ora kasengkuyungan",
+       "sectioneditnotsupported-title": "Besut pérangan ora kasengkuyung",
        "sectioneditnotsupported-text": "Ora bisa mbesut sapérangan ana ing kaca iki.",
        "permissionserrors": "Masalah idin",
-       "permissionserrorstext": "Panjengan ora kagungan idin kanggo nglakoni kang panjenengan gayuh amerga {{PLURAL:$1|alesan|alesan-alesan}} iki:",
+       "permissionserrorstext": "Panjengan ora kagungan idin kanggo nglakoni kang panjenengan gayuh amarga {{PLURAL:$1|alesan|alesan-alesan}} iki:",
        "permissionserrorstext-withaction": "Panjenengan ora diidinaké $2 amarga {{PLURAL:$1|alasan|alasan}} ing ngisor iki:",
        "recreate-moveddeleted-warn": "<strong>Pélik: Panjenengan nggawé manèh kaca kang tau kabusak.</strong>\n\nPanjenengan kudu nglelimbang apa pantes nerusaké mbesut kaca iki.\nIng isor iki kapacak log pambusak lan pangalih saka kaca iki:",
-       "moveddeleted-notice": "Kaca iki wis dibusak.\nLog busak, reksa, lan alih bab kacané cumepak ing ngisor minangka rujukan.",
+       "moveddeleted-notice": "Kaca iki wis binusek.\nLog busak, reksa, lan alih bab kacané cumepak ing ngisor minangka rujukan.",
        "log-fulllog": "Deleng cathetan wutuh",
        "edit-hook-aborted": "Besutan diwurungaké déning cangkolan.\nOra ana katerangané.",
-       "edit-gone-missing": "Ora bisa nganyari kaca.\nKatoné kaca iki wis dibusak.",
+       "edit-gone-missing": "Ora bisa nganyari kaca.\nKatoné kaca iki wis binusek.",
        "edit-conflict": "Cengkah besutan",
        "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.",
-       "edit-already-exists": "Ora bisa nggawé kaca anyar.\nAmerga wis ana.",
+       "postedit-confirmation-published": "Besutané panjenengan 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",
        "invalid-content-data": "Data isi ora trap",
        "content-not-allowed-here": "Konten \"$1\" ora oleh ing kaca [[$2]]",
-       "editwarning-warning": "Yen sampeyan ninggalake kaca niki, pangowahan sampeyan bakal ilang.\nYen sampeyan wis mlebet log, sampeyan saged mateni peringatan niki lewat preferensi \"Panyuntingan\" sampeyan.",
+       "editwarning-warning": "Ninggalake kaca iki bisa njalari ilangé owah-owahané panjenengan.\nManawa panjenengan ing jero log, panjenengan bisa matèni pepéling iki ing pérangan \"{{int:prefs-editing}}\" ing pilalané panjenengan.",
+       "editpage-invalidcontentmodel-title": "Modhèl kontèn ora sinengkuyung",
+       "editpage-invalidcontentmodel-text": "Modhèl kontèn \"$1\" ora sinengkuyung.",
+       "editpage-notsupportedcontentformat-title": "Formal kontèn ora sinengkuyung",
+       "editpage-notsupportedcontentformat-text": "Format kontèn $1 ora disengkuyung modhèl kontèn $2.",
        "content-model-wikitext": "tulisan wiki",
        "content-model-text": "tulisan barès",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
        "content-model-json": "JSON",
+       "content-json-empty-object": "Obyèk kosong",
        "expensive-parserfunction-warning": "Pènget: Kaca iki ngandhut kakèhan panggunan fungsi ''parser'' kang larang.\n\nSajatiné kuduné duwé kurang saka {{PLURAL:$2|panggilan|panggilan}}, saiki ana {{PLURAL:$1|$1 panggilan|$1 panggilan}}.",
        "expensive-parserfunction-category": "Kaca-kaca mawa panggunan fungsi ''parser'' kang kakèhan",
        "post-expand-template-inclusion-warning": "Pènget: Cithakan klebu ukurané kegedhèn.\nSawetara cithakan bakal dilirwakaké.",
        "converter-manual-rule-error": "Masalah kapranggul ing aturan konvèrsi basa manual",
        "undo-success": "Besutan iki kena diwurungaké.\nTiliki bandhingan ngisor iki saperlu mesthèkaké yèn bener iki kang arep kolakoni, banjur simpen owahan ngisor iki kanggo ngiyai yèn besutané diwurungaké.",
        "undo-failure": "Besutan iki ora bisa dipulihaké amarga bisa cengkah besutan antara.",
-       "undo-norev": "Besutan iki ora bisa diwurungaké amarga wis ora ana utawa wis dibusak.",
+       "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''",
        "page_last": "pungkasan",
        "histlegend": "Kanggo mbandhingaké: Tandhani kothak radhioning révisi-révisi kang arep dibandhingaké lan pencèt ''Enter'' utawa tombol ing ngisor.<br />\nLegéndhah: <strong>({{int:cur}})</strong> = bédané karo révisi pungkasan, <strong>({{int:last}})</strong> = bédané karo révisi sadurungé, <strong>{{int:minoreditletter}}</strong> = besutan cilik.",
        "history-fieldset-title": "Golèk owahan",
-       "history-show-deleted": "Mligi owahan kang dibusak",
+       "history-show-deleted": "Mligi owahan kang binusek",
        "histfirst": "lawas dhéwé",
        "histlast": "anyar dhéwé",
        "historysize": "($1 {{PLURAL:$1|bét|bét}})",
        "history-feed-title": "Sajarah owahan",
        "history-feed-description": "Sajarah owahaning kaca iki ing wiki",
        "history-feed-item-nocomment": "$1 ing $2",
-       "history-feed-empty": "Kaca kang disuwun ora ditemokaké. Mbokmenawa wis dibusak saka wiki, utawa diwènèhi jeneng anyar. Coba [[Special:Search|golèka ing wiki]] kanggo kaca anyar kang rélevan.",
-       "rev-deleted-comment": "(tingkesaning besutan dibusak)",
-       "rev-deleted-user": "(jeneng panganggo dibusak)",
-       "rev-deleted-event": "(rerincèn log dibusak)",
-       "rev-deleted-user-contribs": "[jeneng panganggo utawa alama IP dibusak - besutan didhelikaké saka pratélaning pasumbang]",
-       "rev-deleted-text-permission": "Révisi kaca iki wis '''dibusak'''.\nPrincèné mbokmanawa kasedyakaké ing  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambusakan].",
-       "rev-deleted-text-unhide": "Révisi kaca iki wis <strong>dibusak</strong>.\nRerincèné bisa digolèki ing [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log busak].\nPanjenengan isih bisa [$1 ndeleng révisi iki] yèn panjenengan arep.",
+       "history-feed-empty": "Kaca kang panjenengan karsakaké ora ana.\nBokmanawa kacané wis binusek saka wiki, utawa ingalih jeneng anyar.\nJajal [[Special:Search|golèka ing wiki]] bab kaca anyar kang magepokan.",
+       "history-edit-tags": "Besut tenger saka révisi kang pinilih",
+       "rev-deleted-comment": "(ringkesané besutan binusek)",
+       "rev-deleted-user": "(jeneng panganggo binusek)",
+       "rev-deleted-event": "(rerincèn log binusek)",
+       "rev-deleted-user-contribs": "[jeneng panganggo utawa alama IP binusek - besutan dhinelikaké saka pratélan pasumbang]",
+       "rev-deleted-text-permission": "Révisi kaca iki wis <strong>binusek</strong>.\nRerincèné bisa tinemu ing [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log busekan].",
+       "rev-deleted-text-unhide": "Révisi kaca iki wis <strong>binusek</strong>.\nRerincèné bisa digolèki ing [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log busak].\nPanjenengan isih bisa [$1 ndeleng révisi iki] yèn panjenengan arep.",
        "rev-suppressed-text-unhide": "Révisi kaca iki wis <strong>dibrèdhèl</strong>.\nRerincèné bisa digolèki ing [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} log brèdhèl].\nPanjenengan isih bisa [$1 ndeleng révisi iki] yèn panjenengan arep.",
-       "rev-deleted-text-view": "Benahan kaca iki wis '''dibusak'''.\nPanjenengan bisa ndelok iki; rinciané bisa ditemokaké ing [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambusakan].",
-       "rev-suppressed-text-view": "Benahan kaca iki wis '''dibrèdèl'''.\nPanjenengan bisa ndelok iki; rinciané bisa ditemokaké ing [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambrèdèlan].",
-       "rev-deleted-no-diff": "Panjenengan ora bisa mirsani prabédan amarga siji saka révisiné wis '''dibusak'''.\nPricèné mbokmanawa isih ana ing [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambusakan].",
-       "rev-suppressed-no-diff": "Panjenengan ora bisa ndelok prabédan iki amarga sawiji benahan wis '''dibusak'''.",
-       "rev-deleted-unhide-diff": "Sawiji benahan saka prabédan iki wis '''dibusak'''.\nRincian bisa ditemokaké ing [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambusakan].\nPanjenengan uga isih bisa [$1 ndelok prabédan iki] yèn panjenengan gelem.",
-       "rev-suppressed-unhide-diff": "Sawiji benahan saka prabédan iki wis '''dibrèdèl'''.\nRincian bisa ditemokaké ing [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambrèdèlan].\nPanjenengan uga isih bisa [$1 ndelok prabédan iki] yèn panjenengan gelem.",
-       "rev-deleted-diff-view": "Sawiji benahan saka prabédan iki wis '''dibusak'''.\nPanjenengan isih bisa ndelok prabédan iki; rincian bisa ditemokaké ing [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambusakan].",
-       "rev-suppressed-diff-view": "Sawiji benahan saka prabédan iki wis '''dibrèdèl'''.\nPanjenengan isih bisa ndelok prabédan iki; rincian bisa ditemokaké ing [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambrèdèlan].",
+       "rev-deleted-text-view": "Révisi kaca iki wis <strong>binusek</strong>.\nPanjenengan bisa ndeleng iku; rerincèné bisa tinemu ing [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log busekan].",
+       "rev-suppressed-text-view": "Révisi kaca iki wis <strong>jinabut</strong>.\nPanjenengan bisa ndeleng iku; rerincèné bisa tinemu ing [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} log jabutan].",
+       "rev-deleted-no-diff": "Panjenengan ora bisa mirsani prabédan amarga siji saka révisiné wis '''binusek'''.\nPricèné mbokmanawa isih ana ing [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambusakan].",
+       "rev-suppressed-no-diff": "Panjenengan ora bisa ndeleng prabédan iki amarga salah siji révisiné wis '''binusek'''.",
+       "rev-deleted-unhide-diff": "Salah siji révisi saka prabédan iki wis '''dibusak'''.\nRincian bisa tinemu ing [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambusakan].\nPanjenengan uga isih bisa [$1 ndeleng prabédan iki] yèn panjenengan gelem.",
+       "rev-suppressed-unhide-diff": "Salah siji révisi saka prabédan iki wis '''dibrèdèl'''.\nRincian bisa tinemu ing [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambrèdèlan].\nPanjenengan uga isih bisa [$1 ndeleng prabédan iki] yèn panjenengan gelem.",
+       "rev-deleted-diff-view": "Salah siji révisi saka prabédan iki wis '''dibusak'''.\nPanjenengan isih bisa ndeleng prabédan iki; rincian bisa tinemu ing [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambusakan].",
+       "rev-suppressed-diff-view": "Salah siji révisi saka prabédan iki wis '''dibrèdèl'''.\nPanjenengan isih bisa ndeleng prabédan iki; rincian bisa tinemu ing [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambrèdèlan].",
        "rev-delundel": "owah pakatonan",
        "rev-showdeleted": "tuduhaké",
        "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 mirsani révisi kang wis kabusak saka berkas \"<nowiki>$1</nowiki>\" ing $2, jam $3?",
+       "revdelete-show-file-confirm": "Apa panjenengan yakin arep mriksa révisi kang kabusek saka barkas \"<nowiki>$1</nowiki>\" nalika $2 jam $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.",
        "pagehist": "Babading kaca",
        "deletedhist": "Sajarah kabusak",
        "revdelete-hide-current": "Gagal ndhelikaké révisi tanggal $2, $1: iki arupa révisi paling anyar.\nRévisi iki ora bisa didhelikaké.",
-       "revdelete-show-no-access": "Gagal nampilaké révisi tanggal $1, jam $2: révisi iki wis ditandhani \"kawates\".\nPanjenengan ora nduwèni aksès menyang révisi iki.",
+       "revdelete-show-no-access": "Ana masalah nalika nuduhaké wiji mawa titimangsa $1, $2: Wiji iki wis tinandhani \"winates\".\nPanjenengan ora kawogan ngaksès iku.",
        "revdelete-modify-no-access": "Gagal ngowahi révisi tanggal $1, jam $2: révisi iki wis ditandhani \"kawates\".\nPanjenengan ora nduwèni aksès menyang révisi iki.",
-       "revdelete-modify-missing": "Gagal ngowahi révisi ID $1: révisi iki ilang saka basis data!",
+       "revdelete-modify-missing": "Ana masalah nalika ndandani wiji ID $1: Barangé ora ana ing basis dhatah!",
        "revdelete-no-change": "'''Pènget:''' révisi tanggal $1, jam $2 wis nduwèni aturan pandhelikan kasebut.",
        "revdelete-concurrent-change": "Gagal ngowahi révisi tanggal $1, jam $2: statusé mbokmanawa wis diowahi déning panganggo liya bebarengan karo panjenengan.\nMangga priksa cathetan log.",
-       "revdelete-only-restricted": "Ora bisa ndhelikaké siji barang mawa tanggal $1 wanci $2: Panjenengan ora bisa ndhelikaké barang kuwi saka pangurus tanpa milih salah sawiji pilihan kanggo ndhelikaké kang liyané.",
+       "revdelete-only-restricted": "Ora bisa ndhelikaké siji barang mawa tanggal $1 wanci $2: Panjenengan ora bisa ndhelikaké barang iku saka pangurus tanpa milih salah siji pilihan kanggo ndhelikaké kang liyané.",
        "revdelete-reason-dropdown": "*Alasan penghapusan yang umum\n** Pelanggaran hak cipta\n** Komentar atau informasi pribadi yang tidak pantas\n** Nama pengguna yang tidak pantas\n** Berpotensi mencemarkan nama baik",
        "revdelete-otherreason": "Alesan liya/tambahan:",
        "revdelete-reasonotherlist": "Alesan liya",
        "revdelete-edit-reasonlist": "Besut alesané pambusak",
        "revdelete-offender": "Juru pangriptaning owahan:",
        "suppressionlog": "Log barang-barang kang didelikaké (''oversight'')",
-       "suppressionlogtext": "Ngisor iki daptar apa-apa waé kang wis dibusak lan diblokir kalebu kontèn kang didhelikaké saka para pangurus.\nDelok [[Special:BlockList|daptar blokiran]] kang isiné daptar apa-apa waé kang lagi dilarang lan diblokir.",
+       "suppressionlogtext": "Ngisor iki pratélan samubarang kang wis dibusak lan diblokir kalebu kontèn kang didhelikaké saka para pangurus.\nDeleng [[Special:BlockList|pratélan blokiran]] kang isiné pratélan samubarang kang lagi dilarang lan diblokir.",
        "mergehistory": "Gabung sajarah kaca",
-       "mergehistory-header": "Ing kaca iki panjenengan bisa nggabung révisi-révisi sajarah saka sawijining kaca sumber menyang kaca anyar.\nPastèkna yèn owah-owahan iki bakal netepaké kasinambungan sajarah kaca.",
+       "mergehistory-header": "Ing kaca iki panjenengan bisa nggabung révisi-révisi sajarah saka kaca sumber menyang kaca anyar.\nPastèkna yèn owah-owahan iki bakal netepaké kasinambungan sajarah kaca.",
        "mergehistory-box": "Gabungna revisi-revisi saka rong kaca:",
        "mergehistory-from": "Kaca sumber:",
        "mergehistory-into": "Kaca paran:",
        "mergehistory-list": "Sajarah besutan kang bisa digabung",
-       "mergehistory-merge": "Révisi-révisi kang kapacak ing ngisor iki saka [[:$1]] bisa digabungaké menyang [[:$2]].\nGunakna tombol radio kanggo nggabungaké révisi-révisi kang digawé sadurungé wektu tartamtu. Gatèkna, menawa nganggo pranala navigasi bakal ngesèt ulang kolom iki.",
+       "mergehistory-merge": "Révisi-révisi kang kapacak ing ngisor iki saka [[:$1]] bisa digabungaké menyang [[:$2]].\nGunakna tombol radio kanggo nggabungaké révisi-révisi kang digawé sadurungé wektu tartamtu. Gatèkna, manawa nganggo pranala navigasi bakal ngesèt ulang kolom iki.",
        "mergehistory-go": "Tuduhaké besutan kang bisa digabung",
        "mergehistory-submit": "Gabung owahan",
        "mergehistory-empty": "Ora ana revisi kang bisa digabung.",
        "mergehistory-comment": "Nggabung [[:$1]] menyang [[:$2]]: $3",
        "mergehistory-same-destination": "Kaca sumber lan tujuan ora kena padha",
        "mergehistory-reason": "Alesan:",
+       "mergehistory-revisionrow": "$1 ($2) $3 . . $4 $5 $6",
        "mergelog": "Gabung log",
        "revertmerge": "Wurung gabung",
-       "mergelogpagetext": "Ing ngisor iki kapacak daftar panggabungan sajarah kaca ing kaca liyané.",
+       "mergelogpagetext": "Ing ngisor iki kapacak pratélan panggabungan sajarah kaca ing kaca liyané.",
        "history-title": "Sajarah owahaning \"$1\"",
        "difference-title": "Béda antarané révisi \"$1\"",
        "difference-title-multipage": "Béda antarané kaca \"$1\" lan \"$2\"",
        "diff-multi-sameuser": "({{PLURAL:$1|Sarévisi antara|$1 révisi antara}} déning panganggo kang padha kang ora katuduhaké)",
        "diff-multi-otherusers": "({{PLURAL:$1|Siji révisi langsung|$1 révisi langsung}} déning {{PLURAL:$2|siji panganggo liyané|$2 panganggo}} ora dituduhaké)",
        "diff-multi-manyusers": "({{PLURAL:$1|Siji révisi langsung|$1 révisi langsung}} déning {{PLURAL:$2|panganggo|panganggo}} $2 ora katuduhaké)",
-       "difference-missing-revision": "{{PLURAL:$2|Sak pambenahan|$2 pambenahan}} saka prabédan iki ($1) {{PLURAL:$2|ora ditemokaké|ora ditemokaké}}.\n\nIki biasané kasebab pranala prabedan kang wis ora kanggo saka kaca isi wis dibusak.\nRinciané bisa ditemokaké ing [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log busak].",
+       "diff-paragraph-moved-tonew": "Paragraf wis ingalih. Klik saperlu lumpat menyang pernah anyar.",
+       "diff-paragraph-moved-toold": "Paragraf wis ingalih. Klik saperlu lumpat menyang pernah lawas.",
+       "difference-missing-revision": "{{PLURAL:$2|Sak pambenahan|$2 pambenahan}} saka prabédan iki ($1) {{PLURAL:$2|ora tinemu|ora tinemu}}.\n\nIki biasané kasebab pranala prabedan kang wis ora kanggo saka kaca isi wis dibusak.\nRinciané bisa tinemu ing [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log busak].",
        "searchresults": "Kasiling golèk",
+       "search-filter-title-prefix": "Mung golèk kaca kang sesirahé kawiwitan \"$1\"",
        "search-filter-title-prefix-reset": "Golèk kabèh kaca",
-       "searchresults-title": "Kasiling golèk \"$1\"",
+       "searchresults-title": "Kasil panggolèké \"$1\"",
        "titlematches": "Sesirah kaca cocog",
-       "textmatches": "Tèks artikel kang cocog",
+       "textmatches": "Tulisan kaca cocog",
        "notextmatches": "Ora ana tèks kaca kang cocog",
        "prevn": "{{PLURAL:$1|$1}} sadurungé",
        "nextn": "{{PLURAL:$1|$1}} sabanjuré",
        "searchprofile-everything-tooltip": "Golèk kabèh kontèn (kalebu ing kaca parembugan)",
        "searchprofile-advanced-tooltip": "Golèk ing mandala 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 subkatégori|$2 subkatégori}}, {{PLURAL:$3|1 berkas|$3 berkas}})",
+       "search-result-category-size": "{{PLURAL:$1|1 anggota|$1 anggota}} ({{PLURAL:$2|1 subkategori|$2 subkategori}}, {{PLURAL:$3|1 barkas|$3 barkas}})",
        "search-redirect": "(alihan saka $1)",
        "search-section": "(pérangan $1)",
        "search-category": "(kategori $1)",
        "prefs-editwatchlist-edit": "Deleng lan busek sesirah ing pawawangané panjenengan",
        "prefs-editwatchlist-raw": "Besut pawawangan lakaran",
        "prefs-editwatchlist-clear": "Resiki pawawangané panjenengan",
-       "prefs-watchlist-days": "Cacahé dina kang dituduhaké ing dhaftar pangawasan:",
+       "prefs-watchlist-days": "Cacah dina kanggo tinuduhaké ing pawawangan:",
        "prefs-watchlist-days-max": "Maksimum $1 {{PLURAL:$1|dina|dina}}",
        "prefs-watchlist-edits": "Cacah maksimum owahan kang kapacak ing pawawangan:",
        "prefs-watchlist-edits-max": "Gunggung maksimum: 1000",
        "prefs-watchlist-token": "Tokening pawawangan:",
+       "prefs-watchlist-managetokens": "Opèni token",
        "prefs-misc": "Liya-liya",
        "prefs-resetpass": "Ganti tembung wadi",
        "prefs-changeemail": "Owah utawa busak alamat layang-èl",
        "recentchangesdays-max": "(maksimum $1 {{PLURAL:$1|dina|dina}})",
        "recentchangescount": "Cacahing besutan kang dituduhaké kanthi baku:",
        "prefs-help-recentchangescount": "Iki klebu owah-owahan pungkasan, kaca sajarah, lan log.",
-       "prefs-help-watchlist-token2": "Ini adalah kunci rahasia (token) ke web feed dari daftar pantauan Anda.\nSiapa saja yang tahu akan dapat melihat daftar pantauan Anda, jadi jangan dibagikan.\n[[Special:ResetTokens|Klik di sini jika Anda perlu menyetel ulang]].",
+       "prefs-help-watchlist-token2": "Iki minangka kunci wadi menyang ''feed'' wèb ing pawawangané panjenengan.\nSapa baé kang ngerti iku bakal bisa maca pawawangané panjenengan, mula aja panjenengan dum-dum.\nPanjenengan bisa [[Special:ResetTokens|ngambali nyetèl]] yèn kudu.",
        "savedprefs": "Prèferènsi Panjenengan wis disimpen",
        "savedrights": "Golongan panganggo {{GENDER:$1|$1}} wis disimpen.",
        "timezonelegend": "Zona wektu:",
        "yourrealname": "Jeneng asli:",
        "yourlanguage": "Basa kang dianggo:",
        "yourvariant": "Werna basa isi:",
-       "prefs-help-variant": "Varian utawa ortografi kang panjenengan pilih kanggo nampilaké kaca kontèn saka wiki iki.",
+       "prefs-help-variant": "Varian utawa ortografi kang panjenengan pilih supaya kapajang ing kaca kontèn wiki iki.",
        "yournick": "Tapak asma anyar:",
        "prefs-help-signature": "Tanggepan ing kaca parembugan kudu ditapakasmani mawa \"<nowiki>~~~~</nowiki>\", kang bakal salin dadi tapak asma lan tandha wektuné panjenengan.",
        "badsig": "Tapak astanipun klèntu; cèk rambu HTML.",
        "prefs-displaywatchlist": "Opsi pitontonan",
        "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Prabédan",
-       "prefs-help-prefershttps": "Pamiji iki bakal lumaku mentas sampeyan mbalèni mlebu.",
-       "prefs-tabs-navigation-hint": "Saran: Sampeyan bisa nganggo tombol jemparing kiwa lan tengen saperlu navigasi tab-tab ing pratélan tab.",
+       "prefs-help-prefershttps": "Pilalan iki bakal lumaku nalika panjenengan mlebu log manèh mengko.",
+       "prefs-tabs-navigation-hint": "Saran: Panjenengan bisa nganggo tombol jemparing kiwa lan tengen saperlu navigasi tab-tab ing pratélan tab.",
        "userrights": "Hak panganggo",
        "userrights-lookup-user": "Pilih panganggo",
        "userrights-user-editname": "Isi jeneng panganggo:",
        "userrights-groups-help": "Panjenengan bisa ngowahi grup-grup kang ana panganggoné iki.\n* Kothak kang dicenthang tegesé panganggo iki ana sajroné grup iku.\n* Kothak kang ora dicenthang tegesé panganggo iku ora ana ing grup iku.\n* Tandha bintang * tegesé panjenengan ora bisa ngilangi grup iku yèn wis tau nambah, utawa sawalikané.",
        "userrights-reason": "Alesan:",
        "userrights-no-interwiki": "Panjenengan ora ana hak kanggo ngowahi hak panganggo ing wiki liyané.",
-       "userrights-nodatabase": "Basis data $1 ora ana utawa ora lokal.",
+       "userrights-nodatabase": "Basis dhatah $1 ora ana utawa ora enggonan.",
        "userrights-changeable-col": "Grup kang bisa panjenengan owahi",
        "userrights-unchangeable-col": "Grup kang ora bisa diowahi panjenengan",
        "userrights-irreversible-marker": "$1*",
        "userrights-expiry-options": "1 dina:1 dina,1 minggu:1 minggu,1 wulan:1 wulan,3 wulan:3 wulan,6 wulan:6 wulan,1 taun:1 taun",
        "userrights-invalid-expiry": "Wektu kadaluwarsa golongan \"$1\" ora trep.",
        "userrights-expiry-in-past": "Wektu kadaluwarsa golongan \"$1\" ana ing kala kawuri.",
-       "userrights-conflict": "Konflik pangowahan hak-hak panganggo! Tulung ditinjau maneh lan konfirmasi Pangowahan sampeyan.",
+       "userrights-conflict": "Konflik pangowahan hak-hak panganggo! Tulung ditinjau maneh lan konfirmasi owah-owahané panjenengan.",
        "group": "Golongan:",
        "group-user": "Para panganggo",
        "group-autoconfirmed": "Panganggo kang otomatis kakonfirmasi",
        "right-move-rootuserpages": "Ngalih kaca panganggo oyod",
        "right-move-categorypages": "Lih kaca kategori",
        "right-movefile": "Lih barkas",
-       "right-suppressredirect": "Aja nggawé pangalihan saka kaca kang lawas yèn mindhah sawijining kaca",
+       "right-suppressredirect": "Aja nggawé pangalihan saka kaca kang lawas yèn mindhah kaca",
        "right-upload": "Unggah barkas",
-       "right-reupload": "Tindhihana sawijining barkas kang wis ana",
-       "right-reupload-own": "Nimpa sawijining berkas kang wis ana lan diunggahaké déning panganggo kang padha",
-       "right-reupload-shared": "Timpanana berkas-berkas ing khazanah binagi sacara lokal",
-       "right-upload_by_url": "Ngunggahaké berkas saka sawijining alamat URL",
-       "right-purge": "Kosongna ''cache'' situs iki kanggo sawijining kaca tanpa kaca konfirmasi",
+       "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-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-nominornewtalk": "Suntingan sithik (''minor'') ora ngwetokaké prompt pesen anyar",
        "right-apihighlimits": "Nganggo wates kang luwih dhuwur ing kwéri API",
        "right-writeapi": "Nganggo API tulis",
        "right-delete": "Busak kaca",
-       "right-bigdelete": "Busak kaca-kaca mawa sajarah panyuntingan kang gedhé",
+       "right-bigdelete": "Busak kaca mawa sajarah besutan kang gedhé",
        "right-deletelogentry": "Busak lan wurung busak èntri log tartamtu",
        "right-deleterevision": "Busak lan wurung busak owahan tinamtuné kaca",
        "right-deletedhistory": "Ndeleng sajarah èntri-èntri kabusak, tanpa bisa ndeleng apa kang dibusak",
        "right-suppressrevision": "Deleng, dhelikaké, lan wurung dhelikaké owahan tinamtu kaca-kacané panganggo sembarang",
        "right-viewsuppressed": "Deleng owahan kang didhelikaké saka panganggo sembarang",
        "right-suppressionlog": "Deleng log priangga",
-       "right-block": "Blokir panganggo-panganggo liya saka panyuntingan",
-       "right-blockemail": "Blokir sawijining panganggo saka ngirim e-mail",
+       "right-block": "Blokir panganggo liya saka mbesut",
+       "right-blockemail": "Blokir panganggo saka ngirim e-mail",
        "right-hideuser": "Blokir jeneng panganggo, lan delikna saka umum",
        "right-ipblock-exempt": "Bypass pamblokiran IP, pamblokiran otomatis lan pamblokiran rangkéan",
        "right-unblockself": "Bukak blokirané dhéwéké",
        "right-editinterface": "Besut antarmuka panganggo",
        "right-editusercss": "Besut barkas-barkas CSS panganggo liya",
        "right-edituserjs": "Besut barkas-barkas JavaScript panganggo liya",
-       "right-editmyusercss": "Owahi berkas CSS panganggo sampeyan",
-       "right-editmyuserjs": "Owahi berkas JavaScript panganggo sampeyan",
+       "right-editmyusercss": "Owahi barkas CSS panganggo panjenengan",
+       "right-editmyuserjs": "Owahi barkas JavaScript panganggo panjenengan",
        "right-viewmywatchlist": "Deleng pawawangané panjenengan",
-       "right-editmywatchlist": "Owahi daftar pangawasan sampeyan. Cathetan: ana cara liyane kanggo nambahi kaca menyang daftar, sanadyan ora duwe hak iki.",
+       "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-editmyprivateinfo": "Besut dhata prianggané panjenengan dhéwé (kaya ta alamat layang-èl, jeneng asli)",
-       "right-editmyoptions": "Owahi preferensi sampeyan",
+       "right-editmyoptions": "Owahi pilalané panjenengan",
        "right-rollback": "Balèkaké kanthi gelis besutaning panganggo pungkasan kang mbesut kaca tinamtu",
        "right-markbotedits": "Tandhani besutan kang kawurungan yèn besutan bot",
        "right-noratelimit": "Ora dipengaruhi déning wates cacahing suntingan.",
        "right-mergehistory": "Gabung sajarah kaca",
        "right-userrights": "Besut kabèh hak panganggo",
        "right-userrights-interwiki": "Besut hak-haking panganggo asal wiki jaba",
-       "right-siteadmin": "Kunci lan buka kunci basis data",
+       "right-siteadmin": "Gembok lan bukak gembok basis dhatah",
        "right-override-export-depth": "Èkspor kaca klebu kaca kagandhèng nganti tataran/''depth'' 5",
        "right-sendemail": "Ngirim layang listrik (e-mail) menyang panganggo liya",
        "grant-group-page-interaction": "Srawungan karo kaca",
        "grant-group-email": "Kirim layang-èl",
        "grant-group-high-volume": "Ngayahi kagiyatan kang akih",
        "grant-group-customization": "Panglarasan lan pilalan",
-       "grant-group-administration": "Ngayahi tumindak administratif",
+       "grant-group-administration": "Ngayahi laku administratif",
        "grant-group-private-information": "Ngaksès dhata pribadhi ngenani panjenengan",
        "grant-group-other": "Kagiyatan rena-rena",
        "grant-blockusers": "Blokir lan uculaké blokirané panganggo",
        "action-createtalk": "gawé kaca parembugan iki",
        "action-createaccount": "gawé akun panganggo iki",
        "action-autocreateaccount": "otomatis nggawé akun panganggo njaba iki",
-       "action-history": "deleng sujarahé kaca iki",
+       "action-history": "deleng sajarahé kaca iki",
        "action-minoredit": "tandhani besutan iki yèn besutan cilik",
        "action-move": "alih kaca iki",
        "action-move-subpages": "lih kaca iki, lan anak-kacané",
        "action-move-categorypages": "alih kaca kategori",
        "action-movefile": "alih barkas iki",
        "action-upload": "ngunggah barkas iki",
-       "action-reupload": "nindhih berkas kang wis ana",
-       "action-reupload-shared": "nindhih berkas kang wis ana ing papan panyimpanan berkas kang dianggo bebarengan",
-       "action-upload_by_url": "unggahna berkas iki saka sawijining alamat URL",
+       "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-writeapi": "migunakaké API panulisan",
        "action-delete": "busak kaca iki",
        "action-deleterevision": "busak révisi",
        "action-deletelogentry": "busak isian log",
-       "action-deletedhistory": "deleng sajarah kang dibusak sawijiné kaca",
+       "action-deletedhistory": "deleng sajarah kaca kang dibusak",
        "action-deletedtext": "deleng tèks révisi kang dibusak",
        "action-browsearchive": "golèk kaca kang wis kabusek",
        "action-undelete": "wurung busak kaca",
        "action-suppressionlog": "deleng log priangga iki",
        "action-block": "malang panganggo iki mbesut",
        "action-protect": "owahi tataran rereksané kaca iki",
-       "action-rollback": "gelis mbalèkaké suntingané panganggo pungkasan ing sawijining saca",
+       "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 berkas",
+       "action-importupload": "impor kaca iki saka pamunggahan barkas",
        "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",
        "action-mergehistory": "nggabungaké sajarah kaca iki",
        "action-userrights": "besut kabèh hak panganggo",
        "action-userrights-interwiki": "besut hak aksès panganggo ing wiki liyané",
-       "action-siteadmin": "ngunci utawa mbukak kunci basis data",
+       "action-siteadmin": "nggembok utawa mbukak gembok basis dhatah",
        "action-sendemail": "kirim layang-èl",
        "action-editmyoptions": "besut pilalané panjenengan",
-       "action-editmywatchlist": "owahi daftar pantauan sampeyan",
-       "action-viewmywatchlist": "dheleng daftar pantauan sampeyan",
+       "action-editmywatchlist": "owahi pawawangané panjenengan",
+       "action-viewmywatchlist": "deleng pawawangané panjenengan",
        "action-viewmyprivateinfo": "deleng katerangan prianggané panjenengan",
        "action-editmyprivateinfo": "besut katerangan prianggané panjenengan",
-       "action-editcontentmodel": "besut modhèl kontèné sawijiné kaca",
+       "action-editcontentmodel": "besut modhèl kontèné kaca",
        "action-managechangetags": "gawé lan patèni tag",
        "action-applychangetags": "pasang tenger kang mbarengi owahané panjenengan",
        "action-changetags": "tambah lan busak tag arbitrèr ing saben révisi lan isian log",
        "rcfilters-limit-title": "Kasil kang arep dituduhaké",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|owahan|owahan}}, $2",
        "rcfilters-date-popup-title": "Dawané wektu kang arep panjenengan golèki",
-       "rcfilters-days-title": "Dina-dina kang mentas waé",
-       "rcfilters-hours-title": "Jam-jam kang mentas waé",
+       "rcfilters-days-title": "Dina-dina iki",
+       "rcfilters-hours-title": "Jam-jam iki",
        "rcfilters-days-show-days": "$1 {{PLURAL:$1|dina|dina}}",
        "rcfilters-days-show-hours": "$1 {{PLURAL:$1|jam|jam}}",
        "rcfilters-highlighted-filters-list": "Kasuwur: $1",
        "rcfilters-filter-newpages-description": "Besutan kang nggawé kaca anyar.",
        "rcfilters-filter-categorization-label": "Owah-owahan kategori",
        "rcfilters-filter-categorization-description": "Cathethan ngenani mlebu-metuné kaca saka kategori.",
-       "rcfilters-filter-logactions-label": "Tumindak njeron log",
-       "rcfilters-filter-logactions-description": "Tumindak administratif, gawéan akun, busakan kaca, unggahan....",
+       "rcfilters-filter-logactions-label": "Laku ing jero log",
+       "rcfilters-filter-logactions-description": "Laku administratif, panggawé akun, pambusak kaca, unggahan...",
        "rcfilters-filtergroup-lastRevision": "Révisi pungkasan",
        "rcfilters-filter-lastrevision-label": "Révisi pungkasan",
        "rcfilters-filter-lastrevision-description": "Mung owahan paling anyar marang kacané.",
        "recentchangeslinked-feed": "Owah-owahan kang magepokan",
        "recentchangeslinked-toolbox": "Owahan magepokan",
        "recentchangeslinked-title": "Owah-owahan kang magepokan \"$1\"",
-       "recentchangeslinked-summary": "Iki pratélaning owah-owahan kang mentas digawé tumrap ing kaca-kaca kang nggayut sawijining kaca (utawa kaca-kaca anggotaning sawijining kategori).\nKaca ing [[Special:Watchlist|pawawangané panjenegan]] <strong>dikandeli</strong>.",
+       "recentchangeslinked-summary": "Iki pratélan owah-owahan kang mentas digawé tumrap ing kaca-kaca kang nggayut kaca (utawa kaca-kaca anggotané siji kategori).\nKaca ing [[Special:Watchlist|pawawangané panjenegan]] <strong>dikandeli</strong>.",
        "recentchangeslinked-page": "Jeneng kaca:",
        "recentchangeslinked-to": "Tuduhaké owahané kaca kang nggayut kaca iki",
        "recentchanges-page-added-to-category": "[[:$1]] ditambahaké ing kategori",
        "upload": "Unggah barkas",
        "uploadbtn": "Unggah barkas",
        "reuploaddesc": "Wurung ngunggah lan bali menyang formulir unggahan",
-       "upload-tryagain": "Kirim déskripsi berkas kang wis diowah",
+       "upload-tryagain": "Kirim déskripsi barkas kang wis diowah",
        "uploadnologin": "Durung mlebu log",
        "uploadnologintext": "Mangga $1 saperlu ngunggah barkas.",
-       "upload_directory_missing": "Direktori pamunggahan ($1) ora ditemokaké lan ora bisa digawé déning server wèb.",
+       "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": "Kaluputan pangunggahan berkas",
-       "upload-recreate-warning": "'''Pèngetan: Berkas mawa jeneng kuwi wis dibusak utawa disingkiraké.'''\n\nLog pambusakan lan panyingkiran saka kaca iki sumadhiya 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 sing 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é",
+       "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é:",
+       "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.",
        "uploadlogpage": "Log unggah",
-       "uploadlogpagetext": "Ing ngisor iki kapacak log pangunggahan berkas kang anyar dhéwé.\nMangga mirsani [[Special:NewFiles|galeri berkas-berkas anyar]] kanggo pratélan visual.",
+       "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",
        "filedesc": "Ringkesan",
        "fileuploadsummary": "Ringkesan:",
-       "filereuploadsummary": "Owah-owahan berkas:",
+       "filereuploadsummary": "Owah-owahan barkas:",
        "filestatus": "Status hak cipta",
        "filesource": "Sumber",
        "ignorewarning": "Lirwakaké pepéling lan simpen langsung barkasé.",
        "ignorewarnings": "Lirwakaké samubarang pepéling",
-       "minlength1": "Jeneng berkas paling ora minimal kudu awujud saaksara.",
-       "illegalfilename": "Jeneng berkas \"$1\" ngandhut aksara kang ora diparengaké ana sajroning irah-irahan kaca. Mangga owahana jeneng berkas iku lan cobanen  diunggahaké manèh.",
-       "filename-toolong": "Jeneng berkas ora olèh luwih dawa saka 240 bita.",
+       "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 berkas \".$1\" ora cocog karo jinis MIME kang kadètèk saka berkas ($2).",
-       "filetype-badmime": "Berkas mawa tipe MIME \"$1\" ora pareng diunggahaké.",
-       "filetype-bad-ie-mime": "Ora bisa ngunggahaké berkas iki amarga Internet Explorer ndhétèksi minangka \"$1\", kang ora diidinaké lan minangka tipe berkas kang nduwèni potènsi mbebayani.",
-       "filetype-unwanted-type": "'''\".$1\"''' klebu jenis berkas kang ora diidinaké.\nLuwih becik {{PLURAL:$3|jinis berkas|Jinis-jinis berkas}} $2.",
+       "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.",
+       "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.",
-       "filetype-missing": "Berkas ini ora duwé ekstènsi (contoné \".jpg\").",
+       "filetype-missing": "Barkas ini ora duwé ekstènsi (contoné \".jpg\").",
        "empty-file": "Barkas kang panjenengan lebokaké kosong.",
        "file-too-large": "Barkas kang panjenengan lebokaké kagedhèn.",
        "filename-tooshort": "Jeneng barkas kecendhèken.",
        "verification-error": "Barkas iki ora lulus vèrifikasi.",
        "hookaborted": "Owahan kang panjenengan ayahi diwurungaké déning èkstènsi.",
        "illegal-filename": "Jeneng barkas ora diidinaké.",
-       "overwrite": "Nibani berkas kang wis ana ora dililakaké.",
+       "overwrite": "Nibani barkas kang wis ana ora dililakaké.",
        "unknown-error": "Ana masalah kang ora dingertèni.",
-       "tmp-create-error": "Ora bisa nggawé berkas sawetara.",
-       "tmp-write-error": "Ora bisa nulis berkas sawetara.",
-       "large-file": "Ukuran berkas disaranaké supaya ora ngluwihi $1 bita; berkas iki ukurané $2 bita.",
+       "tmp-create-error": "Ora bisa nggawé barkas sauntara.",
+       "tmp-write-error": "Ora bisa nulis barkas sauntara.",
+       "large-file": "Ukuran barkas disaranaké supaya ora ngluwihi $1 bita; barkas iki ukurané $2 bita.",
        "largefileserver": "Barkas iki luwih gedhé tinimbang kang diidinaké ing paladèn.",
-       "emptyfile": "Berkas kang panjenengan unggahaké katoné kosong. Mbokmenawa iki amerga anané salah ketik ing jeneng berkas. Mangga dipastèkaké apa panjenengan pancèn kersa ngunggahaké berkas iki.",
+       "emptyfile": "Barkas kang panjenengan unggahaké katoné kosong. Bokmanawa iki amarga anané salah ketik ing jeneng barkas. Mangga dipastèkaké apa panjenengan pancèn kersa ngunggahaké barkas iki.",
        "windows-nonascii-filename": "Wiki iki ora nyengkuyung jeneng berkas mawa karakter kusus.",
-       "fileexists": "Sawijining berkas mawa jeneng iku wis ana, mangga dipriksa <strong>[[:$1]]</strong> yèn panjenengan ora yakin sumedya ngowahiné.\n[[$1|thumb]]",
-       "filepageexists": "Kaca dèskripsi kanggo berkas iki wis digawé ing <strong>[[:$1]]</strong>, nanging saiki iki ora ditemokaké berkas mawa jeneng iku. Ringkesan kang panjenengan lebokaké ora bakal metu ing kaca dèskripsi. Kanggo ngetokaké dèskripsi iki, panjenengan kudu nyunting sacara manual. [[$1|thumb]]",
+       "fileexists": "Barkas mawa jeneng iku wis ana, mangga dipriksa <strong>[[:$1]]</strong> yèn panjenengan ora yakin sumedya ngowahiné.\n[[$1|thumb]]",
+       "filepageexists": "Kaca dhèskripsi kanggo berkas iki wis digawé ing <strong>[[:$1]]</strong>, nanging saiki iki ora tinemu berkas mawa jeneng iku. Ringkesan kang panjenengan lebokaké ora bakal metu ing kaca dhèskripsi. Kanggo ngetokaké dhèskripsi iki, panjenengan kudu mbesut kanthi manual. [[$1|thumb]]",
        "fileexists-extension": "Berkas mawa jeneng kang padha wis ana: [[$2|thumb]]\n* Jeneng berkas kang bakal diunggahaké: <strong>[[:$1]]</strong>\n* Jeneng berkas kang wis ana: <strong>[[:$2]]</strong>\nMangga milih jeneng liya.",
        "fileexists-thumbnail-yes": "Berkas iki katoné gambar mawa ukuran kang luwih cilik ''(thumbnail)''. [[$1|thumb]]\nTulung dipriksa berkas <strong>[[:$1]]</strong>.\nYèn berkas kang wis dipriksa iku padha, ora perlu panjenengan ngunggahaké vèrsi cilik liyané manèh.",
-       "file-thumbnail-no": "Jeneng berkas diwiwiti kanthi <strong>$1</strong>. Katoné berkas iki sawijining gambar mawa ukuran kang dicilikaké <em>(thumbnail)</em>.\nYèn panjenengan kagungan vèrsi mawa résolusi kebak saka gambar iki, mangga diunggahaké. Yèn ora, tulung jeneng berkas diganti.",
-       "fileexists-forbidden": "Sawijining berkas mawa jeneng iki wis ana, lan ora bisa ditindhes.\nYèn panjenengan isih arep ngunggahaké berkas panjenengan, supaya\nmbalik lan gunakna jeneng liya.\n[[File:$1|thumb|center|$1]]",
+       "file-thumbnail-no": "Jeneng berkas diwiwiti kanthi <strong>$1</strong>. Katoné berkas iki wujud gambar mawa ukuran kang dicilikaké <em>(thumbnail)</em>.\nYèn panjenengan kagungan vèrsi mawa résolusi kebak saka gambar iki, mangga diunggahaké. Yèn ora, tulung jeneng berkas diganti.",
+       "fileexists-forbidden": "Barkas mawa jeneng iki wis ana, lan ora bisa ditindhes.\nYèn panjenengan isih arep ngunggahaké berkas panjenengan, supaya\nmbalik lan gunakna jeneng liya.\n[[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Wis ana berkas liyané mawa jeneng kang padha ing gudhang berkas kang dianggo bebarengan.\nYèn isih ngersakaké ngunggahaké, mangga berkas diunggahaké manèh mawa jeneng liya. [[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Barkas iki dhuplikaté {{PLURAL:$1|barkas}} iki:",
-       "file-deleted-duplicate": "Sawijining berkas persis berkas iki ([[:$1]]) wis tau dibusak. Mangga panjenengan priksani sajarah pambusakan berkas kasebut sadurungé nerusaké ngunggahaké berkas kuwi manèh.",
+       "file-deleted-duplicate": "Ana siji barkas kang mèmper barkas iki ([[:$1]]) wis binusek. Mangga panjenengan priksani sajarah pambusakan berkas kasebut sadurungé nerusaké ngunggahaké berkas iku manèh.",
        "uploadwarning": "Pèngetan pangunggahan berkas",
        "uploadwarning-text": "Mangga owah katrangan berkas ing ngisor lan coba manèh.",
        "savefile": "Simpen barkas",
        "upload-description": "Katerangan barkas",
        "upload-options": "Opsi unggahan",
        "watchthisupload": "Awasi barkas iki",
-       "filewasdeleted": "Sawijining berkas mawa jeneng iki wis tau diunggahaké lan sawisé dibusak.\nMangga priksanen $1 sadurungé ngunggahaké berkas iku manèh.",
-       "filename-bad-prefix": "Jeneng berkas sing panjenengan unggahaké, diawali mawa '''\"$1\"''', kang sawijining jeneng non-dèskriptif kang biasané diwènèhaké sacara otomatis déning kamera digital. Mangga milih jeneng liyané kang luwih dèskriptif kanggo berkas panjenengan.",
+       "filewasdeleted": "Barkas mawa jeneng iki wis tau diunggahaké lan sawisé dibusak.\nMangga priksanen $1 sadurungé ngunggahaké berkas iku manèh.",
+       "filename-bad-prefix": "Jeneng berkas kang panjenengan unggahaké, diawali mawa '''\"$1\"''', ya iku jeneng non-dèskriptif kang biasané diwènèhaké sacara otomatis déning kamera digital. Mangga milih jeneng liyané kang luwih dèskriptif kanggo berkas panjenengan.",
        "upload-proto-error": "Protokol ora bener",
        "upload-proto-error-text": "Pangunggahan jarah adoh mbutuhaké URL kang diawali karo <code>http://</code> utawa <code>ftp://</code>.",
-       "upload-file-error": "Kaluputan internal",
-       "upload-file-error-text": "Ana kaluputan internal nalika nyoba ngunggahaké berkas sauntara ing server.\nMangga kontak [[Special:ListUsers/sysop|pangurus]].",
-       "upload-misc-error": "Kaluputan pamunggahan kang ora dimangertèni",
-       "upload-misc-error-text": "Ana kaluputan kang ora diweruhi kadadéyan nalika pangunggahan. Mangga dipasthèkaké yèn URL kasebut iku absah lan bisa diaksès lan sawisé iku cobanen manèh. Yèn masalah iki isih ana, mangga kontak [[Special:ListUsers/sysop|pangurus sistem]].",
+       "upload-file-error": "Masalah njero",
+       "upload-file-error-text": "Ana masalah njero nalika njajal nggawé barkas sauntara ing paladèn.\nSumangga sesambungan karo [[Special:ListUsers/sysop|pangurus]].",
+       "upload-misc-error": "Masalah pangunggah kang ora kaweruhan",
+       "upload-misc-error-text": "Ana masalah kang ora kaweruhan nalika ngunggah.\nSumangga vèrifikasi yèn URLé trep lan kena ingaksès lan jajala manèh. \nYèn masalah iki isih muncul, sumangga sesambungan karo [[Special:ListUsers/sysop|pangurus]].",
        "upload-too-many-redirects": "URL ngandhut kakèhan pengalihan",
        "upload-http-error": "Ana masalah HTTP: $1",
        "upload-copy-upload-invalid-domain": "Unggahan salinan ora sumadhiya ing domain iki.",
        "upload-form-label-own-work": "Iki karyaku dhéwé",
        "upload-form-label-infoform-categories": "Kategori",
        "upload-form-label-infoform-date": "Tanggal",
-       "backend-fail-stream": "Ora bisa milikaké berkas \"$1\".",
-       "backend-fail-backup": "Ora bisa nyadangaké berkas \"$1\".",
+       "backend-fail-stream": "Ora bisa ngilèkaké barkas \"$1\".",
+       "backend-fail-backup": "Ora bisa nyadhangaké barkas \"$1\".",
        "backend-fail-notexists": "Barkas $1 ora ana.",
-       "backend-fail-hashes": "Ora bisa ngéntukaké has berkas kanggo mbandingaké.",
-       "backend-fail-notsame": "Berkas nonidèntik wis ana ing \"$1\".",
+       "backend-fail-hashes": "Ora bisa ngolèhaké has barkas kanggo mbandhingaké.",
+       "backend-fail-notsame": "Barkas nonidèntik wis ana ing \"$1\".",
        "backend-fail-invalidpath": "\"$1\" dudu jurusan nyimpen kang trep.",
-       "backend-fail-delete": "Ora bisa mbusak berkas \"$1\".",
-       "backend-fail-describe": "Gagal mengubah metadata untuk berkas \"$1\".",
-       "backend-fail-alreadyexists": "Berkas \"$1\" wis ana.",
-       "backend-fail-store": "Ora bisa nyèlèhaké berkas \"$1\" ing \"$2\".",
-       "backend-fail-copy": "Ora bisa nyalin berkas \"$1\" ing \"$2\".",
-       "backend-fail-move": "Ora bisa mindhahaké berkas \"$1\" ing \"$2\".",
-       "backend-fail-opentemp": "Ora bisa mbukak berkas sawetara.",
-       "backend-fail-writetemp": "Ora bisa nulis berkas sawetara.",
-       "backend-fail-closetemp": "Ora bisa nutup berkas sawetara.",
-       "backend-fail-read": "Ora bisa maca berkas \"$1\".",
-       "backend-fail-create": "Ora bisa nulis berkas \"$1\".",
-       "backend-fail-maxsize": "Ora bisa nulis berkas \"$1\" amarga luwih gedhé saka {{PLURAL:$2|sak bita|$2 bita}}.",
+       "backend-fail-delete": "Ora bisa mbusek barkas \"$1\".",
+       "backend-fail-describe": "Ora bisa ngowahi métahdhatah barkas \"$1\".",
+       "backend-fail-alreadyexists": "Barkas \"$1\" wis ana.",
+       "backend-fail-store": "Ora bisa ndokok barkas \"$1\" ing \"$2\".",
+       "backend-fail-copy": "Ora bisa nurun barkas \"$1\" ing \"$2\".",
+       "backend-fail-move": "Ora bisa ngalih barkas \"$1\" menyang \"$2\".",
+       "backend-fail-opentemp": "Ora bisa mbukak barkas sauntara.",
+       "backend-fail-writetemp": "Ora bisa nulis barkas sauntara.",
+       "backend-fail-closetemp": "Ora bisa nutup barkas sauntara.",
+       "backend-fail-read": "Ora bisa maca barkas \"$1\".",
+       "backend-fail-create": "Ora bisa nulis barkas \"$1\".",
+       "backend-fail-maxsize": "Ora bisa nulis barkas \"$1\" amarga munjuli {{PLURAL:$2|siji bèt|$2 bèt}}.",
        "backend-fail-readonly": "Backend penyimpanan \"$1\" ini saat ini hanya bisa dibaca. Alasan yang diberikan adalah: \"''$2''\"",
-       "backend-fail-synced": "Berkas \"$1\" dalam keadaan yang tidak konsisten dalam backends penyimpanan internal",
+       "backend-fail-synced": "Barkas \"$1\" ing kaanan kang ora ajeg ing backend panyimpenan njero.",
        "backend-fail-connect": "Tidak dapat menyambung ke penyimpanan backend \"$1\".",
        "backend-fail-internal": "Ana masalah ing backend panyimpenan \"$1\".",
-       "backend-fail-contenttype": "Ora bisa nemtokaké jinisé kontèn saka berkas kang arep disimpen ing \"$1\".",
-       "backend-fail-batchsize": "Penyimpanan backend diberikan batch $1 berkas {{PLURAL:$1||}}operasi; batasnya adalah $2 {{PLURAL:$2||}}operasi.",
-       "backend-fail-usable": "Ora bisa maca utawa nulis berkas \"$1\" amarga idin durung nyukupi utawa ilang dirèktori/kontaineré.",
+       "backend-fail-contenttype": "Ora bisa nemtokaké jinisé kontèn saka barkas kang arep kasimpen ing \"$1\".",
+       "backend-fail-batchsize": "Backend panyimpenan olèh batch {{PLURAL:$1|operasi|operasi}} barkas $2; watesé $2 {{PLURAL:$2|operasi|operasi}}.",
+       "backend-fail-usable": "Ora bisa maca utawa nulis barkas \"$1\" amarga idin durung nyukupi utawa ilang dirèktori/kontaineré.",
        "filejournal-fail-dbconnect": "Tidak dapat menyambung ke database jurnal untuk penyimpanan backend \"$1\".",
        "filejournal-fail-dbquery": "Tidak bisa update database jurnal untuk penyimpanan backend \"$1\".",
-       "lockmanager-notlocked": "Ora bisa mbukak gembok \"$1\"; kuwi ora kagembok.",
-       "lockmanager-fail-closelock": "Ora bisa nutup berkas gembok kanggo \"$1\".",
-       "lockmanager-fail-deletelock": "Ora bisa mbusak berkas gembok kanggo \"$1\".",
+       "lockmanager-notlocked": "Ora bisa mbukak gembok \"$1\"; iku ora kagembok.",
+       "lockmanager-fail-closelock": "Ora bisa nutup barkas gembok tumrap \"$1\".",
+       "lockmanager-fail-deletelock": "Ora bisa mbusek barkas gembok tumrap \"$1\".",
        "lockmanager-fail-acquirelock": "Ora bisa njaluk gembok kanggo \"$1\".",
-       "lockmanager-fail-openlock": "Ora bisa mbukak berkas gembok kanggo \"$1\".",
+       "lockmanager-fail-openlock": "Ora bisa mbukak barkas gembok tumrap \"$1\".",
        "lockmanager-fail-releaselock": "Ora bisa ngetokaké gembok kanggo \"$1\".",
-       "lockmanager-fail-db-bucket": "Ora bisa ngubungi cukup basis data gembok ing èmbèr $1.",
-       "lockmanager-fail-db-release": "Ora bisa nguculaké gembok neng basis data $1.",
+       "lockmanager-fail-db-bucket": "Ora bisa ngubungi cukup basis dhatah gembok ing èmbèr $1.",
+       "lockmanager-fail-db-release": "Ora bisa nguculaké gembok ing basis dhatah $1.",
        "lockmanager-fail-svr-acquire": "Ora bisa ngentokaké gembok ing sasana $1.",
-       "lockmanager-fail-svr-release": "Ora bisa nguculaké gembok neng sasana $1.",
+       "lockmanager-fail-svr-release": "Ora bisa nguculaké gembok ing paladèn $1.",
        "zip-file-open-error": "Ana masalah nalika mbukak barkas kanggo pamriksan ZIP.",
        "zip-wrong-format": "Barkas kang panjenengan lebokaké dudu barkas ZIP.",
-       "zip-bad": "Berkas rusak utawa berkas ZIP kang ora bisa diwaca.\nKuwi ora bisa kapriksa kanthi patut kanggo kamanan.",
-       "zip-unsupported": "Berkasé kuwi berkas ZIP sing nganggo piranti ZIP kang ora kasengkuyung déning MediaWiki.\nKuwi ora bisa kapriksa kanthi patut kanggo kamanan.",
+       "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 berkas-berkas kang wis diunggah (utawa lagi diunggah) naning durung diterbitaké ing wiki. Berkas-berkas iki ora katon kanggo sapa waé nanging namung kanggo panganggo kang ngunggah waé.",
-       "uploadstash-clear": "Busak berkas kadhelikaké",
+       "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-clear": "Busek barkas kadhelikaké",
        "uploadstash-nofiles": "Panjenengan ora duwé barkas simpenan.",
-       "uploadstash-badtoken": "Nglakoni iki ora suksès, mungkin amarga hak panyuntingan panjenengan wis kedaluwarsa. Jajal manèh.",
+       "uploadstash-badtoken": "Nglakoni iki ora dadi, bokamanawa amarga hak besut panjenengan wis kadaluwarsa. Sumangga jajal manèh.",
        "uploadstash-errclear": "Wurung ngresiki barkasé.",
-       "uploadstash-refresh": "Segeraké daptar berkas",
+       "uploadstash-refresh": "Segeraké pratélan barkas",
        "invalid-chunk-offset": "Ganti rugi kethoka ora sah",
        "img-auth-accessdenied": "Aksès ditulak",
-       "img-auth-nopathinfo": "Kélangan PATH_INFO.\nSasana panjenengan durung disetèl kanggo ngliwati inpormasi iki.\nMungkin amarga abasis-CGI lan ora bisa nyengkuyung img_auth.\nDelok https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
+       "img-auth-nopathinfo": "Kélangan PATH_INFO.\nSasana panjenengan durung disetèl kanggo ngliwati inpormasi iki.\nMungkin amarga abasis-CGI lan ora bisa nyengkuyung img_auth.\nWaca https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Alur kang dijaluk dudu dirèktori unggah kakonpigurasi.",
        "img-auth-badtitle": "Ora bisa ngyasa sesirah kang trep saka \"$1\".",
        "img-auth-nologinnWL": "Panjenengan durung mlebu log lan \"$1\" ora ing pratélan putih.",
-       "img-auth-nofile": "Berkas \"$1\" ora ana.",
+       "img-auth-nofile": "Barkas \"$1\" ora ana.",
        "img-auth-isdir": "Panjenengan lagi njajal ngaksès dirèktori \"$1\".\nNamung aksès barkas kang dililakaké.",
        "img-auth-streaming": "Striming \"$1\".",
-       "img-auth-public": "Pungsi img_auth.php yakuwi ngetokaké berkas saka wiki pribadi.\nWiki iki ditata minangka wiki umum.\nKanggo kamanan paling apik, img_auth.php dipatèni.",
+       "img-auth-public": "Fungsi img_auth.php iku ngetokaké barkas saka wiki pribadi.\nWiki iki ditata minangka wiki umum.\nKanggo kamanan paling apik, img_auth.php dipatèni.",
        "img-auth-noread": "Panganggo ora nduwé aksès kanggo maca \"$1\".",
        "http-invalid-url": "URL ora absah: $1",
        "http-invalid-scheme": "URL mawa skéma \"$1\" ora disengkuyung.",
        "upload-curl-error6": "URL-é ora bisa dihubungi",
        "upload-curl-error6-text": "URL kang diwènèhaké ora bisa dihubungi.\nMangga dipriksa manèh yèn URL iku pancèn bener lan situs iki lagi aktif.",
        "upload-curl-error28": "Pangunggahan ngliwati wektu",
-       "upload-curl-error28-text": "Situsé kesuwèn sadurungé réaksi.\nMangga dipriksa menawa situsé aktif, nunggu sedélok lan coba manèh.\nMbok-menawa panjenengan bisa nyoba manèh ing wektu kang luwih longgar.",
+       "upload-curl-error28-text": "Situsé kesuwèn sadurungé réaksi.\nMangga dipriksa manawa situsé aktif, nunggu sedélok lan coba manèh.\nBokmanawa panjenengan bisa nyoba manèh ing wektu kang luwih longgar.",
        "license": "Lisènsi:",
        "license-header": "Lisènsi",
        "nolicense": "Durung ana kang dipilih",
        "filehist-comment": "Tanggepan",
        "imagelinks": "Panggunaning barkas",
        "linkstoimage": "{{PLURAL:$1|Kaca|$1 kaca}} ngisor iki nggayut barkas iki:",
-       "linkstoimage-more": "Luwih saka $1 {{PLURAL:$1|kaca|kaca-kaca}} nduwèni pranala menyang berkas iki.\nDhaftar ing ngisor nuduhaké {{PLURAL:$1|kaca pisanan kanthi pranala langsung|$1 kaca kanthi pranala langsung}} menyang berkas iki.\n[[Special:WhatLinksHere/$2|dhaftar pepak]] uga ana.",
+       "linkstoimage-more": "Luwih saka $1 {{PLURAL:$1|kaca|kaca-kaca}} nduwèni pranala menyang berkas iki.\nPratélan ing ngisor nuduhaké {{PLURAL:$1|kaca pisanan kanthi pranala langsung|$1 kaca kanthi pranala langsung}} menyang berkas iki.\n[[Special:WhatLinksHere/$2|pratélan pepak]] uga ana.",
        "nolinkstoimage": "Ora ana kaca kang nganggo barkas iki.",
        "morelinkstoimage": "Ndeleng [[Special:WhatLinksHere/$1|luwih akèh pranala]] menyang berkas iki.",
        "linkstoimage-redirect": "$1 (alihan barkas) $2",
        "sharedupload": "Barkas iki saka $1 lan bisa kanggo proyèk-proyèk liyané.",
        "sharedupload-desc-there": "Berkas iki asal saka $1 lan bisa dipigunakaké déning proyèk liya.\nMangga pirsani [$2 kaca dhèskripsi berkas] kanggo informasi sabanjuré.",
        "sharedupload-desc-here": "Barkas iki saka $1 lan kena kanggo proyèk liya.\nPanyandraning [$2 kaca panyandra barkas]é kapacak ing ngisor.",
-       "sharedupload-desc-edit": "Barkas iki saka $1 lan mungkin dianggo ing proyèk liya.\nMungkin panjenengan pingin nyunting katrangan ing [$2 kaca katrangan berkasé] ing kono.",
-       "sharedupload-desc-create": "Berkas iki saka $1 lan mungkin dianggo ing proyèk liya.\nMungkin panjenengan pingin nyunting katrangan ing [$2 kaca katrangan berkasé] ing kono.",
+       "sharedupload-desc-edit": "Barkas iki saka $1 lan mungkin dianggo ing proyèk liya.\nBokamanawa panjenengan arep mbesut katrangan ing [$2 kaca katrangan berkasé] ing kono.",
+       "sharedupload-desc-create": "Berkas iki saka $1 lan mungkin dianggo ing proyèk liya.\nBokamanawa panjenengan arep mbesut katrangan ing [$2 kaca katrangan berkasé] ing kono.",
        "filepage-nofile": "Ora ana barkas kanthi jeneng kaya mangkéné.",
        "filepage-nofile-link": "Ora ana berkas nganggo jeneng iki, nanging panjenengan bisa [$1 ngunggahaké].",
        "uploadnewversion-linktext": "Unggah vèrsi anyar saka barkas iki",
        "shared-repo-from": "saka $1",
-       "shared-repo": "sawijining panyimpenan kanggo bebarengan",
+       "shared-repo": "panyimpenan kanggo bebarengan",
        "upload-disallowed-here": "Panjenengan ora kena ngeblegi barkas iki.",
        "filerevert": "Balèkna $1",
        "filerevert-legend": "Pulihaké barkas",
        "filerevert-success": "'''[[Media:$1|$1]]''' wis dibalèkaké menyang [vèrsi $4 ing $3, $2].",
        "filerevert-badversion": "Ora ana vèrsi lokal sadurungé saka berkas iki mawa stèmpel wektu kang dikarepaké.",
        "filerevert-identical": "Vèrsi barkasé kang saiki padha plek karo kang dipilih.",
-       "filedelete": "Mbusak $1",
+       "filedelete": "Mbusek $1",
        "filedelete-legend": "Busak barkas",
-       "filedelete-intro": "Panjenengan bakal mbusak berkas '''[[Media:$1|$1]]''' sekaliyan kabèh riwayaté.",
-       "filedelete-intro-old": "Panjenengan mbusak vèrsi '''[[Media:$1|$1]]''' per [$4 $3, $2].",
+       "filedelete-intro": "Panjenengan arep mbusek barkas <strong>[[Media:$1|$1]]</strong> sisan karo kabèh sajarahé.",
+       "filedelete-intro-old": "Panjenengan mbusek vèrsi <strong>[[Media:$1|$1]]</strong> per [$4 $3, $2].",
        "filedelete-comment": "Alesan:",
        "filedelete-submit": "Busak",
        "filedelete-success": "'''$1''' wis dibusak.",
        "filedelete-success-old": "Berkas '''[[Media:$1|$1]]''' vèrsi $3, $2 wis dibusak.",
        "filedelete-nofile": "'''$1''' ora ana.",
-       "filedelete-nofile-old": "Ora ditemokaké arsip vèrsi saka '''$1''' mawa atribut kang diwènèhaké.",
+       "filedelete-nofile-old": "Ora tinemu arsip vèrsi saka <strong>$1</strong> mawa atribut kang diwènèhaké.",
        "filedelete-otherreason": "Alesan tambahan/liya:",
        "filedelete-reason-otherlist": "Alesan liya",
        "filedelete-reason-dropdown": "*Alesan pambusakan\n** Nglanggar hak cipta\n** Berkas duplikat",
-       "filedelete-edit-reasonlist": "Besut alesané mbusak",
+       "filedelete-edit-reasonlist": "Besut alesané mbusek",
        "filedelete-maintenance": "Pambusakan lan pambalikan berkas kanggo sawetara dipatèni salawas ana pangruwatan.",
-       "filedelete-maintenance-title": "Ora bisa mbusak barkas",
+       "filedelete-maintenance-title": "Ora bisa mbusek barkas",
        "mimesearch": "Gegolèkan MIME",
        "mimesearch-summary": "Kaca iki nyedyaké fasilitas nyaring berkas miturut tipe MIME-né. Lebokna: contenttype/subtype, contoné <code>image/jpeg</code>.",
        "mimetype": "Tipe MIME:",
        "download": "undhuh",
        "unwatchedpages": "Kaca kang ora ingawasan",
-       "listredirects": "Daftar pengalihan",
+       "listredirects": "Pratélan alihan",
        "unusedtemplates": "Cithakan kang ora kanggo",
-       "unusedtemplatestext": "Kaca iki ngamot kabèh kaca ing bilik jeneng {{ns:template}} kang ora dianggo ing kaca ngendi waé.\nPriksanen dhisik pranala-pranala menyang cithakan iki sadurungé mbusak.",
+       "unusedtemplatestext": "Kaca iki isi kabèh kaca ing mandala aran {{ns:template}} kang ora kaanggo ing kaca liya.\nAja lali mesthèkaké ana-orané pranala liya kang ngener cithakané sadurungé panjenengan mbusek.",
        "unusedtemplateswlh": "pranala liya-liyané",
        "randompage": "Kaca sembarang",
        "randompage-nopages": "Ora ana kaca ing {{PLURAL:$2||}}bilik jeneng iki:$1.",
        "doubleredirects": "Alihan kang dhobel",
        "doubleredirectstext": "Kaca iki ngemu pratélan kaca kang ngener kaca alihan liyané.\nSaben larik ngemu pranala menyang kaca alihan kapisan lan kapindho, sarta jujuganing kaca alihan kapindho, kang adaté minagka kaca jujugan kang \"sajatiné\", ya iku kaca kang kuduné dadi jujugané kaca alihan kapisan.\nÈntri kang <del>kacorèk</del> tegesé wis kadandani.",
        "double-redirect-fixed-move": "[[$1]] wis kapindhahaké, saiki dadi kaca peralihan menyang [[$2]]",
-       "double-redirect-fixed-maintenance": "Otomatis ndandani lih-lihan dhobel saka [[$1]] nyang [[$2]] nalika ana opèn-opènan.",
+       "double-redirect-fixed-maintenance": "Otomatis ndandani lih-lihan dhobel saka [[$1]] menyang [[$2]] nalika ana opèn-opènan.",
        "double-redirect-fixer": "Révisi pangalihan",
        "brokenredirects": "Alihan kang rusak",
        "brokenredirectstext": "Kaca alihan ing isor iki ngener kaca kang ora ana:",
        "brokenredirects-edit": "besut",
        "brokenredirects-delete": "busak",
        "withoutinterwiki": "Kaca kang tanpa pranala basa",
-       "withoutinterwiki-summary": "Kaca-kaca ing ngisor iki ora nggayut nyang vèrsi basa liyané.",
+       "withoutinterwiki-summary": "Kaca-kaca ing ngisor iki ora nggayut menyang vèrsi basa liyané.",
        "withoutinterwiki-legend": "Préfiks",
        "withoutinterwiki-submit": "Tuduhna",
        "fewestrevisions": "Artikel kang owahé sithik dhéwé",
        "shortpages": "Kaca kang cendhak",
        "longpages": "Kaca kang dawa",
        "deadendpages": "Kaca kang buntu",
-       "deadendpagestext": "Kaca-kaca ing ngisor iki ora nggayut nyang kaca liya ing {{SITENAME}}.",
+       "deadendpagestext": "Kaca-kaca ing ngisor iki ora nggayut menyang kaca liya ing {{SITENAME}}.",
        "protectedpages": "Kaca kang kareksa",
        "protectedpages-indef": "Namung rereksan tanpa watesan wektu",
        "protectedpages-cascade": "Amung kaca rineksan kang runtut",
        "ancientpages": "Kaca kang lawas dhéwé",
        "move": "Lih",
        "movethispage": "Lih kaca iki",
-       "unusedimagestext": "Berkas-berkas kang kapacak iki ana nanging ora dienggo ing kaca apa waé.\nTulung digatèkaké yèn situs wèb liyané mbok-menawa bisa nyambung ing sawijining berkas sacara langsung mawa URL langsung, lan berkas-berkas kaya mengkéné iku mbok-menawa ana ing daftar iki senadyan ora dienggo aktif manèh.",
+       "unusedimagestext": "Barkas-barkas kang kapacak iki ana nanging ora dienggo ing kaca apa waé.\nTulung digatèkaké yèn situs wèb liyané bokmanawa bisa nyambung ing barkas sacara langsung mawa URL langsung, lan barkas-barkas mengkéné iku bokmanawa ana ing pratélan iki sanajan ora dienggo aktif manèh.",
        "unusedcategoriestext": "Kaca kategori iki ana sanajan ora ana artikel utawa kategori liyané kang nganggo.",
        "notargettitle": "Ora ana sasaran",
        "notargettext": "Panjenengan ora nemtokaké kaca utawa panganggo tujuan fungsi iki.",
-       "nopagetitle": "Kaca tujuan ora ditemokaké",
+       "nopagetitle": "Kaca jujugan mangkono ora ana",
        "nopagetext": "Kaca jujugan kang panjenengan karsakaké ora ana.",
        "pager-newer-n": "{{PLURAL:$1|1 luwih anyar|$1 luwih anyar}}",
        "pager-older-n": "{{PLURAL:$1|1 luwih lawas|$1 luwih lawas}}",
        "apisandbox": "Kothak wedhi API",
        "apisandbox-jsonly": "JavaScript dibutuhaké saperlu nganggo bak wedhi API.",
        "apisandbox-api-disabled": "API dipatèni ing situs iki.",
-       "apisandbox-intro": "Anggo kaca iki kanggo njajal-njajal '''API layanan wèb MediaWiki'''.\nRujuk [https://www.mediawiki.org/wiki/API:Main_page the dhokumèntasi API] kanggo panganggoan API luwih rinci. Conto: [https://www.mediawiki.org/wiki/API#A_simple_example ngéntukaké kontèn Kaca Utama]. Pilih laku kanggo ndelok conto luwih akèh.",
+       "apisandbox-intro": "Anggo kaca iki kanggo njajal-njajal '''API layanan wèb MediaWiki'''.\nRujuk [https://www.mediawiki.org/wiki/API:Main_page the dhokumèntasi API] kanggo panganggoan API luwih rinci. Conto: [https://www.mediawiki.org/wiki/API#A_simple_example ngéntukaké kontèn Kaca Utama]. Pilih laku kanggo ndeleng conto luwih akèh.",
        "apisandbox-submit": "Gawé panjalukan",
        "apisandbox-reset": "Resiki",
        "apisandbox-retry": "Jajal manèh",
        "apisandbox-alert-field": "Ajiné babagan iki ora trep.",
        "apisandbox-continue": "Banjuraké",
        "apisandbox-continue-clear": "Resiki",
-       "apisandbox-continue-help": "{{int:apisandbox-continue}} bakal [https://www.mediawiki.org/wiki/API:Query#Continuing_queries mbanjuraké] panyuwunané kang pungkasan; {{int:apisandbox-continue-clear}} bakal ngresiki paramèter kang gegayutan karo tumindak panglanjutané.",
+       "apisandbox-continue-help": "{{int:apisandbox-continue}} bakal [https://www.mediawiki.org/wiki/API:Query#Continuing_queries mbanjuraké] panyuwunané kang pungkasan; {{int:apisandbox-continue-clear}} bakal ngresiki paramèter kang magepokan.",
        "apisandbox-param-limit": "Isinen <kbd>max</kbd> saperlu nganggo watesan maksimum.",
        "apisandbox-multivalue-all-namespaces": "$1 (Kabèh mandala aran)",
        "apisandbox-multivalue-all-values": "$1 (Kabèh aji)",
        "booksources-search-legend": "Golèk sumber buku",
        "booksources-isbn": "ISBN:",
        "booksources-search": "Golèk",
-       "booksources-text": "Ing ngisor iki kapacak daftar pranala menyang situs liyané kang ngadol buku anyar lan bekas, lan mbok-menawa uga ndarbèni informasi sabanjuré ngenani buku-buku kang lagi panjenengan golèki:",
+       "booksources-text": "Ing ngisor iki kapacak pratélan pranala menyang situs liyané kang ngadol buku anyar lan bekas, lan bokmanawa uga ndarbèni informasi sabanjuré ngenani buku-buku kang lagi panjenengan golèki:",
        "booksources-invalid-isbn": "ISBN kang diwènèhaké katonané ora trep; priksanen bokmanawa ana masalah nalika nurun sumber asli.",
        "magiclink-tracking-rfc": "Kaca kang nganggo pranala RFC",
        "magiclink-tracking-rfc-desc": "Kaca iki nganggo pranala ajaib RFC. Delengen [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] ngenani carané boyongan.",
        "allpagesbadtitle": "Irah-irahan (judhul) ingkang dipun-gunaaken boten sah utawi nganggé ater-ater (awalan) antar-basa utawi antar-wiki. Irah-irahan punika saged ugi nganggé setunggal aksara utawi luwih ingkang boten saged kagunaaken dados irah-irahan.",
        "allpages-bad-ns": "{{SITENAME}} ora duwé mandala aran \"$1\".",
        "allpages-hide-redirects": "Dhelikaké alihan",
-       "cachedspecial-viewing-cached-ttl": "Panjenengan lagi ndelok vèrsi cadhangan saka kaca iki, kang bisa dadi lawasé wis $1.",
-       "cachedspecial-viewing-cached-ts": "Panjenengan lagi ndelok vèrsi cadhangan saka kaca iki, kang bisa dadi ora padha karo kasunyatan.",
+       "cachedspecial-viewing-cached-ttl": "Panjenengan lagi ndeleng vèrsi cadhangan saka kaca iki, kang bisa dadi lawasé wis $1.",
+       "cachedspecial-viewing-cached-ts": "Panjenengan lagi ndeleng vèrsi cadhangan saka kaca iki, kang bisa dadi ora padha karo kasunyatan.",
        "cachedspecial-refresh-now": "Deleng kang paling anyar.",
        "categories": "Kategori",
        "categories-submit": "Tuduhaké",
        "listusers-noresult": "Panganggo ora ana.",
        "listusers-blocked": "(diblokir)",
        "activeusers": "Pratélan panganggo aktif",
-       "activeusers-intro": "Iki daptar panganggo kang katon lakuné ing $1 {{PLURAL:$1|dina|dina}} kapungkur.",
-       "activeusers-count": "$1 {{PLURAL:$1|tumindak|tumindak}} ing {{PLURAL:$3|dina|$3 dina}} pungkasan",
+       "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",
        "activeusers-from": "Tampilna panganggo wiwit saka:",
        "activeusers-groups": "Tuduhaké panganggo kang mlebu golongan:",
        "activeusers-excludegroups": "Aja lebokaké panganggo kang kalebu golongan:",
        "activeusers-noresult": "Panganggo ora ana.",
        "activeusers-submit": "Tuduhaké panganggo aktif",
        "listgrouprights": "Hak-hak grup panganggo",
-       "listgrouprights-summary": "Ing ngisor iki kapacak dhaftar grup panganggo kang didéfinisi ing wiki iki, kanthi hak-hak aksès gandhèngané.\nInformasi tambahan perkara hak-hak individual bisa ditemokaké ing [[{{MediaWiki:Listgrouprights-helppage}}|kéné]].",
+       "listgrouprights-summary": "Ing ngisor iki kapacak pratélan grup panganggo kang didéfinisi ing wiki iki, kanthi hak-hak aksès gandhèngané.\nInformasi tambahan perkara hak-hak individual bisa tinemu ing [[{{MediaWiki:Listgrouprights-helppage}}|kéné]].",
        "listgrouprights-key": "* <span class=\"listgrouprights-granted\">Hak kang diidinaké</span>\n* <span class=\"listgrouprights-revoked\">Hak kang dijabel</span>",
        "listgrouprights-group": "Grup",
        "listgrouprights-rights": "Hak-hak",
        "listgrouprights-members": "(pratélaning anggota)",
        "listgrouprights-addgroup": "Tambah {{PLURAL:$2|golongan}}: $1",
        "listgrouprights-removegroup": "Busak {{PLURAL:$2|golongan}}: $1",
-       "listgrouprights-addgroup-all": "Bisa nambahaké kabèh klompok",
-       "listgrouprights-removegroup-all": "Bisa mbusak kabèh klompok",
-       "listgrouprights-addgroup-self": "Nambahaké {{PLURAL:$2|klompok|klompok}} menyang akuné dhéwé: $1",
-       "listgrouprights-removegroup-self": "Mbusak {{PLURAL:$2|klompok|klompok}} saka akuné dhéwé: $1",
+       "listgrouprights-addgroup-all": "Wuwuh kabèh golongan",
+       "listgrouprights-removegroup-all": "Busak kabèh golongan",
+       "listgrouprights-addgroup-self": "Muwuh {{PLURAL:$2|golongan|golongan}} menyang akuné dhéwé: $1",
+       "listgrouprights-removegroup-self": "Mbusek {{PLURAL:$2|golongan|golongan}} saka akuné dhéwé: $1",
        "listgrouprights-addgroup-self-all": "Nambahaké kabèh grup menyang akuné dhéwé",
-       "listgrouprights-removegroup-self-all": "Mbusak kabèh klompok saka akuné dhéwé",
+       "listgrouprights-removegroup-self-all": "Busak kabèh golongan saka akuné dhéwé",
        "listgrouprights-namespaceprotection-header": "Watesan mandala aran",
        "listgrouprights-namespaceprotection-namespace": "Mandala aran",
        "listgrouprights-namespaceprotection-restrictedto": "Hak kang ngidinaké panganggo mbesut",
        "nowatchlist": "Ora ana apa-apa ing pawawangané panjenengan.",
        "watchlistanontext": "Sumangga mlebu log saperlu ndeleng utawa mbesut barang ing pawawangané panjenengan.",
        "watchnologin": "Durung mlebu log",
-       "addwatch": "Tambah ing pratélan pangawasan",
-       "addedwatchtext": "Kaca \"[[:$1]]\" wis ditambahaké menyang [[Special:Watchlist|daftar pangawasan]].\nOwah-owahan kang dumadi ing tembé ing kaca iku lan kaca dhiskusi sing kagandhèng, bakal dipacak ing kéné.",
-       "removewatch": "Singkiraké saka daptar pangawasan",
-       "removedwatchtext": "Kaca \"[[:$1]]\" wis dibusak saka [[Special:Watchlist|daftar pangawasan]].",
+       "addwatch": "Tambah ing pawawangan",
+       "addedwatchtext": "Kaca \"[[:$1]]\" wis ditambahaké menyang [[Special:Watchlist|pawawangan]].\nOwah-owahan kang dumadi ing tembé ing kaca iku lan kaca dhiskusi kang kagandhèng, bakal dipacak ing kéné.",
+       "removewatch": "Singkiraké saka pawawangan",
+       "removedwatchtext": "Kaca \"[[:$1]]\" wis dibusak saka [[Special:Watchlist|pawawangan]].",
        "watch": "Awasi",
        "watchthispage": "Periksa kaca iki",
        "unwatch": "Aja ngawasaké manèh",
        "enotif_lastvisited": "Deleng $1 kanggo kabèh owah-owahan wiwit pungkasan panjenengan niliki.",
        "enotif_lastdiff": "Saperlu ndeleng owahan iki, tilikana $1",
        "enotif_anon_editor": "panganggo anonim $1",
-       "enotif_body": "Kang minulya $WATCHINGUSERNAME,\n\nKaca $PAGETITLE ing {{SITENAME}} wis $CHANGEDORCREATED ing $PAGEEDITDATE déning $PAGEEDITOR, mangga mirsani $PAGETITLE_URL kanggo vèrsi pungkasan.\n\n$NEWPAGE\n\nSajarah suntingan: $PAGESUMMARY $PAGEMINOREDIT\n\nHubungana panyunting:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nKita ora bakal ngandhani manèh yèn diowahi manèh, kejaba panjenengan wis mirsani kaca iku. Panjenengan uga bisa mbusak tandha notifikasi kanggo kabèh kaca pangawasan ing daftar pangawasan panjenengan.\n\n             Sistém notifikasi {{SITENAME}}\n\n--\nKanggo ngowahi préferènsi ing daftar pangawasan panjenengan, mangga mirsani\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nUmpan balik lan pitulung sabanjuré:\n$HELPPAGE",
+       "enotif_body": "Kang minulya $WATCHINGUSERNAME,\n\nKaca $PAGETITLE ing {{SITENAME}} wis $CHANGEDORCREATED ing $PAGEEDITDATE déning $PAGEEDITOR, mangga mirsani $PAGETITLE_URL kanggo vèrsi pungkasan.\n\n$NEWPAGE\n\nSajarah suntingan: $PAGESUMMARY $PAGEMINOREDIT\n\nHubungana panyunting:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nKita ora bakal ngandhani manèh yèn diowahi manèh, kejaba panjenengan wis mirsani kaca iku. Panjenengan uga bisa mbusak tandha notifikasi kanggo kabèh kaca pangawasan ing pawawangané panjenengan.\n\n             Sistém notifikasi {{SITENAME}}\n\n--\nKanggo ngowahi préferènsi ing pawawangané panjenengan, mangga mirsani\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nUmpan balik lan pitulung sabanjuré:\n$HELPPAGE",
        "enotif_minoredit": "Iki besutan cilik",
        "created": "kadamel",
        "changed": "kaubah",
        "delete-legend": "Busak",
        "historywarning": "'''Pènget''': Kaca kang bakal panjenengan busak ana sajarahé kanthi $1 {{PLURAL:$1|révisi|révisi}}:",
        "historyaction-submit": "Tuduhaké",
-       "confirmdeletetext": "Panjenengan nedya mbusak kaca dalah kabèh sujarahé.\nMangga konfirmasi yèn panjenengan pancèn nedya ngayahi iki, ngerti kabèh temahané, lan tumindaké panjenengan miturut [[{{MediaWiki:Policy-url}}|pranatan]].",
+       "confirmdeletetext": "Panjenengan arep mbusek kaca dalah kabèh sajarahé.\nSumangga konfirmasi yèn panjenengan pancèn arep ngayahi iki, ngerti temahané, lan panjenengan tumindak miturut [[{{MediaWiki:Policy-url}}|pranatan]].",
        "actioncomplete": "Kasil diayahi",
        "actionfailed": "Tindakan gagal",
        "deletedtext": "\"$1\" wis dibusak. \nDelenga $2 minangka cathetan ngenani kang pungkasan kabusak.",
        "deletereasonotherlist": "Alesan liya",
        "deletereason-dropdown": "*Alesan pambusakan\n** Spam\n** Vandhalisme\n** Terakan hak cipta\n** Panyuwun kang nulis\n** Alihan rusak",
        "delete-edit-reasonlist": "Besut alesané pambusak",
-       "delete-toobig": "Kaca iki darbé sajarah besutan kang dawa, punjul $1 {{PLURAL:$1|owahan}}.\nMbusak kaca kang mangkono wis ora diidinaké kanggo njagani supaya ora ana kang rusak ing {{SITENAME}}.",
+       "delete-toobig": "Kaca iki duwé sajarah besutan kang dawa, punjul $1 {{PLURAL:$1|owahan}}.\nMbusek kaca mangkéné wis winates kanggo ngéndhani prakara kang ora ingarepaké {{SITENAME}}.",
        "delete-warning-toobig": "Kaca iki duwé sajarah besutan kang dawa, punjul $1 {{PLURAL:$1|révisi}}.\nMbusak kaca iki bisa ngrusak lakuné basis dhata ing {{SITENAME}};\nkudu diayahi kanthi ngati-ati.",
        "deleteprotected": "Panjenengan ora bisa mbusak kaca iki amarga direksa.",
        "deleting-backlinks-warning": "<strong>Pepéling:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|Ana kaca liya]] kang nggayut utawa tranklud marang kaca kang arep panjenengan busek.",
        "rollbacklinkcount-morethan": "balèkaké luwih saka $1 {{PLURAL:$1|suntingan|suntingan}}",
        "rollbackfailed": "Pambalèkan gagal dilakoni",
        "cantrollback": "Ora bisa mbalèkaké suntingan; panganggo pungkasan iku siji-sijiné penulis artikel iki.",
-       "alreadyrolled": "Ora bisa mulihaké besutan pungkasan [[:$1]] déning [[User:$2|$2]] ([[User talk:$2|rembug]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); ana wong liya sing wis mbesut utawa mulihaké kaca iki.\n\nBesutan pungkasan kaca iku garapané [[User:$3|$3]] ([[User talk:$3|rembug]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
+       "alreadyrolled": "Ora bisa mulihaké besutan pungkasan [[:$1]] déning [[User:$2|$2]] ([[User talk:$2|rembug]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); ana wong liya kang wis mbesut utawa mulihaké kaca iki.\n\nBesutan pungkasan kaca iku garapané [[User:$3|$3]] ([[User talk:$3|rembug]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Ringkesan suntingan yaiku: <em>$1</em>.",
        "revertpage": "Besutané [[Special:Contributions/$2|$2]] ([[User talk:$2|rembugan]]) dipulihaké ing révisi pungkasan garapané [[User:$1|$1]]",
        "revertpage-nouser": "Besutané panganggo peteng dipulihaké ing révisi pungkasan garapané {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Suntingan dibalèkaké déning $1;\ndiowahi bali menyang vèrsi pungkasan déning $2.",
        "sessionfailure-title": "Sèsi gagal",
-       "sessionfailure": "Katoné ana masalah nalika panjenengan mlebu log; \ntumindak iki diwurungaké kanggo jaga-jaga yèn ana sing mbajag.\nBalia menyang kaca sadurungé, momota manèh kacané lan tumuli jajalen manèh.",
+       "sessionfailure": "Katoné ana masalah nalika panjenengan mlebu log; \nlaku iki kawurungaké kanggo jaga-jaga yèn ana kang mbajag.\nSumangga balèni kirim formuliré.",
        "changecontentmodel-title-label": "Sesirahé kaca",
        "changecontentmodel-model-label": "Modhèl kontèn anyar",
        "changecontentmodel-reason-label": "Alesan:",
        "logentry-contentmodel-change-revertlink": "pulihaké",
        "logentry-contentmodel-change-revert": "pulihaké",
        "protectlogpage": "Log reksa",
-       "protectlogtext": "Ngisor iki daptar owahan saka panjagan kaca.\nDelok [[Special:ProtectedPages|daptar kaca sing dijaga]] kanggo daptar panjagan kaca paling anyar.",
+       "protectlogtext": "Ngisor iki pratélan owahan saka panjagan kaca.\nDeleng [[Special:ProtectedPages|pratélan kaca kang dijaga]] kanggo pratélan panjagan kaca paling anyar.",
        "protectedarticle": "ngreksa \"[[$1]]\"",
        "modifiedarticleprotection": "ngowahi tataran rereksané \"[[$1]]\"",
        "unprotectedarticle": "nyingkiraké panjagan saka \"[[$1]]\"",
        "protect-title": "Owahi tataran rereksané \"$1\"",
        "protect-title-notallowed": "Deleng tataran rereksan saka \"$1\"",
        "prot_1movedto2": "$1 dialihaké menyang $2",
-       "protect-badnamespace-title": "Bilik jeneng sing ora bisa dijagani",
+       "protect-badnamespace-title": "Bilik jeneng kang ora bisa dijagani",
        "protect-badnamespace-text": "Kaca ing bilik jeneng iki ora bisa dijagani.",
        "protect-norestrictiontypes-text": "Kaca iki ora isa diproteksi.",
-       "protect-norestrictiontypes-title": "Kaca sing ora bisa diproteksi",
+       "protect-norestrictiontypes-title": "Kaca kang ora bisa diproteksi",
        "protect-legend": "Konfirmasi rereksan",
        "protectcomment": "Alesan:",
        "protectexpiry": "Kadaluwarsa:",
        "protect_expiry_invalid": "Wektu kadaluwarsa ora sah.",
-       "protect_expiry_old": "Wektu kadaluwarsané kuwi ana ing jaman biyèn.",
+       "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-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 amerga disertakaké ing {{PLURAL:$1|kaca|kaca-kaca}} sing wis direksa mawa pilihan pangreksan runtun diaktifaké. Panjenengan bisa ngganti tingkat pangreksan kanggo kaca iki, nanging perkara iku ora awèh pengaruh pangreksan runtun.",
+       "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.",
        "protect-default": "Idinaké kabèh panganggo",
        "protect-fallback": "Perlu idin hak aksès \"$1\"",
-       "protect-level-autoconfirmed": "Mung idinaké panganggo sing otomatis kadhaftar",
+       "protect-level-autoconfirmed": "Mung idinaké panganggo kang otomatis kadhaftar",
        "protect-level-sysop": "Namung opsis (operator sistem)",
        "protect-summary-cascade": "runtun",
        "protect-expiring": "kadaluwarsa $1 (UTC)",
        "protect-expiring-local": "kedaluwarsa $1",
        "protect-expiry-indefinite": "salawasé",
-       "protect-cascade": "Reksa kaca sing kalebu ing kaca iki (rereksan runtun).",
+       "protect-cascade": "Reksa kaca kang kalebu ing kaca iki (rereksan runtun).",
        "protect-cantedit": "Panjenengan ora bisa ngowahi tataran rereksan kaca iki amarga panjenengan ora kawogan mbesut.",
        "protect-othertime": "Wektu liyané:",
        "protect-othertime-op": "wektu liyané",
        "protect-existing-expiry": "Wektu kadaluwarsa saiki: $3, $2",
        "protect-otherreason": "Alesan tambahan/liyané:",
        "protect-otherreason-op": "Alesan liyané",
-       "protect-dropdown": "*Alesan umum pangreksa\n** Vandalisme makaping-kaping\n** Spam makaping-kaping\n** Perang besutan ora prodhuktif\n** Kaca sing dhuwur trafiké",
+       "protect-dropdown": "*Alesan umum pangreksa\n** Vandalisme makaping-kaping\n** Spam makaping-kaping\n** Perang besutan ora prodhuktif\n** Kaca kang dhuwur trafiké",
        "protect-edit-reasonlist": "Besut alesané ngreksa",
        "protect-expiry-options": "1 jam:1 hour,1 dina:1 day,1 minggu:1 week,2 minggu:2 weeks,1 wulan:1 month,3 wulan:3 months,6 wulan:6 months,1 taun:1 year,tanpa wates:infinite",
        "restriction-type": "Palilah:",
        "restriction-level-sysop": "kareksa sawutuhé",
        "restriction-level-autoconfirmed": "semu kareksa",
        "restriction-level-all": "kabèh tingkatan",
-       "undelete": "Deleng kaca sing dibusak",
+       "undelete": "Deleng kaca kang dibusak",
        "undeletepage": "Deleng lan pulihaké kaca kabusak",
-       "undeletepagetitle": "'''Ing ngisor iki kapacak daftar révisi sing dibusak saka [[:$1]]'''.",
-       "viewdeletedpage": "Deleng kaca sing wis dibusak",
+       "undeletepagetitle": "'''Ing ngisor iki kapacak pratélan révisi kang dibusak saka [[:$1]]'''.",
+       "viewdeletedpage": "Deleng kaca kang wis dibusak",
        "undeletepagetext": "{{PLURAL:$1|kaca iki wis dibusak nanging isih|$1 kaca iki wis dibusak nanging isih}} ana ing arsip lan bisa dibalèkaké.\nArsip bisa diresiki sakala-kala.",
        "undelete-fieldset-title": "Pulihaké révisi",
-       "undeleteextrahelp": "Saperlu mulihaké kabèh surajah kaca, jaraké kothak cèk kosong banjur klik <strong><em>{{int:undeletebtn}}</em></strong>.\nSaperlu ngayahi réstorasi sèlèktif, cèk kothak sing magepokan karo révisi sing arep dipulihaké, banjur klik <strong><em>{{int:undeletebtn}}</em></strong>.",
+       "undeleteextrahelp": "Saperlu mulihaké kabèh surajah kaca, jaraké kothak cèk kosong banjur klik <strong><em>{{int:undeletebtn}}</em></strong>.\nSaperlu ngayahi réstorasi sèlèktif, cèk kothak kang magepokan karo révisi kang arep dipulihaké, banjur klik <strong><em>{{int:undeletebtn}}</em></strong>.",
        "undeleterevisions": "$1 {{PLURAL:$1|révisi|révisi}} diarsipaké",
-       "undeletehistory": "Yèn panjenengan mbalèkaké kaca, kabèh révisi bakal dibalèkaké jroning sajarah.\nYèn sawijining kaca anyar kanthi jeneng sing padha wis digawé wiwit nalika pambusakan, révisi sing wis dibalèkaké bakal katon jroning sajarah sadurungé.",
-       "undeleterevdel": "Pambatalan pambusakan ora bakal dilakokaké yèn bab iku bakal ngakibataké révisi pungkasan kaca dadi sabagéyan kabusak.\nIng kasus kaya mengkono, panjenengan kudu ngilangaké cèk utawa mbusak pandelikan révisi kabusak sing anyar dhéwé.",
-       "undeletehistorynoadmin": "Kaca iki wis dibusak.\nAlesané dituduhaké ing ringkesan ing ngisor iki, karo détail para panganggo sing wis nyunting kaca iki sadurungé dibusak.\nIsi pungkasan tèks iki wis dibusak lan namung bisa dideleng para pangurus.",
-       "undelete-revision": "Révisi sing wis dibusak saka $1 (ing $5, $4) déning $3:",
-       "undeleterevision-missing": "Revisi salah utawa ora ditemokaké.\nPanjenengan mbokmenawa ngetutaké pranala sing salah, utawa revisi iku wis dipulihaké utawa diguwang saka arsip.",
-       "undelete-nodiff": "Ora ditemokaké révisi sing luwih lawas.",
+       "undeletehistory": "Yèn panjenengan mbalèkaké kaca, kabèh révisi bakal dibalèkaké jroning sajarah.\nYèn kaca anyar kanthi jeneng kang padha wis digawé wiwit nalika pambusakan, révisi kang wis dibalèkaké bakal katon jroning sajarah sadurungé.",
+       "undeleterevdel": "Pambatalan pambusakan ora bakal dilakokaké yèn bab iku bakal ngakibataké révisi pungkasan kaca dadi sabagéyan kabusak.\nIng kasus kaya mengkono, panjenengan kudu ngilangaké cèk utawa mbusak pandelikan révisi kabusak kang anyar dhéwé.",
+       "undeletehistorynoadmin": "Kaca iki wis dibusak.\nAlesané dituduhaké ing ringkesan ing ngisor iki, karo détail para panganggo kang wis mbesut kaca iki sadurungé dibusak.\nIsi pungkasan tèks iki wis dibusak lan namung bisa dideleng para pangurus.",
+       "undelete-revision": "Révisi kang wis dibusak saka $1 (ing $5, $4) déning $3:",
+       "undeleterevision-missing": "Revisi salah utawa ora tinemu.\nPanjenengan bokmanawa ngetutaké pranala kang salah, utawa revisi iku wis dipulihaké utawa diguwang saka arsip.",
+       "undelete-nodiff": "Ora tinemu révisi kang luwih lawas.",
        "undeletebtn": "Balèkna!",
        "undeletelink": "pirsani/balèkna",
        "undeleteviewlink": "pirsani",
        "undeletecomment": "Alesan:",
        "cannotundelete": "Olèhé mbatalaké pambusakan gagal;\n$1",
        "undeletedpage": "'''$1 bisa dibalèkaké'''\n\nDelengen [[Special:Log/delete|log pambusakan]] kanggo data pambusakan lan pambalèkan.",
-       "undelete-header": "Mangga mirsani [[Special:Log/delete|log pambusakan]] kanggo daftar kaca sing lagi waé dibusak.",
+       "undelete-header": "Mangga mirsani [[Special:Log/delete|log pambusakan]] kanggo pratélan kaca kang lagi waé dibusak.",
        "undelete-search-title": "Golèk kaca kabusak",
-       "undelete-search-box": "Golèk kaca-kaca sing wis dibusak",
-       "undelete-search-prefix": "Tuduhna kaca sing diwiwiti karo:",
+       "undelete-search-box": "Golèk kaca-kaca kang wis dibusak",
+       "undelete-search-prefix": "Tuduhna kaca kang diwiwiti karo:",
        "undelete-search-submit": "Golèk",
-       "undelete-no-results": "Ora ditemokaké kaca sing cocog ing arsip pambusakan.",
+       "undelete-no-results": "Ora tinemu kaca kang cocog ing arsip pambusakan.",
        "undelete-filename-mismatch": "Ora bisa mulihaké révisi barkas mawa tandha wektu $1: Jeneng barkas ora padha",
        "undelete-bad-store-key": "Ora bisa mbatalaké pambusakan révisi berkas mawa tandha wektu $1: berkas ilang sadurungé dibusak.",
-       "undelete-cleanup-error": "Ana kaluputan nalika mbusak arsip berkas \"$1\" sing ora dienggo.",
-       "undelete-missing-filearchive": "Ora bisa mulihaké arsip barkas ID $1 amarga ora ana ing basis data.\nBarkas iku bokmenawa wis dibusak.",
+       "undelete-cleanup-error": "Masalah nalika mbusak barkas arsip \"$1\" kang ora kanggo.",
+       "undelete-missing-filearchive": "Ora bisa mulihaké arsip barkas ID $1 amarga ora ana ing basis dhatah.\nBarkas iku bokmanawa wis binusek.",
        "undelete-error": "Masalah mulihaké kaca",
-       "undelete-error-short": "Kaluputan olèhé mbatalaké pambusakan: $1",
-       "undelete-error-long": "Ana kaluputan nalika mbatalaké pambusakan berkas:\n\n$1",
-       "undelete-show-file-confirm": "Apa panjenengan yakin arep mirsani révisi berkas \"<nowiki>$1</nowiki>\" sing wis kabusak ing $2 jam $3?",
+       "undelete-error-short": "Masalah nalika wurung mbusak barkas: $1",
+       "undelete-error-long": "Masalah nalika wurung mbusak barkas:\n\n$1",
+       "undelete-show-file-confirm": "Apa panjenengan yakin arep mirsani révisi berkas \"<nowiki>$1</nowiki>\" kang wis kabusak ing $2 jam $3?",
        "undelete-show-file-submit": "Ya",
        "namespace": "Mandala aran:",
        "invert": "Balèkaké pilihan",
        "tooltip-invert": "Centhang kothak iki kanggo ndhelikaké owahan saka kaca-kaca ing njero bilik jeneng kapilih (lan bilik jeneng kakait yèn dicenthang)",
        "namespace_association": "Mandala aran magepokan",
-       "tooltip-namespace_association": "Centhang kothak iki kanggo nglebokaké uga bilik jeneng gumenan utawa subyèk sing kakait karo bilik jeneng kapilih",
+       "tooltip-namespace_association": "Centhang kothak iki kanggo nglebokaké uga bilik jeneng gumenan utawa subyèk kang kakait karo bilik jeneng kapilih",
        "blanknamespace": "(Pokok)",
        "contributions": "Pisumbanging {{GENDER:$1|panganggo}}",
        "contributions-title": "Pisumbanging panganggo $1",
        "sp-contributions-newbies-sub": "Kanggo panganggo anyar",
        "sp-contributions-newbies-title": "Pisumbanging panganggo anyar",
        "sp-contributions-blocklog": "log blokir",
-       "sp-contributions-deleted": "pisumbangé {{GENDER:$1|panganggo}} sing dibusak",
+       "sp-contributions-deleted": "pisumbangé {{GENDER:$1|panganggo}} kang dibusak",
        "sp-contributions-uploads": "unggahan",
        "sp-contributions-logs": "log",
        "sp-contributions-talk": "rembug",
        "whatlinkshere-title": "Kaca mawa pranala nggayut \"$1\"",
        "whatlinkshere-page": "Kaca:",
        "linkshere": "Kaca-kaca ing ngisor iki nggayut menyang <strong>$2</strong>:",
-       "nolinkshere": "Ora ana kaca sing nduwé pranala menyang '''$2'''.",
-       "nolinkshere-ns": " Ora ana kaca sing nduwé pranala menyang '''$2''' ing bilik jeneng sing kapilih.",
+       "nolinkshere": "Ora ana kaca kang nduwé pranala menyang '''$2'''.",
+       "nolinkshere-ns": " Ora ana kaca kang nduwé pranala menyang '''$2''' ing bilik jeneng kang kapilih.",
        "isredirect": "kaca lih-lihan",
        "istemplate": "tranklusi",
        "isimage": "pranala barkas",
        "block": "Blokir panganggo",
        "unblock": "Uculaké blokirané panganggo",
        "blockip": "Palang {{GENDER:$1|panganggo}}",
-       "blockiptext": "Enggonen formulir ing ngisor iki saperlu mblokir aksès nulis lumantar alamat IP utawa panganggo mirunggan.\nIki kudu diayahi kanggo ngéndhani vandhalisme, lan minangkani [[{{MediaWiki:Policy-url}}|pranatan]].\nIsinen alesan sing mirunggan ing ngisor iki (contoné, nyitir kaca mirunggan sing dirusak).\nPanjenengan bisa mblokir saprangkat alamat IP lumantar sintaksis [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR]; kèhé prangkat sing diidinaké ya iku /$1 kanggo IPv4 lan /$2 kanggo IPv6.",
+       "blockiptext": "Enggonen formulir ing ngisor iki saperlu mblokir aksès nulis lumantar alamat IP utawa panganggo mirunggan.\nIki kudu diayahi kanggo ngéndhani vandhalisme, lan minangkani [[{{MediaWiki:Policy-url}}|pranatan]].\nIsinen alesan kang mirunggan ing ngisor iki (contoné, nyitir kaca mirunggan kang dirusak).\nPanjenengan bisa mblokir saprangkat alamat IP lumantar sintaksis [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR]; kèhé prangkat kang diidinaké ya iku /$1 kanggo IPv4 lan /$2 kanggo IPv6.",
        "ipaddressorusername": "Alamat IP utawa jeneng panganggo",
        "ipbexpiry": "Kadaluwarsa",
        "ipbreason": "Alesan:",
-       "ipbreason-dropdown": "*Alesan umum mblokir\n** Mènèhi informasi palsu\n** Mbusak isi kaca\n** Spam pranala menyang situs njaba\n** Nglebokaké tulisan ngawur ing kaca\n** Tumindak nglècèhaké\n** Ngujar-ujari sawenèh akun\n** Jeneng panganggo ora patut",
-       "ipb-hardblock": "Wurungaké panganggo sing wis mlebu log mbesut saka alamat IP iki",
+       "ipbreason-dropdown": "*Alesan kang lumrah blokiran\n** Mènèhi informasi palsu\n** Mbusak isi kaca\n** Nguwuh pranala menyang situs njaba\n** Nglebokaké tulisan ngawur ing kaca\n** Ngasoraké liyan\n** Nganggo sawenèh akun kanggo laku ala\n** Jeneng panganggo ora patut",
+       "ipb-hardblock": "Wurungaké panganggo kang wis mlebu log mbesut saka alamat IP iki",
        "ipbcreateaccount": "Penggak panggawéné akun",
        "ipbemailban": "Penggak panganggo saka ngirim layang-èl",
-       "ipbenableautoblock": "Otomatis blokir alamat IP pungkasan sing dienggo panganggo iki, lan samubarang alamat IP ing tembé sing arep dienggo mbesut.",
+       "ipbenableautoblock": "Otomatis blokir alamat IP pungkasan kang dienggo panganggo iki, lan samubarang alamat IP ing tembé kang arep dienggo mbesut.",
        "ipbsubmit": "Blokir panganggo iki",
        "ipbother": "Wektu liya",
        "ipboptions": "2 jam:2 hours,1 dina:1 day,3 dina:3 days,1 minggu:1 week,2 minggu:2 weeks,1 wulan:1 month,3 wulan:3 months,6 wulan:6 months,1 taun:1 year,tanpa wates:infinite",
        "badipaddress": "Alamat IP klèntu",
        "blockipsuccesssub": "Suksès mblokir",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] wis diblokir.<br />\nDeleng [[Special:BlockList|pratélan blokir]] saperlu mriksa blokiran.",
-       "ipb-blockingself": "Panjenengan arep mblokir panjenengan dhéwé! Panjenengan yakin arep nglakoni kuwi?",
-       "ipb-confirmhideuser": "Panjenengan arep mblokir panganggo mawa piranti \"dhelikaké panganggo\" isih murub. Iki bakal nyegah jeneng panganggo ana ing kabèh daptar lan èntri log. Panjenengan yakin arep nglakoni kuwi?",
+       "ipb-blockingself": "Panjenengan arep mblokir panjenengan dhéwé! Panjenengan yakin arep nglakoni iku?",
+       "ipb-confirmhideuser": "Panjenengan arep mblokir panganggo mawa piranti \"dhelikaké panganggo\" isih murub. Iki bakal nyegah jeneng panganggo ana ing kabèh pratélan lan èntri log. Panjenengan yakin arep nglakoni iku?",
        "ipb-edit-dropdown": "Besut alesané mblokir",
        "ipb-unblock-addr": "Copot blokiran tumrap $1",
        "ipb-unblock": "Copot blokiran tumrap jeneng panganggo utawa alamat IP",
-       "ipb-blocklist": "Deleng blokiran sing ana",
+       "ipb-blocklist": "Deleng blokiran kang ana",
        "ipb-blocklist-contribs": "Pasumbanging {{GENDER:$1|$1}}",
        "ipb-blocklist-duration-left": "Kari $1",
        "unblockip": "Copot blokiran panganggo",
-       "unblockiptext": "Nggonen formulir ing ngisor iki kanggo mbalèkaké aksès nulis sawijining alamt IP utawa panganggo sing sadurungé diblokir.",
+       "unblockiptext": "Nggonen formulir ing ngisor iki kanggo mbalèkaké aksès nulis alamat IP utawa panganggo kang sadurungé diblokir.",
        "ipusubmit": "Copot blokiran iki",
        "unblocked": "Blokir marang [[User:$1|$1]] wis dijabel",
        "unblocked-range": "$1 ora diblokir manèh",
        "autoblocklist-localblocks": "{{PLURAL:$1|Swablokir}} enggonan",
        "autoblocklist-empty": "Pratélan swablokir kosong.",
        "ipblocklist": "Panganggo diblokir",
-       "ipblocklist-legend": "Golèk panganggo sing diblokir",
+       "ipblocklist-legend": "Golèk panganggo kang diblokir",
        "blocklist-userblocks": "Dhelikaké blokiran akun",
        "blocklist-tempblocks": "Dhelikaké blokiran sawetara",
        "blocklist-addressblocks": "Dhelikaké blokiran IP tunggal",
        "emailblock": "layang-èl dipatèni",
        "blocklist-nousertalk": "ora kena mbesut kaca parembugané dhéwé",
        "ipblocklist-empty": "Pratélan blokir kosong.",
-       "ipblocklist-no-results": "alamat IP utawa panganggo sing disuwun ora diblokir.",
+       "ipblocklist-no-results": "alamat IP utawa panganggo kang disuwun ora diblokir.",
        "blocklink": "palang",
        "unblocklink": "copot blokiran",
        "change-blocklink": "owahi blokiran",
        "blocklog-showsuppresslog": "Panganggo iki wis tau diblokir lan didhelikaké sakdurungé.\nLog brèdèlan sumadhiya ing ngisor kanggo rujukan:",
        "blocklogentry": "mblokir [[$1]] kanthi wektu kadaluwarsa $2 $3",
        "reblock-logentry": "ngowah setèlan blokir tumrap [[$1]] kanthi wektu kadaluwarsa $2 $3",
-       "blocklogtext": "Ing ngisor iki kapacak log pamblokiran lan panjabelan blokir panganggo.\nAlamat IP sing diblokir sacara otomatis ora ana ing daftar iki.\nMangga mirsani [[Special:BlockList|daftar panganggo sing diblokir]] kanggo daftar blokir pungkasan.",
+       "blocklogtext": "Ing ngisor iki kapacak log pamblokiran lan panjabelan blokir panganggo.\nAlamat IP kang diblokir sacara otomatis ora ana ing pratélan iki.\nMangga mirsani [[Special:BlockList|pratélan panganggo kang diblokir]] kanggo pratélan blokiran pungkasan.",
        "unblocklogentry": "njabel blokir \"$1\"",
        "block-log-flags-anononly": "namung panganggo anonim",
        "block-log-flags-nocreate": "panggawéné akun dipatèni",
        "range_block_disabled": "Fungsi pamblokir blok IP kanggo para opsis dipatèni.",
        "ipb_expiry_invalid": "Wektu kadaluwarsa ora absah.",
        "ipb_expiry_old": "Wektu kadaluwarsa ana ing nguni.",
-       "ipb_expiry_temp": "Pamblokiran tumrap jeneng panganggo sing didhelikaké kudu permanèn.",
+       "ipb_expiry_temp": "Pamblokiran tumrap jeneng panganggo kang didhelikaké kudu permanèn.",
        "ipb_hide_invalid": "Ora bisa ndhelikaké akun iki; manawa wis kakèhan suntingan.",
        "ipb_already_blocked": "\"$1\" wis diblokir",
        "ipb-needreblock": "$1 wis diblokir. Apa panjenengan sedya ngowahi patrapan blokiran kasebut?",
        "ipb-otherblocks-header": "{{PLURAL:$1|Blokiran|Blokiran}} liya",
        "unblock-hideuser": "Panjenengan ora bisa mbukak blokiran panganggo iki amarga jeneng panganggoné didhelikaké.",
-       "ipb_cant_unblock": "Kaluputan: Blokir mawa ID $1 ora ditemokaké. Blokir iku mbok-menawa wis dibuka.",
-       "ipb_blocked_as_range": "Kaluputan: IP $1 ora diblokir sacara langsung lan ora bisa dijabel blokiré. IP $1 diblokir mawa bagéyan saka pamblokiran kelompok IP $2, sing bisa dijabel pamblokirané.",
+       "ipb_cant_unblock": "Masalah: ID blokiran $1 ora tinemu. Blokiran iku bokmanawa wis kabukak.",
+       "ipb_blocked_as_range": "Masalah: Alamat IP $1 ora langsung kablokir lan ora bisa kabukak blokirané.\nMangkonoa, alamat IP-né kablokir awit saka pérangané $2, kang bisa kabukak blokirané.",
        "ip_range_invalid": "Blok IP ora absah.",
        "ip_range_toolarge": "Jangkahé blokiran luwih gedhé saka /$1 ora dililakaké.",
        "proxyblocker": "Pamblokir proxy",
-       "proxyblockreason": "Alamat IP panjenengan wis diblokir amerga alamat IP panjenengan iku ''open proxy''.\nMangga ngubungi sing nyedyakaké dines internèt panjenengan utawa pitulungan tèknis lan aturana masalah kaamanan sérius iki.",
+       "proxyblockreason": "Alamat IP panjenengan wis diblokir amarga alamat IP panjenengan iku ''open proxy''.\nMangga ngubungi kang nyedyakaké dines internèt panjenengan utawa pitulungan tèknis lan aturana masalah kaamanan sérius iki.",
        "sorbsreason": "Alamat IP panjenengan didaftar minangka ''open proxy'' ing DNSBL.",
        "sorbs_create_account_reason": "Alamat IP panjenengan didaftar minangka ''open proxy'' ing DNSBL. Panjenengan ora bisa nggawé akun utawa rékening.",
        "xffblockreason": "Sebuah alamat IP di kepala X-Forwarded-For, entah milik Anda atau server proxy yang Anda pakai, telah diblokir. Alasan pemblokirannya adalah: $1",
-       "cant-see-hidden-user": "Panganggo sing panjenengan coba blokir wis kablokir lan didhelikaké.\nAmarga panjenengan ora nduwé hak ndhelikaké panganggo, panjenengan ora bisa ndelok utawa nyunting blokiran panganggo.",
+       "cant-see-hidden-user": "Panganggo kang panjenengan coba blokir wis kablokir lan didhelikaké.\nAmarga panjenengan ora nduwé hak ndhelikaké panganggo, panjenengan ora bisa ndeleng utawa mbesut blokiran panganggo.",
        "ipbblocked": "Panjenengan ora bisa mblokir utawa mbukak blokiran panganggo liya amarga panjenengan dhéwé diblokir",
        "ipbnounblockself": "Panjenengan ora dililakaké mbukak blokirané panjenengan",
-       "lockdb": "Kunci basis data",
-       "unlockdb": "Buka kunci basis data",
-       "lockdbtext": "Ngunci basis data bakal menggak kabèh panganggo kanggo nyunting kaca, ngowahi prèferènsi panganggo, nyunting daftar pangawasan, lan prekara-prekara liyané sing merlokaké owah-owahan basis data. Pastèkna yèn iki pancèn panjenengan gayuh, lan yèn panjenengan ora lali mbuka kunci basis data sawisé pangopènan rampung.",
-       "unlockdbtext": "Mbuka kunci basis data bakal mbalèkaké kabèh panganggo bisa nyunting kaca manèh, ngowahi prèferènsi panganggo, nyunting daftar pangawasan, lan prekara-prekara liyané sing merlokaké pangowahan marang basis data.\nTulung pastèkna yèn iki pancèn sing panjenengan gayuh.",
+       "lockdb": "Gembok basis dhatah",
+       "unlockdb": "Bukak gembok basis dhatah",
+       "lockdbtext": "Ngunci basis data bakal menggak kabèh panganggo kanggo mbesut kaca, ngowahi prèferènsi panganggo, mbesut pawawangan, lan prekara-prekara liyané kang merlokaké owah-owahan basis data. Pastèkna yèn iki pancèn panjenengan gayuh, lan yèn panjenengan ora lali mbuka kunci basis data sawisé pangopènan rampung.",
+       "unlockdbtext": "Mbukak kunci basis data bakal mbalèkaké kabèh panganggo bisa mbesut kaca manèh, ngowahi prèferènsi panganggo, mbesut pawawangan, lan prekara-prekara liyané kang merlokaké pangowahan marang basis data.\nTulung pastèkna yèn iki pancèn kang panjenengan gayuh.",
        "lockconfirm": "Iya, aku pancèn péngin ngunci basis data.",
        "unlockconfirm": "Iya, aku pancèn péngin tmbuka kunci basis data.",
        "lockbtn": "Kunci basis data",
        "lockedbyandtime": "(déning {{GENDER:$1|$1}} tanggal $2 wanci $3)",
        "move-page": "Ngalih $1",
        "move-page-legend": "Mindhah kaca",
-       "movepagetext": "Formulir ing ngisor iki bakal ngganti jeneng kaca lan ngalihaké kabèh sajarahé nyang jeneng anyar.\nJeneng lawas bakal dadi kaca alihan marang jeneng anyar.\nPanjenengan bisa ndandani kaca alihan sing otomatis nggayut nyang kaca asliné.\nYèn ora, pesthèkaké yèn panjenengan wis mriksa ana-orané kaca alihan [[Special:DoubleRedirects|dhobel]] utawa [[Special:BrokenRedirects|rusak]].\nPanjenengan kudu tanggon saperlu mesthèkaké yèn pranalané menyang kaca sing samesthiné.\n\nÉling-élingen yèn kacané <strong>ora</strong> bakal dilih yèn jeneng sing dituju wis ana kacané, kajaba isiné kaca alihan sing ora ana sajarah besutané.\nIki ateges panjenengan bisa ngganti jeneng kaca bali nyang asliné manawa ana salah, lan panjenengan ora bisa ngamblegi kaca sing wis ana.\n\n<strong>Cathetan:</strong>\nTumindak iki bisa dadi owahan sing ora kinira lan gedhé mungguh ing kaca sing misuwur;\nmangga pesthèkaké dhisik yèn panjenengan mudheng temahané sadurungé mbacutaké.",
-       "movepagetext-noredirectfixer": "Formulir ing ngisor iki bakal ngganti jeneng kaca lan ngalihaké kabèh sajarahé nyang jeneng anyar.\nJeneng lawas bakal dadi kaca alihan marang jeneng anyar.\nPanjenengan kudu yakin yèn wis mriksa ana-orané kaca alihan [[Special:DoubleRedirects|dhobel]] utawa [[Special:BrokenRedirects|rusak]].\nPanjenengan kudu tanggon saperlu mesthèkaké yèn pranalané menyang kaca sing samesthiné.\n\nÉling-élingen yèn kacané <strong>ora</strong> bakal dilih yèn jeneng sing dituju wis ana kacané, kajaba isiné kaca alihan sing ora ana sajarah besutané.\nIki ateges panjenengan bisa ngganti jeneng kaca bali nyang asliné manawa ana salah, lan panjenengan ora bisa ngamblegi kaca sing wis ana.\n\n<strong>Cathetan:</strong>\nTumindak iki bisa dadi owahan sing ora kinira lan gedhé mungguh ing kaca sing misuwur;\nmangga pesthèkaké dhisik yèn panjenengan mudheng temahané sadurungé mbacutaké.",
-       "movepagetalktext": "Menawa panjenengan nyénthang kothak iki, kaca parembugan sing magepokan bakal otomatis dilih nyang sesirah anyar, kajaba kaca parembugané sing dituju wis ana isiné.\n\nYèn mangkéné, panjenengan kudu ngalih utawa nggabung kaca-kaca iku kanthi manual.",
-       "moveuserpage-warning": "<strong>Pènget:</strong> Panjenengan iki arep ngalih kaca panganggo. Mangga èlingana yèn mung kacané waé sing bakal dilih, déné panganggoné <em>ora</em> bakal ganti jeneng.",
-       "movecategorypage-warning": "<strong>Pélik:</strong> Panjenengan arep ngalih kaca kategori. Tulung gatèkaké yèn mung kacané thok sing bakal dilih déné samubarang kaca sing ana ing kategori lawas <em>ora</em> bakal mèlu dilih nyang kaca kategori anyar.",
-       "movenologintext": "Panjenengan kudu dadi panganggo sing kadhaftar lan wis [[Special:UserLogin|mlebu log]] yèn arep ngalihaké kaca.",
+       "movepagetext": "Formulir ing ngisor iki bakal ngganti jeneng kaca lan ngalihaké kabèh sajarahé menyang jeneng anyar.\nJeneng lawas bakal dadi kaca alihan marang jeneng anyar.\nPanjenengan bisa ndandani kaca alihan kang otomatis nggayut menyang kaca asliné.\nYèn ora, pesthèkaké yèn panjenengan wis mriksa ana-orané kaca alihan [[Special:DoubleRedirects|dhobel]] utawa [[Special:BrokenRedirects|rusak]].\nPanjenengan kudu tanggung jawab mesthèkaké yèn pranalané menyang kaca kang samesthiné.\n\nÉling-élinga yèn kacané <strong>ora</strong> bakal ingalih yèn jeneng kang kaener wis ana kacané, kajaba isiné kaca alihan kang ora ana sajarah besutané.\nIki ateges panjenengan bisa ngganti jeneng kaca bali menyang asliné manawa kaluputan, lan panjenengan ora bisa ngamblegi kaca kang wis ana.\n\n<strong>Cathetan:</strong>\nLaku iki bisa dadi owahan kang ora kinira lan gedhé mungguh ing kaca kang misuwur;\nsumangga pesthèkaké dhisik yèn panjenengan mudheng temahané sadurungé mbacutaké.",
+       "movepagetext-noredirectfixer": "Formulir ing ngisor iki bakal ngganti jeneng kaca lan ngalihaké kabèh sajarahé menyang jeneng anyar.\nJeneng lawas bakal dadi kaca alihan marang jeneng anyar.\nPanjenengan kudu yakin yèn wis mriksa ana-orané kaca alihan [[Special:DoubleRedirects|dhobel]] utawa [[Special:BrokenRedirects|rusak]].\nPanjenengan kudu tanggung jawab mesthèkaké yèn pranalané menyang kaca kang samesthiné.\n\nÉling-élinga yèn kacané <strong>ora</strong> bakal ingalih yèn jeneng kang kaener wis ana kacané, kajaba isiné kaca alihan kang ora ana sajarah besutané.\nIki ateges panjenengan bisa ngganti jeneng kaca bali menyang asliné manawa ana salah, lan panjenengan ora bisa ngamblegi kaca kang wis ana.\n\n<strong>Cathetan:</strong>\nLaku iki bisa dadi owahan kang ora kinira lan gedhé mungguh ing kaca kang misuwur;\nsumangga pesthèkaké dhisik yèn panjenengan mudheng temahané sadurungé mbacutaké.",
+       "movepagetalktext": "Manawa panjenengan nyénthang kothak iki, kaca parembugan kang magepokan bakal otomatis dilih menyang sesirah anyar, kajaba kaca parembugané kang dituju wis ana isiné.\n\nYèn mangkéné, panjenengan kudu ngalih utawa nggabung kaca-kaca iku kanthi manual.",
+       "moveuserpage-warning": "<strong>Pènget:</strong> Panjenengan iki arep ngalih kaca panganggo. Mangga èlingana yèn mung kacané waé kang bakal dilih, déné panganggoné <em>ora</em> bakal ganti jeneng.",
+       "movecategorypage-warning": "<strong>Pélik:</strong> Panjenengan arep ngalih kaca kategori. Tulung gatèkaké yèn mung kacané kang bakal dilih déné samubarang kaca kang ana ing kategori lawas <em>ora</em> bakal mèlu dilih menyang kaca kategori anyar.",
+       "movenologintext": "Panjenengan kudu dadi panganggo kang kadhaftar lan wis [[Special:UserLogin|mlebu log]] yèn arep ngalihaké kaca.",
        "movenotallowed": "Panjenengan ora pareng ngalihaké kaca.",
        "movenotallowedfile": "Panjenengan ora duwé hak kanggo mindhahaké berkas.",
        "cant-move-user-page": "Panjenengan ora nduwèni hak aksès kanggo mindhahaké kaca panganggo (kapisah saka anak-kaca).",
-       "cant-move-to-user-page": "Panjenengan ora nduwèni hak aksès kanggo mindhahaké kaca menyang sawijining kaca panganggoa (kajaba menyang anak-kaca panganggo).",
+       "cant-move-to-user-page": "Panjenengan ora nduwèni hak aksès kanggo mindhahaké kaca menyang kaca panganggo (kajaba menyang anak-kaca panganggo).",
        "newtitle": "Sesirah anyar:",
        "move-watch": "Awasna kaca iki",
        "movepagebtn": "Ngalih kaca",
        "movepage-moved": "<strong>\"$1\" wis dilih menyang \"$2\"</strong>",
        "movepage-moved-redirect": "Kaca alihan wis kagawé.",
        "movepage-moved-noredirect": "Kanggo gawé pengalihan wis ditahan.",
-       "articleexists": "Kaca mawa jeneng mangkono wis ana utawa jeneng sing kokpilih ora valid.\nMangga pilih jeneng liya.",
-       "cantmove-titleprotected": "Panjenengan ora bisa mindhahaké kaca iki menyang lokasi iki, amerga irah-irahan tujuan lagi direksa; ora olèh digawé",
-       "movetalk": "Lih kaca parembugan sing magepokan",
+       "articleexists": "Kaca mawa jeneng mangkono wis ana utawa jeneng kang kokpilih ora valid.\nMangga pilih jeneng liya.",
+       "cantmove-titleprotected": "Panjenengan ora bisa mindhahaké kaca iki menyang lokasi iki, amarga irah-irahan tujuan lagi direksa; ora olèh digawé",
+       "movetalk": "Lih kaca parembugan kang magepokan",
        "move-subpages": "Lih anak kaca (tekan $1)",
        "move-talk-subpages": "Lih anak kaca saka kaca parembugan (tekan $1)",
        "movepage-page-exists": "Kaca $1 wis ana lan ora bisa ditindhes sacara otomatis.",
        "movepage-page-moved": "Kaca $1 wis dilih menyang $2.",
        "movepage-page-unmoved": "Kaca $1 ora bisa dialihaké menyang $2.",
-       "movepage-max-pages": "Paling akèh $1 {{PLURAL:$1|kaca|kaca}} wis dialihaké lan ora ana manèh sing bakal dialihaké sacara otomatis.",
+       "movepage-max-pages": "Paling akèh $1 {{PLURAL:$1|kaca|kaca}} wis dialihaké lan ora ana manèh kang bakal dialihaké sacara otomatis.",
        "movelogpage": "Log alih",
        "movelogpagetext": "Ing ngisor iki kapacak log pangalihan kaca.",
        "movesubpage": "{{PLURAL:$1|Anak-kaca|Anak-kaca}}",
        "delete_and_move_text": "Kaca paran \"[[:$1]]\" wis ana.\nApa panjenengan péngin mbusak iku supaya kacané bisa dilih?",
        "delete_and_move_confirm": "Ya, busak kaca iku.",
        "delete_and_move_reason": "Dibusak kanggo sarana ngalihaké saka \"[[$1]]\"",
-       "selfmove": "Sesirah sumber lan tujuan padha;\nora bisa ngalih nyang tujuan sing padha.",
+       "selfmove": "Sesirah sumber lan tujuan padha;\nora bisa ngalih menyang tujuan kang padha.",
        "immobile-source-namespace": "Ora bisa mindhahaké kaca jroning bilik jeneng \"$1\"",
        "immobile-target-namespace": "Ora bisa mindhahaké kaca menyang bilik jeneng \"$1\"",
-       "immobile-target-namespace-iw": "Pranala interwiki dudu tujuan sing trep tumrap pangalihé kaca.",
+       "immobile-target-namespace-iw": "Pranala interwiki dudu tujuan kang trep tumrap pangalihé kaca.",
        "immobile-source-page": "Kaca iki ora bisa dilih-lih.",
        "immobile-target-page": "Ora bisa mindhahaké menyang irah-irahan tujuan kasebut.",
-       "bad-target-model": "Tujuan sing diarepaké nganggo gagrag isi sing béda. Ora bisa ngganti $1 dadi $2.",
+       "bad-target-model": "Tujuan kang diarepaké nganggo gagrag isi kang béda. Ora bisa ngganti $1 dadi $2.",
        "imagenocrossnamespace": "Ora bisa mindhahaké gambar menyang bilik nama non-gambar",
-       "nonfile-cannot-move-to-file": "Ora bisa ngalih non-barkas nyang mandala aran barkas.",
+       "nonfile-cannot-move-to-file": "Ora bisa ngalih non-barkas menyang mandala aran barkas.",
        "imagetypemismatch": "Èkstènsi anyar berkas ora cocog karo jenisé",
        "imageinvalidfilename": "Jeneng barkas tujuan ora trep.",
-       "fix-double-redirects": "Dandani kabèh pangalihan gandha sing tumuju marang irah-irahan asli",
+       "fix-double-redirects": "Dandani kabèh pangalihan gandha kang tumuju marang irah-irahan asli",
        "move-leave-redirect": "Ungkur kaca alihan",
-       "protectedpagemovewarning": "'''Pènget:''' Kaca iki wis dikunci dadi mung panganggo sing nduwé hak aksès pangurus baé sing bisa mindhahaké.\nCathetan entri pungkasan disadiakaké ing ngisor kanggo referensi:",
-       "semiprotectedpagemovewarning": "<strong>Cathetan:</strong> Kaca iki wis direksa saéngga mung panganggo kadhaftar sing bisa ngalihaké.\nÈntri log pungkasan cumepak ing ngisor kanggo rujukan:",
+       "protectedpagemovewarning": "'''Pènget:''' Kaca iki wis dikunci dadi mung panganggo kang nduwé hak aksès pangurus baé kang bisa mindhahaké.\nCathetan entri pungkasan disadiakaké ing ngisor kanggo referensi:",
+       "semiprotectedpagemovewarning": "<strong>Cathetan:</strong> Kaca iki wis direksa saéngga mung panganggo kadhaftar kang bisa ngalihaké.\nÈntri log pungkasan cumepak ing ngisor kanggo rujukan:",
        "move-over-sharedrepo": "[[:$1]] ana ing panyimpenan barengan. Ngalih barkas mawa sesirah iki bakal ngamblegi barkas barengan iku.",
        "file-exists-sharedrepo": "Jeneng berkas kapilih wis ana kanggo ing panyimpenan bebarengan.\nMangga pilih jeneng liya.",
        "export": "Èspor kaca",
-       "exporttext": "Panjenengan bisa ngèkspor tèks lan sajarah panyuntingan sawijining kaca tartamtu utawa sawijining sèt kaca awujud XML tartamtu. Banjur iki bisa diimpor ing wiki liyané nganggo MediaWiki nganggo fasilitas [[Special:Import|impor kaca]].\n\nKanggo ngèkspor kaca-kaca artikel, lebokna irah-irahan utawa judhul sajroning kothak tèks ing ngisor iki, irah-irahan utawa judhul siji per baris, lan pilihen apa panjenengan péngin ngèkspor jangkep karo vèrsi sadurungé, utawa namung vèrsi saiki mawa cathetan panyuntingan pungkasan.\n\nYèn panjenengan namun péngin ngimpor vèrsi pungkasan, panjenengan uga bisa nganggo pranala kusus, contoné [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] kanggo ngèkspor artikel \"[[{{MediaWiki:Mainpage}}]]\".",
+       "exporttext": "Panjenengan bisa ngèkspor tèks lan sajarah panyuntingan kaca tartamtu utawa sèt kaca awujud XML tartamtu. Banjur iki bisa diimpor ing wiki liyané nganggo MediaWiki nganggo fasilitas [[Special:Import|impor kaca]].\n\nKanggo ngèkspor kaca-kaca artikel, lebokna irah-irahan utawa judhul sajroning kothak tèks ing ngisor iki, irah-irahan utawa judhul siji per baris, lan pilihen apa panjenengan péngin ngèkspor jangkep karo vèrsi sadurungé, utawa namung vèrsi saiki mawa cathetan panyuntingan pungkasan.\n\nYèn panjenengan namun péngin ngimpor vèrsi pungkasan, panjenengan uga bisa nganggo pranala kusus, contoné [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] kanggo ngèkspor artikel \"[[{{MediaWiki:Mainpage}}]]\".",
        "exportall": "Ngèkspor kabèh kaca",
        "exportcuronly": "Namung èkspor révisi saiki, dudu kabèh vèrsi lawas",
        "exportnohistory": "----\n'''Cathetan:''' Ngèkspor kabèh sajarah suntingan kaca ngliwati formulir iki wis dinon-aktifaké déning alesan kinerja.",
-       "exportlistauthors": "Lebokaké daptar jangkep kontributor kanggo pendhak kaca",
+       "exportlistauthors": "Lebokaké pratélan jangkep kontributor kanggo pendhak kaca",
        "export-submit": "Èkspor",
        "export-addcattext": "Tambahna kaca saka kategori:",
        "export-addcat": "Tambahna",
        "allmessagesdefault": "Tèks baku",
        "allmessagescurrent": "Tèks saiki",
        "allmessagestext": "Iki pratélan layang sistem kang ana ing mandala aran MediaWiki.\nMangga manjing [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Panglokalan MediaWiki] lan [https://translatewiki.net translatewiki.net] manawa panjenengan arep nyumbang ing panglokalan MediaWiki kangasli.",
-       "allmessagesnotsupportedDB": "Kaca iki ora bisa dienggo amerga '''$wgUseDatabaseMessages''' dipatèni.",
+       "allmessagesnotsupportedDB": "Kaca iki ora bisa dienggo amarga '''$wgUseDatabaseMessages''' dipatèni.",
        "allmessages-filter-legend": "Penyaring",
        "allmessages-filter": "Saring nganggo kahanan kustomisasi:",
        "allmessages-filter-unmodified": "Ora diowahi",
        "allmessages-filter-translate": "Pertal",
        "thumbnail-more": "Gedhèkaké",
        "filemissing": "Barkas ilang",
-       "thumbnail_error": "Kaluputan nalika nggawé gambar cilik (''thumbnail''): $1",
+       "thumbnail_error": "Masalah nalika nggawé gambar mini: $1",
        "thumbnail_error_remote": "Layang masalah saka $1:\n$2",
        "djvu_page_error": "Kaca DjVu ana ing sajabaning ranggèhan (''range'')",
        "djvu_no_xml": "Ora bisa njupuk XML kanggo berkas DjVu",
        "thumbnail_image-missing": "Barkasé kayané ora ana: $1",
        "import": "Impor kaca",
        "importinterwiki": "Impor saka wiki liya",
-       "import-interwiki-text": "Pilih sawijining wiki lan irah-irahan kaca kang arep diimpor.\nTanggal révisi lan jeneng panyunting bakal dilestarèkaké.\nKabèh aktivitas impor transwiki bakal dilog ing [[Special:Log/import|log impor]].",
+       "import-interwiki-text": "Pilih wiki lan irah-irahan kaca kang arep diimpor.\nTanggal révisi lan jeneng panyunting bakal dilestarèkaké.\nKabèh aktivitas impor transwiki bakal dilog ing [[Special:Log/import|log impor]].",
        "import-interwiki-sourcewiki": "Wiki sumber:",
        "import-interwiki-sourcepage": "Kaca sumber:",
        "import-interwiki-history": "Tuladen kabèh vèrsi lawas saka kaca iki",
        "importnofile": "Ora ana berkas sumber impor kang wis diunggahaké.",
        "importuploaderrorsize": "Unggahan barkas impor ora dadi.\nBarkasé gedhéné ngluwihi ukuran kang diidinaké.",
        "importuploaderrorpartial": "Pangunggahan berkas impor gagal. Namung sabagéyan berkas kang kasil bisa diunggahaké.",
-       "importuploaderrortemp": "Pangunggahan berkas gagal. Sawijining dirèktori sauntara kang dibutuhaké ora ana.",
+       "importuploaderrortemp": "Pangunggahan berkas gagal. Map sauntara kang dibutuhaké ora ana.",
        "import-parse-failure": "Prosès impor XML gagal",
        "import-noarticle": "Ora ana kaca kang bisa diimpor!",
        "import-nonewrevisions": "Kabèh révisi sadurungé wis tau diimpor.",
        "import-token-mismatch": "Kélangan data sèsi. Mangga dijajal manèh.",
        "import-invalid-interwiki": "Ora bisa ngimpor saka wiki kang kapilih.",
        "import-error-edit": "Kaca \"$1\" ora kaimpor amarga panjenengan ora kawogan mbesut iku.",
-       "import-error-create": "Kaca \"$1\" ora diimpor amarga panjenengan ora dililakaké nggawé kuwi.",
+       "import-error-create": "Kaca \"$1\" ora diimpor amarga panjenengan ora dililakaké nggawé iku.",
        "import-error-interwiki": "Kaca \"$1\" ora diimpor amarga jenengé dicadhangaké kango pranala njaba (interwiki).",
        "import-error-special": "Kaca \"$1\" ora diimpor amarga darbèké mandala aran mirunggan kang ora nglilakaké anané kaca.",
        "import-error-invalid": "Kaca \"$1\" ora diimpor amarga jenengé ora trep kanggo wiki iki.",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|révisi}} diimpor",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|révisi}} diimpor saka $2",
        "javascripttest": "Panjajalan JavaScript",
-       "javascripttest-pagetext-unknownaction": "Tumindak ora dingertèni: $1",
+       "javascripttest-pagetext-unknownaction": "Laku ora kaweruhan: \"$1\"",
        "javascripttest-qunit-intro": "Deleng [$1 dhokumèntasi uji-coba] ing mediawiki.org.",
        "tooltip-pt-userpage": "Kaca {{GENDER:|panganggoné panjenengan}}",
        "tooltip-pt-anonuserpage": "Kaca panganggo IP panjenengan",
        "tooltip-feed-rss": "''RSS feed'' kanggo kaca iki",
        "tooltip-feed-atom": "Pakan atom tumrap kaca iki",
        "tooltip-t-contributions": "Pratélaning pisumbanging {{GENDER:$1|panganggo iki}}",
-       "tooltip-t-emailuser": "Kirimi layang-èl nyang {{GENDER:$1|panganggo iki}}",
+       "tooltip-t-emailuser": "Kirimi layang-èl menyang {{GENDER:$1|panganggo iki}}",
        "tooltip-t-info": "Katerangan liyané ngenani kaca iki",
        "tooltip-t-upload": "Unggah barkas",
        "tooltip-t-specialpages": "Pratélaning kabèh kaca mirunggan",
        "tooltip-compareselectedversions": "Delengen prabédan antara rong vèrsi kaca iki kang dipilih.",
        "tooltip-watch": "Wuwuh kaca iki menyang pawawangané panjenengan",
        "tooltip-watchlistedit-normal-submit": "Busak sesirah",
-       "tooltip-watchlistedit-raw-submit": "Anyari daptar pangawasan",
-       "tooltip-recreate": "Gawéa kaca iki manèh senadyan tau dibusak",
+       "tooltip-watchlistedit-raw-submit": "Anyari pawawangan",
+       "tooltip-recreate": "Gawéa manèh kaca iki sanajan tau dibusak",
        "tooltip-upload": "Wiwit ngunggah",
        "tooltip-rollback": "\"Balèkaké\" bakal murungaké besutané kang nyumbang pungkasan ing kaca iki sarana ngeklik pisan",
        "tooltip-undo": "\"Wurung\" mbalèkaké besutan iki lan mbukak blangko besutan sarana modhe pratuduh. Alesan kena diwuwuhaké ing babagan ringkesan.",
        "creditspage": "Informasi para panulis kaca",
        "nocredits": "Ora ana informasi ngenani para panulis ing kaca iki.",
        "spamprotectiontitle": "Filter anti-spam",
-       "spamprotectiontext": "Kaca kang arep panjenengan simpen diblokir déning filter spam.\nMbokmanawa iki disebabaké anané pranala jaba kang klebu daftar ireng.",
+       "spamprotectiontext": "Kaca kang arep panjenengan simpen diblokir déning filter spam.\nMbokmanawa iki disebabaké anané pranala jaba kang klebu pratélan ireng.",
        "spamprotectionmatch": "Tèks kang kapacak iki mancing filter spam kita: $1",
        "spambot_username": "Resik-resik spam MediaWiki",
        "spam_reverting": "Mbalèkaké menyang vèrsi pungkasan kang ora ana pranalané menyang $1",
        "spam_blanking": "Kabèh révisi kang duwé pranala menyang $1, pangosongan",
-       "spam_deleting": "Kabèh benahan kang nduwé pranala ing $1, dibusaki",
+       "spam_deleting": "Kabèh révisi kang ngemu pranala menyang $1 binusek",
        "simpleantispam-label": "Pamariksa anti-spam.\nIki <strong>aja</strong> diisi!",
        "pageinfo-title": "Katerangan bab \"$1\"",
        "pageinfo-not-current": "Maaf, tidak mungkin memberikan informasi ini ke revisi lama.",
        "rcpatroldisabled": "Patroli owah-owahan pungkasan dipatèni",
        "rcpatroldisabledtext": "Fitur patroli owah-owahan pungkasan lagi dipatèni.",
        "markedaspatrollederror": "Ora bisa awèh tandha wis dipatroli",
-       "markedaspatrollederrortext": "Panjenengan kudu nentokaké sawijining révisi kanggo ditandhani minangka kang dipatroli.",
+       "markedaspatrollederrortext": "Panjenengan kudu nentokaké révisi kanggo ditandhani minangka kang dipatroli.",
        "markedaspatrollederror-noautopatrol": "Panjenengan ora kena nandhani besutané panjenengan dhéwé minangka kapriksa.",
        "markedaspatrollednotify": "Owahan $1 wis dipatroli.",
        "markedaspatrollederrornotify": "Penanda patroli gagal dibuat.",
        "patrol-log-header": "Iki log revisi kang wis dipatroli.",
        "confirm-markpatrolled-button": "YA",
        "deletedrevision": "Revisi lawas kang dibusak $1.",
-       "filedeleteerror-short": "Kaluputan nalika mbusak berkas: $1",
-       "filedeleteerror-long": "Ana kaluputan nalika mbusak berkas:\n\n$1",
-       "filedelete-missing": "Berkas \"$1\" ora bisa dibusak amerga ora ditemokaké.",
+       "filedeleteerror-short": "Masalah nalika mbusak barkas: $1",
+       "filedeleteerror-long": "Ana masalah nalika mbusek barkas:\n\n$1",
+       "filedelete-missing": "Barkas \"$1\" ora bisa dibusek amarga ora tinemu.",
        "filedelete-old-unregistered": "Révisi berkas \"$1\" kang diwènèhaké ora ana sajroning basis data.",
        "filedelete-current-unregistered": "Berkas kang dispésifikasi \"$1\" ora ana sajroning basis data.",
        "filedelete-archive-read-only": "Dirèktori arsip \"$1\" ora bisa ditulis déning server wèb.",
        "file-no-thumb-animation": "'''Catatan: Karena keterbatasan teknis, cuplikan berkas ini tidak akan teranimasikan.'''",
        "file-no-thumb-animation-gif": "'''Catatan: Karena keterbatasan teknis, cuplikan gambar GIF beresolusi tinggi seperti yang satu ini tidak akan teranimasikan.'''",
        "newimages": "Galeri berkas anyar",
-       "imagelisttext": "Ing ngisor iki kapacak daftar '''$1''' {{PLURAL:$1|berkas|berkas}} kang diurutaké $2.",
-       "newimages-summary": "Kaca astaméwa utawa kusus iki nuduhaké daftar berkas anyar dhéwé kang diunggahaké.",
+       "imagelisttext": "Ing ngisor iki kapacak pratélan '''$1''' {{PLURAL:$1|berkas|berkas}} kang diurutaké $2.",
+       "newimages-summary": "Kaca astaméwa utawa kusus iki nuduhaké pratélan berkas anyar dhéwé kang diunggahaké.",
        "newimages-legend": "Filter",
        "newimages-label": "Jeneng barkas (utawa pérangané):",
        "noimages": "Ora ana kang dideleng.",
        "saturday-at": "Septu jam $1",
        "sunday-at": "Minggu jam $1",
        "yesterday-at": "Dhek wingi jam $1",
-       "bad_image_list": "Formaté mengkéné:\n\nNamung butir daftar (baris kang diawali mawa tandha *) kang mèlu diitung. Pranala kapisan ing sawijining baris kudu pranala ing berkas kang ala.\nPranala-pranala sabanjuré ing baris kang padha dianggep minangka ''pengecualian'', yaiku artikel sing bisa nuduhaké berkas iku.",
+       "bad_image_list": "Formaté mengkéné:\n\nNamung butir pratélan (baris kang diawali mawa tandha *) kang mèlu diitung. Pranala kapisan ing larik kudu pranala ing berkas kang ala.\nPranala-pranala sabanjuré ing baris kang padha dianggep minangka ''pengecualian'', yaiku artikel kang bisa nuduhaké berkas iku.",
        "metadata": "Métadhatah",
        "metadata-help": "Barkas iki ngemu katerangan tambahan, bokmanawa asalé saka kodhak dhigital utawa sekèner kang dienggo metha utawa ndhigitalisasi barkas iku. \nYèn barkasé wis diowahi saka asliné, sawenèh rerincèn mungkin ora sawutuhé mèmper karo barkas owahané.",
        "metadata-expand": "Tuduhaké rerincèn tambahan",
        "exif-fixtureidentifier": "Jeneng pikstur",
        "exif-locationdest": "Panggon digambaraké",
        "exif-locationdestcode": "Kodhe dhaérah kagambaraké",
-       "exif-objectcycle": "Wektu katujon mèdia kuwi",
+       "exif-objectcycle": "Wektu katujon mèdia iku",
        "exif-contact": "Inpormasi kontak",
        "exif-writer": "Panulis",
        "exif-languagecode": "Basa",
        "monthsall": "kabèh",
        "confirmemail": "Konfirmasi alamat layang-èl",
        "confirmemail_noemail": "Panjenengan ora maringi alamat é-mail kang trep ing [[Special:Preferences|prèferènsi]] panjenengan.",
-       "confirmemail_text": "{{SITENAME}} ngwajibaké panjenengan ndhedhes utawa konfirmasi alamat e-mail panjenengan sadurungé bisa nganggo fitur-fitur e-mail.\nPencèten tombol ing ngisor iki kanggo ngirim sawijining kode konfirmasi arupa sawijining pranala;\nTuladen pranala iki ing panjlajah wèb panjenengan kanggo ndhedhes yèn alamat e-mail panjenengan pancèn bener.",
-       "confirmemail_pending": "Sawijining kode konfirmasi wis dikirim menyang alamat e-mail panjenengan;\nyèn panjenengan lagi waé nggawé akun utawa rékening panjenengan, mangga nunggu sawetara menit nganti layang iku tekan sadurungé nyuwun kode anyar manèh.",
+       "confirmemail_text": "{{SITENAME}} ngwajibaké panjenengan ndhedhes utawa konfirmasi alamat e-mail panjenengan sadurungé bisa nganggo fitur-fitur e-mail.\nPencèten tombol ing ngisor iki kanggo ngirim kodhe konfirmasi arupa pranala;\nTuladen pranala iki ing panjlajah wèb panjenengan kanggo ndhedhes yèn alamat e-mail panjenengan pancèn bener.",
+       "confirmemail_pending": "Kodhe konfirmasi wis dikirim menyang alamat e-mail panjenengan;\nyèn panjenengan lagi waé nggawé akun utawa rékening panjenengan, mangga nunggu sawetara menit nganti layang iku tekan sadurungé nyuwun kode anyar manèh.",
        "confirmemail_send": "Kirim kode konfirmasi",
        "confirmemail_sent": "E-mail mawa kode konfirmasi wis dikirim.",
-       "confirmemail_oncreate": "Sawijining kode pandhedhesan (konfirmasi) wis dikirim menyang alamat e-mail panjenengan.\nKode iki ora dibutuhaké kanggo log mlebu, nanging dibutuhaké sadurungé nganggo kabèh fitur kang nganggo e-mail ing wiki iki.",
-       "confirmemail_sendfailed": "{{SITENAME}} ora bisa ngirim layang e-mail konfirmaside.\nMangga dipriksa mbok-menawa ana aksara ilegal ing alamat e-mail panjenengan.\n\nPangirim mènèhi informasi: $1",
-       "confirmemail_invalid": "Kode konfirmasi salah. Kode iku mbok-menawa wis kadaluwarsa.",
+       "confirmemail_oncreate": "Kodhe konfirmasi wis dikirim menyang alamat e-mail panjenengan.\nKode iki ora dibutuhaké kanggo log mlebu, nanging dibutuhaké sadurungé nganggo kabèh fitur kang nganggo e-mail ing wiki iki.",
+       "confirmemail_sendfailed": "{{SITENAME}} ora bisa ngirim layang e-mail konfirmaside.\nMangga dipriksa bokmanawa ana aksara ilegal ing alamat e-mail panjenengan.\n\nPangirim mènèhi informasi: $1",
+       "confirmemail_invalid": "Kode konfirmasi salah. Kode iku bokmanawa wis kadaluwarsa.",
        "confirmemail_needlogin": "Panjenengan kudu ndhedhes (konfirmasi) $1 alamat layang e-mail panjenengan.",
        "confirmemail_success": "Alamat e-mail panjenengan wis dikonfirmasi.\nSaiki panjenengan bisa log mlebu lan wiwit nganggo wiki.",
        "confirmemail_loggedin": "Alamat e-mail panjenengan wis dikonfirmasi.",
        "confirmemail_subject": "Konfirmasi alamat layang-èl ing {{SITENAME}}",
        "confirmemail_body": "Ana wong, bokmanawa panjenengan, saka alamat IP $1, wis ndhaftar kanthi akun \"$2\" mawa alamat layang-èl iki ing {{SITENAME}}.\n\nSaperlu ngonfirmasi yèn akun iki temenan duwèké panjenengan lan ngaktivasi fitur layang-èl ing {{SITENAME}}, bukaken pranala iki ing pangluruné panjenengan:\n\n$3\n\nYèn panjenengan *ora tau* ndhaftar mawa akun iki, turuten pranala ngisor iki saperlu murungaké konfirmasi lumantar alamat layang-èl iki:\n\n$5\n\nKodhe konfirmasi iki bakal kadaluwarsa nalika $4.",
        "confirmemail_body_changed": "Ana wong, bokmanawa panjenengan, saka alamat IP $1, wis ngganti alamat layang-èl ing akun \"$2\" dadi nganggo alamat iki ing {{SITENAME}}. \n\nSaperlu ngonfirmasi yèn akun iki temenan duwèké panjenengan, bukaken pranala iki ing pangluruné panjenengan:\n\n$3\n\nYèn akun iku *dudu* duwèké panjenengan, turuten pranala iki saperlu murungaké konfirmasi lumantar alamat layang-èl iki:\n\n$5\n\nKodhe konfirmasi iki bakal kadaluwarsa nalika $4.",
-       "confirmemail_body_set": "Sawijining wong, mbokmenawa panjenengan dhéwé, saka alamat IP $1, wis ndaftaraké akun \"$2\" mawa alamat e-mail iki ing {{SITENAME}}. Bukaka pranala iki ing panjlajah wèb panjenengan.\n\n$3\n\nYèn panjenengan *ora tau* ndaftar akun iki, tutna pranala ing ngisor iki kanggo mbatalaké konfirmasi alamat e-mail:\n\n$5\n\nKonfirmasi iki bakal kadaluwarsa ing $4.",
+       "confirmemail_body_set": "Ana wong, bokmanawa panjenengan dhéwé, saka alamat IP $1, wis ndhaftaraké akun \"$2\" mawa alamat e-mail iki ing {{SITENAME}}. Bukaka pranala iki ing panjlajah wèb panjenengan.\n\n$3\n\nYèn panjenengan *ora tau* ndhaftar akun iki, tutna pranala ing ngisor iki kanggo mbatalaké konfirmasi alamat e-mail:\n\n$5\n\nKonfirmasi iki bakal kadaluwarsa ing $4.",
        "confirmemail_invalidated": "Konfirmasi alamat layang-èl wurung",
        "invalidateemail": "Wurung konfirmasi layang-èl",
        "scarytranscludedisabled": "[Transklusi cithakan interwiki dipatèni]",
        "scarytranscludefailed-httpstatus": "[Pengambilan templat $1 gagal: HTTP $2]",
        "scarytranscludetoolong": "[URL-é kedawan]",
        "deletedwhileediting": "<strong>Pélik:</strong> Kaca iki wis dibusak kawit pisanan panjenengan mbesut!",
-       "confirmrecreate": "Panganggo [[User:$1|$1]] ([[User talk:$1|Wicara]]) wis mbusak kaca iki nalika panjenengan miwiti panyuntingan mawa alesan:\n: ''$2''\nMangga didhedhes (dikonfirmasi) menawa panjenengan kersa nggawé ulang kaca iki.",
+       "confirmrecreate": "Panganggo [[User:$1|$1]] ([[User talk:$1|Wicara]]) wis mbusak kaca iki nalika panjenengan miwiti panyuntingan mawa alesan:\n: ''$2''\nMangga didhedhes (dikonfirmasi) manawa panjenengan kersa nggawé ulang kaca iki.",
        "confirmrecreate-noreason": "Panganggo [[User:$1|$1]] ([[User talk:$1|rembug]]) {{GENDER:$1|mbusak}} kaca iki sawisé panjenengan wiwit mbesut. Sumangga konfirmasi yèn panjenengan temen arep nggawé manèh kaca iki.",
        "recreate": "Gawé ulang",
        "confirm-purge-title": "Buwang kaca iki",
        "confirm_purge_button": "OK",
        "confirm-purge-top": "Busak ''cache'' kaca iki?",
-       "confirm-purge-bottom": "Ngresiki kaca uga bakal mbusak singgahan lan nampilaké vèrsi kaca pungkasan.",
+       "confirm-purge-bottom": "Mbusak kaca bakal ngresiki telih lan meksa supaya révisi kang anyar dhéwé muncul.",
        "confirm-watch-button": "Oké",
-       "confirm-watch-top": "Tambahaké kaca iki nènh daptar pangawasan panjenengan?",
+       "confirm-watch-top": "Tambahaké kaca iki ing pawawangané panjenengan?",
        "confirm-unwatch-button": "Oké",
-       "confirm-unwatch-top": "Singkiraké kaca iki saka daptar pangawasan panjenengan?",
+       "confirm-unwatch-top": "Singkiraké kaca iki saka pawawangané panjenengan?",
        "confirm-rollback-button": "YA",
        "confirm-rollback-top": "Pulihaké besutan menyang kaca iki?",
        "quotation-marks": "\"$1\"",
        "autosumm-new": "Nggawé kaca mawa \"$1\"",
        "autosumm-newblank": "Nggawé kaca barès",
        "lag-warn-normal": "Owah-owahan pungkasan kang luwih anyar tinimbang $1 {{PLURAL:$1|detik|detik}} mbokmanawa ora metu ing pratélan iki.",
-       "lag-warn-high": "Amarga gedhéné ''lag'' basis data server, owah-owahan pungkasan kang luwih anyar saka $1 {{PLURAL:$1|detik|detik}} mbokmanawa ora metu ing daftar iki.",
+       "lag-warn-high": "Amarga gedhéné ''lag'' basis data server, owah-owahan pungkasan kang luwih anyar saka $1 {{PLURAL:$1|detik|detik}} mbokmanawa ora metu ing pratélan iki.",
        "watchlistedit-normal-title": "Besut pawawangan",
        "watchlistedit-normal-legend": "Busak sesirah saka pawawangan",
-       "watchlistedit-normal-explain": "Irah-irahan utawa judhul ing daftar pangawasan panjenengan kapacak ing ngisor iki.\nKanggo mbusak sawijining irah-irahan, kliken kothak ing pinggiré, lan banjur kliken \"Busak judhul\".\nPanjenengan uga bisa [[Special:EditWatchlist/raw|nyunting daftar mentah]].",
+       "watchlistedit-normal-explain": "Irah-irahan utawa judhul ing pawawangané panjenengan kapacak ing ngisor iki.\nKanggo mbusak irah-irahan, kliken kothak ing pinggiré, lan banjur kliken \"Busak judhul\".\nPanjenengan uga bisa [[Special:EditWatchlist/raw|mbesut pratélan mentah]].",
        "watchlistedit-normal-submit": "Busak sesirah",
-       "watchlistedit-normal-done": "Irah-irahan {{PLURAL:$1|siji|$1}} wis dibusak saka daftar pangawasan panjenengan:",
+       "watchlistedit-normal-done": "Irah-irahan {{PLURAL:$1|siji|$1}} wis dibusak saka pawawangané panjenengan panjenengan:",
        "watchlistedit-raw-title": "Besut pawawangan wantahan",
        "watchlistedit-raw-legend": "Besut pawawangan wantahan",
-       "watchlistedit-raw-explain": "Irah-irahan ing daftar pangawasan panjenengan kapacak ing ngisor iki, lan bisa diowahi mawa nambahaké utawa mbusak daftar; sairah-irahan saban barisé.\nYèn wis rampung, anyarana kaca daftar pangawasan iki.\nPanjenengan uga bisa [[Special:EditWatchlist|nganggo éditor standar panjenengan]].",
+       "watchlistedit-raw-explain": "Irah-irahan ing pawawangané panjenengan kapacak ing ngisor iki, lan bisa diowahi mawa nambahaké utawa mbusak pratélan; sairah-irahan saban barisé.\nYèn wis rampung, anyarana kaca pawawangan iki.\nPanjenengan uga bisa [[Special:EditWatchlist|nganggo éditor standar panjenengan]].",
        "watchlistedit-raw-titles": "Sesirah:",
        "watchlistedit-raw-submit": "Anyari pawawangan",
        "watchlistedit-raw-done": "Pawawangané panjenengan wis dianyari.",
        "version-libraries-description": "Wedharan",
        "version-libraries-authors": "Pangarang",
        "redirect": "Lih-lihan miturut barkas, panganggo, kaca, owahan, utawa cathetan",
-       "redirect-summary": "Kaca mirunggan iki ngener ing sawijining barkas (jeneng gambar diwenehi), kaca (ID revisi utama ID kaca diwenehi), utawa kaca panganggo (ID panganggo diwenehi). Cara nganggo: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], or [[{{#Special:Redirect}}/user/101]].",
+       "redirect-summary": "Kaca mirunggan iki ngener ing barkas (jeneng gambar diwenehi), kaca (ID revisi utama ID kaca diwenehi), utawa kaca panganggo (ID panganggo diwenehi). Cara nganggo: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], or [[{{#Special:Redirect}}/user/101]].",
        "redirect-submit": "Menyang",
        "redirect-lookup": "Luru:",
        "redirect-value": "Aji:",
        "redirect-revision": "Révisi kaca",
        "redirect-file": "Jeneng barkas",
        "redirect-logid": "ID log",
-       "redirect-not-exists": "Nilai ora ditemokaké",
+       "redirect-not-exists": "Aji ora ana",
        "fileduplicatesearch": "Golèk berkas duplikat",
        "fileduplicatesearch-summary": "Golèk duplikat berkas adhedhasar biji hash-é.",
        "fileduplicatesearch-filename": "Jeneng barkas:",
        "specialpages-group-developer": "Piranti déveloper",
        "blankpage": "Kaca kosong",
        "intentionallyblankpage": "Kaca iki disengajakaké kosong",
-       "external_image_whitelist": " #Umbarna larikan iki apa anané<pre>\n#Pigunakaké fragmèn èksprèsi regular (mung bagéyan ing antara //) ing ngisor\n#Fragmèn ini bakal dicocogaké karo URL saka gambar-gambar èksternal\n#Fragmèn sing cocog bakal ditampilaké minangka gambar, yèn ora mung pranala menyang gambar waé sing ditampilaké\n#Larikan sing diwiwiti nganggo # dianggep minangka komentar\n#Iki ora mbédakaké aksara gedhé/cilik\n#Dèlèhna kabèh fragmèn èksprèsi regular sadhuwuré larikan iki. Umbarna larikan iki apa anané</pre>",
-       "tags": "Tag pangowahan sing absah",
+       "external_image_whitelist": " #Umbarna larikan iki apa anané<pre>\n#Pigunakaké fragmèn èksprèsi regular (mung bagéyan ing antara //) ing ngisor\n#Fragmèn ini bakal dicocogaké karo URL saka gambar-gambar èksternal\n#Fragmèn kang cocog bakal ditampilaké minangka gambar, yèn ora mung pranala menyang gambar waé kang ditampilaké\n#Larikan kang diwiwiti nganggo # dianggep minangka komentar\n#Iki ora mbédakaké aksara gedhé/cilik\n#Dèlèhna kabèh fragmèn èksprèsi regular sadhuwuré larikan iki. Umbarna larikan iki apa anané</pre>",
+       "tags": "Tag pangowahan kang absah",
        "tag-filter": "Panyaringan [[Special:Tags|tenger]]:",
        "tag-filter-submit": "Penyaring",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tenger|Tenger}}]]: $2)",
        "tag-mw-new-redirect": "Alihan anyar",
        "tag-mw-blank": "Ngosongaké",
        "tags-title": "Tag",
-       "tags-intro": "Kaca iki isi pratélan tenger sing dienggo nandhani besutan déning piranti alus, sinartan tegesé.",
+       "tags-intro": "Kaca iki isi pratélan tenger kang dienggo nandhani besutan déning piranti alus, sinartan tegesé.",
        "tags-tag": "Jeneng tag",
        "tags-display-header": "Cakrik ing pratélan owahan",
        "tags-description-header": "Dhèskripsi pepak saka makna",
        "tags-source-header": "Sumber",
        "tags-active-header": "Aktif?",
        "tags-hitcount-header": "Owah-owahan mawa tag",
-       "tags-actions-header": "Tumindak",
+       "tags-actions-header": "Laku",
        "tags-active-yes": "Iya",
        "tags-active-no": "Ora",
        "tags-source-extension": "Dikukuhaké déning piranti alus",
        "tags-hitcount": "$1 {{PLURAL:$1|pangowahan|pangowahan}}",
        "tags-manage-no-permission": "Panjenengan ora kawogan ngemunah tenger owahan.",
        "tags-create-heading": "Gawé tenger anyar",
-       "tags-create-explanation": "Bakuné, tenger sing mentas digawé bakal bisa dianggo déning panganggo lan bot.",
+       "tags-create-explanation": "Bakuné, tenger kang mentas digawé bakal bisa dianggo déning panganggo lan bot.",
        "tags-create-tag-name": "Jeneng tenger:",
        "tags-create-reason": "Alesan:",
        "tags-create-submit": "Gawé",
        "tags-create-no-name": "Panjenengan kudu ngisi jeneng tenger.",
        "tags-create-invalid-chars": "Jenengé tengeré isiné ora kena komah (<code>,</code>) utawa garis miring maju (<code>/</code>).",
-       "tags-create-invalid-title-chars": "Jenengé tengeré isiné ora kena karakter sing ora bisa dianggo ing sesirah kaca.",
+       "tags-create-invalid-title-chars": "Jenengé tengeré isiné ora kena karakter kang ora bisa dianggo ing sesirah kaca.",
        "tags-create-already-exists": "Tenger \"$1\" wis ana.",
        "tags-create-warnings-above": "{{PLURAL:$2|Pélik}} ngisor iki muncul nalika lagi nggawé tenger \"$1\":",
        "tags-create-warnings-below": "Panjenengan yakin arep mbacutaké nggawé tenger?",
        "tags-delete-title": "Busak tenger",
        "tags-delete-reason": "Alesan:",
        "tags-delete-submit": "Temenan busak tenger iki",
-       "tags-delete-not-allowed": "Tenger sing diwedharaké lumantar èkstènsi ora bisa dibusak kajaba èkstènsiné ngidinaké.",
+       "tags-delete-not-allowed": "Tenger kang diwedharaké lumantar èkstènsi ora bisa dibusak kajaba èkstènsiné ngidinaké.",
        "tags-delete-not-found": "Tenger \"$1\" ora ana.",
-       "tags-delete-too-many-uses": "Tenger \"$1\" dicakaké nyang punjul $2 {{PLURAL:$2|révisi}}, sing tegesé ora bisa dibusak.",
+       "tags-delete-too-many-uses": "Tenger \"$1\" dicakaké menyang punjul $2 {{PLURAL:$2|révisi}}, kang tegesé ora bisa dibusak.",
        "tags-delete-warnings-after-delete": "Tenger \"$1\" wis dibusak, nanging ana {{PLURAL:$2|pélik}} mangkéné:",
        "tags-delete-no-permission": "Panjenengan ora kawogan mbusak tenger owahan.",
        "tags-activate-title": "Urubaké tenger",
        "tags-apply-no-permission": "Panjenengan ora kawogan ngecakaké tenger owahan bebarengan karo owahané panjenengan.",
        "tags-apply-blocked": "Panjenengan ora bisa ngecakaké tenger owahan bebarengan karo owahané panjenengan manawa {{GENDER:$1|panjenengan}} diblokir.",
        "tags-apply-not-allowed-one": "Tenger \"$1\" ora kena dicakaké kanthi manual.",
-       "tags-edit-existing-tags": "Tenger sing ana:",
+       "tags-edit-existing-tags": "Tenger kang ana:",
        "tags-edit-existing-tags-none": "<em>Ora ana</em>",
        "tags-edit-new-tags": "Tenger anyar:",
        "tags-edit-add": "Tambah tenger iki:",
        "tags-edit-remove": "Busak tenger iki:",
        "tags-edit-remove-all-tags": "(busak kabèh tenger)",
        "tags-edit-chosen-placeholder": "Pilih sawenèh tenger",
-       "tags-edit-chosen-no-results": "Ora ana tenger sing cocog",
+       "tags-edit-chosen-no-results": "Ora ana tenger kang cocog",
        "tags-edit-reason": "Alesan:",
-       "tags-edit-revision-submit": "Cakaké owahan nyang {{PLURAL:$1|révisi iki|$1 révisi}}",
-       "tags-edit-logentry-submit": "Cakaké owahan nyang {{PLURAL:$1|èntri log iki|$1 èntri log}}",
+       "tags-edit-revision-submit": "Cakaké owahan menyang {{PLURAL:$1|révisi iki|$1 révisi}}",
+       "tags-edit-logentry-submit": "Cakaké owahan menyang {{PLURAL:$1|èntri log iki|$1 èntri log}}",
        "tags-edit-success": "Owahané wis dicakaké.",
        "tags-edit-failure": "Owahané ora bisa dicakaké:\n$1",
        "tags-edit-nooldid-title": "Révisi tujuan ora trep",
        "compare-rev1": "Révisi 1",
        "compare-rev2": "Révisi 2",
        "compare-submit": "Bandingaké",
-       "compare-invalid-title": "Sesirah sing kokawèhaké ora sah.",
-       "compare-title-not-exists": "Sesirah sing kokawèhaké ora ana.",
-       "compare-revision-not-exists": "Benahan sing panjenengan jaluk ora ana.",
+       "compare-invalid-title": "Sesirah kang kokawèhaké ora sah.",
+       "compare-title-not-exists": "Sesirah kang kokawèhaké ora ana.",
+       "compare-revision-not-exists": "Révisi kang panjenengan karsakaké ora ana.",
        "diff-form": "Béda",
        "dberr-problems": "Nyuwun ngapura! Situs iki ngalami masalah tèknis.",
        "dberr-again": "Coba nunggu sawetara menit lan unggahna manèh.",
        "dberr-info-hidden": "(Ora bisa nggayut basis dhata)",
        "dberr-usegoogle": "Panjenengan bisa nyoba nggolèki nganggo Google kanggo sauntara wektu.",
        "dberr-outofdate": "Perlu diweruhi yèn indhèks isi kita manawa wis kadaluwarsa.",
-       "dberr-cachederror": "Iki sawijining salinan kasimpen kaca sing dijaluk, lan manawa dudu sing paling anyar.",
+       "dberr-cachederror": "Iki turunan kasimpen kaca kang dijaluk, lan manawa dudu kang paling anyar.",
        "htmlform-invalid-input": "Ana masalah jroning sawetara input panjenengan",
-       "htmlform-select-badoption": "Aji sing panjenengan lebokaké ora absah",
-       "htmlform-int-invalid": "Aji sing panjenengan lebokaké dudu angka wutuh (integer).",
-       "htmlform-float-invalid": "Sing panjenengan lebokaké dudu angka.",
-       "htmlform-int-toolow": "Aji sing panjenengan lebokaké keciliken ing sangisoré aji minimum $1",
-       "htmlform-int-toohigh": "Aji sing panjenengan lebokaké kegedhèn ngluwihi aji maksimum $1",
+       "htmlform-select-badoption": "Aji kang panjenengan lebokaké ora absah",
+       "htmlform-int-invalid": "Aji kang panjenengan lebokaké dudu angka wutuh (integer).",
+       "htmlform-float-invalid": "Kang panjenengan lebokaké dudu angka.",
+       "htmlform-int-toolow": "Aji kang panjenengan lebokaké keciliken ing sangisoré aji minimum $1",
+       "htmlform-int-toohigh": "Aji kang panjenengan lebokaké kegedhèn ngluwihi aji maksimum $1",
        "htmlform-required": "Nilé iki dibutuhaké",
        "htmlform-submit": "Kirim",
        "htmlform-reset": "Balèkaké owahan",
        "htmlform-date-placeholder": "TTTT-WW-DD",
        "htmlform-time-placeholder": "JJ:MM:SS",
        "htmlform-datetime-placeholder": "TTTT-WW-DD JJ:MM:SS",
-       "htmlform-title-not-creatable": "\"$1\" dudu sesirah kaca sing bisa digawé",
+       "htmlform-title-not-creatable": "\"$1\" dudu sesirah kaca kang bisa digawé",
        "htmlform-title-not-exists": "$1 ora ana.",
        "htmlform-user-not-exists": "<strong>$1</strong> ora ana.",
-       "htmlform-user-not-valid": "<strong>$1</strong> dudu jeneng panganggo sing trep.",
+       "htmlform-user-not-valid": "<strong>$1</strong> dudu jeneng panganggo kang trep.",
        "logentry-delete-delete": "$1 {{GENDER:$2|mbusak}} kaca $3",
        "logentry-delete-delete_redir": "$1 {{GENDER:$2|mbusak}} kaca alihan $3 sarana numpuk-undhung.",
        "logentry-delete-restore": "$1 {{GENDER:$2|mulihaké}} kaca $3 ($4)",
        "revdelete-content-unhid": "kontèn dituduhaké",
        "revdelete-summary-unhid": "tingkesaning besutan ora kadhelikaké",
        "revdelete-uname-unhid": "jeneng panganggo dituduhaké",
-       "revdelete-restricted": "watesan sing dicakaké marang pangurus",
+       "revdelete-restricted": "watesan kang dicakaké marang pangurus",
        "revdelete-unrestricted": "rèstriksi marang para opsis dijabel",
        "logentry-block-block": "$1 {{GENDER:$2|mblokir}} {{GENDER:$4|$3}} kanthi wektu kadaluwarsa $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|nyopot blokirané}} {{GENDER:$4|$3}}",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|ngalih}} kaca $3 menyang $4 tanpa ninggal alihan",
        "logentry-move-move_redir": "$1 {{GENDER:$2|ngalih}} kaca $3 menyang $4 kanthi nindhihi alihan",
        "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|ngalih}} kaca $3 menyang $4 kanthi nindhihi alihan tanpa nginggal alihan",
-       "logentry-patrol-patrol": "$1 {{GENDER:$2|nengeri}} révisi $4 saka kaca $3 sing diawasi",
-       "logentry-patrol-patrol-auto": "$1 otomatis {{GENDER:$2|nandhani}} benahan $4 saka kaca $3 kaawasake",
+       "logentry-patrol-patrol": "$1 {{GENDER:$2|nengeri}} révisi $4 saka kaca $3 kang diawasi",
+       "logentry-patrol-patrol-auto": "$1 otomatis {{GENDER:$2|nandhani}} révisi $4 saka kaca $3 kang diawasi",
        "logentry-newusers-newusers": "Akun panganggo $1 {{GENDER:$2|digawé}}",
        "logentry-newusers-create": "Akun panganggo $1 wis {{GENDER:$2|kagawé}}",
        "logentry-newusers-create2": "Akun panganggo $3 {{GENDER:$2|digawé}} déning $1",
        "rightslogentry-temporary-group": "$1 (sauntara, tumeka $2)",
        "feedback-adding": "Nambahaké lebon saran ing kaca...",
        "feedback-back": "Balik",
-       "feedback-bugcheck": "Apik! Pesthèké kuwi dudu sawijining [$1 bug sing dingertèni].",
+       "feedback-bugcheck": "Apik! Pesthèké iku dudu salah siji [$1 ama kang kaweruhan].",
        "feedback-bugnew": "Aku wis mriksa. Kandakaké bug anyar",
-       "feedback-bugornote": "Yèn panjenengan siyap njelasaké masalah tèhnis kanthi rinci mangga [$1 laporaké bug].\nUtawa, panjenengan bisa nganggo pormulir gampang ngisor. Tanggepan panjenengan bakal ditambahaké ing kaca \"[$3 $2]\", bebarengan karo jeneng panganggo panjenengan lan pramban sing panjenengan anggo.",
+       "feedback-bugornote": "Yèn panjenengan siyap njelasaké masalah tèhnis kanthi rinci mangga [$1 laporaké bug].\nUtawa, panjenengan bisa nganggo pormulir gampang ngisor. Tanggepan panjenengan bakal ditambahaké ing kaca \"[$3 $2]\", bebarengan karo jeneng panganggo panjenengan lan pramban kang panjenengan anggo.",
        "feedback-cancel": "Wurung",
        "feedback-close": "Rampung",
        "feedback-external-bug-report-button": "Kirim ayahan tèhnis",
        "limitreport-expansiondepth": "Highest expansion depth",
        "limitreport-expensivefunctioncount": "Expensive parser function count",
        "expandtemplates": "Cithakan dikembangaké",
-       "expand_templates_intro": "Kaca astaméwa iki njupuk sawetara tèks lan ngembangaké kabèh cithakan sajroning iku sacara rékursif.\nKaca iki uga ngembangaké fungsi parser kaya ta\n<nowiki>{{</nowiki>#language:…}}, lan variabel kaya ta\n<nowiki>{{</nowiki>CURRENTDAY}}&mdash;sajatiné mèh kabèh sing ana ing antara rong tandha kurung akolade.",
+       "expand_templates_intro": "Kaca astaméwa iki njupuk sawetara tèks lan ngembangaké kabèh cithakan sajroning iku sacara rékursif.\nKaca iki uga ngembangaké fungsi parser kaya ta\n<nowiki>{{</nowiki>#language:…}}, lan variabel kaya ta\n<nowiki>{{</nowiki>CURRENTDAY}}&mdash;sajatiné mèh kabèh kang ana ing antara rong tandha kurung akolade.",
        "expand_templates_title": "Sesirah kontèks, kanggo {{FULLPAGENAME}}, lsp.:",
        "expand_templates_input": "Tèks sumber:",
        "expand_templates_output": "Pituwas (kasil)",
        "pagelang-nonexistent-page": "Kaca $1 ora ana.",
        "pagelang-unchanged-language": "Kaca $1 wis disetèl menyang basa $2.",
        "mediastatistics-table-mimetype": "Jinis MIME",
-       "mediastatistics-table-extensions": "Èkstènsi sing mungkin",
+       "mediastatistics-table-extensions": "Èkstènsi kang mungkin",
        "mediastatistics-table-count": "Cacah barkas",
        "mediastatistics-table-totalbytes": "Ukuran gabungan",
        "mediastatistics-header-unknown": "Ora dingertèni",
        "special-characters-group-thai": "Thailand",
        "special-characters-group-lao": "Lao",
        "special-characters-group-khmer": "Khmer",
-       "mw-widgets-dateinput-no-date": "Ora ana tanggal sing dipilih",
+       "mw-widgets-dateinput-no-date": "Ora ana tanggal kang dipilih",
        "mw-widgets-mediasearch-input-placeholder": "Golèk médhia",
        "mw-widgets-mediasearch-noresults": "Ora ana wohing panggolèk.",
        "mw-widgets-titleinput-description-new-page": "kaca durung ana",
        "log-action-filter-contentmodel": "Jinis owahan modhèl isi:",
        "log-action-filter-delete": "Jinis busakan:",
        "log-action-filter-import": "Jinis imporan:",
-       "log-action-filter-managetags": "Jinis tumindak pangemunah tenger:",
+       "log-action-filter-managetags": "Jinis laku kanggo ngopèni tenger:",
        "log-action-filter-move": "Jinis lih-lihan:",
        "log-action-filter-newusers": "Jinis gawéan akun:",
        "log-action-filter-patrol": "Jinis patroli:",
        "log-action-filter-newusers-create": "Gawéan déning panganggo anonim",
        "log-action-filter-newusers-create2": "Gawéan déning panganggo kadhaftar",
        "log-action-filter-newusers-autocreate": "Gawéan otomatis",
-       "log-action-filter-newusers-byemail": "Gawéan mawa tembung wadi sing dikirim lumantar layang-èl",
+       "log-action-filter-newusers-byemail": "Gawéan mawa tembung wadi kang dikirim lumantar layang-èl",
        "log-action-filter-patrol-patrol": "Patroli manual",
        "log-action-filter-patrol-autopatrol": "Patroli otomatis",
        "log-action-filter-protect-protect": "Rereksan",
        "authmanager-provider-temporarypassword": "Tembung wadi sauntara",
        "authprovider-resetpass-skip-label": "Langkahi",
        "credentialsform-account": "Jeneng akun:",
-       "cannotlink-no-provider-title": "Ora ana akun sing bisa digayutaké",
-       "cannotlink-no-provider": "Ora ana akun sing bisa digayutaké.",
+       "cannotlink-no-provider-title": "Ora ana akun kang bisa digayutaké",
+       "cannotlink-no-provider": "Ora ana akun kang bisa digayutaké.",
        "linkaccounts": "Gayutaké akun",
        "linkaccounts-success-text": "Akun wis digayutaké.",
        "linkaccounts-submit": "Gayutaké akun",
        "pageid": "ID kaca $1",
        "rawhtml-notallowed": "&lt;html&gt; tenger ora bisa dianggo sajabané kaca adaté.",
        "gotointerwiki": "Metu {{SITENAME}}",
-       "gotointerwiki-invalid": "Sesirah sing diisèkaké ora trep.",
-       "gotointerwiki-external": "Panjenengan arep metu {{SITENAME}} saperlu marani [[$2]], sawijining situs jaringan manca.\n\n'''[$1 Bacutaké nyang $1]'''",
+       "gotointerwiki-invalid": "Sesirah kang diisèkaké ora trep.",
+       "gotointerwiki-external": "Panjenengan arep metu {{SITENAME}} saperlu marani [[$2]], situs jaringan manca.\n\n'''[$1 Bacutaké menyang $1]'''",
        "undelete-cantedit": "Panjenengan ora bisa wurung mbusak kaca iki amarga panjenengan ora kawogan mbesut kaca iki."
 }
index d88229f..bcab4c0 100644 (file)
        "history_short": "မေင်ႋစိင်",
        "history_small": "မေင်ႋစိင်",
        "updatedmarker": "လေဝ်ယောဝ်ႋဝေ့အ်ုလါင်ခါင့်ခါ့ အင်းတင်ထဝေ့",
-       "printableversion": "á\80\9cá\80±á\80\9dá\80º",
+       "printableversion": "á\80\95á\80ºá\80¯á\80\9bá\80\84á\80·á\80ºá\80\91á\80\84á\80ºá\82\8bá\81®á\80±á\80\9dá\80ºá\82\8b á\80\97á\80¬á\80¸á\80\9bá\80¾á\80\84á\80ºá\80¸",
        "permalink": "ဆ်ုသုဂ်ကၠယ်သီ့",
        "print": "ထုဂ်ထင်းလိက်",
        "view": "မ်ုယောဝ်ႋ",
        "viewsourcelink": "မ်ုယောဝ်ႋ အ်ုထိုဝ်",
        "editsectionhint": "ကၞါင့်ယိုဝ် မ်ုအင်းတင်: $1",
        "toc": "ပ်ုယုံ့ခေါဟ်တင်",
+       "confirmable-no": "လ်ုမာၜး",
        "site-rss-feed": "RSS feed $1 ဍူ",
        "site-atom-feed": "Atom feed $1ဍူ",
        "page-atom-feed": "Atom feed $1 ဍူ",
        "search-showingresults": "{{PLURAL:$4|<strong>$3</strong> ၏ <strong>$1</strong> အ်ုတင်ၮေဝ်ႋ|<strong>$3</strong> ၏ <strong>$1 - $2</strong> အ်ုတင်ၮေဝ်ႋလ်ုဖး}}",
        "search-nonefound": "အင်းၰူ့ဆ်ုပ်ုယောဝ်ႋလ်ုၜးဍံင်သယ်လ်ုဖး အ်ုတင်ၮေဝ်လ်ုအှ်ၜးႋ။",
        "mypreferences": "မ်ုလုဲႋၯင်းလ်ုဖး",
+       "group-user": "ဆ်ုသုံႋဆာႋလ်ုဖး",
+       "group-autoconfirmed": "အ်ုဆ်ုမာအ်ုလ်ုအ်ု ဆ်ုထီ့ဆာႋထ ဆ်ုသုံႋဆာႋလ်ုဖး",
        "group-bot": "ဘေါႋလ်ုဖး",
        "group-sysop": "ပိုင်ဆ်ုပျာဆ်ုလ်ုဖး",
+       "grouppage-user": "{{ns:project}}:ဆ်ုသုံႋဆာႋလ်ုဖး",
        "grouppage-bot": "{{ns:project}}:ဘော့သယ်",
        "grouppage-sysop": "{{ns:project}}:ပိုင်ဆ်ုပျာဆိုင်လ်ုဖး",
        "right-writeapi": "ဆ်ုကေဝ်လိက် API အိုဝ် မ်ုအင်းသုံ့",
        "proxyblocker": "ပ်ုရောက်ဆီ ဆ်ုခၠာၜိင်း",
        "movelogpage": "အင်းသုံ့လင် မာၮါင်း",
        "export": "လိက်မေံသယ်လ်ဖး Export ထုက်ထုင်း",
+       "export-submit": "မ်ုသုံႋထုင်း",
        "thumbnail-more": "မာဍောဟ်အ်ုလာဟှင်",
        "importlogpage": "ဍုဂ်ဆူ့ စ်ုရင့်",
        "tooltip-pt-userpage": "{{GENDER:|ၮ်ုခဝ့် ဆ်ုသုံ့ဆာ}} လိက်မေံၜၠါ်",
        "tooltip-rollback": "\"မ်ုထါင် ကျးက္ဍာ\" ယိုဝ် လိက်မေံအ်ုယိုဝ် လါင်းခါင့် ဆ်ုအင်းတင်ႋခဝ့် ကလစ် လ်ုထီးအိုဝ် ထါင်က္ဍာဖှ်ေဝေ့လှ်။",
        "tooltip-undo": "\"ထါင်လါင်းခါင့်\" ၮှ် ဆ်ုအင်းတင်ယိုဝ် ထါင်ဆုဂ်ခါင့်ဝေ့ၯံင် လ်ုအ်ုဍံင်ၯင်မဝ့်မ်ှ မ်ုအင်းတင် မ်ုပၠါ်ထါင်းၮင်။ ဆှ်ၜိုဝ် ထါင်ဆုဂ်ခါင့်ယိုဝ် ပ်ုကုံႋဆုဂ် အ်ုခဝ့်ပ်ုယဝ့် ကေဝ်ၮေဝ်လှ်။",
        "tooltip-summary": "အင်းတင်ႋဖူးဆူ့လင်",
+       "anonusers": "{{SITENAME}} အ်ုမၠိင်လ်ုသှ်ယာႋ {{PLURAL:$2|ဆ်ုသုံႋဆာႋ|ဆ်ုသုံႋဆာႋလ်ုဖး}} $1",
        "simpleantispam-label": "Anti-spam အင်းၰူ့ၯင်းဆ်ုပၠယ်တဝ်။ အှ်ယိုဝ်ၮှ် <strong>ဖိုင့်ၰိုဲလ်ုၯေဝ်</strong>!",
        "pageinfo-title": "\"$1\" အ်ုၯင်း ဆ်ုသုဂ်ကၠယ်လ်ုဖး",
        "pageinfo-header-basic": "အ်ုခင်းထါ်ဆ်ုပြိုင့်အ်ုၯာင်ႋအ်ုကျံင်း",
index f9ce13b..e9a7300 100644 (file)
        "undeleteinvert": "선택 반전",
        "undeletecomment": "이유:",
        "cannotundelete": "일부 또는 모든 항목의 되살리기를 실패했습니다:\n$1",
-       "undeletedpage": "<strong>$1 문서가 복구되었습니다.</strong>\n\n[[Special:Log/delete|삭제 기록]]에서 최근의 삭제 및 복구 기록을 볼 수 있습니다.",
+       "undeletedpage": "<strong>$1 문서가 복구되었습니다</strong>\n\n[[Special:Log/delete|삭제 기록]]에서 최근의 삭제 및 복구 기록을 볼 수 있습니다.",
        "undelete-header": "최근에 삭제한 문서에 대한 기록은 [[Special:Log/delete|여기]]에서 볼 수 있습니다.",
        "undelete-search-title": "삭제된 문서 검색",
        "undelete-search-box": "삭제된 문서 검색",
        "confirm-unwatch-top": "이 문서를 주시문서 목록에서 뺄까요?",
        "confirm-rollback-button": "확인",
        "confirm-rollback-top": "이 문서의 편집을 되돌리시겠습니까?",
+       "confirm-mcrrestore-title": "판 복구",
        "confirm-mcrundo-title": "변경사항 취소",
        "mcrundofailed": "실행 취소를 실패했습니다",
        "mcrundo-missingparam": "요청에 필요한 변수가 존재하지 않습니다.",
        "mcrundo-changed": "차이를 본 이후로 문서가 변경되었습니다. 새로운 변경사항을 검토해 주십시오.",
+       "mcrundo-parse-failed": "새 판의 구문 분석을 실패했습니다: $1",
        "quotation-marks": "“$1”",
        "imgmultipageprev": "← 이전 페이지",
        "imgmultipagenext": "다음 페이지 →",
index 2cb3e4c..f78b4f8 100644 (file)
        "redirect-revision": "Versioun vun der Säit",
        "redirect-file": "Numm vum Fichier",
        "redirect-not-exists": "Wäert net fonnt",
+       "redirect-not-numeric": "Wäert ne tnumeresch",
        "fileduplicatesearch": "No duebele Fichiere sichen",
        "fileduplicatesearch-summary": "Sichen no Doublone vu Fichieren op der Basis vun hirem ''Hash-Wäert''.",
        "fileduplicatesearch-filename": "Numm vum Fichier:",
index 5cd97ce..3b3a5b8 100644 (file)
        "group-autoconfirmed": "Автотестикь хьанвай иштиракчияр",
        "group-bot": "Ботар",
        "group-sysop": "Къавха",
+       "group-interface-admin": "Интерфейсдин администраторар",
        "group-bureaucrat": "Бюрократар",
        "group-suppress": "Ревизорар",
        "group-all": "(вири)",
        "group-user-member": "{{GENDER:$1|иштиракчи}}",
        "group-bot-member": "{{GENDER:$1|бот}}",
        "group-sysop-member": "{{GENDER:$1|администратор}}",
+       "group-interface-admin-member": "{{GENDER:$1|интерфейсдин администратор}}",
        "group-bureaucrat-member": "{{GENDER:$1|бюрократ}}",
        "grouppage-user": "{{ns:project}}:Иштиракчияр",
        "grouppage-bot": "{{ns:project}}:Бот",
index daae6da..5649f9b 100644 (file)
        "confirm-unwatch-top": "Да ја отстранам страницава од набљудуваните?",
        "confirm-rollback-button": "ОК",
        "confirm-rollback-top": "Да ги отповикам уредувањата на страницава?",
+       "confirm-mcrrestore-title": "Поврати преработка",
        "confirm-mcrundo-title": "Откажи промена",
        "mcrundofailed": "Откажувањето не успеа",
        "mcrundo-missingparam": "Недостасуваат задолжителни параметри за барањето.",
        "mcrundo-changed": "Страницата е изменета откако ги гледавте разликите. Прегледајте ја новата промена.",
+       "mcrundo-parse-failed": "Не успеав да ја расчленам новата преработка: $1",
        "percent": "$1&#160;%",
        "quotation-marks": "„$1“",
        "imgmultipageprev": "← претходна страница",
index 774c4e2..6db8de9 100644 (file)
        "right-editcontentmodel": "താളിന്റെ ഉള്ളടക്ക രീതി തിരുത്തുക",
        "right-editinterface": "ഉപയോക്തൃ സമ്പർക്കമുഖത്തിൽ മാറ്റം വരുത്തുക",
        "right-editusercss": "മറ്റ് ഉപയോക്താക്കളുടെ CSS പ്രമാണങ്ങൾ തിരുത്തുക",
+       "right-edituserjson": "മറ്റ് ഉപയോക്താക്കളുടെ ജെസൺ പ്രമാണങ്ങൾ തിരുത്തുക",
        "right-edituserjs": "മറ്റ് ഉപയോക്താക്കളുടെ JS പ്രമാണങ്ങൾ തിരുത്തുക",
        "right-editmyusercss": "താങ്കളുടെ സ്വന്തം ഉപയോക്തൃ സി.എസ്.എസ്. പ്രമാണങ്ങൾ തിരുത്തുക",
        "right-editmyuserjs": "താങ്കളുടെ സ്വന്തം ഉപയോക്തൃ ജാവാസ്ക്രിപ്റ്റ് പ്രമാണങ്ങൾ തിരുത്തുക",
        "rcfilters-watchlist-showupdated": "മാറ്റങ്ങൾ ഉണ്ടായ ശേഷം താങ്കൾ സന്ദർശിക്കാത്ത താളുകളിലെ മാറ്റങ്ങൾ, തളിക അടയാളത്തോടൊപ്പം <strong>കടുപ്പിച്ച്</strong> കാണിച്ചിരിക്കുന്നു.",
        "rcfilters-preference-label": "സമീപകാലമാറ്റങ്ങളുടെ പുതുക്കിയ പതിപ്പ് പ്രദർശിപ്പിക്കേണ്ട",
        "rcfilters-preference-help": "സമ്പർക്കമുഖത്തിൽ 2017-ൽ വരുത്തിയ രൂപകല്പനാമാറ്റങ്ങളും, അതോടൊപ്പവും പിന്നീടും ചേർത്ത എല്ലാ ഉപകരണങ്ങളും ഒഴിവാക്കുക.",
+       "rcfilters-watchlist-preference-label": "ശ്രദ്ധിക്കുന്നവയുടെ പട്ടികയുടെ പുതുക്കിയ പതിപ്പ് പ്രദർശിപ്പിക്കേണ്ടതില്ല",
+       "rcfilters-watchlist-preference-help": "2017-ലെ സമ്പർക്കമുഖ പുനർരൂപകല്പനയും അതോടൊപ്പവും പിന്നീടും ചേർത്ത എല്ലാ ഉപകരണങ്ങളും ഒഴിവാക്കുക",
        "rcfilters-filter-showlinkedfrom-label": "കണ്ണി ചേർക്കപ്പെട്ട താളുകളിലെ മാറ്റങ്ങൾ കാണിക്കുക",
        "rcfilters-filter-showlinkedfrom-option-label": "തിരഞ്ഞെടുത്ത താളിൽ <strong>കണ്ണി ചേർക്കപ്പെട്ട താളുകൾ</strong>",
+       "rcfilters-filter-showlinkedto-label": "കണ്ണി ചേർക്കപ്പെട്ട താളുകളിലെ മാറ്റങ്ങൾ കാണിക്കുക",
+       "rcfilters-filter-showlinkedto-option-label": "തിരഞ്ഞെടുത്ത താളിലേക്ക് <strong>കണ്ണി ചേർക്കപ്പെട്ട താളുകൾ</strong>",
        "rcfilters-target-page-placeholder": "താളിന്റെ (അല്ലെങ്കിൽ വർഗ്ഗത്തിന്റെ) പേര് നൽകുക",
        "rcnotefrom": "<strong>$3, $4</strong> മുതലുള്ള {{PLURAL:$5|മാറ്റം|മാറ്റങ്ങൾ}} ആണ് താഴെയുള്ളത്  (<strong>$1</strong> എണ്ണം വരെ കൊടുക്കുന്നതാണ്).",
        "rclistfromreset": "തീയതി എടുത്തത് പുനഃസജ്ജീകരിക്കുക",
        "http-timed-out": "എച്ച്.റ്റി.റ്റി.പി. അഭ്യർത്ഥന സമയം കഴിഞ്ഞു.",
        "http-curl-error": "യു.ആർ.എൽ. ശേഖരിക്കുന്നതിൽ പിഴവ്: $1",
        "http-bad-status": "എച്ച്.റ്റി.റ്റി.പി. അഭ്യർത്ഥനാ വേളയിൽ ഒരു പിഴവുണ്ടായി: $1 $2",
+       "http-internal-error": "എച്ച്.റ്റി.റ്റി.പി. ആന്തരിക പിഴവ്.",
        "upload-curl-error6": "യൂ.ആർ.എൽ. പ്രാപ്യമല്ല",
        "upload-curl-error6-text": "താങ്കൾ സമർപ്പിച്ച യൂ.ആർ.എൽ. പ്രാപ്യമല്ല‌. ദയവായി യൂ.ആർ.എൽ. സാധുവാണോ എന്നും സൈറ്റ് സജീവമാണോ എന്നും പരിശോധിക്കുക.",
        "upload-curl-error28": "അപ്‌ലോഡ് ടൈംഔട്ട്",
index 78d380e..addbfb3 100644 (file)
        "tog-extendwatchlist": "သၠဲ စရၚ်မမၚ်မဲ သ္ဂောံ ထ္ၜး အလုံ မုက်လိၚ်ဂမၠိုၚ်, ဆ မတုဲကၠုၚ်လၟုဟ် ဟွံသေၚ်",
        "tog-showtoolbar": "ထ္ၜး တာန်ကြိယာမဒါန်",
        "tog-editondblclick": "ဒါန်မုက်လိက်ဂမၠိုၚ် ပွမပ္ဍဵုကေတ်ၜါလ္တန်",
+       "tog-enotifwatchlistpages": "ပြၚ်အီမေလ်ကုအဲ အခိၚ်မုက်လိက် ဟွံသေၚ် ဝှာၚ်မနွံပ္ဍဲစရၚ်မမၚ်မွဲအဲ ဒးဒုၚ်ပြံၚ်",
+       "tog-enotifusertalkpages": "ပြၚ်အဳမေလ်ကုအဲ အခိၚ်မုက်လိက်ဓရီုကျာညးလွပ်အဲ ဒးဒုၚ်ပြံၚ်",
+       "tog-enotifminoredits": "ပြၚ်အဳမေလ်ကုအဲ သွက်မပလေဝ်ဒါန်ညိညဒဒှ်မုက်လိက်ကေုာံဝှာၚ်အဲဂမၠိုၚ်ကီုလေဝ်",
+       "tog-oldsig": "စၟတ်တဲ မၞး မၞုံဒၟံၚ်တုဲတုဲ:",
+       "tog-watchlisthideown": "ဗဒန်ထောံအဲဒါန်လဝ်နူစရၚ်မဗဵုရံၚ်",
+       "tog-watchlisthidebots": "ဗဒန်ထောံ ရုပ်စက်မပလေဝ်ဒါန်   နူ စရၚ်မမၚ်မွဲ",
+       "tog-watchlisthideminor": "ဗဒန်ထောံ ပလေဝ်ဒါန်မညိည နူ စရၚ်မမၚ်မွဲ",
+       "tog-watchlisthidecategorization": "ပၞုက် အရာမဖျေဟ်ကဏ္ဍ ကုမုက်လိက်",
+       "tog-ccmeonemails": "ပြၚ်ကုအဲ ဆာဲကဝ်ပဳဒဒှ်အီမေလ် အဲမပြၚ်ဏာစရၚ်ညးလွပ်တၞဟ်တအ်",
+       "tog-diffonly": "လ္ပထ္ၜး မုက်လိက် မာတိကာ သၟဝ် မတၞဟ်ခြာ",
        "tog-showhiddencats": "ထ္ၜးကဆံၚ်မပၞုက်လဝ်",
        "tog-prefershttps": "လၟိုန်သုၚ်စောဲကေတ် လာၚ်မမၞုံဂီုကၠီု အခိၚ်မလုပ်လံက်အေန်",
        "underline-always": "လၟိုန်အခါ",
        "retrievedfrom": "ကလေင်သီကေတ်လဝ် နူ \"$1\"",
        "youhavenewmessages": "{{PLURAL:$3|မၞး ကလိဂွံ}} $1 ($2).",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|မၞး ကလိဂွံ}} $1 နူ {{PLURAL:$3| မဒှ် ညးလွပ်တၞဟ်မွဲ|$3 ညးလွပ်ဂမၠိုင်}} ($2).",
+       "youhavenewmessagesmanyusers": "မၞး မၞုံ$1 မူ ညးလွဟ်ဗွဲမဂၠိုၚ် ($2)",
        "newmessageslinkplural": "{{PLURAL:$1|ပရိုင်မေတ်သုက် တၟိ|999=ပရိုင်မေတ်သုက်တၟိဂမၠိုင်}}",
        "newmessagesdifflinkplural": "လက္ကရဴအိုတ် {{PLURAL:$1|အပြံင်အလှာဲ|999=အပြံင်အလှာဲဂမၠိုင်}}",
+       "youhavenewmessagesmulti": "မၞး မၞုံကဵု ပိုဒ်ဂလာန် မေသုက်မတၟိ ပ္ဍဲ $1",
        "editsection": "ပလေဝ်ဒါန်",
        "editold": "ပလေဝ်ဒါန်",
        "viewsourceold": "ထ္ၜး တမ်ရိုဟ်",
        "confirmable-no": "ဟအှ်ေ",
        "thisisdeleted": "ဗဵု ဟွံသေၚ် ကလၚ်စွံ $1 ဟာ",
        "viewdeleted": "ဗဵု $1 ဟာ",
+       "restorelink": "{{PLURAL:$1|ဒါမပလီုမွဲ|$1 ဒါန်မပလီုဂမၠိုၚ်}}",
        "feedlinks": "တရိုပ်:",
+       "site-rss-feed": "$1 RSS feed",
        "site-atom-feed": "$1 ဒၞာဲ ဗလးပတိတ်",
+       "page-rss-feed": "\"$1\" RSS feed",
        "page-atom-feed": "\"$1\" ဒၞာဲ ဗလးပတိတ်",
        "red-link-title": "$1(မုက်လဝ်ဏအ် ဟွံပြာကတ်)",
+       "sort-descending": "လၟေၚ်မစှေ်ကၠုၚ်ဒၟံၚ်",
+       "sort-ascending": "လၟေၚ်မတိုန်ကၠုၚ်ဒၟံၚ်",
        "nstab-main": "မုက်လိက်",
        "nstab-user": "မုက်လိက် ညးလွပ်",
        "nstab-media": "မုက်လိက် မဳဒဳယာ",
        "nstab-help": "မုက်လိက် မရီုဗင်",
        "nstab-category": "ကဏ္ဍ",
        "mainpage-nstab": "မုက်လိက်တမ်",
+       "nosuchaction": "ဟွံမွဲကဵု ပွမမိက်မွဲမွဲ",
        "nosuchspecialpage": "မုက်လိက် တၟေင် ညံင်ရဴဏအ် ဟွံမဲ",
        "nospecialpagetext": "<strong>မၞး အာတ်မိက်လဝ် မုက်လိက်တၟေင် မဟွံမဲမွဲရ၊၊</strong>\n\nစရင် မုက်လိက်တၟေင် မနွံတအ်ဂှ် ဂွံဆဵုကေတ် ပ္ဍဲ [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "ဗၠေတ်",
+       "databaseerror-query": "သၟာန်: $1",
        "databaseerror-function": "ကမၠောန်: $1",
        "databaseerror-error": "ဗၠေတ်: $1",
+       "missingarticle-rev": "(ကလၚ်ဖျေံ#:$1)",
        "missingarticle-diff": "(တၞဟ်ခြာ: $1, $2)",
        "internalerror": "ဗၠေတ်အပ္ဍဲ",
        "internalerror_info": "ဗၠောတ်အပ္ဍဲ:$1",
+       "filecopyerror": "ဆာဲစၠောံ ဝှာၚ်  \"$1\" ဏာစရေၚ် \"$2\" ဟွံမာန်",
+       "filerenameerror": "ကလေၚ်ကဵုယၟုဝှာၚ် \"$1\" ဏာ \"$2\" ဟွံမာန်",
+       "filedeleteerror": "ပလီုကေတ်ဝှာၚ် \"$1\" ဟွံမာန်",
+       "directorycreateerror": "ခၞံကၠောန်ကေတ် လိက်အုပ်မစၞောန်ထ္ၜးဌာန်ဒၟံၚ်ကဵုယၟုမၞိဟ် \"$1\" ဟွံမာန်",
+       "directoryreadonlyerror": "အိက်အုပ်မစၞောန်ထ္ၜးဌာန်ဒၟံၚ်ကဵုယၟုမၞိဟ် \"$1\" ဂှ် ဆအယာံမာတ်- ဗှ်ဟေၚ်",
+       "directorynotreadableerror": "လိက်အုပ်မစၞောန်ထ္ၜးဌာန်ဒၟံၚ်ကဵုယၟုမၞိဟ် \"$1\" ဂှ် ဗှ်ကေတ်မာန်ဟွံသေၚ်.",
+       "filenotfound": "ဂၠာဲကေတ် ဝှာၚ် \"$1\" ဟွံမာန်",
+       "unexpected": "ၚုဟ်မး ဟွံစၟဳကေတ်: \"$1\"=\"$2\"",
+       "formerror": "ဗၠောတ်: ပတိုန်တၞးဗပေၚ်ဏအ် ဟွံမာန်.",
        "cannotdelete-title": "ပလီုကေတ်မုက်လိက်ဟွံဂွံ$1",
        "badtitle": "က္ဍိုပ်လိက် ဟွံခိုဟ်",
        "badtitletext": "မုက်လိက် မအာတ်မိက်လဝ်ဂှ် ဟွံသၟဟ်အစောမ်၊ သၠာတ်သၠးဒၟံင် ဟွံသေင်မ္ဂး ဆက်စၠောအ်လေန်လဝ် ကုအရေဝ်ဘာသာနာနာ ဟွံသေင်မ္ဂး က္ဍိုပ်လိက် အပ္ဍဲအကြာဝဳကဳ ဟွံဒးရ၊၊\nဟိုတ်နူ စကာလဝ် မလိက် နဒဒှ်က္ဍိုပ်လိက်ဟွံဂွံ ပါလုပ်ဒၟံင် မွဲမ ဟွံသေင်မ္ဂး မဂၠိုင် ကုမ လေဝ် ဒှ်မာန်ရ၊၊",
+       "title-invalid-characters": "က္ဍိုပ်လိက် မုက်လိက်မအာတ်လဝ်အခေါၚ် သၚ်္ကေတ ဟွံစှ်ေသၞောတ် မပါလုပ်: \"$1\"",
        "viewsource": "ထ္ၜး တမ်ရိုဟ်",
        "viewsource-title": "ဗဵု တမ်ရိုဟ် သွက် $1",
        "actionthrottled": "ပွပတ်ကအ်",
        "viewsourcetext": "မၞး ဗဵု ကေုာံ စၠောအ်ကပ်ပဳကေတ် တမ်ရိုဟ် မုက်လိက်ဏအ် ဂွံရ၊၊",
+       "namespaceprotected": "မၞး ဟွဲမွဲကဵု အခေါၚ်အရာ သ္ဂောအ်ပလေဝ်ဒါန် မုက်လိက် ပ္ဍဲ<strong>$1</strong> ဒၞဲါယၟု.",
+       "customcssprotected": "မၞး ဟွံမွဲကဵု အခေါၚ်အရာ သ္ဂောအ် ပလေဝ်ဒါန် မုက်လိက် CSS ဏအ် မုဟိုတ်တှ်ေ ဍေံတအ်ဂှ် မၞုံဒၟံၚ်ကဵု မချိၚ်ထ္ၜတ်ပရၚ်ပူဂိုလ်ညးလွဟ်တၞဟ်တအ်ရ.",
+       "customjsonprotected": "မၞး ဟွံမွဲကဵု အခေါၚ်အရာ သ္ဂောအ် ပလေဝ်ဒါန် မုက်လိက် JSON ဏအ် မုဟိုတ်တှ်ေ ဍေံတအ်ဂှ် မၞုံဒၟံၚ်ကဵု မချိၚ်ထ္ၜတ်ပရၚ်ပူဂိုလ်ညးလွဟ်တၞဟ်တအ်ရ.",
+       "customjsprotected": "မၞး ဟွံမွဲကဵု အခေါၚ်အရာ သ္ဂောအ် ပလေဝ်ဒါန် မုက်လိက် JavaScript ဏအ် မုဟိုတ်တှ်ေ ဍေံတအ်ဂှ် မၞုံဒၟံၚ်ကဵု မချိၚ်ထ္ၜတ်ပရၚ်ပူဂိုလ်ညးလွဟ်တၞဟ်တအ်ရ.",
+       "sitecssprotected": "မၞး ဟွံမွဲကဵု အခေါၚ်အရာ သ္ဂောအ် ပလေဝ်ဒါန် မုက်လိက် CSS ဏအ် မုဟိုတ်တှ်ေ ဇီုကပိုက်အာကဵု ကၟုဲတအ်သီုဖအိုတ်မာန်ဏောၚ်.",
+       "sitejsonprotected": "မၞး ဟွံမွဲကဵု အခေါၚ်အရာ သ္ဂောအ် ပလေဝ်ဒါန် မုက်လိက် JSON ဏအ် မုဟိုတ်တှ်ေ ဇီုကပိုက်အာကဵု ကၟုဲတအ်သီုဖအိုတ်မာန်ဏောၚ်.",
+       "sitejsprotected": "မၞး ဟွံမွဲကဵု အခေါၚ်အရာ သ္ဂောအ် ပလေဝ်ဒါန် မုက်လိက် JavaScript ဏအ် မုဟိုတ်တှ်ေ ဇီုကပိုက်အာကဵု ကၟုဲတအ်သီုဖအိုတ်မာန်ဏောၚ်.",
        "mycustomcssprotected": "မၞးဟွံမွဲကဵုအခေါၚ်ဂွံဒါန်မုက်လိက်CSSဏအ်.",
        "mycustomjsonprotected": "မၞးဟွံမွဲကဵုအခေါၚ်ဂွံဒါန်မုက်လိက်JSONဏအ်",
        "mycustomjsprotected": "မၞးဟွံမွဲကဵုအခေါၚ်ဂွံဒါန်မုက်လိက်JavaScriptဏအ်.",
        "mypreferencesprotected": "မၞးဟွံမွဲကဵုအခေါၚ်ဂွံဒါန်ပၟိက်ဒးဂၞပ်မၞး.",
        "ns-specialprotected": "မုက်လိက်ဗွဲတၟေၚ်မဂပ်ဝ်ဒါန်ဟွံဂွံ.",
        "titleprotected": "က္ဍိုပ်လိက်ဏအ် ဒးဒုၚ်စဵုဒၞါနူမခၞံကၠောန်နကဵု[[User:$1|$1]].\nဟိုတ်မကဵုလဝ်တအ်တုန် <em>$2</em>.",
+       "filereadonlyerror": "ဟွံသၟဟ်အစောန် သ္ဂောံ ပြုပြေၚ် ဝှာၚ် \"$1\" မုဟိုတ်တှေ် ဝှာၚ်မဒုၚ်လျိုၚ် \" $2\" ဂှ် နွံပ္ဍဲ မဝ်ဒယ် ဆ-ဗှ်ဟေၚ်.\nညးကောပ်ကာဲသၞောတ် ပူဂိုလ်မကၟာတ်လတ် အရာဏအ် ကဵုကၠုၚ်တၚ်သောၚ်ကလး: \"$3\"",
        "invalidtitle": "က္ဍိုပ်လိက်မဟွံစှေ်ကဵုဗဗွဲဓရ်",
        "invalidtitle-knownnamespace": "က္ဍိုပ်လိက် မဟွံစှ်ေကဵုဗဗွဲဓရ် နကဵု ဒၞဲါယၟု \"$2\" ကေုာံ လိက် \"$3\"",
        "invalidtitle-unknownnamespace": "က္ဍိုပ်လိက် မဟွံမွဲကဵုဗဗွဲဓရ် ကေုာံ မဂၞန်ဒၞဲါယၟု မတီကေတ်ဟွံမာန် \"$1\"  ကေုာံ လိက်\"$2\"",
        "botpasswords-label-resetpassword": "ကလေင်စုတ် မလိက်ပၞုက်",
        "botpasswords-label-grants": "ဂရမ်မကလိဂွံမာန်:",
        "botpasswords-bad-appid": "ယၟု bot \"$1\" ဂှ်ဟွံကိတ်ညဳ.",
+       "resetpass_forbidden": "မက္ခရ်ပၞုက်လှာဲကေတ်ဟွံဂွံ",
+       "resetpass_forbidden-reason": "မအက္ခရ်ပၞုက်တအ် လှာဲကေတ်ဟွံဂွံ:$1",
+       "resetpass-no-info": "မၞးထေက်ကဵု ဒးလုပ်လံက်လဝ် သ္ဂောအ်လုပ်မုက်လိက်ဗွဲတိုက်ရိုက်.",
        "resetpass-submit-loggedin": "လှာဲအက္ခရ်ပၞုက်",
        "resetpass-submit-cancel": "တးပါဲ",
        "resetpass-temp-password": "အက္ခရ်ပၞုက် ယာယဳ:",
        "passwordreset-domain": "ဒိုမိန်:",
        "passwordreset-email": "ဌာန်အဳမေလ်တအ်",
        "passwordreset-emailtitle": "ခၞံကၠောန်အကံက်သွက်{{SITENAME}}",
+       "passwordreset-emailelement": "ယၟုညးလွပ်:\n$1\n\nမက္ခရ်ပၞုက် ယာယဳ:\n$2",
+       "passwordreset-emailsentemail": "ယဝ်ဌာန်ဒတန်အဳမေလ်ဏအ်ဆက်စပ်ကဵုအကံက်မၞး, ဗွဲကြဴ အဳမေလ် မအက္ခရ်ပၞုက်မကလေၚ်ချိၚ် ပလံၚ်ဏာဏောၚ်.",
        "passwordreset-invalidemail": "အဳမေလ် ဟွံလုပ်အဝေါင်",
        "changeemail": "လှာဲ ဟွံသေၚ် ပတိတ် ဌာန်ဒတန် အဳမေလ်",
        "changeemail-oldemail": "ဌာန်ဒတန် အဳမေလ် သုၚ်စောဲလၟုဟ်:",
        "editing": " $1 ပလေဝ်ဒါန်ဒၟံင်",
        "creating": "မခၞံကၠောန်ဒၟံင် $1",
        "editingsection": "ပလေဝ်ဒါန်ဒၟံင် (ဒကုတ်) $1",
+       "editingcomment": "ဒါန်ဒၟံၚ် $1 (အခန် တၟိ)",
+       "editconflict": "ဒါန်ပလေဝ် ဒှ်ဒစဵုဒစး :$1",
+       "yourtext": "လိက်မၞး",
        "yourdiff": "မတၞဟ်ခြာတအ်",
        "templatesused": "{{PLURAL:$1|Template|Templates}} မသုင်စောဲ ပ္ဍဲ မုက်လိက်ဏအ်:",
        "templatesusedpreview": "{{PLURAL:$1|Template|Templates}} မစကာလဝ် ပ္ဍဲနမူနာဏအ်-",
        "recreate-moveddeleted-warn": "<strong>သတိ - မုက်လိက် မဒးဒုင်ပလီုလဝ်တုဲ ခြာဟွံလအ်ဂှ် မၞး ကလေင်ခၞံကၠောန်ဒၟံင်ရ၊၊</strong>\nမုက်လိက်ဂှ် မၞးကလေင်ပလေဝ်ဒါန်ကၠောန် ထေက် ဟွံထေက်ဂှ် မၞးထေက် ကဵုဒးဗစာရဏာရ၊၊\n\nသွက်မၞး ဂွံဆဵုကေတ်မာန်ဂှ် တင်စၟတ်သမ္တီ ဒဒှ်မပလီု ကေုာံ မပြံင်ပဆုဲတအ်ဂှ် ထ္ၜးကဵုလဝ် ပ္ဍဲဒၞာဲဏအ်ရ၊၊",
        "moveddeleted-notice": "မုက်လိက်ဏအ် ဒးဒုင် ပလီုထောအ်လဝ်ရ၊၊\nတင်စၟတ်သမ္တီ အရာမပလီု၊ မစဵုဒၞာ၊ မပြံင်လဝ် မုက်လိက်တအ်ဂှ် ဗၟံက်ထ္ၜးလဝ် ဗွဲသၟဝ်ဏအ် သွက်ဂွံနိဿဲ၊၊",
        "edit-conflict": "ဒါန်ပလေဝ် ဒှ်ဒစဵုဒစး",
+       "postedit-confirmation-created": "မုက်လိက်ဒးဒုၚ်ခၞံကၠောန်တုဲယျ.",
+       "postedit-confirmation-restored": "မုက်လိက်ဒးဒုၚ်ကလေၚ်သီစွံတုဲယျ.",
        "postedit-confirmation-saved": "မၞးဒါန်လဝ်ဂှ် ဂိုၚ်သိပ်တုဲယျ.",
        "postedit-confirmation-published": "မၞးဒါန်လဝ်တအ်ဂှ်တြးပတိတ်တုဲယျ.",
        "edit-already-exists": "ကၠောန်ခၞံကေတ်မုက်လိက်တၟိဂွံဟွံသေၚ်.\nနွံမံၚ်တုဲတုဲယျ.",
        "editpage-invalidcontentmodel-title": "ဗီုပြၚ်မာတိကာဂှ်ဟွံထက်ပံၚ်လဝ်ရ",
        "editpage-invalidcontentmodel-text": "ဗီုပြၚ်မာတိကာ\"$1\"ဏအ်ဟွံထံက်ပၚ်ရ။",
        "content-model-wikitext": "ဖျုန်လိက်ဝဳကဳ",
+       "content-model-text": "လိက်ပလး",
+       "content-model-javascript": "JavaScript",
+       "content-json-empty-object": "ဟွံမွဲကဵု ကပေါတ်",
        "undo-failure": "ပရေင်ပလေဝ်ဒါန်ဂှ် ပတုဲဟွံဂွံ ဟိုတ်တုန် ဒၟာနူ မၞုံ ကုအခက်အခုဲ ပရေင်ပလေဝ်ဒါန် ဗွဲအပ္ဍဲ၊၊",
        "viewpagelogs": "ဗဵု တင်စၟတ်သမ္တီ မုက်လိက်ဏအ်",
        "currentrev": "မူ ကြဴအိုတ်",
        "history-fieldset-title": "ဂၠာဲ မူတြေံဂမၠိုင်",
        "histfirst": "တြေံအိုတ်",
        "histlast": "တၟိအိုတ်",
+       "historysize": "({{PLURAL:$1|1 ဘာ်|$1 ဘာ်ဂမၠိုၚ်}})",
        "historyempty": "(ဟွံမွဲ)",
        "history-feed-title": "လၟေင်အပြံင်အလှာဲ မူလိက်",
        "history-feed-description": "လၟေင်အပြံင်အလှာဲ မပလေဝ်ဒါန်လဝ် ပ္ဍဲမုက်လိက်ဏအ် ပ္ဍဲကဵု ဝဳကဳ",
        "history-feed-item-nocomment": "$1 ပ္ဍဲ $2",
+       "rev-deleted-user": "(ပတိတ်ထောံ ယၟုညးလွပ်)",
        "rev-delundel": "ပြံင်လှာဲ ဗီုပြင်မဂွံညာတ်ကေတ်",
        "rev-showdeleted": "ထ္ၜး",
        "revdelete-show-file-submit": "ယွံ",
        "revdelete-log": "ဟိုတ်:",
        "pagehist": "လၟေၚ်အပြံၚ်အလှာဲ မုက်လိက်",
        "deletedhist": "လၟေၚ်အပြံၚ်အလှာဲ ပလီုလဝ်",
+       "revdelete-otherreason": "တၞဟ်/မထပ် ဟိုတ်:",
        "revdelete-reasonotherlist": "ဟိုတ် တၞဟ်",
+       "revdelete-edit-reasonlist": "ဒါန် ဟိုတ်ပလီုဂမၠိုၚ်",
        "mergehistory-from": "တမ်ရိုဟ် မုက်လိက်:",
        "mergehistory-reason": "ဟိုတ်:",
        "mergelog": "တင်စၟတ်သမ္တီ အရာမပံင်ပကောံလဝ်",
        "right-upload_by_url": "ပတိုန်ပၠောပ် ဝှာၚ် နူ URL",
        "right-writeapi": "အခေါင်အရာ ညးမချူ API",
        "right-delete": "မုက်မပလီုလဝ်",
+       "right-userrights": "ဒါန် အခေါၚ်အရာညးလွဟ်တအ်အလုံဖအိုတ်",
+       "grant-group-email": "ပလံၚ် အဳမေလ်",
        "grant-createaccount": "ခၞံကၠောန် အကံက်",
        "grant-createeditmovepage": "ခၞံကၠောန်, ဒါန်, ကေုာံ ပဆုဲ မုက်လိက်ဂမၠိုၚ်",
        "grant-editmyoptions": "ဒါန် ပၟိက်ဂၞပ်မၞး",
        "grant-editmywatchlist": "ပလေဝ် စရင်မမင်မဲ အပြောမ်",
        "grant-uploadfile": "ပတိုန်ပၠောပ် ဝှာင်တၟိ",
+       "grant-basic": "အခေါၚ်အရာသ္ဇိုၚ်",
+       "grant-viewmywatchlist": "ရံၚ် စရင်မမင်မွဲ မၞး",
        "newuserlogpage": "စၟတ်သမ္တီ ညးလွပ် မခၞံကၠောန်လဝ်",
        "rightslog": "တင်စၟတ်သမ္တီ အခေါင်အရာ ညးလွပ်",
+       "action-read": "ဗှ်လိက်မုက်လိက်ဏအ်",
        "action-edit": "ပလေဝ်ဒါန် မုက်လိက် ဏအ်",
+       "action-createpage": "ခၞံကၠောန်မုက်လိက်ဏအ်",
+       "action-createtalk": "ခၞံကၠောန်မုက်လိက်သဳကၠဳဏအ်",
        "action-createaccount": "ခၞံကၠောန် အကံက် ညးလွပ်ဏအ်",
        "action-move": "ပြံင်ပဆုဲ မုက်လိက်ဏအ်",
        "action-move-rootuserpages": "ပဆုဲတမ်ရိုဟ်မုက်လိက်ညးလွပ်",
        "rcfilters-days-show-days": "$1 {{PLURAL:$1|တ္ၚဲ|တ္ၚဲဂမၠိုင်}}",
        "rcfilters-days-show-hours": "$1{{PLURAL:$1|နာဍဳ|နာဍဳဂမၠိုၚ်}}",
        "rcfilters-highlighted-filters-list": "Highlighted: $1",
+       "rcfilters-quickfilters": "ဂိုၚ်သိပ်ဖဍိုဟ်ဂမၠိုၚ်",
+       "rcfilters-savedqueries-defaultlabel": "ဂိုၚ်သိပ်လဝ် ဖဍိုဟ်ဂမၠိုၚ်",
        "rcfilters-savedqueries-rename": "ကဵုယၟုတၟိ",
+       "rcfilters-savedqueries-setdefault": "ချိၚ်ကေတ်နဒဒှ်လၟိုန်",
+       "rcfilters-savedqueries-unsetdefault": "ပတိတ် နဒဒှ်လၟိုန်",
        "rcfilters-savedqueries-remove": "ပလီု",
        "rcfilters-savedqueries-new-name-label": "ယၟု",
+       "rcfilters-savedqueries-new-name-placeholder": "ထမံက်ထ္ၜး တၚ်ရန်တၟံဖဍိုဟ်",
        "rcfilters-savedqueries-apply-label": "ခၞံကၠောန် ဟဍိုဟ်",
+       "rcfilters-savedqueries-apply-and-setdefault-label": "ခၞံကၠောန်ဖဍိုဟ်မလၟိုန်",
        "rcfilters-savedqueries-cancel-label": "တးပဲါ",
+       "rcfilters-savedqueries-add-new-title": "ဂိုၚ်သိပ် လချိၚ်ဖဍိုဟ်လၟုဟ်တအ်",
        "rcfilters-filterlist-title": "ဖဍိုဟ်",
        "rcfilters-highlightmenu-title": "ရုဲ အရံၚ်",
        "rcfilters-highlightmenu-help": "ရုဲ အရံၚ် သွက်ဂွံဖျောန် ကပေါတ်ဏအ်",
        "rcfilters-filter-watchlistactivity-seen-label": "သီဂိုၚ်မပြံၚ်လှာဲတအ်",
        "rcfilters-filtergroup-changetype": "ပြောင်းလဲမှု အမျိုးအစား",
        "rcfilters-filter-pageedits-label": "စာမျက်နှာ တည်းဖြတ်မှုများ",
+       "rcfilters-filter-newpages-label": "မခၞံကၠောန် မုက်လိက်",
+       "rcfilters-filter-categorization-label": "လှာဲ ကဏ္ဍ",
        "rcfilters-filtergroup-lastRevision": "မူမဒါန်လဝ် လက္ကရဴအိုတ်ဂမၠိုၚ်",
        "rcfilters-filter-lastrevision-label": "မူမဒါန်လဝ် လက္ကရဴအိုတ်",
        "rcfilters-tag-prefix-namespace-inverted": "<strong>:ဟွံသေၚ်</strong> $1",
        "filereuploadsummary": "ဝှာၚ် ပြံၚ်ဂမၠိုၚ်:",
        "filestatus": "ကဆံၚ် တၠမူ:",
        "filesource": "တမ်ရိုဟ်:",
+       "filename-tooshort": "ယၟုဝှာၚ်ဏအ်ဂှ် ဂၠိကွေအ်ကွေအ်.",
        "savefile": "ဂိုၚ်သိပ် ဝှာၚ်",
        "upload-source": "တမ်ရိုဟ် ဝှာၚ်",
        "sourcefilename": "တမ်ရိုဟ် ယၟုဝှာၚ်:",
        "upload-disallowed-here": "မၞး ထပ်ချူစုတ် ပ္ဍဲ ဝှာင်ဏအ် ဟွံဂွံ၊၊",
        "filerevert-comment": "ဟိုတ်:",
        "filerevert-submit": "ကလေင်ပြံင်",
+       "filedelete": "ပလီုလဝ် $1",
        "filedelete-comment": "ဟိုတ်:",
        "filedelete-submit": "ပလီု",
+       "filedelete-otherreason": "တၞဟ်/မထပ် ဟိုတ်:",
        "filedelete-reason-otherlist": "ဟိုတ် တၞဟ်",
+       "filedelete-edit-reasonlist": "ဒါန် ဟိုတ်ပလီုဂမၠိုၚ်",
        "filedelete-maintenance-title": "ဝှာၚ် ပလီု ဟွံဂွံ",
        "mimesearch": "ဂၠာဲ MIME",
        "mimetype": "ဂကူ MIME:",
        "statistics-pages": "မုက်လိက်ဂမၠိုင်",
        "statistics-files": "ပတိုန်ပၠောပ် ဝှာင်မဂၠိုၚ်",
        "statistics-users": " ညးလွပ် မစၟတ်သမ္တီလဝ်တုဲဂမၠိုင်",
+       "statistics-users-active": "ညးလွပ်မချဳဒရာၚ်",
        "pageswithprop-submit": "အာ",
        "double-redirect-fixer": "ညးမပလေဝ် အရာမကလေင်စၞောန်ပညုင်",
        "brokenredirects-edit": "ပလေဝ်ဒါန်",
        "brokenredirects-delete": "ပလီု",
        "withoutinterwiki-submit": "ထ္ၜး",
        "nbytes": "$1 {{PLURAL:$1|byte|bytes}}",
+       "ncategories": "$1{{PLURAL:$1|ကဏ္ဍ|ကဏ္ဍဂမၠိုင်}}",
+       "ninterwikis": "$1 {{PLURAL:$1|အေန်တာဝဳကဳ|အေန်တာဝဳကဳဂမၠိုၚ်}}",
+       "nlinks": "$1 {{PLURAL:$1|link|links}}",
        "nmembers": "$1 {{PLURAL:$1|ကောန်ဂကောံ|ကောန်ဂကောံဂမၠိုင်}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|ညးလုပ်ဂကောံ|ညးလုပ်ဂကောံဂမၠိုၚ်}}",
+       "unusedcategories": "ကဏ္ဍ မဟွံသုၚ်စောဲလဝ်ဂမၠိုၚ်",
+       "unusedimages": "ဝှာၚ် မဟွံသုၚ်လဝ်တအ်",
+       "wantedcategories": "ကဏ္ဍ မနွံပၟိက်လဝ်တအ်",
        "prefixindex": "မုက်လိက် သီုဖအိုတ် နကဵု prefix",
        "prefixindex-submit": "ထ္ၜး",
        "shortpages": "မုက်လိက် မဂၠိဂမၠိုၚ်",
        "apihelp": "ရီု API",
        "apisandbox-submit": "သ္ပကေတ် မအာတ်",
        "apisandbox-reset": "ဖအး",
+       "apisandbox-retry": "ကလေင်ကၠောန်",
+       "apisandbox-examples": "ဥပမာဂမၠိုင်",
+       "apisandbox-add-multi": "ထပ်",
+       "apisandbox-results": "လဂွံဂမၠိုၚ်",
        "apisandbox-request-url-label": "အာတ်အခေါၚ် URL:",
        "apisandbox-request-json-label": "အာတ်အခေါၚ် JSON:",
        "apisandbox-request-time": "အခိၚ် မအာတ်: {{PLURAL:$1|$1 ms}}",
        "linksearch-ns": "ဒၞာဲယၟု:",
        "linksearch-ok": "ဂၠာဲ",
        "listusers-submit": "ထ္ၜး",
+       "activeusers-from": "ထ္ၜးမုက်လိက်ဂမၠိုၚ် စနူ:",
+       "listgrouprights": "အခေါၚ်အရာ ညးလွပ်ဂမၠိုၚ်",
        "listgrouprights-group": "ဂကောံ",
        "listgrouprights-rights": "အခေါၚ်အရာဂမၠိုၚ်",
        "listgrouprights-helppage": "Help: အခေါၚ်အရာ ဂကောံဂမၠိုၚ်",
        "listgrouprights-removegroup": "ပတိတ်{{PLURAL:$2|ဂကောံ|ဂကောံဂမၠိုၚ်}}: $1",
        "listgrouprights-addgroup-all": "ထပ် ဂကောံဂမၠိုၚ် သီုဖအိုတ်",
        "listgrouprights-removegroup-all": "ပတိတ် ဂကောံသီုဖအိုတ်",
+       "listgrouprights-namespaceprotection-namespace": "ဒၞာဲယၟု",
+       "listgrants-rights": "အခေါၚ်အရာဂမၠိုၚ်",
        "emailuser": "ပလံင် အဳမေလ် ကုညးလွပ်ဏအ်",
+       "emailuser-title-target": "ပလံၚ်လိက်ဣဏံ{{GENDER:$1|ညးလွပ်}}",
+       "emailuser-title-notarget": "ညးလွပ် အဳမေလ်",
+       "noemailtitle": "ဌာန်အဳမေလ်ဟွံမွဲ",
+       "emailusername": "ယၟုညးလွပ်:",
+       "emailusernamesubmit": "ဗပေင်",
+       "emailfrom": "နူ:",
+       "emailto": "ဗ္စိုပ်:",
+       "emailsubject": "ပရူပရာ:",
+       "emailmessage": "မေတ်သုက်:",
+       "emailsend": "ပလံင်",
+       "emailsent": "အဳမေလ် ပြၚ်တုဲ",
+       "emailsenttext": "ပိုဒ်လိက်အဳမေလ် မၞး မဒးပြၚ်ဏာတုဲယျ",
        "usermessage-editor": "သၞောတ် ပရိုင်မေတ်သေန်ဂျာ",
        "watchlist": "စရင်မမင်မဲ",
        "mywatchlist": "စရင်မမင်မဲ",
        "watchlistfor2": "သွက် $1 $2",
+       "watchnologin": "ဟွံ လုပ်လံက်အေန်လဝ်",
+       "addwatch": "စုတ် စရၚ် စရၚ်မမၚ်မွဲ",
+       "addedwatchtext-short": "မုက်လိက်\"$1\" ဒးဒုၚ်စုတ်လဝ် စရေၚ် စရၚ်မမၚ်မွဲမၞးရ.",
+       "removewatch": "ပတိတ်  နူ စရၚ်မမၚ်မွဲ",
+       "removedwatchtext-short": "မုက်လိက်\"$1\" ဒးဒုၚ်ပတိတ်နူ စရၚ် မၞ မမၚ်မွဲရ.",
        "watch": "မင်မဲ",
+       "watchthispage": "မင်မဲ မုက်လိက်ဏအ်",
        "unwatch": "ဟွံမင်မဲ",
        "watchlist-details": "{{PLURAL:$1|$1 မုက်လိက်ဂှ် နွံ|$1 မုက်လိက်တအ်ဂှ် နွံ}} ပ္ဍဲ စရင်မမင်မဲ မၞး (သီုကဵု မုက်လိက် ဓရီုကျာဂမၠိုင်).",
        "wlheader-showupdated": "မုက်လိက် မပြံင်လှာဲလဝ် ကြဴနူ မၞးမလုပ်ဝေင်လဝ်တုဲတအ်ဂှ် ထ္ၜးလဝ် နကဵု <strong>အက္ခရ်တီုတီု</strong>.",
        "wlnote": "ဗွဲသၟဝ်ဝွံ {{PLURAL:$1|ဒှ် အရာ မပြံင်လှာဲလဝ် လက္ကရဴအိုတ်ရ၊၊| ဒှ် အရာ မပြံင်လှာဲလဝ် လက္ကရဴအိုတ်ဂမၠိုင်ရ၊၊ <strong>$1</strong> အပြံင်အလှာဲ}} ပ္ဍဲအခိင် မအောန် နူ {{PLURAL:$2|နာဍဳ|<strong>$2</strong> နာဍဳ}}, ကု $3, $4.",
        "wlshowlast": "လက္ကရဴအိုတ် $1 နာဍဳ $2 တ္ၚဲ ဂှ် ထ္ၜးညိ",
+       "watchlist-hide": "ဗဒန်",
+       "watchlist-submit": "ထ္ၜး",
+       "wlshowhideminor": "မပလေဝ်ဒါန်လဝ် ညိည",
+       "wlshowhidebots": "ဗောတ်ဂမၠိုင်",
+       "wlshowhideliu": " ညးလွပ် မစၟတ်သမ္တီလဝ်တုဲဂမၠိုင်",
+       "wlshowhideanons": "ညးလွပ် ဟွံဗမံက်ယၟု",
+       "wlshowhidecategorization": "မုက်လိက် မသ္ပကၠောန်ကဏ္ဍ",
        "watchlist-options": "အရာမရုဲစှ် သွက် စရင်မမင်မဲ",
+       "watching": " မမၚ်မွဲဒၟံၚ်",
+       "unwatching": "ဟွံမၚ်မွဲဒၟံၚ်...",
        "enotif_reset": "ကဵုစၟတ် ကုမုက်လိက် မဗဵုစိုပ်လဝ်တုဲ သီုဖအိုတ်",
+       "enotif_impersonal_salutation": "{{SITENAME}} ညးလွပ်",
+       "enotif_subject_deleted": "{{SITENAME}} မုက်လိက် $1 ဒးဒုၚ် {{GENDER:$2|ပလီု}} နကဵု $2",
+       "enotif_subject_created": "{{SITENAME}} မုက်လိက် $1 ဒးဒုၚ် {{GENDER:$2|ခၞံကၠောန်လဝ်}} နကဵု $2",
+       "enotif_subject_moved": "{{SITENAME}} မုက်လိက် $1 ဒးဒုၚ် {{GENDER:$2|ပတိတ်လဝ်}} နကဵု $2",
+       "enotif_subject_restored": "{{SITENAME}} မုက်လိက် $1 ဒးဒုၚ် {{GENDER:$2|ကလေၚ်စွံလဝ်}} နကဵု $2",
+       "enotif_subject_changed": "{{SITENAME}} မုက်လိက် $1 ဒးဒုၚ် {{GENDER:$2|ပြံၚ်လဝ်}} နကဵု $2",
+       "enotif_body_intro_deleted": "The {{SITENAME}} မုက်လိက် $1 ဒးဒုၚ် {{GENDER:$2|ပလီုလဝ်}} ပ္ဍဲ $PAGEEDITDATE နကဵု $2, see $3.",
+       "enotif_lastdiff": "သ္ဂောအ်ဗဵုကေတ်ပြံၚ်လှာဲဏအ်, ရံၚ်ကေတ်$1",
+       "enotif_anon_editor": "ညးလွပ် ဟွံဗမံက်ယၟု $1",
+       "enotif_minoredit": "ဣဏအ်ဂှ် ဒှ်အရာ မပလေဝ်ဒါန် ညိည",
+       "deletepage": "မုက်မပလီု",
+       "confirm": "သ္ပဒတန်",
+       "delete-confirm": "ပလီုလဝ် $1",
+       "delete-legend": "ပလီု",
+       "historyaction-submit": "ထ္ၜး",
+       "actioncomplete": "ကမၠောန်အာစိုပ်ဒတုဲ",
+       "actionfailed": "ကမၠောန် ဟုံဗြီု",
        "dellogpage": "တင်စၟတ်သမ္တီ အရာမဇိုတ်ပလီုလဝ်",
+       "logentry-create-create": "$1 {{GENDER:$2|ခၞံကၠောန်လဝ်}} မုက်လိက် $3",
+       "deletecomment": "ဟိုတ်:",
+       "deleteotherreason": "တၞဟ်/မထပ် ဟိုတ်:",
+       "deletereasonotherlist": "ဟိုတ် တၞဟ်",
        "rollbacklink": "ကလေင်",
        "rollbacklinkcount": "ကလေင်အာ $1 {{PLURAL:$1|ပလေဝ်ဒါန်|ပလေဝ်ဒါန်ဂမၠိုင်}}",
+       "changecontentmodel-legend": "ပြံၚ် မဝ်ဒေလ် မာတိက",
+       "changecontentmodel-title-label": "က္ဍိုပ်မုက်လိက်",
+       "changecontentmodel-model-label": " မဝ်ဒေလ် မာတိကမတၟိ",
+       "changecontentmodel-reason-label": "ဟိုတ်:",
+       "changecontentmodel-submit": "ပြံင်လှာဲ",
+       "logentry-contentmodel-change-revertlink": "ကလေင်ပြံင်",
+       "logentry-contentmodel-change-revert": "ကလေင်ပြံင်",
        "protectlogpage": "တင်စၟတ်သမ္တီ အရာမစဵုဒၞာဂမၠိုင်",
        "protectedarticle": "မစဵုဒၞာလဝ် \"[[$1]]\"",
        "modifiedarticleprotection": "ပြံင်လှာဲ ကဆံင်မစဵုဒၞာ သွက် မုက်လိက် \"[[$1]]\"",
+       "prot_1movedto2": "[[$1]] ပြံၚ်ဏာ စရေၚ် [[$2]]",
+       "protectcomment": "ဟိုတ်:",
+       "protectexpiry": "အိုတ်အာ:",
        "protect-default": "ကဵုအခေါင် ညးလွပ် သီုဖအိုတ်",
+       "protect-othertime": "အခိၚ် တၞဟ်:",
+       "protect-othertime-op": "အခိၚ် တၞဟ်",
+       "protect-otherreason-op": "ဟိုတ် တၞဟ်",
+       "restriction-type": "တင်မကဵုအခေါင်:",
        "restriction-edit": "ပလေဝ်ဒါန်",
        "restriction-move": "ပြံင်ပဆုဲ",
+       "restriction-create": "ခၞံကၠောန်",
+       "restriction-upload": "ပတိုန်",
+       "undeletebtn": "ကလေၚ်စွံ",
+       "undeletelink": "ဗဗဵု/ကလေၚ်စွံ",
+       "undeleteviewlink": "ဗဗဵု",
+       "undeleteinvert": "ဂတးထောအ် အရာမရုဲစှ်",
+       "undeletecomment": "ဟိုတ်:",
+       "undelete-search-title": "ဂၠာဲ မုက်လိက်မပလီုလဝ်တအ်",
+       "undelete-search-box": "ဂၠာဲ မုက်လိက်မပလီုလဝ်တအ်",
+       "undelete-search-submit": "ဂၠာဲ",
+       "undelete-show-file-submit": "ယွံ",
        "namespace": "ဒၞာဲယၟု",
        "invert": "ဂတးထောအ် အရာမရုဲစှ်လဝ်",
        "tooltip-invert": "Check this box to hide changes to pages within the selected namespace (and the associated namespace if checked)",
        "month": "နူ ဂိတု (ကေုာံ ပြဟ်နူ)",
        "year": "နူ သၞာံ (ကေုာံ ပြဟ်နူ):",
        "sp-contributions-newbies": "ထ္ၜး အရာမကၠောန်ခၞံ နူကဵု အကံက်တၟိ ဟေင်",
+       "sp-contributions-newbies-sub": "သွက် အကံက် တၟိဂမၠိုၚ်",
+       "sp-contributions-newbies-title": "ညးလွပ် ရီုဗၚ် သွက် အကံက် တၟိဂမၠိုၚ်",
        "sp-contributions-blocklog": "စၟတ်သမ္တီ အရာမကၟာတ်ဗလံက်လဝ်",
        "sp-contributions-uploads": "ပတိုန်ပၠောပ်",
        "sp-contributions-logs": "တင်စၟတ်သမ္တီဂမၠိုင်",
        "whatlinkshere-hidelinks": "$1 လေန်",
        "whatlinkshere-hideimages": "$1 ဝှာင်အဆက်အစပ်",
        "whatlinkshere-filters": "ဖဍိုဟ်",
+       "whatlinkshere-submit": "အာ",
+       "block": "ညးလွပ် မဒးကၟာတ်",
+       "unblock": "ညးလွပ် ဟွံဒးကၟာတ်",
+       "ipbreason": "ဟိုတ်:",
+       "ipbsubmit": "ကၟာတ်ထောံ ညးလွပ်ဏအ်",
+       "ipbother": "အခိၚ် တၞဟ်:",
        "ipboptions": "၂ နာဍဳ:2 hours,၁ တ္ၚဲ:1 day,၃တ္ၚဲ:3 days,၁ သတ္တဟ:1 week,၂သတ္တဟ:2 weeks,၁ ဂိတု:1 month,၃ ဂိတု:3 months,၆ ဂိတု:6 months,၁ သၞာံ:1 year,ဟွံချိုတ်ပၠိုတ်:infinite",
+       "unblockip": "ဟွံကၟာတ်ထောံ ညးလွပ်",
+       "ipusubmit": "ပတိတ်ထောအ် ကရုင်ဏအ်",
+       "blocklist": "ညးလွပ်မဒးကၟာတ်လဝ်",
+       "autoblocklist-submit": "ဂၠာဲ",
+       "blocklist-reason": "ဟိုတ်",
+       "ipblocklist-submit": "ဂၠာဲ",
        "infiniteblock": "မဟွံမဲကုအပိုင်အခြာ",
        "blocklink": "ကၟာတ်ဗလံက်",
+       "unblocklink": "ဟွံကၟာတ်",
+       "change-blocklink": "ပြံၚ်ကရုၚ်",
        "contribslink": "တြးပတိတ်",
+       "emaillink": "ပလံၚ် အဳမေလ်",
        "blocklogpage": "စၟတ်သမ္တီ အရာမကၟာတ်ဗလံက်လဝ်",
        "blocklogentry": "ကၟာတ်ဗလံက်လဝ် [[$1]] နကဵု အပိုင်အခြာအခိင်  $2 ဟိုတ်နူ $3",
        "reblock-logentry": "ဒဒှ်မကၟာတ်လဒဵု ညးလွပ်  [[$1]] ဂှ် ပြံင်လှာဲလဝ် နကဵု တ္ၚဲလက္ကရဴအိုတ် $2 $3",
        "block-log-flags-nocreate": "ပွမခၞံကၠောန် အကံက်ဂှ် ဟွံသၟဟ်ရထ",
+       "ipb_already_blocked": "\"$1\" ကၟာတ်လဝ်တုဲ.",
+       "ipb-otherblocks-header": "တၞဟ် {{PLURAL:$1|ကၟာတ်|ကၟာတ်တအ်}}",
        "proxyblocker": "ညးမကၟာတ်စဵု proxy",
+       "move-page": "ပဆုဲ $1",
+       "move-page-legend": "ပဆုဲမုက်လိက်",
+       "movenotallowed": "မၞး အခေါၚ်အရာဟွံမွဲ သွက်ဂွံပဆုဲမုက်လိက်တအ်.",
+       "movenotallowedfile": "မၞး အခေါၚ်အရာ ဟွံမွဲ သ္ဂောအ်ပဆုဲဝှာၚ်တအ်",
+       "cant-move-user-page": "မၞး အခေါၚ်အရာ ဟွံမွဲ သ္ဂောံပဆုဲမုက်လိက် ညးလွပ် (မဒှ်အဝဲနူ သာပ်မုက်လိက်တအ်).",
+       "cant-move-category-page": "မၞး အခေါၚ်အရာဟွံမွဲ သွက်ဂွံပဆုဲ ကဏ္ဍမုက်လိက်တအ်.",
+       "cant-move-to-category-page": "မၞး အခေါၚ်အရာ ဟွံမွဲ သ္ဂောံပဆုဲမုက်လိက် စရၚ်မုက်လိက်မကဏ္ဍ",
+       "cant-move-subpages": "မၞး အခေါၚ်အရာဟွံမွဲ သွက်ဂွံပဆုဲသာပ်မုက်လိက်တအ်.",
+       "newtitle": "က္ဍိုပ်လိက်တၟိ:",
+       "movepagebtn": "ပဆုဲမုက်လိက်",
+       "pagemovedsub": "ပဆုဲ အံၚ်ဇၞးတုဲဒှ်",
+       "movepage-moved": "<strong>\"$1\" ဒးဒုၚ်ပဆုဲဏာလဝ်တေံ \"$2\"</strong>",
        "movelogpage": "ပြံင်ပဆုဲ တင်စၟတ်သမ္တီ",
+       "movereason": "ဟိုတ်:",
+       "revertmove": "ကလေင်ပြံင်",
+       "delete_and_move_confirm": "ယွံ, ပလီုမုက်လိက်",
+       "immobile-source-page": "မုက်လိက်ဏအ်ဂှ် ပဆုဲဟွံဂွံ.",
        "export": "ပတိတ်တြး မုက်လိက်တအ်",
+       "export-submit": "ပတိတ်",
+       "export-addcattext": "ထပ်မုက်လိက်နူကဏ္ဍ:",
+       "export-addcat": "စုတ်",
+       "export-addnstext": "ထပ်မုက်လိက်နူ ဒၞါယၟု:",
+       "export-addns": "စုတ်",
+       "export-download": "ဂိုၚ်သိပ် နဒဒှ် ဝှာၚ်",
+       "allmessagesname": "ယၟု",
+       "allmessagesdefault": "လိက်ဂလာန်ပိုဒ်မဒတန်",
+       "allmessages-filter-legend": "ဖဍိုဟ်",
+       "allmessages-filter-unmodified": "ဟွံပြုပြောၚ်လဝ်",
+       "allmessages-filter-all": " သီုဖအိုတ်",
+       "allmessages-filter-modified": "ပြုပြေၚ်လဝ်",
+       "allmessages-language": "အရေဝ်ဘာသာ :",
+       "allmessages-filter-submit": "အာ",
+       "allmessages-filter-translate": "မတြာဲ",
        "thumbnail-more": "ဇၞော်ပတိုန်",
+       "import": "ပလုပ် မုက်လိက်ဂမၠိုၚ်",
+       "importinterwiki": "ပလုပ် နူ ဝဳကဳ တၞဟ်",
+       "import-interwiki-sourcewiki": "တမ်ရိုဟ် ဝဳကဳ:",
+       "import-interwiki-sourcepage": "တမ်ရိုဟ် မုက်လိက်:",
+       "import-interwiki-submit": "ပလုပ်",
+       "import-upload-filename": "ယၟုဝှာင်:",
+       "import-comment": "တင်ပသောင်ကလး:",
+       "importstart": "ပလုပ်ဒၟံၚ် မုက်လိက်ဂမၠိုၚ်...",
+       "import-revision-count": "$1{{PLURAL:$1|ကလေၚ်|ကလေၚ်ဂမၠိုၚ်}}",
+       "importnopages": "ဟွံမွဲ မုက်လိက်ဂမၠိုၚ် သွက်ဂွံ ပလုပ်.",
+       "import-noarticle": "ဟွံမွဲ မုက်လိက်ဂမၠိုၚ် သွက်ဂွံ ပလုပ်!",
        "importlogpage": "တင်စၟတ်သမ္တီ မပၠောပ်စုတ်",
+       "javascripttest": "JavaScript စမ်ၜတ်ဒၟံၚ်",
+       "javascripttest-pagetext-unknownaction": "ပွ မတီကေတ်ဟွံမာန် $1",
        "tooltip-pt-userpage": "မုက်လိက် {{GENDER:|မၞးမသုင်စောဲ}}",
        "tooltip-pt-mytalk": "{{GENDER:|မုက်လိက် မၞး}} မဓရီုကျာ",
        "tooltip-pt-preferences": "{{GENDER:|မၞး}} မဒးဂၞပ်စိုတ်ဂမၠိုင်",
        "tooltip-t-permalink": "ဌာန်ဒၟံင်လေန် လၟိုန် မုက်လိက် မကလေင်ပလေဝ်ဏအ်",
        "tooltip-ca-nstab-main": "ဗဵု မုက်လိက် မာတိကာ",
        "tooltip-ca-nstab-user": "ဗဵု မုက်လိက် ညးလွပ်",
+       "tooltip-ca-nstab-media": "ဗဵု မုက်လိက် မဳဒဳယာ",
        "tooltip-ca-nstab-special": "မုက်လိက်ဏအ်ဂှ် ဒှ်မုက် တၟေင်၊ ဟိုတ်ဂှ်ရ ပလေဝ် ဟွံဂွံ",
        "tooltip-ca-nstab-project": "ဗဵု မုက်လိက် ပရဝ်ဂျေတ်",
        "tooltip-ca-nstab-image": "ဗဵု မုက်လိက် ဝှာင်",
        "tooltip-ca-nstab-mediawiki": "ကျောဝ်ဗဵု သၞောတ် ပရိုင်မေတ်သုက်",
        "tooltip-ca-nstab-template": "ကျောဝ်ဗဵု template",
+       "tooltip-ca-nstab-help": "ဗဵု မုက်လိက် ရီုဗၚ်",
        "tooltip-ca-nstab-category": "ဗဵု မုက်လိက်ကဏ္ဍ",
        "tooltip-minoredit": "ကဵုစၟတ် အရာဏအ် ဒဒှ်ရ မဒှ် အရာမပလေဝ်ဒါန် ညိည",
        "tooltip-save": "ဂိုင်သိပ် အရာမၞး မပြံင်လှာဲလဝ်",
+       "tooltip-publish": "မပြံၚ်လှာဲတအ် ပတိတ်တြး",
        "tooltip-preview": "ဗဵုနမူနာ အရာမၞး မပြံင်လှာဲလဝ်၊၊ ပဂုန်တုဲ ကၠာဟွံဂွံဂိုင်သိပ်ဂှ် ကၠောန်ကၠာညိ၊၊",
        "tooltip-diff": "ထ္ၜး ဒၞာဲ မလိက် မၞးမပြံင်လှာဲလဝ်ဂှ်ညိ",
        "tooltip-compareselectedversions": "ရံင် ဗီုတၞဟ်ခြာ အကြာ မူမပလေဝ်ဒါန်လဝ် ပ္ဍဲမုက်လိက်ဏအ် ဒၞာဲမရုဲစှ်လဝ် ၜါဂှ်",
        "tooltip-watch": "စုတ် မုက်လိက်ဏအ် ပ္ဍဲစရင်မမင်မဲ မၞး",
+       "tooltip-watchlistedit-normal-submit": "ပတိတ်ထောံ က္ဍိုပ်လိက်ဂမၠိုၚ်",
+       "tooltip-watchlistedit-raw-submit": "ပလေဝ် စရင်မမင်မဲ",
+       "tooltip-upload": "စ ပတိုန်",
        "tooltip-rollback": "\"Rollback\" reverts the last contributor's edit(s) to this page in one click",
        "tooltip-undo": "\"ဟွံကၠောန်\" ဂှ် ဒှ်အရာ မဟွံကၠောန်တုဲ ကလေင်အာ ဗီုအတိုင်တြေံ ကၠာဟွံဂွံစ ပလေဝ်လဝ်ဂှ်ရ၊၊ မုဟိုတ် ကလေင်အာ အတိုင်ဗီုတြေံပၠန်ဂှ် ချူစၟတ်သမ္တီ သကေံ မာန်ရ၊၊",
+       "tooltip-preferences-save": "ဂိုင်သိပ် မဒးဂၞပ်ဂမၠိုင်",
        "tooltip-summary": "စုတ် သကေမ် summary ဇမၠေအ်",
+       "siteuser": "{{SITENAME}} ညးလွပ် $1",
+       "anonuser": "{{SITENAME}} ညးလွပ် မဟွံပပြာကတ်ယၟု $1",
+       "lastmodifiedatby": "မုက်လိက်ဏအ် လက္ကရဴအိုတ် ပလေဝ်ဒါန်လဝ် $2, $1 နကဵု $3",
+       "othercontribs": "ဒုၚ်သ္ဇိုၚ်လ္တူကမၠောန် နူ$1",
+       "others": "တၞဟ်တအ်",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|{{လိၚ်:$1|ညးလွပ်}}|ညးလွပ်}} $1",
+       "creditspage": "မုက်လိက် မကဵုစရာဲဂမၠိုၚ်",
+       "spamprotectiontitle": "ဖဍိုဟ် ဂွံစဵုဒၞါ Spam",
        "simpleantispam-label": "စၟဳစၟတ် အရာမပလီုပလာ်\n<strong>လ္ပ </strong> စုတ် ပ္ဍဲဏအ်ညိ!",
        "pageinfo-title": "ပရိုင်တင်ဂၞင် သွက် \"$1\"",
        "pageinfo-header-basic": "ပရိုင်တင်ဂၞင် သဇိုင်",
        "pageinfo-length": "ဇမၠိင် မုက်လိက် (နကဵု ဘာက်)",
        "pageinfo-article-id": "မုက်လိက် ID",
        "pageinfo-language": "မုက်လိက် အရေဝ်ဘာသာ ဖျုန်လိက်",
+       "pageinfo-language-change": "ပြံင်လှာဲ",
        "pageinfo-content-model": "မုက်လိက် မဝ်ဒေလ် မာတိက",
+       "pageinfo-content-model-change": "ပြံင်လှာဲ",
        "pageinfo-robot-policy": "ကၠောန်မာတိကာ index နကဵု စက်ရဝ်ဗတ်",
        "pageinfo-robot-index": "မသၠးကဵုလဝ်အခေါင်",
        "pageinfo-robot-noindex": "ဟွံကဵုလဝ်အခေါင်",
        "pageinfo-hidden-categories": "ပၞုက် {{PLURAL:$1|ကဏ္ဍ|ကဏ္ဍဂမၠိုင်}} ($1)",
        "pageinfo-templates": "မကၠောန် Transcluded လဝ် {{PLURAL:$1|template|templates}} ($1)",
        "pageinfo-toolboxlink": "မုက်လိက် ပရိုင်တင်ဂၞင်",
+       "pageinfo-redirectsto-info": "တၚ်နၚ်",
        "pageinfo-contentpage": "ရိုဟ်လၟိဟ် နဒဒှ် မုက်လိက် မာတိကာ",
        "pageinfo-contentpage-yes": "ယွံ",
+       "pageinfo-protect-cascading-yes": "ယွံ",
+       "pageinfo-category-info": "တၚ်နၚ်ပရိုၚ် ကဏ္ဍ",
+       "pageinfo-category-total": "လၟိဟ် ကောန်ဂကောံ သီုဖအိုတ်",
+       "pageinfo-category-pages": "လၟိုဟ်မုက်လိက်ဂမၠိုၚ်",
+       "pageinfo-category-subcats": "လၟိုဟ် သာပ်ကဏ္ဍဂမၠိုၚ်",
+       "pageinfo-category-files": "လၟိုဟ် ဝှာၚ်တအ်",
+       "pageinfo-user-id": "ID ညးလွပ်",
        "patrol-log-page": "တင်စၟတ်သမ္တီ အရာမစဳစောတ်ကောပ်ကာဲ",
+       "confirm-markpatrolled-button": "ခိုဟ်",
        "previousdiff": "← အရာမပလေဝ်ဒါန်လဝ် တြေံ",
        "nextdiff": "မပလေဝ်ဒါန်လဝ် တၟိနူဂှ် →",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|မုက်လိက်|မုက်လိက်ဂမၠိုင်}}",
        "show-big-image-preview": "ဇမၞော် နမူနာ ဏအ် - $1",
        "show-big-image-other": "တၞဟ် {{PLURAL:$2|resolution|resolutions}}: $1.",
        "show-big-image-size": "$1 × $2 pixels",
+       "newimages-legend": "ဖဍိုဟ်",
+       "newimages-user": "IP address ဟွံသေင်မ္ဂး ယၟုမညးလွပ်",
+       "newimages-newbies": "ထ္ၜး အရာမကၠောန်ခၞံ နူကဵု အကံက်တၟိ ဟေင်",
+       "newimages-showbots": "ထ္ၜး ပတိုန်နူ ရုပ်စက်တအ်",
+       "ilsubmit": "ဂၠာဲ",
+       "bydate": "နကဵု စၟတ်တ္ၚဲ",
+       "sp-newimages-showfrom": "ထ္ၜး အရာမပြံင်လှာဲတၟိတၟိ စနူ $2, $1",
+       "seconds": "{{PLURAL:$1|စက္က|စက္ကဂမၠိုၚ်}}",
+       "minutes": "{{PLURAL:$1|$1ဗဳဇနာ|$1 ဗဳဇနာဂမၠိုၚ်}}",
+       "hours": "{{PLURAL:$1|နာဍဳ|နာဍဳဂမၠိုၚ်}}",
+       "days": "$1 {{PLURAL:$1|တ္ၚဲ|တ္ၚဲဂမၠိုင်}}",
+       "weeks": "{{PLURAL:$1|$1 အပါတ်|$1 အပါတ်ဂမၠိုၚ်}}",
+       "months": "{{PLURAL:$1|$1 ဂိတု|$1 ဂိတုဂမၠိုၚ်}}",
+       "years": "{{PLURAL:$1|$1 သၞာံ|$1 သၞာံဂမၠိုၚ်}}",
+       "ago": "$1 တုဲကၠုၚ်",
+       "just-now": "ဆ လၟုဟ်",
+       "hours-ago": "$1{{PLURAL:$1|နာဍဳ|နာဍဳဂမၠိုၚ်}} တုဲကၠုၚ်",
+       "minutes-ago": "$1 {{PLURAL:$1|ဗဳဇနာ|ဗဳဇနာဂမၠိုၚ်}} တုဲကၠုၚ်",
+       "seconds-ago": "$1 {{PLURAL:$1|စက္က|စက္ကဂမၠိုၚ်}} မတုဲကၠုၚ်",
+       "monday-at": "တ္ၚဲစန် ပ္ဍဲ$1",
+       "tuesday-at": "တ္ၚဲအၚာ ပ္ဍဲ $1",
+       "wednesday-at": "တ္ၚဲဗုဒ္ဓဝါ ပ္ဍဲ$1",
+       "thursday-at": "တ္ၚဲဗြဴပတိ ပ္ဍဲ $1",
+       "friday-at": "တ္ၚဲသိုက် ပ္ဍဲ$1",
+       "saturday-at": "တ္ၚဲသ္ၚိသဝ် ပ္ဍဲ$1",
+       "sunday-at": "တ္ၚဲအဒိုတ် ပ္ဍဲ$1",
+       "yesterday-at": "နူကနေံ ပ္ဍဲ$1",
        "metadata": "Metadata",
        "metadata-help": "ပ္ဍဲဝှာင်ဏအ်ဂှ် နွံဒၟံင် နကဵုအရာမဗပေင်စုတ်လဝ်ရ၊၊ မဒှ်အရာ မဗပေင်စုတ်လဝ် နူကဵု ကမ္မရာ ဒဳဂျဳတေဝ် ဟွံသေင်မ္ဂး နူသကေန်နာ မွဲမွဲ ဒှ်မာန်ရ၊၊\nယဝ်ရ ဝှာင်ဂှ် ဒးဒုင်ပလေဝ်ပလေတ် နူတမ်မူလဍေဟ်မ္ဂး၊ အရာလ္ၚဵုတအ်ဂှ် ဟွံမံက် ပ္ဍဲဝှာင်ဂှ် ဒှ်မာန်ရ၊၊",
        "metadata-fields": "Image metadata fields listed in this message will be included on image page display when the metadata table is collapsed.\nOthers will be hidden by default.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "exif-imagewidth": "အနာံ",
+       "exif-imagelength": "သၠုၚ်",
        "exif-orientation": "ဒဒှ်မဖျေဟ်ဗီုပြင်မုက်",
        "exif-xresolution": "သွဟ် ဂၠံင်လၞင်",
        "exif-yresolution": "သွဟ် ဂၠံင်စှ်ေ",
        "exif-datetime": "ဝှာင် ပြံင်လှာဲ စၟတ်တ္ၚဲ ကေုာံ အခိင်",
+       "exif-imagedescription": "က္ဍိုပ်လိက် ဗီုရုပ်",
        "exif-make": "ညးမကၠောန်ပတိတ် ကမ္မရာ",
        "exif-model": "မဝ်ဒေလ် ကမ္မရာ",
        "exif-software": "သပ်ဝဴ မစကာလဝ်",
+       "exif-artist": "ကဝိ",
        "exif-exifversion": "Exif version",
        "exif-colorspace": "ဒၞာဲ အသာ်",
+       "exif-pixelxdimension": "အနာံ သၞိၚ်ရုပ်",
+       "exif-pixelydimension": "သၠုၚ် ဗီုရုပ်",
        "exif-datetimeoriginal": "စၟတ်တ္ၚဲ ကေုာံ အခိင် မခၞံဗဒှ် ဒါတာ",
        "exif-datetimedigitized": "စၟတ်တ္ၚဲ ကေုာံ အခိင် မပြံင်လှာဲ နကဵုဒဳဂျဳတေဝ်",
+       "exif-headline": "က္ဍိုပ်လိက်",
+       "exif-credit": "မကဵုစရာဲ/ ညးဖန်ကၠောန်",
+       "exif-source": "တမ်ရိုဟ်",
+       "exif-writer": "ညးချူ",
+       "exif-languagecode": "အရေဝ်ဘာသာ",
+       "exif-iimversion": "မူ IIM",
+       "exif-iimcategory": "ကဏ္ဍ",
+       "exif-datetimereleased": "တြးပတိတ်လဝ်",
+       "exif-label": "ကရံက်",
+       "exif-unknowndate": "စၟတ်တ္ၚဲ တီကေတ်ဟွံမာန်",
        "exif-orientation-1": "ဓမ္မတာ",
+       "exif-orientation-3": "ဗ္ဂေတ်ကေတ် 180°",
+       "exif-orientation-6": "ဗ္ဂေတ်ကေတ် 90° CCW",
+       "exif-orientation-8": "ဗ္ဂေတ်ကေတ် 90° CW",
+       "exif-exposureprogram-1": "ဗွဲတဲ",
+       "exif-meteringmode-0": "တီကေတ်ဟွံမာန်",
+       "exif-meteringmode-3": "ပချဳဇိုၚ်တဲ",
+       "exif-meteringmode-255": "တၞဟ်",
+       "exif-lightsource-0": "တီကေတ်ဟွံမာန်",
+       "exif-focalplaneresolutionunit-2": "ၝောံတဲဂမၠိုၚ်",
+       "exif-scenecapturetype-1": "လ္ပာ်အနာံ",
+       "exif-scenecapturetype-2": "လ္ပာ်ပစူ",
+       "exif-gaincontrol-0": "ဟွံသေၚ်",
+       "exif-contrast-0": "ဓမ္မတာ",
+       "exif-contrast-1": "ဍိုန်ၜတ်",
+       "exif-contrast-2": "ကြံၚ်မ္ၚိုဟ်",
+       "exif-saturation-0": "ဓမ္မတာ",
+       "exif-sharpness-0": "ဓမ္မတာ",
+       "exif-sharpness-1": "ဍိုန်ၜတ်",
+       "exif-sharpness-2": "ကြံၚ်မ္ၚိုဟ်",
+       "exif-subjectdistancerange-0": "တီကေတ်ဟွံမာန်",
+       "exif-gpsdop-excellent": "အိုတ်အစောန်$1",
+       "exif-gpsdop-good": "ခိုဟ် ($1)",
+       "exif-gpsdop-moderate": "တဲအဒေါဝ် ($1)",
+       "exif-gpsdop-fair": "ဓရ်ယာ($1)",
+       "exif-gpsdop-poor": "အောန်($1)",
+       "exif-objectcycle-a": "နူဂယး ဟေၚ်",
+       "exif-objectcycle-p": "သဝ်တ္ၚဲ ဟေၚ်",
+       "exif-objectcycle-b": "သီု နူဂယး ကဵု သဝ်တ္ၚဲ",
+       "exif-dc-date": "ပလီု(တအ်)",
+       "exif-dc-publisher": "ညးတြးပတိတ်",
+       "exif-dc-rights": "အခေါၚ်အရာဂမၠိုၚ်",
+       "exif-iimcategory-edu": "ပရေၚ်ပညာ",
+       "exif-iimcategory-evn": "ပရေၚ်ပွဳပွိုၚ်သဘာဝ",
+       "exif-iimcategory-hth": "ပရေၚ်ထတ်ယုတ်",
+       "exif-iimcategory-hum": "ဒတုဲဖိုဟ် မၞိဟ်",
+       "exif-iimcategory-lab": "သၟာကမၠောန်",
+       "exif-iimcategory-pol": "ပရေၚ်ဍုၚ်ကွာန်",
+       "exif-iimcategory-rel": "ဘာသာ ကေုာံ ဓရ်ပတှေ်",
+       "exif-iimcategory-sci": "သိပ္ပံ ကေုာံ နဲကဲပညာ",
+       "exif-iimcategory-soi": "ပရူပရာ ပရေၚ်မၞိဟ်",
+       "exif-iimcategory-spo": "ပရေၚ်ချဳဒရာၚ်ဂမၠိုၚ်",
+       "exif-iimcategory-war": "ပၞာန်, ပဋိပက္ခ ကေုာံ ကလာ်ကမဵု",
+       "exif-iimcategory-wea": "ဥတုရာသီ",
+       "exif-urgency-normal": "သာမည ($1)",
+       "exif-urgency-low": "သဝ် ($1)",
+       "exif-urgency-high": "သၠုၚ် ($1)",
        "namespacesall": "သီုဖအိုတ်",
        "monthsall": "သီုဖအိုတ်",
+       "confirm_purge_button": "OK",
+       "confirm-watch-button": "OK",
+       "confirm-unwatch-button": "OK",
+       "confirm-rollback-button": "OK",
+       "quotation-marks": "\"$1\"",
+       "imgmultipageprev": "← မုက်လိက် ကြဴ",
        "imgmultipagenext": "မုက်လိက်ဂတ →",
        "imgmultigo": "အာ!",
        "imgmultigoto": "အာ ဇရေင် မုက်လိက် $1",
+       "img-lang-go": "အာ",
+       "table_pager_next": "မုက်လိက် ဂတ",
+       "table_pager_prev": "မုက်လိက် ကြဴ",
+       "table_pager_first": "မုက်လိက် ပထမ",
+       "table_pager_last": "မုက်လိက် လကြဴ",
+       "table_pager_limit_submit": "အာ",
+       "autosumm-new": "ခၞံကၠောန်လဝ် မုက်လိက် နကဵု \"$1\"",
+       "autosumm-newblank": "ခၞံကၠောန်လဝ် မုက်လိက် ပလး",
+       "watchlistedit-normal-title": "ပလေဝ် စရင်မမင်မဲ",
+       "watchlistedit-normal-legend": "ပတိတ် က္ဍိုပ်လိက်တအ် နူ စရၚ်မမၚ်မွဲ",
+       "watchlistedit-normal-submit": "ပတိတ်ထောံ က္ဍိုပ်လိက်ဂမၠိုၚ်",
+       "watchlistedit-raw-title": "ပလေဝ် စရင်မမင်မဲ အပြောမ်",
+       "watchlistedit-raw-legend": "ပလေဝ် စရင်မမင်မဲ အပြောမ်",
+       "watchlistedit-raw-titles": "က္ဍိုပ်လိက်ဂမၠိုၚ်:",
+       "watchlistedit-raw-submit": "ပဂဵုလဟဵု စရၚ်မမၚ်မွဲ",
+       "watchlistedit-raw-done": "စရၚ်မမၚ်မွဲ မၞး ပဂဵုလဟဵုလဝ်တုဲ.",
+       "watchlistedit-clear-title": "ဖအး စရင်မမင်မွဲဂှ်",
+       "watchlistedit-clear-legend": "ဖအး စရင်မမင်မွဲဂှ်",
+       "watchlistedit-clear-titles": "က္ဍိုပ်လိက်ဂမၠိုၚ်:",
+       "watchlistedit-clear-done": "စရၚ်မမၚ်မွဲ မၞး ဖအးကၠောံတုဲယျ.",
+       "watchlistedit-clear-jobqueue": "စရၚ်မမၚ်မွဲ မၞး စဖအးကၠေအ်ဒၟံၚ်ယျ. ဒးကေတ်အခိၚ်ညိဏောၚ်!",
        "watchlisttools-clear": "ဖအး စရင်မမင်မွဲဂှ်",
        "watchlisttools-view": "ဗဵု အရာမပြံင်လှာဲထေက်တအ်",
        "watchlisttools-edit": "ဗဵု ကေုာံ ပလေဝ် စရင်မမင်မဲ",
        "watchlisttools-raw": "ပလေဝ် စရင်မမင်မဲ အပြောမ်",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ဓရီု]])",
+       "timezone-local": "ဒေသ",
+       "version-editors": "ညးဒါန်ဂမၠိုၚ်",
+       "version-other": "တၞဟ်",
        "redirect": "ကလေင်စၞောန်ပညုင်လဝ် နကဵု ဝှာင်၊ ညးလွပ်၊ မုက်လိက်၊ မူမပလေဝ်ဒန်လဝ် ဟွံသေင်မ္ဂး အာင်ဒဳ",
        "redirect-summary": "မုက်လိက်တၟေင်ဏအ် ကလေင်စၞောန် ကဵု ဝှာင်(မကဵုလဝ်ယၟု), မုက်လိက်မွဲ (given a revision ID or page ID), မုက်လိက် ညးမသုင်စောဲမွဲ (given a numeric user ID), ဟွံသေင်မ္ဂး တင်စၟတ်သမ္တီမွဲ (given the log ID). Usage: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], or [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "အာ",
        "redirect-page": "မုက်လိက် အာင်ဒဳ",
        "redirect-revision": "မုက်လိက် မူမပလေဝ်ဒါန်",
        "redirect-file": "ယၟုဝှာင်",
+       "fileduplicatesearch-filename": "ယၟုဝှာင်:",
+       "fileduplicatesearch-submit": "ဂၠာဲ",
        "specialpages": "မုက်လိက် တၟေင်",
+       "specialpages-note-top": "ဒဏ္ဍာရဳ",
+       "specialpages-group-users": "ညးလွပ်တအ် ကေုာံ အခေါၚ်အရာဂမၠိုၚ်",
+       "specialpages-group-pages": "စရၚ်မုက်လိက်ဂမၠိုၚ်",
+       "specialpages-group-pagetools": "ကြိယာမုက်လိက်",
+       "specialpages-group-wiki": "စၟတ်တ္ၚဲ ကေုာံ ကြိယာဂမၠိုၚ်",
+       "blankpage": "မုက်လိက် ပလး",
        "tag-filter": "[[Special:Tags|Tag]] ဝှာင်ဂမၠိုင်:",
+       "tag-filter-submit": "ဖဍိုဟ်",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2)",
+       "tag-mw-replace": "ကလေၚ်ဖျေံဒၞာဲ",
+       "tag-mw-undo": "ဟွံပ",
+       "tags-source-header": "တမ်ရိုဟ်",
+       "tags-active-header": "မချဳဓရာင်",
+       "tags-actions-header": "ပွဂမၠိုၚ်",
        "tags-active-yes": "ယွံ",
        "tags-active-no": "ဟအှ်ေ",
+       "tags-edit": "ပလေဝ်ဒါန်",
+       "tags-delete": "ပလီု",
        "tags-hitcount": "$1 {{PLURAL:$1|ပြံင်လှာဲ|ပြံင်လှာဲဂမၠိုင်}}",
+       "tags-create-reason": "ဟိုတ်:",
+       "tags-create-submit": "ခၞံကၠောန်",
+       "tags-delete-reason": "ဟိုတ်:",
+       "tags-activate-reason": "ဟိုတ်:",
+       "tags-deactivate-reason": "ဟိုတ်:",
+       "tags-edit-reason": "ဟိုတ်:",
+       "compare-page1": "မုက်လိက် 1",
+       "compare-page2": "မုက်လိက် 2",
+       "htmlform-submit": "ဗပေင်",
+       "htmlform-selectorother-other": "တၞဟ်",
+       "htmlform-no": "ဟအှ်ေ",
+       "htmlform-yes": "ယွံ",
+       "htmlform-cloner-create": "စုတ် ပပဵု",
+       "htmlform-cloner-delete": "ပတိတ်",
+       "htmlform-date-placeholder": "YYYY-MM-DD",
+       "htmlform-time-placeholder": "HH:MM:SS",
+       "htmlform-datetime-placeholder": "YYYY-MM-DD HH:MM:SS",
        "logentry-delete-delete": "$3 မုက်လိက်ဂှ် $1 {{GENDER:$2|ပလီုထောအ်လဝ်ရ}}",
        "logentry-delete-restore": "$1 {{GENDER:$2|ကလေင်ပ္တန်}} မုက်လိက် $3 ($4)",
        "logentry-delete-revision": "ပ္ဍဲမုက်လိက် $3: $4 ဂှ် $1 {{GENDER:$2|ပြံင်လှာဲလဝ်}} ဗီုပြင် မုက်လိက် {{PLURAL:$5|မူလိက်မဒါန်လဝ် မွဲ|$5 မူလိက်မဒါန်လဝ်ဂမၠိုင်}}",
        "logentry-newusers-autocreate": "အကံက် ညးလွပ် $1 ဂှ် {{GENDER:$2|ခၞံကၠောန်လဝ်}} အလဵုအလဵုရ၊၊",
        "logentry-upload-upload": "$1  {{GENDER:$2|ပတိုန်ပၠောပ်လဝ်}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|ပလံင်ပၠောပ်လဝ်}} မူလိက် $3ဏအ် တၟိမွဲ",
+       "rightsnone": "(ဟွံမဲ)",
+       "feedback-back": "ကလေင်",
+       "feedback-cancel": "တးပဲါ",
+       "feedback-close": "တုဲဒှ်",
+       "feedback-message": "မေတ်သုက်:",
+       "feedback-subject": "ပရူပရာ:",
+       "feedback-submit": "ဗပေင်",
+       "feedback-thanks-title": "တင်ဂုန်ရအဴ!",
        "searchsuggest-search": "ဂၠာဲ {{SITENAME}}",
+       "duration-seconds": "$1{{PLURAL:$1|စက္က|စက္ကဂမၠိုၚ်}}",
+       "duration-minutes": "$1{{PLURAL:$1|ဗဳဇနာ|ဗဳဇနာဂမၠိုၚ်}}",
+       "duration-hours": "$1{{PLURAL:$1|နာဍဳ|နာဍဳဂမၠိုၚ်}}",
        "duration-days": "$1 {{PLURAL:$1|တ္ၚဲ|တ္ၚဲဂမၠိုင်}}",
-       "randomrootpage": "တမ် မုက်လိက် ဇဟောမ်"
+       "limitreport-cputime-value": "$1{{PLURAL:$1|စက္က|စက္ကဂမၠိုၚ်}}",
+       "expand_templates_output": "လဂွံ",
+       "expand_templates_ok": "OK",
+       "expand_templates_preview": "ကလေၚ်ရံၚ်",
+       "pagelanguage": "သၠာဲ အရေဝ်ဘာသာ မုက်လိက်",
+       "pagelang-name": "မုက်လိက်",
+       "pagelang-language": "အရေဝ်ဘာသာ",
+       "pagelang-select-lang": "ရုဲဘာသာဇကုညိ",
+       "pagelang-reason": "ဟိုတ်",
+       "pagelang-submit": "ဗပေင်",
+       "pagelang-nonexistent-page": "မုက်လိက်ဏအ် $1 ဟွံပြာကတ်",
+       "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (enabled)",
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>disabled</strong>)",
+       "mediastatistics-table-mimetype": "ဂကူ MIME",
+       "mediastatistics-table-count": "လၟိုဟ် ဝှာၚ်တအ်",
+       "mediastatistics-header-unknown": "တီကေတ်ဟွံမာန်",
+       "mediastatistics-header-audio": "ရမျှာၚ်",
+       "mediastatistics-header-office": "ရုၚ်",
+       "mediastatistics-header-total": "ဝှာၚ် သီုဖအိုတ်",
+       "special-characters-group-ipa": "IPA",
+       "special-characters-group-thai": "ထာဲ",
+       "special-characters-group-lao": "လော",
+       "special-characters-group-khmer": "ခမာ",
+       "mw-widgets-categoryselector-add-category-placeholder": "ထပ် ကဏ္ဍ...",
+       "date-range-from": "နူ စၟတ်တ္ၚဲ:",
+       "date-range-to": "စိုပ် စၟတ်တ္ၚဲ:",
+       "randomrootpage": "တမ် မုက်လိက် ဇဟောမ်",
+       "log-action-filter-all": " သီုဖအိုတ်",
+       "log-action-filter-block-block": "ကၟာတ်လဒဵု",
+       "log-action-filter-block-unblock": "ဟွံကၟာတ်",
+       "pagedata-title": "တၚ်နၚ် မုက်လိက်",
+       "passwordpolicies-group": "ဂကောံ",
+       "passwordpolicies-policies": "မူဝါဒဂမၠိုၚ်",
+       "passwordpolicies-policy-minimalpasswordlength": "မက္ခရ်ပၞုက်တအ်ဂှ် အောန်အိုတ်ဒးနွံကဵု $1{{PLURAL:$1|သၚ်္ကေတ|သၚ်္ကေတဂမၠိုၚ်}} ဂၠိၚ်"
 }
index 47a0722..bd817dc 100644 (file)
        "accmailtext": "[[User talk:$1|$1]] यांसाठी अनियतक्रमाने निर्मित केलेला परवलीचा शब्द $2 यांना पाठवण्यात आला आहे.\n\nया नवीन खात्यासाठीचा परवलीचा शब्द,सनोंद-प्रवेश घेतल्यावर [[Special:ChangePassword|परवलीचा शब्द बदला]] येथे बदलता येईल.",
        "newarticle": "(नवीन लेख)",
        "newarticletext": "आपण सध्या अस्तित्त्वात नसलेल्या पानाच्या दुव्याचा मागोवा घेत आला आहात.\nहे पान नव्याने तयार करण्यासाठी खालील पेटीत टंकन करणे सुरु करा(अधिक माहितीसाठी [$1 साहाय्य पान] बघा).\n\nजर आपण येथे चुकून आला असाल तर ब्राउझरच्या  <strong>परत</strong>(बॅक) कळीवर टिचकी द्या.",
-       "anontalkpagetext": "<em>हे चर्चापान अशा अज्ञात सदस्यासाठी आहे, ज्यांनी खाते तयार केलेले नाही किंवा त्याचा वापर करत नाहीत.</em> \nत्यांच्या ओळखीसाठी आम्ही आंतरजाल अंकपत्ता वापरतो आहोत. असा अंकपत्ता बऱ्याच लोकांचा एकच असू शकतो.  \nजर आपण अज्ञात सदस्य असाल आणि आपल्याला काही अप्रासंगिक संदेश मिळाला असेल तर कृपया [[Special:CreateAccount| खाते तयार करा]] किंवा [[Special:CreateAccount|सनोंद-प्रवेश करा]] ज्यामुळे, पुढे असे गैरसमज होणार नाहीत.",
+       "anontalkpagetext": "<em>हे चर्चापान अशा अज्ञात सदस्यासाठी आहे, ज्यांनी खाते तयार केलेले नाही किंवा त्याचा वापर करत नाहीत.</em> \nत्यांच्या ओळखीसाठी आम्ही आंतरजाल अंकपत्ता वापरतो आहोत. असा अंकपत्ता बऱ्याच लोकांचा एकच असू शकतो.  \nजर आपण अज्ञात सदस्य असाल आणि आपल्याला काही अप्रासंगिक संदेश मिळाला असेल तर कृपया [[Special:CreateAccount|खाते तयार करा]] किंवा [[Special:UserLogin|सनोंद-प्रवेश करा]] ज्यामुळे, पुढे असे गैरसमज होणार नाहीत.",
        "noarticletext": "या लेखात सध्या काहीही मजकूर नाही.\nतुम्ही विकिपीडियावरील इतर लेखांमध्ये या [[Special:Search/{{PAGENAME}}| मथळ्याचा शोध घेऊ शकता]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} इतर नोंदी शोधा],\nकिंवा हा लेख [{{fullurl:{{FULLPAGENAME}}|action=edit}}तयार करू शकता]</span>.",
        "noarticletext-nopermission": "सध्या या लेखात  काहीही मजकूर नाही.\nतुम्ही विकिपीडियावरील इतर लेखांमध्ये [[Special:Search/{{PAGENAME}}| या मथळ्याचा शोध घेऊ शकता]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAME}}}}आपण या लेखाच्या इतर नोंदी शोधा]</span>,परंतु, आपणास हा लेख लिहीण्याची परवानगी देण्यात येउ शकत नाही.",
        "missing-revision": "\"{{FULLPAGENAME}}\" या लेखाचे #$1 हे संस्करण अस्तित्वात नाही.वगळल्या गेलेल्या लेखपानाच्या जुन्या इतिहास-दुव्याचे अनुसरण केल्यामुळे असे होते.याबाबत विस्तृत माहिती  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळलेल्या नोंदी]येथे बघता येईल.",
index 9712ebf..01de69f 100644 (file)
        "newpages": "စာမျက်နှာအသစ်",
        "newpages-submit": "ပြသရန်",
        "newpages-username": "မှတ်​ပုံ​တင်​အ​မည်:",
-       "ancientpages": "အဟောင်းဆုံးစာမျက်နှာ",
+       "ancientpages": "အဟောင်းဆုံး စာမျက်နှာများ",
        "move": "ရွှေ့ရန်",
        "movethispage": "ဤစာမျက်နှာကို ရွှေ့ပြောင်းရန်",
        "unusedimagestext": "အောက်ပါဖိုင်များသည် မည်သည့်စာမျက်နှာတွင်မှ သုံးစွဲထားခြင်း မရှိပါ။\nအခြားသော ဝက်ဘ်ဆိုဒ်များမှနေ၍ ဖိုင်တစ်ခုခုသို့ တိုက်ရိုက် URL ဖြင့် တိုက်ရိုက်ချိတ်ဆက်ထားခြင်း ရှိနေနိုင်ပြီး သုံးစွဲနေခြင်းမရှိသော်လည်း ဤနေရာတွင် ဖော်ပြထားနိုင်ကြောင်း ကျေးဇူးပြု၍ မှတ်သားပါ။",
index 5b810ea..89db104 100644 (file)
@@ -29,7 +29,8 @@
                        "Drjpoudel",
                        "Fitoschido",
                        "Nabin Sapkota",
-                       "Tulsi Bhagat"
+                       "Tulsi Bhagat",
+                       "ديفيد"
                ]
        },
        "tog-underline": "रेखाङ्कित लिङ्क:",
index f78d049..c238105 100644 (file)
@@ -90,7 +90,8 @@
                        "MarcoSwart",
                        "Pahles",
                        "Optilete",
-                       "Goefie"
+                       "Goefie",
+                       "AHmed Khaled"
                ]
        },
        "tog-underline": "Verwijzingen onderstrepen:",
        "confirm-unwatch-top": "Deze pagina verwijderen uit uw volglijst?",
        "confirm-rollback-button": "OK",
        "confirm-rollback-top": "Bewerkingen op deze pagina ongedaan maken?",
+       "confirm-mcrrestore-title": "Een versie terugplaatsen",
        "confirm-mcrundo-title": "Een wijziging ongedaan maken",
        "mcrundofailed": "Ongedaan maken mislukt",
        "mcrundo-missingparam": "Er ontbreken nodige parameters in het verzoek.",
index 30e5ab7..bf8fcde 100644 (file)
        "botpasswords-invalid-name": "Określona nazwa użytkownika nie zawiera separatora hasła bota (\"$1\").",
        "botpasswords-not-exist": "Użytkownik \"$1\" nie ma hasła dla bota o nazwie \"$2\".",
        "botpasswords-needs-reset": "Hasło dla bota o nazwie „$2” {{GENDER:$1|użytkownika|użytkowniczki}} „$1” musi zostać zresetowane.",
+       "botpasswords-locked": "Nie możesz zalogować się przy użyciu hasła bota, ponieważ Twoje konto jest zablokowane.",
        "resetpass_forbidden": "Hasła nie mogą zostać zmienione",
        "resetpass_forbidden-reason": "Hasła nie mogą zostać zmienione: $1",
        "resetpass-no-info": "Musisz być zalogowany, by uzyskać bezpośredni dostęp do tej strony.",
        "spam_blanking": "Wszystkie wersje zawierały odnośniki do $1. Czyszczenie strony.",
        "spam_deleting": "Wszystkie wersje zawierały linki do $1, usuwam.",
        "simpleantispam-label": "Filtr antyspamowy.\n<strong>Nie</strong> wpisuj tu nic!",
-       "pageinfo-title": "Informacje o „$1”",
+       "pageinfo-title": "Informacje o stronie „$1”",
        "pageinfo-not-current": "Niestety, te informacje nie są dostępne dla starych wersji stron.",
        "pageinfo-header-basic": "Podstawowe informacje",
        "pageinfo-header-edits": "Historia edycji",
        "confirm-unwatch-top": "Usunąć tę stronę z listy obserwowanych?",
        "confirm-rollback-button": "OK",
        "confirm-rollback-top": "Wycofać edycje tej strony?",
+       "confirm-mcrrestore-title": "Odtwórz wersję",
        "confirm-mcrundo-title": "Cofnij zmianę",
        "mcrundofailed": "Cofnięcie nie powiodło się",
        "mcrundo-missingparam": "W żądaniu nie podano wymaganych parametrów.",
        "mcrundo-changed": "Strona została zmodyfikowana w czasie w którym {{GRAMMAR:|przeglądałeś|przeglądałaś}} różnicę. Sprawdź nową zmianę.",
+       "mcrundo-parse-failed": "Parsowanie nowej nie powiodło się: $1",
        "percent": "$1%",
        "quotation-marks": "„$1”",
        "imgmultipageprev": "← poprzednia strona",
index 5e2ebc4..6fc3143 100644 (file)
        "confirm-unwatch-top": "Remover esta página das páginas vigiadas?",
        "confirm-rollback-button": "OK",
        "confirm-rollback-top": "Reverter edições nesta página?",
+       "confirm-mcrrestore-title": "Restaurar uma revisão",
        "confirm-mcrundo-title": "Desfazer uma mudança",
        "mcrundofailed": "A reversão falhou",
        "mcrundo-missingparam": "Faltam parâmetros obrigatórios no pedido.",
        "mcrundo-changed": "Esta página foi alterada desde que começou a ver as diferenças. Reveja a nova mudança, por favor.",
+       "mcrundo-parse-failed": "Falha ao analisar a nova revisão: $1",
        "semicolon-separator": ";&#32;",
        "comma-separator": ",&#32;",
        "colon-separator": ":&#32;",
index 4d72d13..9b8fa98 100644 (file)
        "confirm-unwatch-top": "Remover esta página da lista de páginas vigiadas?",
        "confirm-rollback-button": "OK",
        "confirm-rollback-top": "Reverter as edições desta página?",
+       "confirm-mcrrestore-title": "Restaurar uma revisão",
        "confirm-mcrundo-title": "Desfazer uma mudança",
        "mcrundofailed": "A reversão falhou",
        "mcrundo-missingparam": "Faltam parâmetros obrigatórios no pedido.",
        "mcrundo-changed": "Esta página foi alterada desde que começou a ver as diferenças. Reveja a nova mudança, por favor.",
+       "mcrundo-parse-failed": "Falha na análise sintática da nova revisão: $1",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← página anterior",
        "imgmultipagenext": "página seguinte →",
index cf4446d..eeb0a1c 100644 (file)
        "confirm-unwatch-top": "Used as confirmation message.",
        "confirm-rollback-button": "Used as Submit button text.\n{{Identical|OK}}",
        "confirm-rollback-top": "Used as confirmation message.",
+       "confirm-mcrrestore-title": "Title for the editless restore form.",
        "confirm-mcrundo-title": "Title for the editless undo form.",
        "mcrundofailed": "Title of the error page when an editless undo fails.",
        "mcrundo-missingparam": "Error displayed when parameters for action=mcrundo are missing",
        "mcrundo-changed": "Message displayed when the page has been edited between the loading and submission of an editless undo.",
+       "mcrundo-parse-failed": "Error message indicating that the page's content can not be parsed because it is syntactically invalid. This may occurr for content types using serialization or a strict markup syntax.\n\nParameters:\n* $1 – specific error message",
        "semicolon-separator": "{{optional}}",
        "comma-separator": "{{optional}}\n\nWarning: languages have different usages of punctuation, and sometimes they are swapped (e.g. openining and closing quotation marks, or full stop and colon in Armenian), or change their form (the full stop in Chinese and Japanese, the prefered \"colon\" in Armenian used in fact as the regular full stop, the comma in Arabic, Armenian, and Chinese...)\n\nTheir spacing (before or after) may also vary across languages (for example French requires a non-breaking space, preferably narrow if the browser supports NNBSP, on the inner side of some punctuations like quotation/question/exclamation marks, colon, and semicolons).",
        "colon-separator": "{{optional}}\nChange it only if your language uses another character for ':' or it needs an extra space before the colon.",
index d9b300f..803e37a 100644 (file)
        "right-editcontentmodel": "Cange 'u modelle de condenute de 'na pàgene",
        "right-editinterface": "Cange l'inderfacce utende",
        "right-editusercss": "Cange 'u CSS de l'otre utinde",
+       "right-edituserjson": "Cange 'u JSON de l'otre utinde",
        "right-edituserjs": "Cange 'u JS de l'otre utinde",
        "right-editmyusercss": "Cange le file tune de CSS",
+       "right-editmyuserjson": "Cange le file tune de JSON",
        "right-editmyuserjs": "Cange le file tune de JavaScript",
        "right-viewmywatchlist": "'Ndruche le pàggene condrollate tune",
        "right-editmywatchlist": "Cange le pàggene condrollate tune. Vide bbuene ca certe aziune vonne a aggiungere pàggene pure ca non ge stonne le deritte.",
index 3f8abdf..77524a4 100644 (file)
@@ -16,7 +16,8 @@
                        "Pippinu",
                        "Macofe",
                        "S4b1nuz E.656",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "Vlad5250"
                ]
        },
        "tog-underline": "Suttalìnia li lijami:",
        "right-editcontentmodel": "Canciari lu mudellu di cuntinutu di na pàggina",
        "right-editinterface": "Canciari la ntirfaccia utenti",
        "right-editusercss": "Canciari li file CSS di l'àutri utenti",
+       "right-edituserjson": "Canciari li file JSON di l'àutri utenti",
        "right-edituserjs": "Canciari li file JavaScript di l'àutri utenti",
        "right-editmyusercss": "Canciari li file CSS dû propiu utenti",
+       "right-editmyuserjson": "Canciari li file JSON dû propiu utenti",
        "right-editmyuserjs": "Canciari li file JavaScript dû propiu utenti",
        "right-viewmywatchlist": "Taliari la propia lista taliata",
        "right-editmywatchlist": "Canciari la propia lista taliata. Nota chi certi azzioni ci ponnu agghiùnciri pàggini macari senza di stu drittu.",
index 3df66d9..b552e57 100644 (file)
        "rollback": "ترميمن کي واپس ورايو",
        "rollbacklink": "واپس ورايو",
        "rollbacklinkcount": "اڻڪريو $1 {{PLURAL:$1|ترميم|ترميمون}}",
+       "revertpage": "ترميمون واپس ڪيون [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) [[User:$1|$1]] جي آخري ترميمن ڏانهن",
        "changecontentmodel-title-label": "صفحي جو عنوان",
        "changecontentmodel-reason-label": "سبب:",
        "logentry-contentmodel-change-revertlink": "واپس ورايو",
index 975271a..3e75864 100644 (file)
@@ -17,7 +17,8 @@
                        "Сербијана",
                        "Acamicamacaraca",
                        "Fitoschido",
-                       "BadDog"
+                       "BadDog",
+                       "ديفيد"
                ]
        },
        "tog-underline": "Podvuci linkove:",
index 3a3bd27..c560bee 100644 (file)
        "botpasswords-invalid-name": "Navedeno uporabniško ime ne vsebuje ločila za geslo bota (»$1«).",
        "botpasswords-not-exist": "Uporabnik »$1« nima gesla bota z imenom »$2«.",
        "botpasswords-needs-reset": "Geslo bota »$2« {{GENDER:$1|uporabnika|uporabnice}} »$1« mora biti ponastavljeno.",
+       "botpasswords-locked": "Ne morete se prijaviti z geslom bota, ker je vaš račun zaklenjen.",
        "resetpass_forbidden": "Gesla ne morete spremeniti",
        "resetpass_forbidden-reason": "Gesel nismo mogli spremeniti: $1",
        "resetpass-no-info": "Za neposreden dostop do te strani morate biti prijavljeni.",
        "right-editsemiprotected": "Urejanje strani, zaščitenih kot »{{int:protect-level-autoconfirmed}}«",
        "right-editcontentmodel": "Urejanje vsebinskega modela strani",
        "right-editinterface": "Urejanje uporabniškega vmesnika",
-       "right-editusercss": "Uredi CSS datotek drugih uporabnikov",
+       "right-editusercss": "Urejanje CSS datotek drugih uporabnikov",
        "right-edituserjson": "Urejanje JSON-datotek drugih uporabnikov",
-       "right-edituserjs": "Uredi JavaScript datotek drugih uporabnikov",
+       "right-edituserjs": "Urejanje JavaScript datotek drugih uporabnikov",
        "right-editsitecss": "Urejanje CSS spletišča",
        "right-editsitejson": "Urejanje JSON spletišča",
        "right-editsitejs": "Urejanje JavaScripta spletišča",
        "confirm-unwatch-top": "Odstranim stran z vašega spiska nadzorov?",
        "confirm-rollback-button": "V redu",
        "confirm-rollback-top": "Povrnemo urejanja te strani?",
+       "confirm-mcrrestore-title": "Obnovi redakcijo",
        "confirm-mcrundo-title": "Razveljavi spremembo",
        "mcrundofailed": "Razveljavitev ni uspela",
        "mcrundo-missingparam": "Pri zahtevi manjkajo zahtevani parametri.",
        "mcrundo-changed": "Stran je bila spremenjena, odkar ste si ogledali primerjavo. Prosimo, preglejte nove spremembe.",
+       "mcrundo-parse-failed": "Razčlenjevanje nove redakcije je spodletelo: $1",
        "percent": "$1&#160;%",
        "quotation-marks": "»$1«",
        "imgmultipageprev": "← prejšnja stran",
index 966ab8f..5a618f5 100644 (file)
        "jumpto": "Иди на:",
        "jumptonavigation": "навигацију",
        "jumptosearch": "претрагу",
-       "view-pool-error": "Ð\9dажалоÑ\81Ñ\82, Ñ\81еÑ\80веÑ\80и Ñ\81Ñ\83 Ñ\82Ñ\80енÑ\83Ñ\82но Ð¿Ñ\80еопÑ\82еÑ\80еÑ\9bени.\nÐ\9fÑ\80евиÑ\88е ÐºÐ¾Ñ\80иÑ\81ника Ð¿Ð¾ÐºÑ\83Ñ\88ава Ð´Ð° Ð¿Ñ\80егледа ову страницу.\nСачекајте неко време пре него што поново покушате да јој приступите.\n\n$1",
-       "generic-pool-error": "Ð\9dажалоÑ\81Ñ\82, Ñ\81еÑ\80веÑ\80и Ñ\81Ñ\83 Ñ\82Ñ\80енÑ\83Ñ\82но Ð¿Ñ\80еопÑ\82еÑ\80еÑ\9bени.\nÐ\9fÑ\80евиÑ\88е ÐºÐ¾Ñ\80иÑ\81ника Ð¿Ð¾ÐºÑ\83Ñ\88ава Ð´Ð° Ð¿Ð¾Ð³Ð»ÐµÐ´Ð° овај ресурс.\nСачекајте неко време пре него што поново покушате да му приступите.",
+       "view-pool-error": "СеÑ\80веÑ\80и Ñ\81Ñ\83 Ñ\82Ñ\80енÑ\83Ñ\82но Ð¿Ñ\80еопÑ\82еÑ\80еÑ\9bени.\nÐ\9fÑ\80евиÑ\88е ÐºÐ¾Ñ\80иÑ\81ника Ð¿Ð¾ÐºÑ\83Ñ\88ава Ð´Ð° Ð²Ð¸Ð´Ð¸ ову страницу.\nСачекајте неко време пре него што поново покушате да јој приступите.\n\n$1",
+       "generic-pool-error": "СеÑ\80веÑ\80и Ñ\81Ñ\83 Ñ\82Ñ\80енÑ\83Ñ\82но Ð¿Ñ\80еопÑ\82еÑ\80еÑ\9bени.\nÐ\9fÑ\80евиÑ\88е ÐºÐ¾Ñ\80иÑ\81ника Ð¿Ð¾ÐºÑ\83Ñ\88ава Ð´Ð° Ð²Ð¸Ð´Ð¸ овај ресурс.\nСачекајте неко време пре него што поново покушате да му приступите.",
        "pool-timeout": "Истек времена чека на закључавање",
        "pool-queuefull": "Ред је пун захтева",
        "pool-errorunknown": "Непозната грешка",
        "internalerror": "Унутрашња грешка",
        "internalerror_info": "Унутрашња грешка: $1",
        "internalerror-fatal-exception": "Грешка необрађеног изузетка типа „$1“",
-       "filecopyerror": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° ÐºÐ¾Ð¿Ð¸Ñ\80ам Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9c Ñ\83 â\80\9e$2â\80\9c.",
-       "filerenameerror": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ñ\80еименÑ\83Ñ\98ем Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9c Ñ\83 â\80\9e$2â\80\9c.",
-       "filedeleteerror": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¸Ð·Ð±Ñ\80иÑ\88ем Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9c.",
-       "directorycreateerror": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð½Ð°Ð¿Ñ\80авим Ð´Ð¸Ñ\80екÑ\82оÑ\80иÑ\98Ñ\83м â\80\9e$1â\80\9c.",
+       "filecopyerror": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе ÐºÐ¾Ð¿Ð¸Ñ\80аÑ\82и Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9d Ñ\83 â\80\9e$2â\80\9d.",
+       "filerenameerror": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¿Ñ\80еименоваÑ\82и Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9d Ñ\83 â\80\9e$2â\80\9d.",
+       "filedeleteerror": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¸Ð·Ð±Ñ\80иÑ\81аÑ\82и Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9d.",
+       "directorycreateerror": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð½Ð°Ð¿Ñ\80авиÑ\82и Ð´Ð¸Ñ\80екÑ\82оÑ\80иÑ\98Ñ\83м â\80\9e$1â\80\9d.",
        "directoryreadonlyerror": "Директоријум „$1“ је само за читање.",
        "directorynotreadableerror": "Директоријум „$1“ није читљив.",
-       "filenotfound": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ñ\80онаÑ\92ем Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9c.",
+       "filenotfound": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¿Ñ\80онаÑ\9bи Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9d.",
        "unexpected": "Неочекивана вредност: „$1“=„$2“.",
-       "formerror": "Ð\93Ñ\80еÑ\88ка: Ð½Ðµ Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ð¾Ñ\88аÑ\99ем образац.",
+       "formerror": "Ð\93Ñ\80еÑ\88ка: Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¿Ð¾Ñ\81лаÑ\82и образац.",
        "badarticleerror": "Ова радња се не може извршити на овој страници.",
-       "cannotdelete": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¸Ð·Ð±Ñ\80иÑ\88ем Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 Ð¸Ð»Ð¸ Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9c.\nМогуће је да ју је неко већ избрисао.",
-       "cannotdelete-title": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¸Ð·Ð±Ñ\80иÑ\88ем Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 â\80\9e$1â\80\9c",
+       "cannotdelete": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¸Ð·Ð±Ñ\80иÑ\81аÑ\82и Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 Ð¸Ð»Ð¸ Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9d.\nМогуће је да ју је неко већ избрисао.",
+       "cannotdelete-title": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¸Ð·Ð±Ñ\80иÑ\81аÑ\82и Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 â\80\9e$1â\80\9d",
        "delete-hook-aborted": "Брисање је прекинула кука.\nНије дато никакво образложење.",
-       "no-null-revision": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð½Ð°Ð¿Ñ\80авим Ð½Ð¾Ð²Ñ\83 Ð½Ð¸Ñ\88Ñ\82авнÑ\83 Ð¸Ð·Ð¼ÐµÐ½Ñ\83 Ñ\81Ñ\82Ñ\80аниÑ\86е â\80\9e$1â\80\9c",
+       "no-null-revision": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð½Ð°Ð¿Ñ\80авиÑ\82и Ð½Ð¾Ð²Ñ\83 Ð½Ð¸Ñ\88Ñ\82авнÑ\83 Ð¸Ð·Ð¼ÐµÐ½Ñ\83 Ñ\81Ñ\82Ñ\80аниÑ\86е â\80\9e$1â\80\9d",
        "badtitle": "Лош наслов",
        "badtitletext": "Тражени наслов странице је неважећи, празан или је погрешно повезан међујезички или међувики наслов.\nМожда садржи један или више знакова који се не могу користити у насловима.",
        "title-invalid-empty": "Тражено име странице је празно или садржи само назив именског простора.",
        "mycustomjsprotected": "Немате дозволу да уређујете ову страницу с јаваскриптом.",
        "myprivateinfoprotected": "Немате дозволу да уређујете своје приватне информације.",
        "mypreferencesprotected": "Немате дозволу да уређујете своја подешавања.",
-       "ns-specialprotected": "Ð\9fоÑ\81ебне Ñ\81Ñ\82Ñ\80аниÑ\86е Ñ\81е Ð½Ðµ Ð¼Ð¾Ð³Ñ\83 Ñ\83Ñ\80еÑ\92иваÑ\82и.",
+       "ns-specialprotected": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ñ\83Ñ\80еÑ\92иваÑ\82и Ð¿Ð¾Ñ\81ебне Ñ\81Ñ\82Ñ\80аниÑ\86е.",
        "titleprotected": "Овај назив је [[User:$1|$1]] заштитио од прављења. Разлог: <em>$2</em>.",
        "filereadonlyerror": "Не могу да изменим датотеку „$1“ јер је ризница „$2“ у режиму за читање.\n\nСистемски администратор је навео следеће објашњење: „$3“.",
        "invalidtitle": "Неважећи наслов",
        "cannotlogin-text": "Пријава није могућа",
        "cannotloginnow-title": "Пријава тренутно није могућа",
        "cannotloginnow-text": "Пријава није могућа када се користи $1.",
-       "cannotcreateaccount-title": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¾Ñ\82воÑ\80им налоге",
+       "cannotcreateaccount-title": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¾Ñ\82воÑ\80иÑ\82и налоге",
        "cannotcreateaccount-text": "Директно отварање налога није омогућено на овом викију.",
        "yourdomainname": "Домен:",
        "password-change-forbidden": "Не можете да промените лозинку на овом викију.",
        "userexists": "Унесено корисничко име је већ у употреби.\nОдаберите друго.",
        "loginerror": "Грешка при пријављивању",
        "createacct-error": "Дошло је до грешке при отварању налога",
-       "createaccounterror": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¾Ñ\82воÑ\80им Ð½Ð°Ð»Ð¾Ð³: $1.",
+       "createaccounterror": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¾Ñ\82воÑ\80иÑ\82и Ð½Ð°Ð»Ð¾Ð³: $1",
        "nocookiesnew": "Кориснички налог је отворен, али нисте пријављени.\n{{SITENAME}} користи колачиће за пријаву. Вама су колачићи онемогућени.\nОмогућите их, па се онда пријавите са својим корисничким именом и лозинком.",
        "nocookieslogin": "{{SITENAME}} користи колачиће за пријављивање корисника.\nВама су колачићи онемогућени. Омогућите их и покушајте поново.",
        "nocookiesfornew": "Кориснички налог није отворен јер његов извор није потврђен.\nОмогућите колачиће на прегледачу и поново учитајте страницу.",
        "wrongpasswordempty": "Нисте унели лозинку. Покушајте поново.",
        "passwordtooshort": "Лозинка мора имати најмање {{PLURAL:$1|један знак|$1 знака|$1 знакова}}.",
        "passwordtoolong": "Лозинке не могу бити дуже од {{PLURAL:$1|$1 знака|$1 знакова}}.",
-       "passwordtoopopular": "ЧеÑ\81Ñ\82о Ð¾Ð´Ð°Ð±Ñ\80ане Ð»Ð¾Ð·Ð¸Ð½ÐºÐµ Ð½Ðµ Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\81е ÐºÐ¾Ñ\80иÑ\81Ñ\82е. Одаберите лозинку коју је теже погодити.",
+       "passwordtoopopular": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе ÐºÐ¾Ñ\80иÑ\81Ñ\82иÑ\82и Ñ\87еÑ\81Ñ\82о Ð¾Ð´Ð°Ð±Ñ\80ане Ð»Ð¾Ð·Ð¸Ð½Ðºе. Одаберите лозинку коју је теже погодити.",
        "password-name-match": "Лозинка се мора разликовати од корисничког имена.",
        "password-login-forbidden": "Коришћење овог корисничког имена и лозинке је забрањено.",
        "mailmypassword": "Ресетуј лозинку",
        "noemailprefs": "Наведите имејл-адресу у подешавањима за оспособљавање ових функција.",
        "emailconfirmlink": "Потврдите своју имејл-адресу",
        "invalidemailaddress": "Имејл-адреса не може да буде прихваћена јер је у неважећем облику.\nУнесите исправну адресу или оставите празно поље.",
-       "cannotchangeemail": "Ð\98меÑ\98л-адÑ\80еÑ\81е Ð½Ð°Ð»Ð¾Ð³Ð° Ð½Ðµ Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\81е Ð¿Ñ\80омене Ð½Ð° Ð¾Ð²Ð¾Ð¼ Ð²Ð¸ÐºÐ¸Ñ\98Ñ\83.",
+       "cannotchangeemail": "Ð\9dа Ð¾Ð²Ð¾Ð¼ Ð²Ð¸ÐºÐ¸Ñ\98Ñ\83 Ð½Ð¸Ñ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¿Ñ\80омениÑ\82и Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81е Ð½Ð°Ð»Ð¾Ð³Ð°.",
        "emaildisabled": "Овај сајт не може да шаље имејлове.",
        "accountcreated": "Налог је отворен",
        "accountcreatedtext": "Кориснички налог [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) је отворен.",
        "botpasswords-restriction-failed": "Не можете се пријавити због ограничења лозинки за ботове.",
        "botpasswords-not-exist": "Корисник „$1“ нема лозинку бота „$2“.",
        "botpasswords-locked": "Не можете да се пријавите са лозинком бота пошто је ваш налог закључан.",
-       "resetpass_forbidden": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ñ\80оменим лозинке",
-       "resetpass_forbidden-reason": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ñ\80оменим лозинке: $1",
+       "resetpass_forbidden": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¿Ñ\80омениÑ\82и лозинке",
+       "resetpass_forbidden-reason": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¿Ñ\80омениÑ\82и лозинке: $1",
        "resetpass-no-info": "Морате бити пријављени да бисте приступили овој страници.",
        "resetpass-submit-loggedin": "Промени лозинку",
        "resetpass-submit-cancel": "Откажи",
        "savechanges": "Сачувај промене",
        "publishpage": "Објави страницу",
        "publishchanges": "Објави промене",
-       "savearticle-start": "Сачувај страницу...",
-       "savechanges-start": "Сачувај промене...",
+       "savearticle-start": "Сачувај страницу",
+       "savechanges-start": "Сачувај промене",
        "publishpage-start": "Објави страницу...",
-       "publishchanges-start": "Објави промене...",
+       "publishchanges-start": "Објави промене",
        "preview": "Претпреглед",
        "showpreview": "Прикажи претпреглед",
        "showdiff": "Прикажи промене",
        "blockednoreason": "разлог није наведен",
        "whitelistedittext": "$1 да бисте уређивали странице.",
        "confirmedittext": "Морате да потврдите своју имејл адресу пре уређивања страница.\nПоставите и потврдите имејл адресу преко [[Special:Preferences|подешавања]].",
-       "nosuchsectiontitle": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ñ\80онаÑ\92ем Ð¾Ð´ÐµÑ\99ак.",
+       "nosuchsectiontitle": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¿Ñ\80онаÑ\9bи Ð¾Ð´ÐµÑ\99ак",
        "nosuchsectiontext": "Покушали сте да уредите одељак који не постоји.\nМожда је премештен или избрисан док сте прегледали страницу.",
        "loginreqtitle": "Потребна је пријава",
        "loginreqlink": "Пријавите се",
        "loginreqpagetext": "$1 да бисте видели друге странице.",
        "accmailtitle": "Лозинка је послата.",
-       "accmailtext": "Ð\9bозинка Ð·Ð° {{GENDER:$1|коÑ\80иÑ\81ника|коÑ\80иÑ\81ниÑ\86Ñ\83}} [[User talk:$1|$1]] Ñ\98е Ð¿Ð¾Ñ\81лаÑ\82а Ð½Ð° $2. Ð\9dакон Ð¿Ñ\80иÑ\98аве, Ð»Ð¾Ð·Ð¸Ð½ÐºÐ° Ñ\81е Ð¼Ð¾Ð¶Ðµ Ð¿Ñ\80омениÑ\82и [[Special:ChangePassword|овде]].",
+       "accmailtext": "Ð\9dаÑ\81Ñ\83миÑ\87но Ð³ÐµÐ½ÐµÑ\80иÑ\81ана Ð»Ð¾Ð·Ð¸Ð½ÐºÐ° Ð·Ð° ÐºÐ¾Ñ\80иÑ\81ника [[User talk:$1|$1]] Ð¿Ð¾Ñ\81лаÑ\82а Ñ\98е Ð½Ð° $2. Ð\9dакон Ð¿Ñ\80иÑ\98аве, Ð»Ð¾Ð·Ð¸Ð½ÐºÐ° Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¿Ñ\80омени Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86и <em>[[Special:ChangePassword|Ð\9fÑ\80омена Ð»Ð¾Ð·Ð¸Ð½ÐºÐµ]]</em>.",
        "newarticle": "(нови)",
        "newarticletext": "Дошли сте на страницу која још не постоји.\nДа бисте је направили, почните да куцате у прозор испод овог текста (погледајте [$1 страницу за помоћ]).\nАко сте овде дошли грешком, вратите се на претходну страницу.",
        "anontalkpagetext": "----\n<em>Ово је страница за разговор с анонимним корисником који још нема налог или га не користи.</em>\nЗбог тога морамо да користимо бројчану IP адресу како бисмо га препознали.\nТакву адресу може делити више корисника.\nАко сте анонимни корисник и мислите да су вам упућене примедбе, [[Special:CreateAccount|отворите налог]] или се [[Special:UserLogin|пријавите]] да бисте избегли будућу забуну с осталим анонимним корисницима.",
        "noarticletext": "На овој страници тренутно нема текста.\nМожете [[Special:Search/{{PAGENAME}}|потражити овај наслов]] на другим страницама,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} претражити сродне извештаје] или [{{fullurl:{{FULLPAGENAME}}|action=edit}} направити ову страницу]</span>.",
        "noarticletext-nopermission": "Тренутно нема текста на овој страници.\nМожете да [[Special:Search/{{PAGENAME}}|потражите овај наслов странице]] на другим страницама или <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} претражите сродне дневнике]</span>, али немате дозволу да направите ову страницу.",
        "missing-revision": "Измена бр. $1 на страници под именом „{{FULLPAGENAME}}“ не постоји.\n\nОво се обично дешава када пратите застарелу везу до странице која је избрисана.\nВише информација можете да пронађете у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневнику брисања].",
-       "userpage-userdoesnotexist": "Ð\9aоÑ\80иÑ\81ниÑ\87ки Ð½Ð°Ð»Ð¾Ð³ â\80\9e<nowiki>$1</nowiki>â\80\9c Ð½Ð¸Ñ\98е Ð¾Ñ\82воÑ\80ен.\nРазмиÑ\81лиÑ\82е Ð´Ð° Ð»Ð¸ Ð·Ð°Ð¸Ñ\81Ñ\82а Ð¶ÐµÐ»Ð¸Ñ\82е да направите/уредите ову страницу.",
+       "userpage-userdoesnotexist": "Ð\9aоÑ\80иÑ\81ниÑ\87ки Ð½Ð°Ð»Ð¾Ð³ â\80\9e<nowiki>$1</nowiki>â\80\9d Ð½Ð¸Ñ\98е Ñ\80егиÑ\81Ñ\82Ñ\80ован.\nРазмиÑ\81лиÑ\82е Ð¶ÐµÐ»Ð¸Ñ\82е Ð»Ð¸ Ð·Ð°Ð¸Ñ\81Ñ\82а да направите/уредите ову страницу.",
        "userpage-userdoesnotexist-view": "Кориснички налог „$1“ није отворен.",
        "blocked-notice-logextract": "Овај корисник је тренутно блокиран.\nНајновији унос у дневнику блокирања је наведен испод као референца:",
        "clearyourcache": "<strong>Напомена:</strong> Након чувања, можда ћете морати да очистите кеш меморију прегледача како бисте видели промене.\n* <strong>Фајерфокс / Сафари:</strong> Држите <em>Shift</em> и кликните на <em>Освежи</em> или притисните <em>Ctrl-F5</em> или <em>Ctrl-R</em> (<em>⌘-R</em> на Меку)\n* <strong>Гугл кроум:</strong> Притисните <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> на Меку)\n* <strong>Интернет експлорер:</strong> Држите <em>Ctrl</em> и кликните на <em>Освежи</em> или притисните <em>Ctrl-F5</em>\n* <strong>Опера:</strong> Идите на <em>Алатке → Подешавања</em> (<em>Опера → Подешавања</em> на Меку) и затим <em>Приватност и безбедност → Очистите податке о прегледима → Кеширане слике и датотеке</em>.",
        "contentmodelediterror": "Не можете уредити ову измену јер је њен модел садржаја <code>$1</code>, што се разликује од актуелног модела садржаја странице <code>$2</code>.",
        "recreate-moveddeleted-warn": "<strong>Упозорење: Поново правите страницу која је претходно избрисана.</strong>\n\nРазмотрите да ли је прикладно да наставите са уређивањем ове странице.\nОвде је наведен дневник брисања и премештања са образложењем:",
        "moveddeleted-notice": "Ова страница је избрисана.\nДневник брисања, заштите и премештања странице је наведен испод као референца.",
-       "moveddeleted-notice-recent": "Ð\9dажалоÑ\81Ñ\82, Ð¾ва страница је недавно избрисана (у последњих 24 сата).\nДневник брисања, заштите и премештања странице наведен је испод као референца:",
+       "moveddeleted-notice-recent": "Ð\9eва страница је недавно избрисана (у последњих 24 сата).\nДневник брисања, заштите и премештања странице наведен је испод као референца:",
        "log-fulllog": "Цео дневник",
        "edit-hook-aborted": "Измену је прекинула кука.\nНије дато никакво образложење.",
-       "edit-gone-missing": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð°Ð¶Ñ\83Ñ\80иÑ\80ам страницу.\nИзгледа да је избрисана.",
+       "edit-gone-missing": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð°Ð¶Ñ\83Ñ\80иÑ\80аÑ\82и страницу.\nИзгледа да је избрисана.",
        "edit-conflict": "Сукоб измена.",
        "edit-no-change": "Ваша измена је занемарена јер није било никаквих промена у тексту.",
        "postedit-confirmation-created": "Страница је направљена.",
        "postedit-confirmation-restored": "Страница је враћена.",
        "postedit-confirmation-saved": "Ваша измена је сачувана.",
        "postedit-confirmation-published": "Ваша измена је објављена.",
-       "edit-already-exists": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð½Ð°Ð¿Ñ\80авим страницу.\nИзгледа да она већ постоји.",
+       "edit-already-exists": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð½Ð°Ð¿Ñ\80авиÑ\82и Ð½Ð¾Ð²Ñ\83 страницу.\nИзгледа да она већ постоји.",
        "defaultmessagetext": "Подразумевани текст поруке",
-       "content-failed-to-parse": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\80аÑ\88Ñ\87ланим Ñ\81адÑ\80жаÑ\98 Ñ\82ипа $2 Ð·Ð° Ð¼Ð¾Ð´ÐµÐ» $1: $3",
+       "content-failed-to-parse": "РаÑ\88Ñ\87лаÑ\9aиваÑ\9aе Ñ\81адÑ\80жаÑ\98а Ñ\82ипа $2 Ð·Ð° Ð¼Ð¾Ð´ÐµÐ» $1 Ð½Ð¸Ñ\98е Ñ\83Ñ\81пело: $3",
        "invalid-content-data": "Неважећи подаци садржаја",
        "content-not-allowed-here": "Садржај модела „$1“ није дозвољен на страници [[$2]]",
        "editwarning-warning": "Ако напустите ову страницу, изгубићете све измене које сте направили. Ако сте пријављени, можете онемогућити ово упозорење у својим подешавањима, у одељку „{{int:prefs-editing}}“.",
        "converter-manual-rule-error": "Пронађена је грешка у правилу за ручно претварање језика",
        "undo-success": "Измена се може поништити.\nПроверите разлике испод, па сачувајте измене.",
        "undo-failure": "Ова измена се не може поништити због сукоба измена.",
-       "undo-norev": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð²Ñ\80аÑ\82им измену јер не постоји или је избрисана.",
+       "undo-norev": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð²Ñ\80аÑ\82иÑ\82и измену јер не постоји или је избрисана.",
        "undo-nochange": "Изгледа да је измена већ поништена.",
        "undo-summary": "Поништена измена $1 {{GENDER:$2|корисника|кориснице}} [[Special:Contributions/$2|$2]] ([[User talk:$2|разговор]])",
        "undo-summary-username-hidden": "Поништи измену $1 скривеног корисника",
        "revdelete-log": "Разлог:",
        "revdelete-submit": "Примени на {{PLURAL:$1|изабрану измену|изабране измене}}",
        "revdelete-success": "Видљивост измене је ажурирана.",
-       "revdelete-failure": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð°Ð¶Ñ\83Ñ\80иÑ\80ам видљивост измене:\n$1",
+       "revdelete-failure": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð°Ð¶Ñ\83Ñ\80иÑ\80аÑ\82и видљивост измене:\n$1",
        "logdelete-success": "Постављена је видљивост уноса у дневнику.",
        "logdelete-failure": "'''Не могу да поставим видљивост историје:'''\n$1",
        "revdel-restore": "промени видљивост",
        "mergehistory-submit": "Споји измене",
        "mergehistory-empty": "Нема измена за спајање.",
        "mergehistory-done": "$3 {{PLURAL:$3|измена странице $1 је спојена|измене странице $1 су спојене|измена странице $1 је спојено}} у [[:$2]].",
-       "mergehistory-fail": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\81поÑ\98им историје. Проверите страницу и временске параметре.",
+       "mergehistory-fail": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¸Ð·Ð²Ñ\80Ñ\88иÑ\82и Ñ\81паÑ\98аÑ\9aе историје. Проверите страницу и временске параметре.",
        "mergehistory-fail-bad-timestamp": "Временска ознака је неважећа.",
        "mergehistory-fail-invalid-source": "Изворна страница није валидна.",
        "mergehistory-fail-invalid-dest": "Одредишна страница је неважећа.",
        "mergehistory-fail-no-change": "Спајање историје није спојило ниједну измену. Проверите параметре странице и времена.",
        "mergehistory-fail-permission": "Немате овлашћење за спајање историје.",
-       "mergehistory-fail-self-merge": "Изворна и одредишна страница не могу бити исте.",
+       "mergehistory-fail-self-merge": "Изворна и одредишна страница су исте.",
        "mergehistory-fail-timestamps-overlap": "Изворне измене се преклапају или долазе након одредишних измена.",
-       "mergehistory-fail-toobig": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¸Ð·Ð²Ñ\80Ñ\88им спајање историје јер ће више од $1 {{PLURAL:$1|измене бити премештене|измена бити премештено}}.",
+       "mergehistory-fail-toobig": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¸Ð·Ð²Ñ\80Ñ\88иÑ\82и спајање историје јер ће више од $1 {{PLURAL:$1|измене бити премештене|измена бити премештено}}.",
        "mergehistory-no-source": "Изворна страница $1 не постоји.",
        "mergehistory-no-destination": "Одредишна страница $1 не постоји.",
        "mergehistory-invalid-source": "Изворна страница мора имати валидан наслов.",
        "recentchanges-summary": "Пратите недавне промене на овој страници.",
        "recentchanges-noresult": "Нема промена током датог периода а које одговарају овим критеријумима.",
        "recentchanges-timeout": "Ова претрага је истекла. Можда желите да покушате другачије параметре претраге.",
-       "recentchanges-network": "Због техничког проблема не могу да учитам резултате. Покушајте да освежите страницу.",
+       "recentchanges-network": "Због техничког проблема, није могуће учитати резултате. Покушајте да освежите страницу.",
        "recentchanges-notargetpage": "Унесите име странице изнад да бисте видели промене сродне с овом страницом",
        "recentchanges-feed-description": "Пратите најскорије промене на викију у овом фиду.",
        "recentchanges-label-newpage": "Овом изменом је направљена нова страница",
        "illegal-filename": "Назив датотеке је забрањен.",
        "overwrite": "Замењивање постојеће датотеке је забрањено.",
        "unknown-error": "Дошло је до непознате грешке.",
-       "tmp-create-error": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð½Ð°Ð¿Ñ\80авим привремену датотеку.",
+       "tmp-create-error": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð½Ð°Ð¿Ñ\80авиÑ\82и привремену датотеку.",
        "tmp-write-error": "Грешка при писању привремене датотеке.",
        "large-file": "Препоручљиво је да датотеке не буду веће од $1; ова датотека је $2.",
        "largefileserver": "Ова датотека прелази ограничење величине.",
-       "emptyfile": "Ð\94аÑ\82оÑ\82ека ÐºÐ¾Ñ\98Ñ\83 Ñ\81Ñ\82е Ð¿Ð¾Ñ\81лали Ñ\98е Ð¿Ñ\80азна.\nУзÑ\80ок Ð¼Ð¾Ð¶Ðµ Ð±Ð¸Ñ\82и Ð³Ñ\80еÑ\88ка Ñ\83 Ð½Ð°Ð·Ð¸Ð²Ñ\83 Ð´Ð°Ñ\82оÑ\82еке.\nÐ\9fÑ\80овеÑ\80иÑ\82е Ð´Ð° Ð»Ð¸ Ð·Ð°Ð¸Ñ\81Ñ\82а Ð¶ÐµÐ»Ð¸Ñ\82е Ð´Ð° Ñ\98е Ð¿Ð¾Ñ\88аÑ\99ете.",
+       "emptyfile": "Ð\94аÑ\82оÑ\82ека ÐºÐ¾Ñ\98Ñ\83 Ñ\81Ñ\82е Ð¾Ñ\82пÑ\80емили Ñ\98е Ð¿Ñ\80азна.\nУзÑ\80ок Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\83де Ð³Ñ\80еÑ\88ка Ñ\83 Ð¸Ð¼ÐµÐ½Ñ\83 Ð´Ð°Ñ\82оÑ\82еке.\nÐ\9fÑ\80овеÑ\80иÑ\82е Ð¶ÐµÐ»Ð¸Ñ\82е Ð»Ð¸ Ð·Ð°Ð¸Ñ\81Ñ\82а Ð´Ð° Ñ\98е Ð¾Ñ\82пÑ\80емите.",
        "windows-nonascii-filename": "Овај вики не подржава имена датотека са посебним знацима.",
        "fileexists": "Датотека с овим именом већ постоји. Погледајте <strong>[[:$1]]</strong> ако нисте сигурни да ли желите да је промените.\n[[$1|thumb]]",
        "filepageexists": "Страница с описом ове датотеке је већ направљена овде <strong>[[:$1]]</strong>, иако датотека не постоји.\nОпис који сте навели се неће појавити на страници с описом.\nДа би се ваш опис овде нашао, потребно је да га ручно измените.\n[[$1|thumb]]",
        "php-uploaddisabledtext": "Отпремање датотека је онемогућено у PHP-у.\nПроверите подешавања file_uploads.",
        "uploadscripted": "Датотека садржи HTML или скриптни код који може бити погрешно протумачен од стране прегледача.",
        "upload-scripted-pi-callback": "Датотека која садржи инструкције за обраду XML стилског облика се не може отпремити.",
-       "upload-scripted-dtd": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¾Ñ\82пÑ\80емаÑ\9aе SVG Ð´Ð°Ñ\82оÑ\82ека које садрже нестандардну DTD декларацију.",
+       "upload-scripted-dtd": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¾Ñ\82пÑ\80емиÑ\82и SVG Ð´Ð°Ñ\82оÑ\82еке које садрже нестандардну DTD декларацију.",
        "uploaded-script-svg": "Пронађен скриптни елеменат „$1“ у постављеној SVG датотеци.",
        "uploaded-hostile-svg": "Пронађен небезбедан CSS у стилском елементу постављене SVG датотеке.",
        "uploaded-event-handler-on-svg": "Није дозвољено постављање атрибута који контролишу догађаје <code>$1=\"$2\"</code> у SVG датотекама.",
        "uploaded-href-unsafe-target-svg": "Пронађен href са несигурним подацима: URI одредиште <code>&lt;$1 $2=\"$3\"&gt;</code> у постављеној SVG датотеци.",
        "uploaded-animate-svg": "Пронађена „animate“ ознака која можда мења href користећи се „from“ атрибутом <code>&lt;$1 $2=\"$3\"&gt;</code> у постављеној SVG датотеци.",
        "uploadscriptednamespace": "Ова SVG датотека садржи погрешан именски простор „<nowiki>$1</nowiki>“",
-       "uploadinvalidxml": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\80аÑ\88Ñ\87ланим XML у отпремљеној датотеци.",
+       "uploadinvalidxml": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ñ\80аÑ\88Ñ\87ланиÑ\82и XML у отпремљеној датотеци.",
        "uploadvirus": "Датотека садржи вирус!\nДетаљи: $1",
        "uploadjava": "Датотека је формата ZIP који садржи јава .class елемент.\nСлање јава датотека није дозвољено јер оне могу изазвати заобилажење сигурносних ограничења.",
        "upload-source": "Изворна датотека",
        "upload-form-label-own-work-message-generic-local": "Ја потврђујем да отпремам ову датотеку поштујући услове коришћења услуге и лиценцирање на {{SITENAME}}.",
        "upload-form-label-not-own-work-message-generic-local": "Ако нисте у могућности да отпремите ову датотеку под правилима пројекта {{SITENAME}}, затворите овај дијалог и покушате другом методом.",
        "upload-form-label-not-own-work-local-generic-local": "Такође можете покушати [[Special:Upload|подразумевану страницу за отпремање]].",
-       "backend-fail-stream": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° ÐµÐ¼Ð¸Ñ\82Ñ\83Ñ\98ем Ð´Ð°Ñ\82оÑ\82екÑ\83 $1.",
-       "backend-fail-backup": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð½Ð°Ð¿Ñ\80авим Ñ\80езеÑ\80вÑ\83 Ð´Ð°Ñ\82оÑ\82еке $1.",
+       "backend-fail-stream": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе ÐµÐ¼Ð¸Ñ\82оваÑ\82и Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9d.",
+       "backend-fail-backup": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð½Ð°Ð¿Ñ\80авиÑ\82и Ñ\80езеÑ\80внÑ\83 ÐºÐ¾Ð¿Ð¸Ñ\98Ñ\83 Ð´Ð°Ñ\82оÑ\82еке â\80\9e$1â\80\9d.",
        "backend-fail-notexists": "Датотека $1 не постоји.",
-       "backend-fail-hashes": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð´Ð¾Ð±Ð¸Ñ\98ем дисперзије датотеке за упоређивање.",
+       "backend-fail-hashes": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð´Ð¾Ð±Ð¸Ñ\82и дисперзије датотеке за упоређивање.",
        "backend-fail-notsame": "Већ постоји неистоветна датотека – $1.",
        "backend-fail-invalidpath": "$1 није важећа путања за складиштење.",
-       "backend-fail-delete": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¸Ð·Ð±Ñ\80иÑ\88ем датотеку „$1”.",
-       "backend-fail-describe": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ñ\80оменим Ð¼ÐµÑ\82аподаÑ\82ке Ð·Ð° Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9c.",
+       "backend-fail-delete": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¸Ð·Ð±Ñ\80иÑ\81аÑ\82и датотеку „$1”.",
+       "backend-fail-describe": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¿Ñ\80омениÑ\82и Ð¼ÐµÑ\82аподаÑ\82ке Ð·Ð° Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9d.",
        "backend-fail-alreadyexists": "Датотека $1 већ постоји.",
-       "backend-fail-store": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\81меÑ\81Ñ\82им Ð´Ð°Ñ\82оÑ\82екÑ\83 $1 Ñ\83 $2.",
-       "backend-fail-copy": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\83множим Ð´Ð°Ñ\82оÑ\82екÑ\83 $1 Ñ\83 $2.",
-       "backend-fail-move": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ñ\80емеÑ\81Ñ\82им Ð´Ð°Ñ\82оÑ\82екÑ\83 $1 Ñ\83 $2.",
-       "backend-fail-opentemp": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¾Ñ\82воÑ\80им привремену датотеку.",
-       "backend-fail-writetemp": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ð¸Ñ\88ем Ñ\83 Ð¿Ñ\80ивÑ\80еменоÑ\98 Ð´Ð°Ñ\82оÑ\82еÑ\86и.",
-       "backend-fail-closetemp": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð·Ð°Ñ\82воÑ\80им привремену датотеку.",
-       "backend-fail-read": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ñ\80оÑ\87иÑ\82ам Ð´Ð°Ñ\82оÑ\82екÑ\83 $1.",
-       "backend-fail-create": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð·Ð°Ð¿Ð¸Ñ\88ем Ð´Ð°Ñ\82оÑ\82екÑ\83 $1.",
+       "backend-fail-store": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ñ\81кладиÑ\88Ñ\82иÑ\82и Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9d Ñ\83 â\80\9e$2â\80\9d.",
+       "backend-fail-copy": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе ÐºÐ¾Ð¿Ð¸Ñ\80аÑ\82и Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9d Ñ\83 â\80\9e$2â\80\9d.",
+       "backend-fail-move": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¿Ñ\80емеÑ\81Ñ\82иÑ\82и Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9d Ñ\83 â\80\9e$2â\80\9d.",
+       "backend-fail-opentemp": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¾Ñ\82воÑ\80иÑ\82и привремену датотеку.",
+       "backend-fail-writetemp": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ñ\83пиÑ\81иваÑ\82и Ñ\83 Ð¿Ñ\80ивÑ\80еменÑ\83 Ð´Ð°Ñ\82оÑ\82екÑ\83.",
+       "backend-fail-closetemp": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð·Ð°Ñ\82воÑ\80иÑ\82и привремену датотеку.",
+       "backend-fail-read": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ñ\87иÑ\82аÑ\82и Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9d.",
+       "backend-fail-create": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð½Ð°Ð¿Ð¸Ñ\81аÑ\82и Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9d.",
        "backend-fail-maxsize": "Не могу да запишем датотеку $1 јер је већа од {{PLURAL:$2|$2 бајта|$2 бајта|$2 бајтова}}.",
        "backend-fail-readonly": "Складишна основа „$1“ је тренутно само за читање. Наведени разлог је: <em>$2</em>",
        "backend-fail-synced": "Датотека „$1“ је недоследна између унутрашњих складишних основа",
-       "backend-fail-connect": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\81е Ð¿Ð¾Ð²ÐµÐ¶ÐµÐ¼ Ñ\81а Ñ\81кладиÑ\88ном Ð¾Ñ\81новом â\80\9e$1â\80\9c.",
+       "backend-fail-connect": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¿Ð¾Ð²ÐµÐ·Ð°Ñ\82и Ñ\81е Ñ\81а Ð¿Ð¾Ð·Ð°Ð´Ð¸Ð½Ñ\81ким Ñ\81кладиÑ\88Ñ\82ем â\80\9e$1â\80\9d.",
        "backend-fail-internal": "Дошло је до непознате грешке у складишној основи „$1“.",
-       "backend-fail-contenttype": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\83Ñ\82вÑ\80дим ÐºÐ°ÐºÐ°Ð² Ñ\81адÑ\80жаÑ\98 Ð¸Ð¼Ð° Ð´Ð°Ñ\82оÑ\82ека ÐºÐ¾Ñ\98Ñ\83 Ñ\82Ñ\80еба Ð´Ð° Ñ\81меÑ\81Ñ\82им Ñ\83 â\80\9e$1â\80\9c.",
+       "backend-fail-contenttype": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¾Ð´Ñ\80едиÑ\82и Ñ\82ип Ñ\81адÑ\80жаÑ\98а Ð´Ð°Ñ\82оÑ\82еке Ð·Ð° Ñ\81кладиÑ\88Ñ\82еÑ\9aе Ñ\83 â\80\9e$1â\80\9d.",
        "backend-fail-batchsize": "Складишна основа је добила блокаду од $1 {{PLURAL:$1|операције|операције|операција}}; ограничење је $2 {{PLURAL:$2|операција|операције|операција}}.",
        "backend-fail-usable": "Не могу да прочитам или запишем датотеку „$1“ јер немате довољно дозвола или вам недостају фасцикле/садржаоци.",
-       "filejournal-fail-dbconnect": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\81е Ð¿Ð¾Ð²ÐµÐ¶ÐµÐ¼ Ñ\81 Ð½Ð¾Ð²Ð¸Ð½Ð°Ñ\80Ñ\81ком Ð±Ð°Ð·Ð¾Ð¼ Ð·Ð° Ñ\81кладиÑ\88нÑ\83 Ð¾Ñ\81новÑ\83 â\80\9e$1â\80\9c.",
-       "filejournal-fail-dbquery": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð°Ð¶Ñ\83Ñ\80иÑ\80ам Ð½Ð¾Ð²Ð¸Ð½Ð°Ñ\80Ñ\81кÑ\83 Ð±Ð°Ð·Ñ\83 Ð·Ð° Ñ\81кладиÑ\88нÑ\83 Ð¾Ñ\81новÑ\83 â\80\9e$1â\80\9c.",
-       "lockmanager-notlocked": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¾Ñ\82кÑ\99Ñ\83Ñ\87ам â\80\9e$1â\80\9c јер није закључан.",
-       "lockmanager-fail-closelock": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð·Ð°Ñ\82воÑ\80им ÐºÐ°Ñ\82анаÑ\86 Ð·Ð° â\80\9e$1â\80\9c.",
-       "lockmanager-fail-deletelock": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¸Ð·Ð±Ñ\80иÑ\88ем ÐºÐ°Ñ\82анаÑ\86 Ð·Ð° â\80\9e$1â\80\9c.",
-       "lockmanager-fail-acquirelock": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\81е Ð·Ð°ÐºÑ\99Ñ\83Ñ\87ам Ð·Ð° â\80\9e$1â\80\9c.",
+       "filejournal-fail-dbconnect": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¿Ð¾Ð²ÐµÐ·Ð°Ñ\82и Ñ\81е Ñ\81а Ð½Ð¾Ð²Ð¸Ð½Ð°Ñ\80Ñ\81ком Ð±Ð°Ð·Ð¾Ð¼ Ð¿Ð¾Ð´Ð°Ñ\82ака Ð·Ð° Ð¿Ð¾Ð·Ð°Ð´Ð¸Ð½Ñ\81ко Ñ\81кладиÑ\88Ñ\82е â\80\9e$1â\80\9d.",
+       "filejournal-fail-dbquery": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð°Ð¶Ñ\83Ñ\80иÑ\80аÑ\82и Ð½Ð¾Ð²Ð¸Ð½Ð°Ñ\80Ñ\81кÑ\83 Ð±Ð°Ð·Ñ\83 Ð¿Ð¾Ð´Ð°Ñ\82ака Ð·Ð° Ð¿Ð¾Ð·Ð°Ð´Ð¸Ð½Ñ\81ко Ñ\81кладиÑ\88Ñ\82е â\80\9e$1â\80\9d.",
+       "lockmanager-notlocked": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¾Ñ\82кÑ\99Ñ\83Ñ\87аÑ\82и â\80\9e$1â\80\9d јер није закључан.",
+       "lockmanager-fail-closelock": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð·Ð°Ñ\82воÑ\80иÑ\82и ÐºÐ°Ñ\82анаÑ\86 Ð·Ð° â\80\9e$1â\80\9d.",
+       "lockmanager-fail-deletelock": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¸Ð·Ð±Ñ\80иÑ\81аÑ\82и ÐºÐ°Ñ\82анаÑ\86 Ð·Ð° â\80\9e$1â\80\9d.",
+       "lockmanager-fail-acquirelock": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ñ\81Ñ\82еÑ\9bи ÐºÐ°Ñ\82анаÑ\86 Ð·Ð° â\80\9e$1â\80\9d.",
        "lockmanager-fail-openlock": "Не могу да отворим катанац за „$1“. Уверите се да је ваш директоријум за отпремање исправно конфигурисан и да ваш веб-сервер има дозволу да пише у том директоријуму. Погледајте https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgUploadDirectory за више информација.",
-       "lockmanager-fail-releaselock": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¾Ñ\81лободим ÐºÐ°Ñ\82анаÑ\86 Ð·Ð° â\80\9e$1â\80\9c.",
-       "lockmanager-fail-db-bucket": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° ÐºÐ¾Ð½Ñ\82акÑ\82иÑ\80ам Ñ\81 довољно катанаца у канти $1.",
-       "lockmanager-fail-db-release": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¾Ñ\81лободим ÐºÐ°Ñ\82анÑ\86е Ñ\83 Ð±Ð°Ð·Ð¸ $1.",
-       "lockmanager-fail-svr-acquire": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð´Ð¾Ð±Ð¸Ñ\98ем катанце на серверу $1.",
-       "lockmanager-fail-svr-release": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¾Ñ\81лободим катанце на серверу $1.",
+       "lockmanager-fail-releaselock": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¾Ñ\81лободиÑ\82и ÐºÐ°Ñ\82анаÑ\86 Ð·Ð° â\80\9e$1â\80\9d.",
+       "lockmanager-fail-db-bucket": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе ÐºÐ¾Ð½Ñ\82акÑ\82иÑ\80аÑ\82и Ñ\81а довољно катанаца у канти $1.",
+       "lockmanager-fail-db-release": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¾Ñ\81лободиÑ\82и ÐºÐ°Ñ\82анÑ\86е Ñ\83 Ð±Ð°Ð·Ð¸ Ð¿Ð¾Ð´Ð°Ñ\82ака $1.",
+       "lockmanager-fail-svr-acquire": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ñ\81Ñ\82еÑ\9bи катанце на серверу $1.",
+       "lockmanager-fail-svr-release": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¾Ñ\81лободиÑ\82и катанце на серверу $1.",
        "zip-file-open-error": "Дошло је до грешке при отварању датотеке за проверу ZIP архиве.",
        "zip-wrong-format": "Наведена датотека није формата ZIP.",
        "zip-bad": "Датотека је оштећена или је нечитљива ZIP датотека.\nБезбедносна провера не може да се изврши како треба.",
        "uploadstash-bad-path-unrecognized-thumb-name": "Непрепознато име минијатуре.",
        "uploadstash-bad-path-bad-format": "Кључ „$1“ није у одговарајућем облику.",
        "uploadstash-file-not-found": "Кључ „$1” није пронађен у складишту.",
-       "uploadstash-file-not-found-no-thumb": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ñ\80ибавим сличицу.",
+       "uploadstash-file-not-found-no-thumb": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¿Ñ\80ибавиÑ\82и сличицу.",
        "uploadstash-file-not-found-no-local-path": "Нема локалне путање за умањену ставку.",
-       "uploadstash-file-not-found-no-object": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð½Ð°Ð¿Ñ\80авим локални датотечни објекат за сличицу.",
+       "uploadstash-file-not-found-no-object": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð½Ð°Ð¿Ñ\80авиÑ\82и локални датотечни објекат за сличицу.",
        "uploadstash-file-not-found-no-remote-thumb": "Добављање минијатуре није успело: $1\nАдреса = $2",
        "uploadstash-file-not-found-missing-content-type": "Недостаје заглавље за тип садржаја.",
        "uploadstash-file-not-found-not-exists": "Не могу наћи путању или ово није обична датотека.",
        "img-auth-accessdenied": "Приступ је одбијен",
        "img-auth-nopathinfo": "Недостаје PATH_INFO.\nВаш сервер није подешен да прослеђује овакве податке.\nМожда је заснован на CGI-ју који не подржава img_auth.\nПогледајте https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization?uselang=sr-ec.",
        "img-auth-notindir": "Тражена путања није у подешеном директоријуму за отпремање.",
-       "img-auth-badtitle": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\81аÑ\81Ñ\82авим Ð²Ð°Ð¶ÐµÑ\9bи Ð½Ð°Ñ\81лов Ð¸Ð· â\80\9e$1â\80\9c.",
+       "img-auth-badtitle": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ñ\81аÑ\81Ñ\82авиÑ\82и Ð²Ð°Ð¶ÐµÑ\9bи Ð½Ð°Ñ\81лов Ð¸Ð· â\80\9e$1â\80\9d.",
        "img-auth-nologinnWL": "Нисте пријављени и „$1” није на списку дозвољених.",
        "img-auth-nofile": "Датотека „$1“ не постоји.",
        "img-auth-isdir": "Покушавате да приступите фасцикли „$1“.\nДозвољен је само приступ датотекама.",
        "http-curl-error": "Грешка при отварању адресе: $1",
        "http-bad-status": "Дошло је до проблема током захтева HTTP: $1 $2",
        "http-internal-error": "HTTP интерна грешка.",
-       "upload-curl-error6": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ñ\80иÑ\81Ñ\82Ñ\83пим адреси",
-       "upload-curl-error6-text": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ñ\80иÑ\81Ñ\82Ñ\83пим Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ð¾Ð¼ URL-Ñ\83.\nÐ\9fÑ\80овеÑ\80иÑ\82е Ð´Ð° Ð»Ð¸ Ñ\98е URL Ð¸Ñ\81пÑ\80аван Ð¸ Ð´Ð¾Ñ\81Ñ\82Ñ\83пан.",
+       "upload-curl-error6": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¿Ñ\80иÑ\81Ñ\82Ñ\83пиÑ\82и URL адреси",
+       "upload-curl-error6-text": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¿Ñ\80иÑ\81Ñ\82Ñ\83пиÑ\82и Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ð¾Ñ\98 URL Ð°Ð´Ñ\80еÑ\81и.\nÐ\9fоново Ð¿Ñ\80овеÑ\80иÑ\82е Ð´Ð° Ð»Ð¸ Ñ\98е Ð¸Ñ\81пÑ\80авна Ð¸ Ð´Ð° Ð»Ð¸ Ñ\81аÑ\98Ñ\82 Ñ\80ади.",
        "upload-curl-error28": "Отпремање је истекло",
        "upload-curl-error28-text": "Сервер не одговара на упит.\nПроверите да ли сајт ради, мало осачекајте и покушајте поново.\nПробајте касније када буде мање оптерећење.",
        "license": "Лиценца:",
        "filedelete-reason-dropdown": "*Најчешћи разлози брисања\n** Кршење ауторских права\n** Дупликати датотека",
        "filedelete-edit-reasonlist": "Уреди разлоге брисања",
        "filedelete-maintenance": "Брисање и враћање датотека је привремено онемогућено због одржавања.",
-       "filedelete-maintenance-title": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¸Ð·Ð±Ñ\80иÑ\88ем датотеку",
+       "filedelete-maintenance-title": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¸Ð·Ð±Ñ\80иÑ\81аÑ\82и датотеку",
        "mimesearch": "MIME претрага",
        "mimesearch-summary": "Ова страница омогућава филтрирање датотека према њиховим MIME типовима.\nУлазни подаци: contenttype/subtype или contenttype/*, нпр. <code>image/jpeg</code>.",
        "mimetype": "MIME тип:",
        "rollbacklinkcount-morethan": "врати више од $1 {{PLURAL:$1|измене|измене|измена}}",
        "rollbackfailed": "Враћање није успело",
        "rollback-missingparam": "Недостаје потребан параметар на захтеву.",
-       "rollback-missingrevision": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\83Ñ\87иÑ\82ам податке о измени.",
-       "cantrollback": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð²Ñ\80аÑ\82им Ð¸Ð·Ð¼ÐµÐ½Ñ\83.\nÐ\9fоÑ\81ледÑ\9aи Ð°Ñ\83Ñ\82оÑ\80 је уједно и једини.",
+       "rollback-missingrevision": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ñ\83Ñ\87иÑ\82аÑ\82и податке о измени.",
+       "cantrollback": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð²Ñ\80аÑ\82иÑ\82и Ð¸Ð·Ð¼ÐµÐ½Ñ\83.\nÐ\9fоÑ\81ледÑ\9aи Ð´Ð¾Ð¿Ñ\80иноÑ\81илаÑ\86 је уједно и једини.",
        "alreadyrolled": "Враћање последње измене странице [[:$1]] од стране {{GENDER:$2|корисника|кориснице|корисника}} [[User:$2|$2]] ([[User talk:$2|разговор]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) није успело; неко други је у међувремену изменио или вратио страницу.\n\nПоследњу измену је {{GENDER:$3|направио|направила|направио}} [[User:$3|$3]] ([[User talk:$3|разговор]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Резиме измене је био: <em>$1</em>.",
        "revertpage": "Враћене измене {{GENDER:$2|корисника|кориснице}} [[Special:Contributions/$2|$2]] ([[User talk:$2|разговор]]) на последњу измену {{GENDER:$1|корисника|кориснице}} [[User:$1|$1]]",
        "blockipsuccesssub": "Блокирање је успело",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] је {{GENDER:$1|блокиран|блокирана}}.<br />\nПогледајте [[Special:BlockList|списак]] за преглед блокада.",
        "ipb-blockingself": "Блокираћете самог себе! Заиста то желите?",
-       "ipb-confirmhideuser": "УпÑ\80аво Ñ\9bеÑ\82е Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\82и ÐºÐ¾Ñ\80иÑ\81ника Ñ\81а Ñ\83кÑ\99Ñ\83Ñ\87еном Ñ\84Ñ\83нкÑ\86иÑ\98ом â\80\9eÑ\81акÑ\80иÑ\98 ÐºÐ¾Ñ\80иÑ\81никаâ\80\9d. Ð\9eвим Ñ\9bе ÐºÐ¾Ñ\80иÑ\81ниÑ\87ко Ð¸Ð¼Ðµ Ð±Ð¸Ñ\82и Ñ\81акÑ\80ивено Ñ\83 Ñ\81вим Ñ\81пиÑ\81ковима Ð¸ Ñ\83ноÑ\81има Ñ\83 Ð´Ð½ÐµÐ²Ð½Ð¸ÐºÑ\83. Ð\97аиÑ\81Ñ\82а Ð¶ÐµÐ»Ð¸Ñ\82е то да урадите?",
+       "ipb-confirmhideuser": "Ð\91локиÑ\80аÑ\82е ÐºÐ¾Ñ\80иÑ\81ника Ñ\81а Ð¾Ð¼Ð¾Ð³Ñ\83Ñ\9bеном Ñ\84Ñ\83нкÑ\86иÑ\98ом â\80\9eÑ\81акÑ\80иÑ\98 ÐºÐ¾Ñ\80иÑ\81никаâ\80\9d. Ð\9eвим Ñ\9bе Ñ\81е Ñ\81акÑ\80иÑ\82и ÐºÐ¾Ñ\80иÑ\81ниÑ\87ко Ð¸Ð¼Ðµ Ñ\83 Ñ\81вим Ñ\81пиÑ\81ковима Ð¸ Ñ\83ноÑ\81има Ñ\83 Ð´Ð½ÐµÐ²Ð½Ð¸ÐºÑ\83. Ð\96елиÑ\82е Ð»Ð¸ Ð·Ð°Ð¸Ñ\81Ñ\82а то да урадите?",
        "ipb-confirmaction": "Ако сте сигурни да желите наставити означите поље „{{int:ipb-confirm}}“ на дну странице.",
        "ipb-edit-dropdown": "Уреди разлоге блокирања",
        "ipb-unblock-addr": "Деблокирај $1",
        "immobile-target-namespace": "Не могу преместити странице у именски простор „$1“.",
        "immobile-target-namespace-iw": "Међувики веза није важеће одредиште за премештање странице.",
        "immobile-source-page": "Ова страница се не може преместити.",
-       "immobile-target-page": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ñ\80емеÑ\81Ñ\82им Ð½Ð° Ð¶ÐµÑ\99ени наслов.",
+       "immobile-target-page": "Ð\9fÑ\80емеÑ\88Ñ\82аÑ\9aе Ð½Ð¸Ñ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð½Ð° Ð¾Ð´Ñ\80едиÑ\88ни наслов.",
        "bad-target-model": "Жељено одредиште користи другачији модел садржаја. Не могу да претворим из $1 у $2.",
        "imagenocrossnamespace": "Датотека се не може преместити у именски простор који не припада датотекама.",
        "nonfile-cannot-move-to-file": "Не-датотеке не можете преместити у именски простор за датотеке",
        "thumbnail_error": "Грешка при прављењу сличице: $1",
        "thumbnail_error_remote": "Порука о грешци из $1:\n$2",
        "djvu_page_error": "DjVu страница је ван опсега",
-       "djvu_no_xml": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ñ\80еÑ\83змем XML за DjVu датотеку.",
-       "thumbnail-temp-create": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð½Ð°Ð¿Ñ\80авим Ð¿Ñ\80ивÑ\80еменÑ\83 Ð´Ð°Ñ\82оÑ\82екÑ\83 Ð·Ð° сличицу",
-       "thumbnail-dest-create": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\81аÑ\87Ñ\83вам Ð¼Ð¸Ð½Ð¸Ñ\98аÑ\82Ñ\83Ñ\80Ñ\83 Ñ\83 Ð¾Ð´Ñ\80едиÑ\88Ñ\82Ñ\83",
+       "djvu_no_xml": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ\82и XML за DjVu датотеку.",
+       "thumbnail-temp-create": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð½Ð°Ð¿Ñ\80авиÑ\82и Ð¿Ñ\80ивÑ\80еменÑ\83 Ð´Ð°Ñ\82оÑ\82екÑ\83-сличицу",
+       "thumbnail-dest-create": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ñ\81аÑ\87Ñ\83ваÑ\82и Ñ\81лиÑ\87иÑ\86Ñ\83 Ð½Ð° Ð¾Ð´Ñ\80едиÑ\88Ñ\82е",
        "thumbnail_invalid_params": "Неважећи параметри сличице",
        "thumbnail_toobigimagearea": "Датотека са величинама већим од $1",
-       "thumbnail_dest_directory": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð½Ð°Ð¿Ñ\80авим Ð¾Ð´Ñ\80едиÑ\88нÑ\83 Ñ\84аÑ\81Ñ\86иклÑ\83",
+       "thumbnail_dest_directory": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð½Ð°Ð¿Ñ\80авиÑ\82и Ð¾Ð´Ñ\80едиÑ\88ни Ð´Ð¸Ñ\80екÑ\82оÑ\80иÑ\98Ñ\83м",
        "thumbnail_image-type": "Тип слике није подржан",
        "thumbnail_gd-library": "Недовршена подешавања графичке библиотеке: недостаје функција $1",
        "thumbnail_image-size-zero": "Изгледа да је величина датотеке нула.",
        "importfailed": "Неуспешан увоз: <nowiki>$1</nowiki>",
        "importunknownsource": "Непознат изворни тип увоза",
        "importnoprefix": "Није наведен међувики префикс",
-       "importcantopen": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¾Ñ\82воÑ\80им Ð´Ð°Ñ\82оÑ\82екÑ\83 Ð·Ð° Ñ\83воз.",
+       "importcantopen": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¾Ñ\82воÑ\80иÑ\82и Ð´Ð°Ñ\82оÑ\82екÑ\83 Ð·Ð° Ñ\83воз",
        "importbadinterwiki": "Лоша међувики веза",
        "importsuccess": "Увожење је завршено!",
        "importnosources": "Није одређен ниједан извор за увоз, тако да је отпремање историје онемогућено.",
-       "importnofile": "Увозна Ð´Ð°Ñ\82оÑ\82ека Ð½Ð¸Ñ\98е Ð¿Ð¾Ñ\81лаÑ\82а.",
-       "importuploaderrorsize": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¾Ñ\82пÑ\80емим Ð´Ð°Ñ\82оÑ\82екÑ\83 Ð·Ð° Ñ\83воз.\nДатотека је већа од дозвољене величине.",
-       "importuploaderrorpartial": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¾Ñ\82пÑ\80емим Ð´Ð°Ñ\82оÑ\82екÑ\83 Ð·Ð° Ñ\83воз.\nÐ\94аÑ\82оÑ\82ека Ñ\98е Ñ\81амо Ð´ÐµÐ»Ð¸Ð¼Ð¸Ñ\87но Ð¿Ð¾Ñ\81лаÑ\82а.",
-       "importuploaderrortemp": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ð¾Ñ\88аÑ\99ем Ð´Ð°Ñ\82оÑ\82екÑ\83 Ð·Ð° Ñ\83воз.\nНедостаје привремена фасцикла.",
+       "importnofile": "Ð\94аÑ\82оÑ\82ека Ð·Ð° Ñ\83воз Ð½Ð¸Ñ\98е Ð¾Ñ\82пÑ\80емÑ\99ена.",
+       "importuploaderrorsize": "Ð\9eÑ\82пÑ\80емаÑ\9aе Ð´Ð°Ñ\82оÑ\82еке Ð·Ð° Ñ\83воз Ð½Ð¸Ñ\98е Ñ\83Ñ\81пело.\nДатотека је већа од дозвољене величине.",
+       "importuploaderrorpartial": "Ð\9eÑ\82пÑ\80емаÑ\9aе Ð´Ð°Ñ\82оÑ\82еке Ð·Ð° Ñ\83воз Ð½Ð¸Ñ\98е Ñ\83Ñ\81пело.\nÐ\94аÑ\82оÑ\82ека Ñ\98е Ñ\81амо Ð´ÐµÐ»Ð¸Ð¼Ð¸Ñ\87но Ð¾Ñ\82пÑ\80емÑ\99ена.",
+       "importuploaderrortemp": "Ð\9eÑ\82пÑ\80емаÑ\9aе Ð´Ð°Ñ\82оÑ\82еке Ð·Ð° Ñ\83воз Ð½Ð¸Ñ\98е Ñ\83Ñ\81пело.\nНедостаје привремена фасцикла.",
        "import-parse-failure": "Погрешно рашчлањивање XML-а.",
        "import-noarticle": "Нема странице за увоз!",
        "import-nonewrevisions": "Ниједна измена није увезена (све су већ присутне или су прескочене због грешака).",
        "xml-error-string": "$1 у реду $2, колона $3 (бајт $4): $5",
        "import-upload": "Отпремање XML података",
        "import-token-mismatch": "Губитак података о сесији.\n\nМожда сте одјављени. '''Молимо Вас проверите да ли сте још увек пријављени и покушајте поново'''.\n\nАко и даље не ради, покушајте се [[Special:UserLogout|одјавити]] и поново пријавити и проверите да ли ваш веб-претраживач дозвољава колачиће са овог сајта.",
-       "import-invalid-interwiki": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\83возим Ñ\81 наведеног викија.",
+       "import-invalid-interwiki": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ñ\83возиÑ\82и Ñ\81а наведеног викија.",
        "import-error-edit": "Страница „$1“ није увезена јер вам није дозвољено да је уређујете.",
        "import-error-create": "Страница „$1“ није увезена јер вам није дозвољено да је направите.",
-       "import-error-interwiki": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\83везем Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 â\80\9e$1â\80\9c Ñ\98еÑ\80 Ñ\98е Ñ\9aен Ð½Ð°Ð·Ð¸Ð² Ñ\80езеÑ\80виÑ\81ан Ð·Ð° Ñ\81поÑ\99но повезивање (међувики).",
-       "import-error-special": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\83везем Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 â\80\9e$1â\80\9c Ñ\98еÑ\80 Ð¾Ð½Ð° Ð¿Ñ\80ипада Ð¿Ð¾Ñ\81ебном Ð¸Ð¼ÐµÐ½Ñ\81ком Ð¿Ñ\80оÑ\81Ñ\82оÑ\80Ñ\83 ÐºÐ¾Ñ\98е Ð½Ðµ Ð¿Ñ\80иÑ\85ваÑ\82а странице.",
+       "import-error-interwiki": "СÑ\82Ñ\80аниÑ\86а â\80\9e$1â\80\9d Ð½Ð¸Ñ\98е Ñ\83везена Ñ\98еÑ\80 Ñ\98е Ñ\9aен Ð½Ð°Ð·Ð¸Ð² Ñ\80езеÑ\80виÑ\81ан Ð·Ð° Ñ\81поÑ\99аÑ\88Ñ\9aе повезивање (међувики).",
+       "import-error-special": "СÑ\82Ñ\80аниÑ\86а â\80\9e$1â\80\9d Ð½Ð¸Ñ\98е Ñ\83везена Ñ\98еÑ\80 Ð¿Ñ\80ипада Ð¿Ð¾Ñ\81ебном Ð¸Ð¼ÐµÐ½Ñ\81ком Ð¿Ñ\80оÑ\81Ñ\82оÑ\80Ñ\83 ÐºÐ¾Ñ\98и Ð½Ðµ Ð´Ð¾Ð·Ð²Ð¾Ñ\99ава странице.",
        "import-error-invalid": "Страница „$1“ није увезена јер је име под којим се треба увости неважеће на овом викију.",
-       "import-error-unserialize": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð´ÐµÑ\81еÑ\80иÑ\98ализÑ\83Ñ\98ем Ð¸Ð·Ð¼ÐµÐ½Ñ\83 $2 Ñ\81Ñ\82Ñ\80аниÑ\86е $1. Ð\97апиÑ\81ано Ñ\98е Ð´Ð° Ð¸Ð·Ð¼ÐµÐ½Ð° ÐºÐ¾Ñ\80иÑ\81Ñ\82и $3 Ð¼Ð¾Ð´ÐµÐ» Ñ\81адÑ\80жаÑ\98а Ñ\83 $4 Ñ\84оÑ\80маÑ\82Ñ\83.",
+       "import-error-unserialize": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð´ÐµÑ\81еÑ\80иÑ\98ализоваÑ\82и Ð¸Ð·Ð¼ÐµÐ½Ñ\83 $2 Ñ\81Ñ\82Ñ\80аниÑ\86е â\80\9e$1â\80\9d. Ð\97апиÑ\81ано Ñ\98е Ð´Ð° Ð¸Ð·Ð¼ÐµÐ½Ð° ÐºÐ¾Ñ\80иÑ\81Ñ\82и Ð¼Ð¾Ð´ÐµÐ» Ñ\81адÑ\80жаÑ\98а $3 ÐºÐ¾Ñ\98и Ñ\98е Ñ\81еÑ\80иÑ\98ализован ÐºÐ°Ð¾ $4.",
        "import-options-wrong": "{{PLURAL:$2|Погрешна опција|Погрешне опције}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "Наведена основна страница има неважећи наслов.",
        "import-rootpage-nosubpage": "Именски простор „$1“ основне странице не дозвољава подстранице.",
        "spam_deleting": "Све измене садрже везе до $1. Бришем",
        "simpleantispam-label": "Провера против нежељеног садржаја. \n<strong>Не</strong> попуњавајте ово!",
        "pageinfo-title": "Информације за „$1“",
-       "pageinfo-not-current": "Ð\9dажалоÑ\81Ñ\82, Ð½ÐµÐ¼Ð¾Ð³Ñ\83Ñ\9bе Ñ\98е навести ове инфомације за старије измене.",
+       "pageinfo-not-current": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе навести ове инфомације за старије измене.",
        "pageinfo-header-basic": "Основне информације",
        "pageinfo-header-edits": "Историја измена",
        "pageinfo-header-restrictions": "Заштита странице",
        "markedaspatrolledtext": "Изабрана измена странице [[:$1]] означена је као патролирана.",
        "rcpatroldisabled": "Патролирање скорашњих измена је онемогућено",
        "rcpatroldisabledtext": "Функција патролирања скорашњих измена је тренутно онемогућена.",
-       "markedaspatrollederror": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¾Ð·Ð½Ð°Ñ\87им ÐºÐ°Ð¾ Ð¿Ð°Ñ\82Ñ\80олиÑ\80ано.",
+       "markedaspatrollederror": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¾Ð·Ð½Ð°Ñ\87иÑ\82и ÐºÐ°Ð¾ Ð¿Ð°Ñ\82Ñ\80олиÑ\80ано",
        "markedaspatrollederrortext": "Морате навести измену да бисте је означили као патролирану.",
        "markedaspatrollederror-noautopatrol": "Не можете да означите своје промене као патролиране.",
        "markedaspatrollednotify": "Ова измена на страници „$1” означена је као патролирана.",
        "deletedrevision": "Избрисана стара измена $1.",
        "filedeleteerror-short": "Грешка при брисању датотеке: $1",
        "filedeleteerror-long": "Дошло је до грешака при брисању датотеке:\n\n$1",
-       "filedelete-missing": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¸Ð·Ð±Ñ\80иÑ\88ем Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9c јер не постоји.",
+       "filedelete-missing": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¸Ð·Ð±Ñ\80иÑ\81аÑ\82и Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9d јер не постоји.",
        "filedelete-old-unregistered": "Наведена измена датотеке „$1“ не постоји у бази података.",
        "filedelete-current-unregistered": "Наведена датотека „$1“ не постоји у бази података.",
        "filedelete-archive-read-only": "Сервер не може да пише по складишној фасцикли ($1).",
        "scarytranscludefailed-httpstatus": "[Не могу да преузмем шаблон $1: HTTP $2]",
        "scarytranscludetoolong": "[URL адреса је предугачка]",
        "deletedwhileediting": "<strong>Упозорење</strong>: Ова страница је избрисана након што сте почели са уређивањем!",
-       "confirmrecreate": "{{GENDER:$1|Ð\9aоÑ\80иÑ\81ник|Ð\9aоÑ\80иÑ\81ниÑ\86а}} [[User:$1|$1]] ([[User talk:$1|Ñ\80азговоÑ\80]]) Ñ\98е {{GENDER:$1|обÑ\80иÑ\81ао|обрисала}} ову страницу након што сте почели да је уређујете из следећег разлога:\n: <em>$2</em>\nПотврдите да стварно желите да направите страницу.",
-       "confirmrecreate-noreason": "{{GENDER:$1|Ð\9aоÑ\80иÑ\81ник|Ð\9aоÑ\80иÑ\81ниÑ\86а}} [[User:$1|$1]] ([[User talk:$1|Ñ\80азговоÑ\80]]) Ñ\98е {{GENDER:$1|обÑ\80иÑ\81ао|обрисала}} ову страницу након што сте почели да је уређујете. Потврдите да стварно желите да поново направите ову страницу.",
+       "confirmrecreate": "{{GENDER:$1|Ð\9aоÑ\80иÑ\81ник|Ð\9aоÑ\80иÑ\81ниÑ\86а}} [[User:$1|$1]] ([[User talk:$1|Ñ\80азговоÑ\80]]) Ñ\98е {{GENDER:$1|избÑ\80иÑ\81ао|избрисала}} ову страницу након што сте почели да је уређујете из следећег разлога:\n: <em>$2</em>\nПотврдите да стварно желите да направите страницу.",
+       "confirmrecreate-noreason": "{{GENDER:$1|Ð\9aоÑ\80иÑ\81ник|Ð\9aоÑ\80иÑ\81ниÑ\86а}} [[User:$1|$1]] ([[User talk:$1|Ñ\80азговоÑ\80]]) Ñ\98е {{GENDER:$1|избÑ\80иÑ\81ао|избрисала}} ову страницу након што сте почели да је уређујете. Потврдите да стварно желите да поново направите ову страницу.",
        "recreate": "Поново направи",
        "unit-pixel": "п",
        "confirm-purge-title": "Освежи ову страницу",
        "confirm-unwatch-top": "Уклонити ову страницу са списка надгледања?",
        "confirm-rollback-button": "У реду",
        "confirm-rollback-top": "Врати измене на овој страници?",
+       "confirm-mcrrestore-title": "Враћање измене",
        "confirm-mcrundo-title": "Поништавање промене",
        "mcrundofailed": "Поништавање није успело",
        "mcrundo-missingparam": "Недостаје потребан параметар на захтеву.",
        "mcrundo-changed": "Страница је промењена док сте гледали разлику. Прегледајте нову промену.",
+       "mcrundo-parse-failed": "Рашчлањивање нових измена није успело: $1",
        "semicolon-separator": ";&#32;",
        "comma-separator": ",&#32;",
        "colon-separator": ":&#32;",
        "tags-activate-title": "Активирање ознака",
        "tags-activate-question": "Активирате ознаку „$1“.",
        "tags-activate-reason": "Разлог:",
-       "tags-activate-not-allowed": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð°ÐºÑ\82ивиÑ\80аÑ\82и Ð¾Ð·Ð½Ð°ÐºÑ\83 â\80\9e$1â\80\9c.",
+       "tags-activate-not-allowed": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð°ÐºÑ\82ивиÑ\80аÑ\82и Ð¾Ð·Ð½Ð°ÐºÑ\83 â\80\9e$1â\80\9d.",
        "tags-activate-not-found": "Ознака „$1“ не постоји.",
        "tags-activate-submit": "Активирај",
        "tags-deactivate-title": "Деактивирање ознака",
        "tags-deactivate-question": "Деактивирате ознаку „$1“.",
        "tags-deactivate-reason": "Разлог:",
-       "tags-deactivate-not-allowed": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð´ÐµÐ°ÐºÑ\82ивиÑ\80аÑ\82и Ð¾Ð·Ð½Ð°ÐºÑ\83 â\80\9e$1â\80\9c.",
+       "tags-deactivate-not-allowed": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð´ÐµÐ°ÐºÑ\82ивиÑ\80аÑ\82и Ð¾Ð·Ð½Ð°ÐºÑ\83 â\80\9e$1â\80\9d.",
        "tags-deactivate-submit": "Декативирај",
        "tags-apply-no-permission": "Немате дозволу да примените ознаке промена заједно са својим променама.",
        "tags-apply-blocked": "Не можете да примените ознаке тагова заједно са вашим променама све док сте блокирани.",
        "tags-edit-reason": "Разлог:",
        "tags-edit-revision-submit": "Примени промене {{PLURAL:$1|овој измени|$1 изменама}}",
        "tags-edit-success": "Промене су примењене.",
-       "tags-edit-failure": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ñ\80именим Ð¸Ð·мене:\n$1",
+       "tags-edit-failure": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¿Ñ\80имениÑ\82и Ð¿Ñ\80омене:\n$1",
        "tags-edit-nooldid-title": "Неважећа одредишна измена",
        "tags-edit-nooldid-text": "Нисте одредили било коју циљану измену на којој ће се извршити ова функција или ако наведена измена не постоји.",
        "tags-edit-none-selected": "Изаберите бар једну ознаку коју треба додати или уклонити.",
        "htmlform-title-not-exists": "$1 не постоји.",
        "htmlform-user-not-exists": "<strong>$1</strong> не постоји.",
        "htmlform-user-not-valid": "<strong>$1</strong> није валидно корисничко име.",
-       "logentry-delete-delete": "$1 Ñ\98е {{GENDER:$2|обÑ\80иÑ\81ао|обрисала}} страницу $3",
-       "logentry-delete-delete_redir": "$1 Ñ\98е {{GENDER:$2|обÑ\80иÑ\81ао|обрисала}} преусмерење $3 преписивањем",
+       "logentry-delete-delete": "$1 Ñ\98е {{GENDER:$2|избÑ\80иÑ\81ао|избрисала}} страницу $3",
+       "logentry-delete-delete_redir": "$1 Ñ\98е {{GENDER:$2|избÑ\80иÑ\81ао|избрисала}} преусмерење $3 преписивањем",
        "logentry-delete-restore": "$1 је {{GENDER:$2|вратио|вратила}} страницу $3 ($4)",
        "logentry-delete-restore-nocount": "$1 је {{GENDER:$2|вратио|вратила}} страницу $3",
        "restore-count-revisions": "{{PLURAL:$1|1 измена|$1 измене|$1 измена}}",
        "log-action-filter-upload-upload": "ново отпремање",
        "log-action-filter-upload-overwrite": "промена постојећег",
        "authmanager-authn-not-in-progress": "Потврда идентитета није у току или је дошло до губитка података о сесији. Почните испочетка.",
-       "authmanager-authn-no-primary": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ñ\80овеÑ\80им пружене акредитиве.",
+       "authmanager-authn-no-primary": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¿Ð¾Ñ\82вÑ\80диÑ\82и пружене акредитиве.",
        "authmanager-authn-no-local-user": "Пружени акредитиви нису повезани ни са једним корисником на овом викију.",
        "authmanager-authn-no-local-user-link": "Пружени акредитиви су важећи, али нису повезани ни са једним корисником на овом викију. Пријавите се на неки други начин или отворите нови кориснички налог, што ће вам дати опцију да повежете претходне акредитиве на нови налог.",
        "authmanager-authn-autocreate-failed": "Не могу да аутоматски направим локални налог: $1",
        "authform-notoken": "Недостаје токен",
        "authform-wrongtoken": "Погрешан токен",
        "specialpage-securitylevel-not-allowed-title": "Није дозвољено",
-       "specialpage-securitylevel-not-allowed": "Ð\96ао Ð½Ð°Ð¼ Ñ\98е, Ð½Ð¸Ñ\98е Ð²Ð°Ð¼ Ð´Ð¾Ð·Ð²Ð¾Ñ\99ено Ð´Ð° ÐºÐ¾Ñ\80иÑ\81Ñ\82иÑ\82е Ð¾Ð²Ñ\83 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 Ñ\98еÑ\80 Ð½Ðµ Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ð¾Ñ\82вÑ\80дим ваш идентитет.",
-       "authpage-cannot-login": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð·Ð°Ð¿Ð¾Ñ\87нем пријаву.",
-       "authpage-cannot-login-continue": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð½Ð°Ñ\81Ñ\82авим са пријавом. Ваша сесија је највероватније истекла.",
-       "authpage-cannot-create": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð·Ð°Ð¿Ð¾Ñ\87нем отварање налога.",
-       "authpage-cannot-create-continue": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð½Ð°Ñ\81Ñ\82авим ÐºÑ\80еиÑ\80аÑ\9aе налога. Ваша сесија је највероватније истекла.",
-       "authpage-cannot-link": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð·Ð°Ð¿Ð¾Ñ\87нем повезивање налога.",
+       "specialpage-securitylevel-not-allowed": "Ð\9dиÑ\98е Ð²Ð°Ð¼ Ð´Ð¾Ð·Ð²Ð¾Ñ\99ено Ð´Ð° ÐºÐ¾Ñ\80иÑ\81Ñ\82иÑ\82е Ð¾Ð²Ñ\83 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 Ñ\98еÑ\80 Ð½Ð¸Ñ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¿Ð¾Ñ\82вÑ\80диÑ\82и ваш идентитет.",
+       "authpage-cannot-login": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð·Ð°Ð¿Ð¾Ñ\87еÑ\82и пријаву.",
+       "authpage-cannot-login-continue": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð½Ð°Ñ\81Ñ\82авиÑ\82и са пријавом. Ваша сесија је највероватније истекла.",
+       "authpage-cannot-create": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð·Ð°Ð¿Ð¾Ñ\87еÑ\82и отварање налога.",
+       "authpage-cannot-create-continue": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð½Ð°Ñ\81Ñ\82авиÑ\82и Ñ\81а Ð¾Ñ\82ваÑ\80аÑ\9aем налога. Ваша сесија је највероватније истекла.",
+       "authpage-cannot-link": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð·Ð°Ð¿Ð¾Ñ\87еÑ\82и повезивање налога.",
        "authpage-cannot-link-continue": "Не могу наставити повезивање налога. Ваша сесија је највероватније истекла.",
        "cannotauth-not-allowed-title": "Приступ је одбијен",
        "cannotauth-not-allowed": "Није вам дозвољено да користите ову страницу",
        "removecredentials-invalidsubpage": "„$1“ није важећи тип акредитива.",
        "removecredentials-success": "Ваши акредитиви су уклоњени.",
        "credentialsform-provider": "Тип акредитива:",
-       "credentialsform-account": "Ð\9dазив налога:",
+       "credentialsform-account": "Ð\98ме налога:",
        "cannotlink-no-provider-title": "Нема налога за повезивање",
        "cannotlink-no-provider": "Нема налога за повезивање.",
        "linkaccounts": "Спајање налога",
index d8139a7..38c7c23 100644 (file)
        "botpasswords-invalid-name": "Det angivna användarnamnet innehåller inte separatorn för botlösenord (\"$1\").",
        "botpasswords-not-exist": "Användaren \"$1\" har inte ett botlösenord som är \"$2\".",
        "botpasswords-needs-reset": "Botlösenordet för botnamnet \"$2\" till {{GENDER:$1|användaren}} \"$1\" måste återställas.",
+       "botpasswords-locked": "Du kan inte logga in med ett botlösenord eftersom ditt konto är låst.",
        "resetpass_forbidden": "Lösenord kan inte ändras",
        "resetpass_forbidden-reason": "Lösenorden kan inte ändras: $1",
        "resetpass-no-info": "Du måste vara inloggad för att komma åt den här sidan direkt.",
        "confirm-unwatch-top": "Ta bort denna sida från din bevakningslista?",
        "confirm-rollback-button": "OK",
        "confirm-rollback-top": "Återställ redigeringar på denna sida?",
+       "confirm-mcrrestore-title": "Återställ en sidversion",
        "confirm-mcrundo-title": "Ångra en ändring",
        "mcrundofailed": "Misslyckades att ångra",
        "mcrundo-missingparam": "Nödvändiga parametrar saknas i begäran.",
        "mcrundo-changed": "Sidan har ändrats sedan du visade skillnaden. Granska den nya ändringen.",
+       "mcrundo-parse-failed": "Misslyckades att tolka den nya sidversionen: $1",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← föregående sida",
        "imgmultipagenext": "nästa sida →",
index 18fab7c..5b1af67 100644 (file)
        "botpasswords-invalid-name": "Вказане ім'я користувача не містить роздільник для пароля бота («$1»).",
        "botpasswords-not-exist": "У користувача «$1» нема пароля для бота «$2».",
        "botpasswords-needs-reset": "Пароль бота з ім'ям «$2» {{GENDER:$1|користувача|користувачки}} «$1» необхідно скинути.",
+       "botpasswords-locked": "Ви не можете увійти за допомогою пароля бота, оскільки Ваш обліковий запис заблоковано.",
        "resetpass_forbidden": "Пароль не можна змінити",
        "resetpass_forbidden-reason": "Пароль не можна змінити: $1",
        "resetpass-no-info": "Щоб звертатися безпосередньо до цієї сторінки, вам слід увійти до системи.",
        "redirect-file": "Назва файлу",
        "redirect-logid": "ID журналу",
        "redirect-not-exists": "Значення не знайдено",
+       "redirect-not-numeric": "Значення не числове",
        "fileduplicatesearch": "Пошук файлів-дублікатів",
        "fileduplicatesearch-summary": "Пошук дублікатів файлів на основі хеш-значень.",
        "fileduplicatesearch-filename": "Назва файлу:",
        "edit-error-long": "Помилки:\n\n$1",
        "revid": "версія $1",
        "pageid": "ID сторінки $1",
-       "interfaceadmin-info": "$1\n\nÐ\9fÑ\80ава Ð½Ð° Ñ\80едагÑ\83ваннÑ\8f Ð·Ð°Ð³Ð°Ð»Ñ\8cниÑ\85 CSS/JS/JSON-Ñ\84айлÑ\96в Ð±Ñ\83ли Ð½ÐµÐ´Ð°Ð²Ð½Ð¾ Ð²Ð¸Ð½ÐµÑ\81енÑ\96 Ð· Ð¿Ñ\80ава <code>editinterface.</code> Ð¯ÐºÑ\89о Ð²Ð¸ Ð½Ðµ Ñ\80озÑ\83мÑ\96Ñ\94Ñ\82е, Ñ\87омÑ\83 Ð²и наткнулись на цю помилку, див. [[mw:MediaWiki_1.32/interface-admin]].",
+       "interfaceadmin-info": "$1\n\nÐ\9fÑ\80ава Ð½Ð° Ñ\80едагÑ\83ваннÑ\8f Ð·Ð°Ð³Ð°Ð»Ñ\8cниÑ\85 CSS/JS/JSON-Ñ\84айлÑ\96в Ð½ÐµÐ´Ð°Ð²Ð½Ð¾ Ð²Ð¸Ð½ÐµÑ\81ено Ð· Ð¿Ñ\80ава <code>editinterface.</code> Ð¯ÐºÑ\89о Ð\92и Ð½Ðµ Ñ\80озÑ\83мÑ\96Ñ\94Ñ\82е, Ñ\87омÑ\83 Ð\92и наткнулись на цю помилку, див. [[mw:MediaWiki_1.32/interface-admin]].",
        "rawhtml-notallowed": "Теги &lt;html&gt; не можна використовувати за межами звичайних сторінок.",
        "gotointerwiki": "Ви покидаєте сайт {{SITENAME}}",
        "gotointerwiki-invalid": "Вказана назва неприпустима.",
index 2b71087..cf94891 100644 (file)
@@ -14,7 +14,8 @@
                        "Таржимон",
                        "Ximik1991",
                        "Bmansurov",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "ديفيد"
                ]
        },
        "tog-underline": "Havolaning tagiga chizish:",
index 3fc931f..05eabfa 100644 (file)
        "cascadeprotected": "Cisse pådje ci a stî protedjeye siconte des candjmints, pask' ele est eploye ådvins {{PLURAL:$1|del pådje shuvante k' est protedjeye|des pådjes shuvantes ki sont protedjeyes}} avou l' tchuze «e cascåde» en alaedje:\n$2",
        "logouttext": "<strong>Vos vs avoz dislodjî.</strong>\n\nNotez ki des pådjes k' i gn a si pôrént continouwer a vey come si vos estîz elodjî, disk' a tant ki vos vudrîz l' muchete di vosse betchteu waibe.",
        "welcomeuser": "Bénvnowe, $1!",
-       "yourname": "Vosse no d' elodjaedje:",
+       "yourname": "No d' uzeu :",
        "userlogin-yourname": "No d' uzeu",
        "userlogin-yourname-ph": "Tapez vosse no d' uzeu",
        "yourpassword": "Vosse sicret",
        "yourpasswordagain": "Ritapez vosse sicret",
        "createacct-yourpasswordagain": "Ritapez l' sicret",
        "createacct-yourpasswordagain-ph": "Ritapez l' sicret",
+       "userlogin-remembermypassword": "Wårdez mi elodjaedje a tchaeke côp",
        "yourdomainname": "Vosse dominne",
        "login": "S' elodjî",
        "nav-login-createaccount": "Ahiver on conte, udon-bén s' elodjî",
        "resetpass-temp-password": "Sicret timporaire:",
        "passwordreset": "Rifé l' sicret",
        "passwordreset-disabled": "Li rfijhaedje di screts a stî dismetou so ç' wiki ci.",
-       "passwordreset-username": "No d' elodjaedje:",
+       "passwordreset-username": "No d' uzeu :",
        "passwordreset-domain": "Dominne:",
        "passwordreset-email": "Adresse emile:",
        "passwordreset-emailtitle": "Detays do contre so {{SITENAME}}",
        "prefs-reset-intro": "Vos ploz eployî ç' boton chal po rmete totes vos preferinces åzès prémetowès valixhances del waibe.\nÇoul n' pôrè nén esse disfwait.",
        "prefs-emailconfirm-label": "Acertinaedje di l' emile:",
        "youremail": "Vost emile:",
-       "username": "No d' elodjaedje:",
+       "username": "{{GENDER:$1|No d' uzeu|No d' uzeuse}} :",
        "prefs-memberingroups": "Mimbe {{PLURAL:$1|do groupe|des groupes}}:",
        "prefs-registration": "Date d' edjîstraedje:",
        "yourrealname": "Li vraiy no da vosse:",
        "defemailsubject": "Emile da l' uzeu «$1» so {{SITENAME}}",
        "noemailtitle": "Pont d' adresse emile",
        "noemailtext": "Cist uzeu chal n' a nén dné d' adresse emile valide.",
+       "emailusername": "No d' uzeu :",
        "emailfrom": "Di:",
        "emailto": "Po:",
        "emailsubject": "Sudjet:",
        "markaspatrolleddiff": "Marké come ricoridjî",
        "markaspatrolledtext": "Marker cisse pådje ci come dedja patrouyeye",
        "markedaspatrolled": "Markêye come ricoridjeye",
-       "markedaspatrolledtext": "Li relîte modêye di [[:$1]] a stî markêye come ricoridjeye",
+       "markedaspatrolledtext": "Li relîte modêye di [[:$1]] a stî markêye come ricoridjeye.",
        "markedaspatrollednotify": "Ci candjmint cial di $1 a stî marké come ricoridjî",
        "patrol-log-page": "Djournå des patrouyaedjes",
        "patrol-log-header": "Çouchal c' est on djournå des modêyes k' ont stî patrouyeyes.",
index 7a5d225..337abd4 100644 (file)
        "default": "預設",
        "prefs-files": "檔案",
        "prefs-custom-css": "自定 CSS",
+       "prefs-custom-json": "自訂JSON",
        "prefs-custom-js": "自定 JavaScript",
        "prefs-common-config": "共有嘅CSS、JSON同埋JavaScript畀所有畫面用:",
        "prefs-reset-intro": "你可以用呢版去重設你嘅喜好設定到網站預設值。呢個動作無得番轉頭。",
        "grant-highvolume": "大量編輯",
        "grant-oversight": "收埋用戶同禁止顯示修訂",
        "grant-sendemail": "寄電郵畀其他用戶",
-       "grant-uploadeditmovefile": "上載、同搬檔",
+       "grant-uploadeditmovefile": "上載、𠖫同搬檔",
        "grant-uploadfile": "上載新檔案",
        "grant-basic": "基本權利",
        "grant-viewdeleted": "睇刪咗嘅檔同頁",
        "authmanager-realname-label": "真名",
        "authmanager-realname-help": "用戶嘅真名",
        "authprovider-resetpass-skip-label": "跳過",
-       "interfaceadmin-info": "$1\n\n改全站通用 CSS/JS/JSON 檔嘅權限由 <code>editinterface</code> 權限拆咗出嚟。如果你唔明點解會出呢個錯誤訊息,請睇[[mw:MediaWiki_1.32/interface-admin]]。",
+       "interfaceadmin-info": "$1\n\n改全站通用 CSS/JS/JSON 檔嘅權限最近由 <code>editinterface</code> 權限拆咗出嚟。如果你唔明點解會出呢個錯誤訊息,請睇[[mw:MediaWiki_1.32/interface-admin]]。",
        "passwordpolicies": "密碼政策",
        "passwordpolicies-summary": "爾度係對爾個wiki定義咗嘅用戶組來講有效嘅密碼政策一覽。",
        "passwordpolicies-group": "組",
index a47816c..ccb3509 100644 (file)
                        "RyRubyy",
                        "Wxyveronica",
                        "夢蝶葬花",
-                       "Dcljr"
+                       "Dcljr",
+                       "Phenolla"
                ]
        },
        "tog-underline": "链接下划线:",
        "botpasswords-invalid-name": "指定的用户名不包含机器人密码分隔符(“$1”)。",
        "botpasswords-not-exist": "用户“$1”没有名叫“$2”的机器人密码。",
        "botpasswords-needs-reset": "用于{{GENDER:$1|用户}}“$1”的机器人名称“$2”的机器人密码必须重置。",
+       "botpasswords-locked": "由于您的账户已被锁定,您不可以使用机器人密码进行登录。",
        "resetpass_forbidden": "无法更改密码",
        "resetpass_forbidden-reason": "密码不能更改:$1",
        "resetpass-no-info": "您必须登录后直接进入这个页面。",
        "confirm-unwatch-top": "从监视列表中删除此页吗?",
        "confirm-rollback-button": "确定",
        "confirm-rollback-top": "回退此页面的编辑么?",
+       "confirm-mcrrestore-title": "还原版本",
        "confirm-mcrundo-title": "撤销一次更改",
        "mcrundofailed": "撤销失败",
        "mcrundo-missingparam": "请求中缺少必需参数。",
index 46f76c1..ad0fffe 100644 (file)
        "botpasswords-invalid-name": "指定的使用者名稱未包含機器人密碼分隔字元 (\"$1\")。",
        "botpasswords-not-exist": "使用者 \"$1\" 並沒有名稱為 \"$2\" 的機器人密碼。",
        "botpasswords-needs-reset": "給{{GENDER:$1|使用者}}「$1」的機器人名稱「$2」該機器人密碼已重新設定。",
+       "botpasswords-locked": "因您的帳號被鎖定,您不能以機器人的密碼登入。",
        "resetpass_forbidden": "無法變更密碼",
        "resetpass_forbidden-reason": "無法變更密碼:$1",
        "resetpass-no-info": "您必須直接登入存取這個頁面。",
        "confirm-unwatch-top": "從您的監視清單中移除此頁面?",
        "confirm-rollback-button": "確定",
        "confirm-rollback-top": "還原編輯到此頁面?",
+       "confirm-mcrrestore-title": "還原修訂",
        "confirm-mcrundo-title": "還原變更",
        "mcrundofailed": "還原失敗",
        "mcrundo-missingparam": "請求缺少必要參數。",
        "mcrundo-changed": "自您檢視差異之後,頁面有被變更過。請檢閱新的變更。",
+       "mcrundo-parse-failed": "解析新修訂失敗:$1",
        "semicolon-separator": ";",
        "comma-separator": "、",
        "colon-separator": ":",
index 5fe241c..72d5ef9 100644 (file)
@@ -1,6 +1,6 @@
 --
--- parsercache table, for cacheing complete parsed articles
--- before they are imbedded in the skin.
+-- parsercache table, for caching completly parsed articles
+-- before they are embedded in the skin.
 --
 
 CREATE TABLE /*$wgDBprefix*/parsercache (
index ff06e49..a0177b1 100644 (file)
@@ -4322,7 +4322,6 @@ useemail
 uselang
 uselivepreview
 usemod
-usemsgcache
 usenewrc
 user
 useragent
index a279cda..eb03b38 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Maintenance
  */
 
+use MediaWiki\Storage\SlotRecord;
+
 require_once __DIR__ . '/Maintenance.php';
 
 /**
@@ -55,7 +57,7 @@ class EditCLI extends Maintenance {
                $bot = $this->hasOption( 'bot' );
                $autoSummary = $this->hasOption( 'autosummary' );
                $noRC = $this->hasOption( 'no-rc' );
-               $slot = $this->getOption( 'slot', 'main' );
+               $slot = $this->getOption( 'slot', SlotRecord::MAIN );
 
                if ( $userName === false ) {
                        $wgUser = User::newSystemUser( 'Maintenance script', [ 'steal' => true ] );
@@ -83,7 +85,7 @@ class EditCLI extends Maintenance {
                $page = WikiPage::factory( $title );
 
                if ( $remove ) {
-                       if ( $slot === 'main' ) {
+                       if ( $slot === SlotRecord::MAIN ) {
                                $this->fatalError( "Cannot remove main slot! Use --slot to specify." );
                        }
 
diff --git a/maintenance/emptyUserGroup.php b/maintenance/emptyUserGroup.php
new file mode 100644 (file)
index 0000000..03a38fc
--- /dev/null
@@ -0,0 +1,61 @@
+<?php
+
+/**
+ * Removes all users from a given user group.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+use MediaWiki\MediaWikiServices;
+
+class EmptyUserGroup extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->addDescription( 'Remove all users from a given user group' );
+               $this->addArg( 'group', 'Group to be removed', true );
+       }
+
+       public function execute() {
+               $group = $this->getArg( 0 );
+
+               $lb = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+
+               $users = User::findUsersByGroup( $group );
+
+               $count = iterator_count( $users );
+
+               $this->output( "Removing $count users from $group..." );
+
+               /**
+                * @var User $user
+                */
+               foreach ( $users as $user ) {
+                       $user->removeGroup( $group );
+
+                       $lb->waitForReplication();
+               }
+
+               $this->output( " Done!\n" );
+       }
+}
+
+$maintClass = EmptyUserGroup::class;
+require_once RUN_MAINTENANCE_IF_MAIN;
index d9a247c..f01d8f5 100644 (file)
@@ -71,7 +71,7 @@ class CLIParser extends Maintenance {
                        false,
                        true
                );
-               $this->addOption( 'tidy', 'Tidy the output' );
+               $this->addOption( 'no-tidy', 'Don\'t tidy the output (deprecated)' );
                $this->addArg( 'file', 'File containing wikitext (Default: stdin)', false );
        }
 
@@ -85,7 +85,7 @@ class CLIParser extends Maintenance {
         * @return string HTML Rendering
         */
        public function render( $wikitext ) {
-               return $this->parse( $wikitext )->getText();
+               return $this->parse( $wikitext )->getText( [ 'wrapperDivClass' => '' ] );
        }
 
        /**
@@ -129,9 +129,10 @@ class CLIParser extends Maintenance {
         * @return ParserOutput
         */
        protected function parse( $wikitext ) {
-               $options = new ParserOptions;
-               if ( $this->getOption( 'tidy' ) ) {
-                       $options->setTidy( true );
+               $options = ParserOptions::newCanonical();
+               $options->setOption( 'enableLimitReport', false );
+               if ( $this->getOption( 'no-tidy' ) ) {
+                       $options->setTidy( false );
                }
                return $this->parser->parse(
                        $wikitext,
index 60f5e8a..6eb2d6d 100644 (file)
@@ -116,8 +116,8 @@ class PopulateArchiveRevId extends LoggedUpdateMaintenance {
                                        $toDelete[] = $id;
 
                                        $maxId = max(
-                                               (int)$dbw->selectField( 'archive', 'MAX(ar_rev_id)', [], __METHOD__ ),
-                                               (int)$dbw->selectField( 'slots', 'MAX(slot_revision_id)', [], __METHOD__ )
+                                               (int)$dbw->selectField( 'archive', 'MAX(ar_rev_id)', [], $fname ),
+                                               (int)$dbw->selectField( 'slots', 'MAX(slot_revision_id)', [], $fname )
                                        );
                                        if ( $id <= $maxId ) {
                                                $dbw->insert( 'revision', [ 'rev_id' => $maxId + 1 ] + self::$dummyRev, $fname );
@@ -220,7 +220,43 @@ class PopulateArchiveRevId extends LoggedUpdateMaintenance {
                        );
                }
                if ( !$rev ) {
-                       throw new UnexpectedValueException( 'No revisions are available to copy' );
+                       // Since no revisions are available to copy, generate a dummy
+                       // revision to a dummy page, then rollback the commit
+                       wfDebug( __METHOD__ . ": No revisions are available to copy\n" );
+
+                       $dbw->begin();
+
+                       // Make a title and revision and insert them
+                       $title = Title::newFromText( "PopulateArchiveRevId_4b05b46a81e29" );
+                       $page = WikiPage::factory( $title );
+                       $updater = $page->newPageUpdater(
+                               User::newSystemUser( 'Maintenance script', [ 'steal' => true ] )
+                       );
+                       $updater->setContent(
+                               'main',
+                               ContentHandler::makeContent( "Content for dummy rev", $title )
+                       );
+                       $updater->saveRevision(
+                               CommentStoreComment::newUnsavedComment( 'dummy rev summary' ),
+                               EDIT_NEW | EDIT_SUPPRESS_RC
+                       );
+
+                       // get the revision row just inserted
+                       $rev = $dbw->selectRow(
+                               'revision',
+                               '*',
+                               [],
+                               __METHOD__,
+                               [ 'ORDER BY' => 'rev_timestamp ASC' ]
+                       );
+
+                       $dbw->rollback();
+               }
+               if ( !$rev ) {
+                       // This should never happen.
+                       throw new UnexpectedValueException(
+                               'No revisions are available to copy, and one couldn\'t be created'
+                       );
                }
 
                unset( $rev->rev_id );
index 49db4fb..93d5baf 100644 (file)
@@ -21,6 +21,7 @@
 
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Storage\NameTableStore;
+use MediaWiki\Storage\SlotRecord;
 use MediaWiki\Storage\SqlBlobStore;
 use Wikimedia\Assert\Assert;
 use Wikimedia\Rdbms\IDatabase;
@@ -66,7 +67,8 @@ class PopulateContentTables extends Maintenance {
        private function initServices() {
                $this->dbw = $this->getDB( DB_MASTER );
                $this->contentModelStore = MediaWikiServices::getInstance()->getContentModelStore();
-               $this->mainRoleId = MediaWikiServices::getInstance()->getSlotRoleStore()->acquireId( 'main' );
+               $this->mainRoleId = MediaWikiServices::getInstance()->getSlotRoleStore()
+                       ->acquireId( SlotRecord::MAIN );
        }
 
        public function execute() {
index 6ac354a..8c496b4 100644 (file)
@@ -67,6 +67,29 @@ jquery:
   integrity: sha256-2Kok7MbOyxpgUVvAk/HJ2jigOSYS2auK4Pfzbm7uH60=
   dest: jquery.js
 
+jquery.cookie:
+  type: multi-file
+  files:
+    jquery.cookie.js:
+      src: https://raw.githubusercontent.com/carhartl/jquery-cookie/v1.3.1/jquery.cookie.js
+      integrity: sha384-Xxq63E9KDgzUJ6WPNPqVeOtRIwZyx6y9DzEwY2u6LYKSnWrjSoGtWSKmTindYBf2
+    MIT-LICENSE.txt:
+      src: https://raw.githubusercontent.com/carhartl/jquery-cookie/v1.3.1/MIT-LICENSE.txt
+      integrity: sha384-zYsGf3KJ7S0AhOICjcoh0kkn7aGZlzYUXXX5xz8dwR9KjLMM+/JPR2g/jVOGGeId
+    CHANGELOG.md:
+      src: https://raw.githubusercontent.com/carhartl/jquery-cookie/v1.3.1/CHANGELOG.md
+      integrity: sha384-SQOHhLc7PHxHDQpGE/zv9XfXKL0A7OBu8kuyVDnHVp+zSoWyRw4xUJ+LSm5ql4kS
+
+mustache:
+  type: multi-file
+  files:
+    mustache.js:
+      src: https://raw.githubusercontent.com/janl/mustache.js/v1.0.0/mustache.js
+      integrity: sha384-k2UYqmzoiq/qgIzZvcYBxbXQW4YdPAsXDOTkHTGb9TCZ9sjCkyT4TlaUN0wQRkql
+    LICENSE:
+      src: https://raw.githubusercontent.com/janl/mustache.js/v1.0.0/LICENSE
+      integrity: sha384-MYVwXwula9+YkyXexOJVZ0v0DaVvG22uX57mNq5Di+7u8OH9EG9q3yuXkp1Iehiq
+
 oojs:
   type: tar
   src: https://registry.npmjs.org/oojs/-/oojs-2.2.2.tgz
@@ -118,3 +141,9 @@ qunitjs:
     qunit.css:
       src: https://code.jquery.com/qunit/qunit-2.6.2.css
       integrity: sha256-qpkurjTvVTJJCSpMABcvF4IlYUJkd8saxiHgUQpEjX8=
+
+sinonjs:
+  type: file
+  src: https://sinonjs.org/releases/sinon-1.17.3.js
+  integrity: sha384-8+RlaM2FW7qMqjxpM5NTVM0y6sTY+vTi/AHnk7Fd7NHjBye9sVxxsMjyxVJnPBtU
+  dest: sinon-1.17.3.js
index 91a5f3b..0f0073c 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Storage\SlotRecord;
 
 require_once __DIR__ . '/../Maintenance.php';
 
@@ -46,13 +47,13 @@ class DumpRev extends Maintenance {
                        $this->fatalError( "Row not found" );
                }
 
-               $content = $rev->getContent( 'main' );
+               $content = $rev->getContent( SlotRecord::MAIN );
                if ( !$content ) {
                        $this->fatalError( "Text not found" );
                }
 
                $blobStore = MediaWikiServices::getInstance()->getBlobStore();
-               $slot = $rev->getSlot( 'main' );
+               $slot = $rev->getSlot( SlotRecord::MAIN );
                $text = $blobStore->getBlob( $slot->getAddress() );
 
                $this->output( "Text length: " . strlen( $text ) . "\n" );
index e57fce9..9c832dc 100644 (file)
@@ -221,7 +221,7 @@ return [
                'dependencies' => 'mediawiki.jqueryMsg',
        ],
        'jquery.cookie' => [
-               'scripts' => 'resources/lib/jquery.cookie.js',
+               'scripts' => 'resources/lib/jquery.cookie/jquery.cookie.js',
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'jquery.form' => [
diff --git a/resources/lib/jquery.cookie.js b/resources/lib/jquery.cookie.js
deleted file mode 100644 (file)
index 3fb201c..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-/*!
- * jQuery Cookie Plugin v1.3.1
- * https://github.com/carhartl/jquery-cookie
- *
- * Copyright 2013 Klaus Hartl
- * Released under the MIT license
- */
-(function ($, document, undefined) {
-
-       var pluses = /\+/g;
-
-       function raw(s) {
-               return s;
-       }
-
-       function decoded(s) {
-               return unRfc2068(decodeURIComponent(s.replace(pluses, ' ')));
-       }
-
-       function unRfc2068(value) {
-               if (value.indexOf('"') === 0) {
-                       // This is a quoted cookie as according to RFC2068, unescape
-                       value = value.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
-               }
-               return value;
-       }
-
-       function fromJSON(value) {
-               return config.json ? JSON.parse(value) : value;
-       }
-
-       var config = $.cookie = function (key, value, options) {
-
-               // write
-               if (value !== undefined) {
-                       options = $.extend({}, config.defaults, options);
-
-                       if (value === null) {
-                               options.expires = -1;
-                       }
-
-                       if (typeof options.expires === 'number') {
-                               var days = options.expires, t = options.expires = new Date();
-                               t.setDate(t.getDate() + days);
-                       }
-
-                       value = config.json ? JSON.stringify(value) : String(value);
-
-                       return (document.cookie = [
-                               encodeURIComponent(key), '=', config.raw ? value : encodeURIComponent(value),
-                               options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
-                               options.path    ? '; path=' + options.path : '',
-                               options.domain  ? '; domain=' + options.domain : '',
-                               options.secure  ? '; secure' : ''
-                       ].join(''));
-               }
-
-               // read
-               var decode = config.raw ? raw : decoded;
-               var cookies = document.cookie.split('; ');
-               var result = key ? null : {};
-               for (var i = 0, l = cookies.length; i < l; i++) {
-                       var parts = cookies[i].split('=');
-                       var name = decode(parts.shift());
-                       var cookie = decode(parts.join('='));
-
-                       if (key && key === name) {
-                               result = fromJSON(cookie);
-                               break;
-                       }
-
-                       if (!key) {
-                               result[name] = fromJSON(cookie);
-                       }
-               }
-
-               return result;
-       };
-
-       config.defaults = {};
-
-       $.removeCookie = function (key, options) {
-               if ($.cookie(key) !== null) {
-                       $.cookie(key, null, options);
-                       return true;
-               }
-               return false;
-       };
-
-})(jQuery, document);
diff --git a/resources/lib/jquery.cookie/CHANGELOG.md b/resources/lib/jquery.cookie/CHANGELOG.md
new file mode 100644 (file)
index 0000000..f3ac692
--- /dev/null
@@ -0,0 +1,34 @@
+1.3.1
+-----
+- Fixing issue where it was no longer possible to check for an arbitrary cookie,
+  while json is set to true, there was a SyntaxError thrown from JSON.parse.
+
+1.3.0
+-----
+- Configuration options: `raw`, `json`. Replaces raw option, becomes config:
+
+  ```javascript
+  $.cookie.raw = true; // bypass encoding/decoding the cookie value
+  $.cookie.json = true; // automatically JSON stringify/parse value
+  ```
+  
+  Thus the default options now cleanly contain cookie attributes only.
+
+- Removing licensing under GPL Version 2, the plugin is now released under MIT License only
+(keeping it simple and following the jQuery library itself here).
+
+- Bugfix: Properly handle RFC 2068 quoted cookie values.
+
+- Added component.json for bower.
+
+- Added jQuery plugin package manifest.
+
+- `$.cookie()` returns all available cookies.
+
+1.2.0
+-----
+- Adding `$.removeCookie('foo')` for deleting a cookie, using `$.cookie('foo', null)` is now deprecated.
+
+1.1
+---
+- Adding default options.
diff --git a/resources/lib/jquery.cookie/MIT-LICENSE.txt b/resources/lib/jquery.cookie/MIT-LICENSE.txt
new file mode 100644 (file)
index 0000000..8ae647b
--- /dev/null
@@ -0,0 +1,20 @@
+Copyright 2013 Klaus Hartl
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
diff --git a/resources/lib/jquery.cookie/jquery.cookie.js b/resources/lib/jquery.cookie/jquery.cookie.js
new file mode 100644 (file)
index 0000000..3fb201c
--- /dev/null
@@ -0,0 +1,90 @@
+/*!
+ * jQuery Cookie Plugin v1.3.1
+ * https://github.com/carhartl/jquery-cookie
+ *
+ * Copyright 2013 Klaus Hartl
+ * Released under the MIT license
+ */
+(function ($, document, undefined) {
+
+       var pluses = /\+/g;
+
+       function raw(s) {
+               return s;
+       }
+
+       function decoded(s) {
+               return unRfc2068(decodeURIComponent(s.replace(pluses, ' ')));
+       }
+
+       function unRfc2068(value) {
+               if (value.indexOf('"') === 0) {
+                       // This is a quoted cookie as according to RFC2068, unescape
+                       value = value.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
+               }
+               return value;
+       }
+
+       function fromJSON(value) {
+               return config.json ? JSON.parse(value) : value;
+       }
+
+       var config = $.cookie = function (key, value, options) {
+
+               // write
+               if (value !== undefined) {
+                       options = $.extend({}, config.defaults, options);
+
+                       if (value === null) {
+                               options.expires = -1;
+                       }
+
+                       if (typeof options.expires === 'number') {
+                               var days = options.expires, t = options.expires = new Date();
+                               t.setDate(t.getDate() + days);
+                       }
+
+                       value = config.json ? JSON.stringify(value) : String(value);
+
+                       return (document.cookie = [
+                               encodeURIComponent(key), '=', config.raw ? value : encodeURIComponent(value),
+                               options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
+                               options.path    ? '; path=' + options.path : '',
+                               options.domain  ? '; domain=' + options.domain : '',
+                               options.secure  ? '; secure' : ''
+                       ].join(''));
+               }
+
+               // read
+               var decode = config.raw ? raw : decoded;
+               var cookies = document.cookie.split('; ');
+               var result = key ? null : {};
+               for (var i = 0, l = cookies.length; i < l; i++) {
+                       var parts = cookies[i].split('=');
+                       var name = decode(parts.shift());
+                       var cookie = decode(parts.join('='));
+
+                       if (key && key === name) {
+                               result = fromJSON(cookie);
+                               break;
+                       }
+
+                       if (!key) {
+                               result[name] = fromJSON(cookie);
+                       }
+               }
+
+               return result;
+       };
+
+       config.defaults = {};
+
+       $.removeCookie = function (key, options) {
+               if ($.cookie(key) !== null) {
+                       $.cookie(key, null, options);
+                       return true;
+               }
+               return false;
+       };
+
+})(jQuery, document);
index dbc9823..c7ffbef 100644 (file)
   };
 
   mustache.name = "mustache.js";
-  mustache.version = "0.8.2";
+  mustache.version = "1.0.0";
   mustache.tags = [ "{{", "}}" ];
 
   // All high-level mustache.* functions use this writer.
index d3b64b0..044ac3f 100644 (file)
@@ -22,6 +22,7 @@
                        } ).done( function ( data, jqXHR ) {
                                response( data[ 1 ], {
                                        type: jqXHR.getResponseHeader( 'X-OpenSearch-Type' ),
+                                       searchId: jqXHR.getResponseHeader( 'X-Search-ID' ),
                                        query: query
                                } );
                        } );
                                action: 'impression-results',
                                numberOfResults: context.config.suggestions.length,
                                resultSetType: metadata.type || 'unknown',
+                               searchId: metadata.searchId || null,
                                query: metadata.query,
                                inputLocation: getInputLocation( context )
                        } );
index e821ce8..18cd68a 100644 (file)
                // tracking purposes
                promise.done( function ( data, jqXHR ) {
                        self.requestType = jqXHR.getResponseHeader( 'X-OpenSearch-Type' );
+                       self.searchId = jqXHR.getResponseHeader( 'X-Search-ID' );
                } );
 
                return promise;
                        data: response || {},
                        metadata: {
                                type: this.requestType || 'unknown',
+                               searchId: this.searchId || null,
                                query: this.getQueryValue()
                        }
                };
                this.requestType = undefined;
+               this.searchId = undefined;
 
                return resp;
        };
                        action: 'impression-results',
                        numberOfResults: items.length,
                        resultSetType: data.metadata.type,
+                       searchId: data.metadata.searchId,
                        query: data.metadata.query,
                        inputLocation: this.dataLocation || 'header'
                } );
index af014b9..d675e85 100644 (file)
@@ -552,6 +552,8 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase {
                        }
                }
 
+               // Re-enable any disabled deprecation warnings
+               MWDebug::clearLog();
                // Restore mw globals
                foreach ( $this->mwGlobals as $key => $value ) {
                        $GLOBALS[$key] = $value;
index 94de088..7ce4d1e 100644 (file)
@@ -215,4 +215,80 @@ class ExtraParserTest extends MediaWikiTestCase {
                $result = $parserOutput->getCategoryLinks();
                $this->assertEmpty( $result );
        }
+
+       /**
+        * @covers Parser::parseLinkParameter
+        * @dataProvider provideParseLinkParameter
+        */
+       public function testParseLinkParameter( $input, $expected, $expectedLinks, $desc ) {
+               $this->parser->startExternalParse( Title::newFromText( __FUNCTION__ ),
+                       $this->options, Parser::OT_HTML );
+               $output = $this->parser->parseLinkParameter( $input );
+
+               $this->assertEquals( $expected[0], $output[0], "$desc (type)" );
+
+               if ( $expected[0] === 'link-title' ) {
+                       $this->assertTrue( $expected[1]->equals( $output[1] ), "$desc (target)" );
+               } else {
+                       $this->assertEquals( $expected[1], $output[1], "$desc (target)" );
+               }
+
+               foreach ( $expectedLinks as $func => $expected ) {
+                       $output = $this->parser->getOutput()->$func();
+                       $this->assertEquals( $expected, $output, "$desc ($func)" );
+               }
+       }
+
+       public static function provideParseLinkParameter() {
+               return [
+                       [
+                               '',
+                               [ 'no-link', false ],
+                               [],
+                               'Return no link when requested',
+                       ],
+                       [
+                               'https://example.com/',
+                               [ 'link-url', 'https://example.com/' ],
+                               [ 'getExternalLinks' => [ 'https://example.com/' => 1 ] ],
+                               'External link',
+                       ],
+                       [
+                               '//example.com/',
+                               [ 'link-url', '//example.com/' ],
+                               [ 'getExternalLinks' => [ '//example.com/' => 1 ] ],
+                               'External link',
+                       ],
+                       [
+                               'Test',
+                               [ 'link-title', Title::newFromText( 'Test' ) ],
+                               [ 'getLinks' => [ 0 => [ 'Test' => 0 ] ] ],
+                               'Internal link',
+                       ],
+                       [
+                               'mw:Test',
+                               [ 'link-title', Title::newFromText( 'mw:Test' ) ],
+                               [ 'getInterwikiLinks' => [ 'mw' => [ 'Test' => 1 ] ] ],
+                               'Internal link (interwiki)',
+                       ],
+                       [
+                               'https://',
+                               [ null, false ],
+                               [],
+                               'Invalid link target',
+                       ],
+                       [
+                               '<>',
+                               [ null, false ],
+                               [],
+                               'Invalid link target',
+                       ],
+                       [
+                               ' ',
+                               [ null, false ],
+                               [],
+                               'Invalid link target',
+                       ],
+               ];
+       }
 }
index 42ea9ed..283e99f 100644 (file)
@@ -12,6 +12,16 @@ class OutputPageTest extends MediaWikiTestCase {
        const SCREEN_MEDIA_QUERY = 'screen and (min-width: 982px)';
        const SCREEN_ONLY_MEDIA_QUERY = 'only screen and (min-width: 982px)';
 
+       // Ensure that we don't affect the global ResourceLoader state.
+       protected function setUp() {
+               parent::setUp();
+               ResourceLoader::clearCache();
+       }
+       protected function tearDown() {
+               parent::tearDown();
+               ResourceLoader::clearCache();
+       }
+
        /**
         * @dataProvider provideRedirect
         *
@@ -174,11 +184,12 @@ class OutputPageTest extends MediaWikiTestCase {
 
        /**
         * Test the actual behavior of the method (in the case where it doesn't throw, e.g., in
-        * production).  Since it threw an exception once in this file, it won't when we call it again.
+        * production).
         *
         * @covers OutputPage::addScriptFile
         */
        public function testAddDeprecatedScriptFileNoOp() {
+               $this->hideDeprecated( 'OutputPage::addScriptFile' );
                $op = $this->newInstance();
                $op->addScriptFile( 'ignored-script.js' );
 
@@ -1378,6 +1389,8 @@ class OutputPageTest extends MediaWikiTestCase {
         * @covers OutputPage::addWikiText
         * @covers OutputPage::addWikiTextWithTitle
         * @covers OutputPage::addWikiTextTitle
+        * @covers OutputPage::addWikiTextTidy
+        * @covers OutputPage::addWikiTextTitleTidy
         * @covers OutputPage::getHTML
         */
        public function testAddWikiText( $method, array $args, $expected ) {
@@ -1410,7 +1423,7 @@ class OutputPageTest extends MediaWikiTestCase {
                                        '* Not a list',
                                ], 'Non-interface' => [
                                        [ "'''Bold'''", true, false ],
-                                       "<div class=\"mw-parser-output\"><p><b>Bold</b>\n</p></div>",
+                                       "<p><b>Bold</b>\n</p>",
                                ], 'No section edit links' => [
                                        [ '== Title ==' ],
                                        "<h2><span class=\"mw-headline\" id=\"Title\">Title</span></h2>\n",
@@ -1419,10 +1432,34 @@ class OutputPageTest extends MediaWikiTestCase {
                        'addWikiTextWithTitle' => [
                                'With title at start' => [
                                        [ '* {{PAGENAME}}', Title::newFromText( 'Talk:Some page' ) ],
-                                       "<div class=\"mw-parser-output\"><ul><li>Some page</li></ul>\n</div>",
+                                       "<ul><li>Some page</li></ul>\n",
+                               ], 'With title at start' => [
+                                       [ '* {{PAGENAME}}', Title::newFromText( 'Talk:Some page' ), false ],
+                                       "* Some page",
+                               ],
+                       ],
+                       'addWikiTextTidy' => [
+                               'SpecialNewimages' => [
+                                       [ "<p lang='en' dir='ltr'>\nMy message" ],
+                                       '<p lang="en" dir="ltr">' . "\nMy message\n</p>"
+                               ], 'List at start' => [
+                                       [ '* List' ],
+                                       "<ul><li>List</li></ul>\n",
+                               ], 'List not at start' => [
+                                       [ '* <b>Not a list', false ],
+                                       '<p>* <b>Not a list</b></p>',
+                               ],
+                       ],
+                       'addWikiTextTitleTidy' => [
+                               'With title at start' => [
+                                       [ '* {{PAGENAME}}', Title::newFromText( 'Talk:Some page' ) ],
+                                       "<ul><li>Some page</li></ul>\n",
                                ], 'With title at start' => [
                                        [ '* {{PAGENAME}}', Title::newFromText( 'Talk:Some page' ), false ],
-                                       "<div class=\"mw-parser-output\">* Some page</div>",
+                                       "<p>* Some page</p>",
+                               ], 'EditPage' => [
+                                       [ "<div class='mw-editintro'>{{PAGENAME}}", Title::newFromText( 'Talk:Some page' ) ],
+                                       '<div class="mw-editintro">' . "Some page\n</div>"
                                ],
                        ],
                ];
@@ -1438,6 +1475,16 @@ class OutputPageTest extends MediaWikiTestCase {
                        $tests['addWikiTextTitle']["$key (addWikiTextTitle)"] =
                                array_merge( [ $args ], array_slice( $val, 1 ) );
                }
+               foreach ( $tests['addWikiTextTidy'] as $key => $val ) {
+                       $args = [ $val[0][0], null, $val[0][1] ?? true, true, false ];
+                       $tests['addWikiTextTitle']["$key (addWikiTextTitle)"] =
+                               array_merge( [ $args ], array_slice( $val, 1 ) );
+               }
+               foreach ( $tests['addWikiTextTitleTidy'] as $key => $val ) {
+                       $args = [ $val[0][0], $val[0][1], $val[0][2] ?? true, true, false ];
+                       $tests['addWikiTextTitle']["$key (addWikiTextTitle)"] =
+                               array_merge( [ $args ], array_slice( $val, 1 ) );
+               }
 
                // We have to reformat our array to match what PHPUnit wants
                $ret = [];
@@ -1461,7 +1508,35 @@ class OutputPageTest extends MediaWikiTestCase {
                $op->addWikiText( 'a' );
        }
 
-       // @todo How should we cover the Tidy variants?
+       /**
+        * @covers OutputPage::addWikiMsg
+        */
+       public function testAddWikiMsg() {
+               $msg = wfMessage( 'parentheses' );
+               $this->assertSame( '(a)', $msg->rawParams( 'a' )->plain() );
+
+               $op = $this->newInstance();
+               $this->assertSame( '', $op->getHTML() );
+               $op->addWikiMsg( 'parentheses', "<b>a" );
+               // This is known to be bad unbalanced HTML; this will be fixed
+               // by I743f4185a03403f8d9b9db010ff1ee4e9342e062 (T198214)
+               $this->assertSame( "<p>(<b>a)\n</p>", $op->getHTML() );
+       }
+
+       /**
+        * @covers OutputPage::wrapWikiMsg
+        */
+       public function testWrapWikiMsg() {
+               $msg = wfMessage( 'parentheses' );
+               $this->assertSame( '(a)', $msg->rawParams( 'a' )->plain() );
+
+               $op = $this->newInstance();
+               $this->assertSame( '', $op->getHTML() );
+               $op->wrapWikiMsg( '[$1]', [ 'parentheses', "<b>a" ] );
+               // This is known to be bad unbalanced HTML; this will be fixed
+               // by I743f4185a03403f8d9b9db010ff1ee4e9342e062 (T198214)
+               $this->assertSame( "<p>[(<b>a)]\n</p>", $op->getHTML() );
+       }
 
        /**
         * @covers OutputPage::addParserOutputMetadata
@@ -1800,7 +1875,7 @@ class OutputPageTest extends MediaWikiTestCase {
                                'exemptStyleModules' => [ 'site' => [ 'site.styles' ], 'user' => [ 'user.styles' ] ],
                                '<meta name="ResourceLoaderDynamicStyles" content=""/>' . "\n" .
                                '<link rel="stylesheet" href="/w/load.php?debug=false&amp;lang=en&amp;modules=site.styles&amp;only=styles&amp;skin=fallback"/>' . "\n" .
-                               '<link rel="stylesheet" href="/w/load.php?debug=false&amp;lang=en&amp;modules=user.styles&amp;only=styles&amp;skin=fallback&amp;version=1e9z0ox"/>',
+                               '<link rel="stylesheet" href="/w/load.php?debug=false&amp;lang=en&amp;modules=user.styles&amp;only=styles&amp;skin=fallback&amp;version=1ai9g6t"/>',
                        ],
                        'custom modules' => [
                                'exemptStyleModules' => [
@@ -1811,7 +1886,7 @@ class OutputPageTest extends MediaWikiTestCase {
                                '<link rel="stylesheet" href="/w/load.php?debug=false&amp;lang=en&amp;modules=example.site.a%2Cb&amp;only=styles&amp;skin=fallback"/>' . "\n" .
                                '<link rel="stylesheet" href="/w/load.php?debug=false&amp;lang=en&amp;modules=site.styles&amp;only=styles&amp;skin=fallback"/>' . "\n" .
                                '<link rel="stylesheet" href="/w/load.php?debug=false&amp;lang=en&amp;modules=example.user&amp;only=styles&amp;skin=fallback&amp;version=0a56zyi"/>' . "\n" .
-                               '<link rel="stylesheet" href="/w/load.php?debug=false&amp;lang=en&amp;modules=user.styles&amp;only=styles&amp;skin=fallback&amp;version=1e9z0ox"/>',
+                               '<link rel="stylesheet" href="/w/load.php?debug=false&amp;lang=en&amp;modules=user.styles&amp;only=styles&amp;skin=fallback&amp;version=1ai9g6t"/>',
                        ],
                ];
                // phpcs:enable
index bea0b49..2ee1ab4 100644 (file)
@@ -11,6 +11,7 @@ use MediaWiki\Storage\RevisionArchiveRecord;
 use MediaWiki\Storage\RevisionRecord;
 use MediaWiki\Storage\RevisionStore;
 use MediaWiki\Storage\RevisionStoreRecord;
+use MediaWiki\Storage\SlotRecord;
 use MediaWiki\Storage\SuppressedDataException;
 use MediaWiki\User\UserIdentityValue;
 use MediaWikiTestCase;
@@ -241,7 +242,7 @@ class RenderedRevisionTest extends MediaWikiTestCase {
                $this->assertContains( 'user:Frank!', $html );
                $this->assertContains( 'time:20180101000003!', $html );
 
-               $this->assertSame( $html, $rr->getSlotParserOutput( 'main' )->getText() );
+               $this->assertSame( $html, $rr->getSlotParserOutput( SlotRecord::MAIN )->getText() );
        }
 
        public function testGetRevisionParserOutput_old() {
@@ -263,7 +264,7 @@ class RenderedRevisionTest extends MediaWikiTestCase {
                $this->assertContains( 'user:Frank!', $html );
                $this->assertContains( 'time:20180101000003!', $html );
 
-               $this->assertSame( $html, $rr->getSlotParserOutput( 'main' )->getText() );
+               $this->assertSame( $html, $rr->getSlotParserOutput( SlotRecord::MAIN )->getText() );
        }
 
        public function testGetRevisionParserOutput_archive() {
@@ -285,7 +286,7 @@ class RenderedRevisionTest extends MediaWikiTestCase {
                $this->assertContains( 'user:Frank!', $html );
                $this->assertContains( 'time:20180101000003!', $html );
 
-               $this->assertSame( $html, $rr->getSlotParserOutput( 'main' )->getText() );
+               $this->assertSame( $html, $rr->getSlotParserOutput( SlotRecord::MAIN )->getText() );
        }
 
        public function testGetRevisionParserOutput_suppressed() {
@@ -337,7 +338,7 @@ class RenderedRevisionTest extends MediaWikiTestCase {
                $this->assertContains( 'user:Frank!', $html );
                $this->assertContains( 'time:20180101000003!', $html );
 
-               $this->assertSame( $html, $rr->getSlotParserOutput( 'main' )->getText() );
+               $this->assertSame( $html, $rr->getSlotParserOutput( SlotRecord::MAIN )->getText() );
        }
 
        public function testGetRevisionParserOutput_raw() {
@@ -371,7 +372,7 @@ class RenderedRevisionTest extends MediaWikiTestCase {
                $this->assertContains( 'user:Frank!', $html );
                $this->assertContains( 'time:20180101000003!', $html );
 
-               $this->assertSame( $html, $rr->getSlotParserOutput( 'main' )->getText() );
+               $this->assertSame( $html, $rr->getSlotParserOutput( SlotRecord::MAIN )->getText() );
        }
 
        public function testGetRevisionParserOutput_multi() {
@@ -387,7 +388,7 @@ class RenderedRevisionTest extends MediaWikiTestCase {
                $rr = new RenderedRevision( $title, $rev, $options, $this->combinerCallback );
 
                $combinedOutput = $rr->getRevisionParserOutput();
-               $mainOutput = $rr->getSlotParserOutput( 'main' );
+               $mainOutput = $rr->getSlotParserOutput( SlotRecord::MAIN );
                $auxOutput = $rr->getSlotParserOutput( 'aux' );
 
                $combinedHtml = $combinedOutput->getText();
@@ -422,7 +423,7 @@ class RenderedRevisionTest extends MediaWikiTestCase {
                $text .= "* user:{{REVISIONUSER}}!\n";
                $text .= "* time:{{REVISIONTIMESTAMP}}!\n";
 
-               $rev->setContent( 'main', new WikitextContent( $text ) );
+               $rev->setContent( SlotRecord::MAIN, new WikitextContent( $text ) );
 
                $options = ParserOptions::newCanonical( 'canonical' );
                $rr = new RenderedRevision( $title, $rev, $options, $this->combinerCallback );
@@ -449,7 +450,7 @@ class RenderedRevisionTest extends MediaWikiTestCase {
                $text .= "* user:{{REVISIONUSER}}!\n";
                $text .= "* time:{{REVISIONTIMESTAMP}}!\n";
 
-               $rev->setContent( 'main', new WikitextContent( $text ) );
+               $rev->setContent( SlotRecord::MAIN, new WikitextContent( $text ) );
 
                $actualRevision = $this->getMockRevision(
                        RevisionStoreRecord::class,
@@ -503,13 +504,13 @@ class RenderedRevisionTest extends MediaWikiTestCase {
                $title = $this->getMockTitle( 7, 21 );
 
                $rev = new MutableRevisionRecord( $title );
-               $rev->setContent( 'main', $mockContent );
+               $rev->setContent( SlotRecord::MAIN, $mockContent );
                $rev->setContent( 'aux', $mockContent );
 
                $options = ParserOptions::newCanonical( 'canonical' );
                $rr = new RenderedRevision( $title, $rev, $options, $this->combinerCallback );
 
-               $output = $rr->getSlotParserOutput( 'main', [ 'generate-html' => false ] );
+               $output = $rr->getSlotParserOutput( SlotRecord::MAIN, [ 'generate-html' => false ] );
                $this->assertFalse( $output->hasText(), 'hasText' );
 
                $output = $rr->getRevisionParserOutput( [ 'generate-html' => false ] );
@@ -527,19 +528,19 @@ class RenderedRevisionTest extends MediaWikiTestCase {
                $text .= "* user:{{REVISIONUSER}}!\n";
                $text .= "* time:{{REVISIONTIMESTAMP}}!\n";
 
-               $rev->setContent( 'main', new WikitextContent( $text ) );
+               $rev->setContent( SlotRecord::MAIN, new WikitextContent( $text ) );
                $rev->setContent( 'aux', new WikitextContent( '[[Goats]]' ) );
 
                $options = ParserOptions::newCanonical( 'canonical' );
                $rr = new RenderedRevision( $title, $rev, $options, $this->combinerCallback );
 
                $firstOutput = $rr->getRevisionParserOutput();
-               $mainOutput = $rr->getSlotParserOutput( 'main' );
+               $mainOutput = $rr->getSlotParserOutput( SlotRecord::MAIN );
                $auxOutput = $rr->getSlotParserOutput( 'aux' );
 
                // emulate a saved revision
                $savedRev = new MutableRevisionRecord( $title );
-               $savedRev->setContent( 'main', new WikitextContent( $text ) );
+               $savedRev->setContent( SlotRecord::MAIN, new WikitextContent( $text ) );
                $savedRev->setContent( 'aux', new WikitextContent( '[[Goats]]' ) );
                $savedRev->setId( 23 ); // saved, new
                $savedRev->setUser( new UserIdentityValue( 9, 'Frank', 0 ) );
@@ -547,7 +548,7 @@ class RenderedRevisionTest extends MediaWikiTestCase {
 
                $rr->updateRevision( $savedRev );
 
-               $this->assertNotSame( $mainOutput, $rr->getSlotParserOutput( 'main' ), 'Reset main' );
+               $this->assertNotSame( $mainOutput, $rr->getSlotParserOutput( SlotRecord::MAIN ), 'Reset main' );
                $this->assertSame( $auxOutput, $rr->getSlotParserOutput( 'aux' ), 'Keep aux' );
 
                $updatedOutput = $rr->getRevisionParserOutput();
index 28052ff..ca13899 100644 (file)
@@ -9,6 +9,7 @@ use LogicException;
 use MediaWiki\Revision\RevisionRenderer;
 use MediaWiki\Storage\MutableRevisionRecord;
 use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Storage\SlotRecord;
 use MediaWiki\User\UserIdentityValue;
 use MediaWikiTestCase;
 use ParserOptions;
@@ -153,7 +154,7 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $text .= "* time:{{REVISIONTIMESTAMP}}\n";
                $text .= "* [[Link It]]\n";
 
-               $rev->setContent( 'main', new WikitextContent( $text ) );
+               $rev->setContent( SlotRecord::MAIN, new WikitextContent( $text ) );
 
                $options = ParserOptions::newCanonical( 'canonical' );
                $rr = $renderer->getRenderedRevision( $rev, $options );
@@ -170,7 +171,7 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $this->assertContains( 'user:Frank', $html );
                $this->assertContains( 'time:20180101000003', $html );
 
-               $this->assertSame( $html, $rr->getSlotParserOutput( 'main' )->getText() );
+               $this->assertSame( $html, $rr->getSlotParserOutput( SlotRecord::MAIN )->getText() );
        }
 
        public function testGetRenderedRevision_current() {
@@ -189,7 +190,7 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $text .= "* user:{{REVISIONUSER}}\n";
                $text .= "* time:{{REVISIONTIMESTAMP}}\n";
 
-               $rev->setContent( 'main', new WikitextContent( $text ) );
+               $rev->setContent( SlotRecord::MAIN, new WikitextContent( $text ) );
 
                $options = ParserOptions::newCanonical( 'canonical' );
                $rr = $renderer->getRenderedRevision( $rev, $options );
@@ -206,7 +207,7 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $this->assertContains( 'user:Frank', $html );
                $this->assertContains( 'time:20180101000003', $html );
 
-               $this->assertSame( $html, $rr->getSlotParserOutput( 'main' )->getText() );
+               $this->assertSame( $html, $rr->getSlotParserOutput( SlotRecord::MAIN )->getText() );
        }
 
        public function testGetRenderedRevision_master() {
@@ -225,7 +226,7 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $text .= "* user:{{REVISIONUSER}}\n";
                $text .= "* time:{{REVISIONTIMESTAMP}}\n";
 
-               $rev->setContent( 'main', new WikitextContent( $text ) );
+               $rev->setContent( SlotRecord::MAIN, new WikitextContent( $text ) );
 
                $options = ParserOptions::newCanonical( 'canonical' );
                $rr = $renderer->getRenderedRevision( $rev, $options, null, [ 'use-master' => true ] );
@@ -236,7 +237,7 @@ class RevisionRendererTest extends MediaWikiTestCase {
 
                $this->assertContains( 'rev:21', $html );
 
-               $this->assertSame( $html, $rr->getSlotParserOutput( 'main' )->getText() );
+               $this->assertSame( $html, $rr->getSlotParserOutput( SlotRecord::MAIN )->getText() );
        }
 
        public function testGetRenderedRevision_old() {
@@ -255,7 +256,7 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $text .= "* user:{{REVISIONUSER}}\n";
                $text .= "* time:{{REVISIONTIMESTAMP}}\n";
 
-               $rev->setContent( 'main', new WikitextContent( $text ) );
+               $rev->setContent( SlotRecord::MAIN, new WikitextContent( $text ) );
 
                $options = ParserOptions::newCanonical( 'canonical' );
                $rr = $renderer->getRenderedRevision( $rev, $options );
@@ -292,7 +293,7 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $text .= "* user:{{REVISIONUSER}}\n";
                $text .= "* time:{{REVISIONTIMESTAMP}}\n";
 
-               $rev->setContent( 'main', new WikitextContent( $text ) );
+               $rev->setContent( SlotRecord::MAIN, new WikitextContent( $text ) );
 
                $options = ParserOptions::newCanonical( 'canonical' );
                $rr = $renderer->getRenderedRevision( $rev, $options );
@@ -317,7 +318,7 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $text .= "* user:{{REVISIONUSER}}\n";
                $text .= "* time:{{REVISIONTIMESTAMP}}\n";
 
-               $rev->setContent( 'main', new WikitextContent( $text ) );
+               $rev->setContent( SlotRecord::MAIN, new WikitextContent( $text ) );
 
                $options = ParserOptions::newCanonical( 'canonical' );
                $sysop = $this->getTestUser( [ 'sysop' ] )->getUser(); // privileged!
@@ -356,7 +357,7 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $text .= "* user:{{REVISIONUSER}}\n";
                $text .= "* time:{{REVISIONTIMESTAMP}}\n";
 
-               $rev->setContent( 'main', new WikitextContent( $text ) );
+               $rev->setContent( SlotRecord::MAIN, new WikitextContent( $text ) );
 
                $options = ParserOptions::newCanonical( 'canonical' );
                $rr = $renderer->getRenderedRevision(
@@ -391,13 +392,13 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $rev->setTimestamp( '20180101000003' );
                $rev->setComment( CommentStoreComment::newUnsavedComment( '' ) );
 
-               $rev->setContent( 'main', new WikitextContent( '[[Kittens]]' ) );
+               $rev->setContent( SlotRecord::MAIN, new WikitextContent( '[[Kittens]]' ) );
                $rev->setContent( 'aux', new WikitextContent( '[[Goats]]' ) );
 
                $rr = $renderer->getRenderedRevision( $rev );
 
                $combinedOutput = $rr->getRevisionParserOutput();
-               $mainOutput = $rr->getSlotParserOutput( 'main' );
+               $mainOutput = $rr->getSlotParserOutput( SlotRecord::MAIN );
                $auxOutput = $rr->getSlotParserOutput( 'aux' );
 
                $combinedHtml = $combinedOutput->getText();
@@ -453,13 +454,13 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $title = $this->getMockTitle( 7, 21 );
 
                $rev = new MutableRevisionRecord( $title );
-               $rev->setContent( 'main', $mockContent );
+               $rev->setContent( SlotRecord::MAIN, $mockContent );
                $rev->setContent( 'aux', $mockContent );
 
                // NOTE: we are testing the private combineSlotOutput() callback here.
                $rr = $renderer->getRenderedRevision( $rev );
 
-               $output = $rr->getSlotParserOutput( 'main', [ 'generate-html' => false ] );
+               $output = $rr->getSlotParserOutput( SlotRecord::MAIN, [ 'generate-html' => false ] );
                $this->assertFalse( $output->hasText(), 'hasText' );
 
                $output = $rr->getRevisionParserOutput( [ 'generate-html' => false ] );
index 8bf87a2..28e6e12 100644 (file)
@@ -259,7 +259,7 @@ abstract class RevisionDbTestBase extends MediaWikiTestCase {
                // getTextId() must be an int!
                $this->assertInternalType( 'integer', $rev->getTextId() );
 
-               $mainSlot = $rev->getRevisionRecord()->getSlot( 'main', RevisionRecord::RAW );
+               $mainSlot = $rev->getRevisionRecord()->getSlot( SlotRecord::MAIN, RevisionRecord::RAW );
 
                // we currently only support storage in the text table
                $textId = MediaWikiServices::getInstance()
@@ -1581,7 +1581,7 @@ abstract class RevisionDbTestBase extends MediaWikiTestCase {
                        'slot_content_id' => 1,
                        'content_address' => 'tt:789',
                        'model_name' => CONTENT_MODEL_WIKITEXT,
-                       'role_name' => 'main',
+                       'role_name' => SlotRecord::MAIN,
                        'slot_origin' => 1,
                ], new WikitextContent( 'Test' ) );
 
index 3e4746a..f5bc4fa 100644 (file)
@@ -35,7 +35,7 @@ class RevisionMcrDbTest extends RevisionDbTestBase {
                        'slot_content_id' => 1,
                        'content_address' => 'tt:789',
                        'model_name' => CONTENT_MODEL_WIKITEXT,
-                       'role_name' => 'main',
+                       'role_name' => SlotRecord::MAIN,
                        'slot_origin' => 1,
                ], new WikitextContent( 'Test' ) );
 
index b446a8c..7218466 100644 (file)
@@ -31,7 +31,7 @@ class RevisionMcrReadNewDbTest extends RevisionDbTestBase {
                        'slot_content_id' => 1,
                        'content_address' => 'tt:789',
                        'model_name' => CONTENT_MODEL_WIKITEXT,
-                       'role_name' => 'main',
+                       'role_name' => SlotRecord::MAIN,
                        'slot_origin' => 1,
                ], new WikitextContent( 'Test' ) );
 
index 6359995..c470787 100644 (file)
@@ -931,7 +931,7 @@ class RevisionTest extends MediaWikiTestCase {
                $this->assertNull( $rev->getContent(), 'Content of no slots is null' );
 
                $content = new TextContent( 'Hello Kittens!' );
-               $rec->setContent( 'main', $content );
+               $rec->setContent( SlotRecord::MAIN, $content );
                $this->assertSame( $content, $rev->getContent() );
        }
 
index 8b472d4..7931236 100644 (file)
@@ -115,7 +115,7 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
                $mainContent = new WikitextContent( 'Lorem ipsum' );
 
                $update = new RevisionSlotsUpdate();
-               $update->modifyContent( 'main', $mainContent );
+               $update->modifyContent( SlotRecord::MAIN, $mainContent );
                $updater = $this->getDerivedPageDataUpdater( $page );
                $updater->prepareContent( $user, $update, false );
 
@@ -194,7 +194,7 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
                );
 
                $update = new RevisionSlotsUpdate();
-               $update->modifyContent( 'main', $mainContent );
+               $update->modifyContent( SlotRecord::MAIN, $mainContent );
                $update->modifySlot( SlotRecord::newInherited( $auxSlot ) );
                // TODO: MCR: test removing slots!
 
@@ -220,7 +220,7 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
                $this->assertEquals( [ 'main', 'aux' ], $updater->getModifiedSlotRoles() );
                $this->assertEquals( [ 'main', 'aux' ], $updater->getTouchedSlotRoles() );
 
-               $mainSlot = $updater->getRawSlot( 'main' );
+               $mainSlot = $updater->getRawSlot( SlotRecord::MAIN );
                $this->assertInstanceOf( SlotRecord::class, $mainSlot );
                $this->assertNotContains( '~~~', $mainSlot->getContent()->serialize(), 'PST should apply.' );
                $this->assertContains( $sysop->getName(), $mainSlot->getContent()->serialize() );
@@ -255,12 +255,12 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
                $mainContent2 = new WikitextContent( 'second ({{subst:REVISIONUSER}}) #~~~#' );
 
                $rev = $this->createRevision( $page, 'first', $mainContent1 );
-               $mainContent1 = $rev->getContent( 'main' ); // get post-pst content
+               $mainContent1 = $rev->getContent( SlotRecord::MAIN ); // get post-pst content
                $userName = $rev->getUser()->getName();
                $sysopName = $sysop->getName();
 
                $update = new RevisionSlotsUpdate();
-               $update->modifyContent( 'main', $mainContent1 );
+               $update->modifyContent( SlotRecord::MAIN, $mainContent1 );
                $updater1 = $this->getDerivedPageDataUpdater( $page );
                $updater1->prepareContent( $sysop, $update, false );
 
@@ -283,12 +283,12 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
 
                // TODO: MCR: test inheritance from parent
                $update = new RevisionSlotsUpdate();
-               $update->modifyContent( 'main', $mainContent2 );
+               $update->modifyContent( SlotRecord::MAIN, $mainContent2 );
                $updater2 = $this->getDerivedPageDataUpdater( $page );
                $updater2->prepareContent( $sysop, $update, false );
 
                // non-null edit use the new user name in PST
-               $pstText = $updater2->getSlots()->getContent( 'main' )->serialize();
+               $pstText = $updater2->getSlots()->getContent( SlotRecord::MAIN )->serialize();
                $this->assertNotContains( '{{subst:REVISIONUSER}}', $pstText, '{{subst:REVISIONUSER}}' );
                $this->assertNotContains( '~~~', $pstText, 'signature ~~~' );
                $this->assertContains( '(' . $sysopName . ')', $pstText, '{{subst:REVISIONUSER}}' );
@@ -342,8 +342,8 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
 
                // TODO: MCR: test multiple slots, test slot removal!
 
-               $this->assertInstanceOf( SlotRecord::class, $updater1->getRawSlot( 'main' ) );
-               $this->assertNotContains( '~~~~', $updater1->getRawContent( 'main' )->serialize() );
+               $this->assertInstanceOf( SlotRecord::class, $updater1->getRawSlot( SlotRecord::MAIN ) );
+               $this->assertNotContains( '~~~~', $updater1->getRawContent( SlotRecord::MAIN )->serialize() );
 
                $mainOutput = $updater1->getCanonicalParserOutput();
                $this->assertContains( 'first', $mainOutput->getText() );
@@ -379,11 +379,11 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
                $mainContent1 = new WikitextContent( 'first [[main]] ~~~' );
 
                $update = new RevisionSlotsUpdate();
-               $update->modifyContent( 'main', $mainContent1 );
+               $update->modifyContent( SlotRecord::MAIN, $mainContent1 );
                $updater = $this->getDerivedPageDataUpdater( $page );
                $updater->prepareContent( $user, $update, false );
 
-               $mainOutput = $updater->getSlotParserOutput( 'main' );
+               $mainOutput = $updater->getSlotParserOutput( SlotRecord::MAIN );
                $canonicalOutput = $updater->getCanonicalParserOutput();
 
                $rev = $this->createRevision( $page, 'first', $mainContent1 );
@@ -394,7 +394,7 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
                $this->assertTrue( $updater->isUpdatePrepared() );
                $this->assertTrue( $updater->isContentPrepared() );
 
-               $this->assertSame( $mainOutput, $updater->getSlotParserOutput( 'main' ) );
+               $this->assertSame( $mainOutput, $updater->getSlotParserOutput( SlotRecord::MAIN ) );
                $this->assertSame( $canonicalOutput, $updater->getCanonicalParserOutput() );
        }
 
@@ -409,11 +409,11 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
                $mainContent1 = new WikitextContent( 'first --{{REVISIONID}}--' );
 
                $update = new RevisionSlotsUpdate();
-               $update->modifyContent( 'main', $mainContent1 );
+               $update->modifyContent( SlotRecord::MAIN, $mainContent1 );
                $updater = $this->getDerivedPageDataUpdater( $page );
                $updater->prepareContent( $user, $update, false );
 
-               $mainOutput = $updater->getSlotParserOutput( 'main' );
+               $mainOutput = $updater->getSlotParserOutput( SlotRecord::MAIN );
                $canonicalOutput = $updater->getCanonicalParserOutput();
 
                // prevent optimization on matching speculative ID
@@ -429,7 +429,7 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
                $this->assertTrue( $updater->isContentPrepared() );
 
                // ParserOutput objects should have been flushed.
-               $this->assertNotSame( $mainOutput, $updater->getSlotParserOutput( 'main' ) );
+               $this->assertNotSame( $mainOutput, $updater->getSlotParserOutput( SlotRecord::MAIN ) );
                $this->assertNotSame( $canonicalOutput, $updater->getCanonicalParserOutput() );
 
                $html = $updater->getCanonicalParserOutput()->getText();
@@ -450,7 +450,7 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
 
                $mainContent = new WikitextContent( 'first [[main]] ~~~' );
                $update = new RevisionSlotsUpdate();
-               $update->modifyContent( 'main', $mainContent );
+               $update->modifyContent( SlotRecord::MAIN, $mainContent );
 
                $updater = $this->getDerivedPageDataUpdater( __METHOD__ );
                $updater->prepareContent( $user, $update, false );
@@ -461,7 +461,7 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
                $this->assertSame( $canonicalOutput->getCacheTime(), $preparedEdit->timestamp );
                $this->assertSame( $canonicalOutput, $preparedEdit->output );
                $this->assertSame( $mainContent, $preparedEdit->newContent );
-               $this->assertSame( $updater->getRawContent( 'main' ), $preparedEdit->pstContent );
+               $this->assertSame( $updater->getRawContent( SlotRecord::MAIN ), $preparedEdit->pstContent );
                $this->assertSame( $updater->getCanonicalParserOptions(), $preparedEdit->popts );
                $this->assertSame( null, $preparedEdit->revid );
        }
@@ -474,7 +474,7 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
 
                $mainContent = new WikitextContent( 'first [[main]] ~~~' );
                $update = new MutableRevisionSlots();
-               $update->setContent( 'main', $mainContent );
+               $update->setContent( SlotRecord::MAIN, $mainContent );
 
                $rev = $this->createRevision( $page, __METHOD__ );
 
@@ -486,7 +486,7 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
                $preparedEdit = $updater->getPreparedEdit();
                $this->assertSame( $canonicalOutput->getCacheTime(), $preparedEdit->timestamp );
                $this->assertSame( $canonicalOutput, $preparedEdit->output );
-               $this->assertSame( $updater->getRawContent( 'main' ), $preparedEdit->pstContent );
+               $this->assertSame( $updater->getRawContent( SlotRecord::MAIN ), $preparedEdit->pstContent );
                $this->assertSame( $updater->getCanonicalParserOptions(), $preparedEdit->popts );
                $this->assertSame( $rev->getId(), $preparedEdit->revid );
        }
@@ -499,7 +499,7 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
                $mainContent1 = new WikitextContent( 'first' );
 
                $update = new RevisionSlotsUpdate();
-               $update->modifyContent( 'main', $mainContent1 );
+               $update->modifyContent( SlotRecord::MAIN, $mainContent1 );
                $updater = $this->getDerivedPageDataUpdater( $page );
                $updater->prepareContent( $user, $update, false );
 
@@ -595,7 +595,7 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
                );
 
                $update = new RevisionSlotsUpdate();
-               $update->modifyContent( 'main', $mainContent2 );
+               $update->modifyContent( SlotRecord::MAIN, $mainContent2 );
                $update->removeSlot( 'aux' );
 
                $page = $this->getPage( __METHOD__ );
@@ -676,13 +676,13 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
                $content2 = new WikitextContent( 'two' );
 
                $update1 = new RevisionSlotsUpdate();
-               $update1->modifyContent( 'main', $content1 );
+               $update1->modifyContent( SlotRecord::MAIN, $content1 );
 
                $update1b = new RevisionSlotsUpdate();
                $update1b->modifyContent( 'xyz', $content1 );
 
                $update2 = new RevisionSlotsUpdate();
-               $update2->modifyContent( 'main', $content2 );
+               $update2->modifyContent( SlotRecord::MAIN, $content2 );
 
                $rev1 = $this->makeRevision( $title, $update1, $user1, 'rev1', 11 );
                $rev1b = $this->makeRevision( $title, $update1b, $user1, 'rev1', 11 );
index 48bf4aa..3e91df4 100644 (file)
@@ -51,7 +51,7 @@ class MutableRevisionRecordTest extends MediaWikiTestCase {
                        $record->setPageId( $rowOverrides['rev_page'] );
                }
 
-               $record->setContent( 'main', new TextContent( 'Lorem Ipsum' ) );
+               $record->setContent( SlotRecord::MAIN, new TextContent( 'Lorem Ipsum' ) );
                $record->setComment( $comment );
                $record->setUser( $user );
                $record->setTimestamp( '20101010000000' );
@@ -141,33 +141,33 @@ class MutableRevisionRecordTest extends MediaWikiTestCase {
        public function testGetMainContentWhenEmpty() {
                $record = new MutableRevisionRecord( Title::newFromText( 'Foo' ) );
                $this->setExpectedException( RevisionAccessException::class );
-               $this->assertNull( $record->getContent( 'main' ) );
+               $this->assertNull( $record->getContent( SlotRecord::MAIN ) );
        }
 
        public function testSetGetMainContent() {
                $record = new MutableRevisionRecord( Title::newFromText( 'Foo' ) );
                $content = new WikitextContent( 'Badger' );
-               $record->setContent( 'main', $content );
-               $this->assertSame( $content, $record->getContent( 'main' ) );
+               $record->setContent( SlotRecord::MAIN, $content );
+               $this->assertSame( $content, $record->getContent( SlotRecord::MAIN ) );
        }
 
        public function testGetSlotWhenEmpty() {
                $record = new MutableRevisionRecord( Title::newFromText( 'Foo' ) );
-               $this->assertFalse( $record->hasSlot( 'main' ) );
+               $this->assertFalse( $record->hasSlot( SlotRecord::MAIN ) );
 
                $this->setExpectedException( RevisionAccessException::class );
-               $record->getSlot( 'main' );
+               $record->getSlot( SlotRecord::MAIN );
        }
 
        public function testSetGetSlot() {
                $record = new MutableRevisionRecord( Title::newFromText( 'Foo' ) );
                $slot = SlotRecord::newUnsaved(
-                       'main',
+                       SlotRecord::MAIN,
                        new WikitextContent( 'x' )
                );
                $record->setSlot( $slot );
-               $this->assertTrue( $record->hasSlot( 'main' ) );
-               $this->assertSame( $slot, $record->getSlot( 'main' ) );
+               $this->assertTrue( $record->hasSlot( SlotRecord::MAIN ) );
+               $this->assertSame( $slot, $record->getSlot( SlotRecord::MAIN ) );
        }
 
        public function testSetGetMinor() {
@@ -249,7 +249,7 @@ class MutableRevisionRecordTest extends MediaWikiTestCase {
                $record->setSlot( $auxSlot );
 
                $this->assertSame( [ 'main' ], $record->getOriginalSlots()->getSlotRoles() );
-               $this->assertSame( $mainSlot, $record->getOriginalSlots()->getSlot( 'main' ) );
+               $this->assertSame( $mainSlot, $record->getOriginalSlots()->getSlot( SlotRecord::MAIN ) );
 
                $this->assertSame( [ 'aux' ], $record->getInheritedSlots()->getSlotRoles() );
                $this->assertSame( $auxSlot, $record->getInheritedSlots()->getSlot( 'aux' ) );
@@ -314,7 +314,7 @@ class MutableRevisionRecordTest extends MediaWikiTestCase {
                yield 'empty' => [ $rev ];
 
                $rev = new MutableRevisionRecord( $title );
-               $rev->setContent( 'main', $content );
+               $rev->setContent( SlotRecord::MAIN, $content );
                $rev->setUser( $user );
                $rev->setComment( $comment );
                yield 'no timestamp' => [ $rev ];
@@ -326,14 +326,14 @@ class MutableRevisionRecordTest extends MediaWikiTestCase {
                yield 'no content' => [ $rev ];
 
                $rev = new MutableRevisionRecord( $title );
-               $rev->setContent( 'main', $content );
+               $rev->setContent( SlotRecord::MAIN, $content );
                $rev->setComment( $comment );
                $rev->setTimestamp( '20101010000000' );
                yield 'no user' => [ $rev ];
 
                $rev = new MutableRevisionRecord( $title );
                $rev->setUser( $user );
-               $rev->setContent( 'main', $content );
+               $rev->setContent( SlotRecord::MAIN, $content );
                $rev->setTimestamp( '20101010000000' );
                yield 'no comment' => [ $rev ];
        }
index 5a83143..1ef0121 100644 (file)
@@ -65,14 +65,14 @@ class MutableRevisionSlotsTest extends RevisionSlotsTest {
 
                $this->assertSame( [], $slots->getSlots() );
 
-               $slotA = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $slotA = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $slots->setSlot( $slotA );
-               $this->assertSame( $slotA, $slots->getSlot( 'main' ) );
+               $this->assertSame( $slotA, $slots->getSlot( SlotRecord::MAIN ) );
                $this->assertSame( [ 'main' => $slotA ], $slots->getSlots() );
 
-               $slotB = SlotRecord::newUnsaved( 'main', new WikitextContent( 'B' ) );
+               $slotB = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'B' ) );
                $slots->setSlot( $slotB );
-               $this->assertSame( $slotB, $slots->getSlot( 'main' ) );
+               $this->assertSame( $slotB, $slots->getSlot( SlotRecord::MAIN ) );
                $this->assertSame( [ 'main' => $slotB ], $slots->getSlots() );
        }
 
@@ -87,18 +87,18 @@ class MutableRevisionSlotsTest extends RevisionSlotsTest {
 
        public function testInheritSlotOverwritesSlot() {
                $slots = new MutableRevisionSlots();
-               $slotA = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $slotA = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $slots->setSlot( $slotA );
-               $slotB = $this->newSavedSlot( 'main', new WikitextContent( 'B' ) );
+               $slotB = $this->newSavedSlot( SlotRecord::MAIN, new WikitextContent( 'B' ) );
                $slotC = $this->newSavedSlot( 'foo', new WikitextContent( 'C' ) );
                $slots->inheritSlot( $slotB );
                $slots->inheritSlot( $slotC );
                $this->assertSame( [ 'main', 'foo' ], $slots->getSlotRoles() );
-               $this->assertNotSame( $slotB, $slots->getSlot( 'main' ) );
+               $this->assertNotSame( $slotB, $slots->getSlot( SlotRecord::MAIN ) );
                $this->assertNotSame( $slotC, $slots->getSlot( 'foo' ) );
-               $this->assertTrue( $slots->getSlot( 'main' )->isInherited() );
+               $this->assertTrue( $slots->getSlot( SlotRecord::MAIN )->isInherited() );
                $this->assertTrue( $slots->getSlot( 'foo' )->isInherited() );
-               $this->assertSame( $slotB->getContent(), $slots->getSlot( 'main' )->getContent() );
+               $this->assertSame( $slotB->getContent(), $slots->getSlot( SlotRecord::MAIN )->getContent() );
                $this->assertSame( $slotC->getContent(), $slots->getSlot( 'foo' )->getContent() );
        }
 
@@ -107,26 +107,26 @@ class MutableRevisionSlotsTest extends RevisionSlotsTest {
 
                $this->assertSame( [], $slots->getSlots() );
 
-               $slotA = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $slotA = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $slots->setSlot( $slotA );
-               $this->assertSame( $slotA, $slots->getSlot( 'main' ) );
+               $this->assertSame( $slotA, $slots->getSlot( SlotRecord::MAIN ) );
                $this->assertSame( [ 'main' => $slotA ], $slots->getSlots() );
 
                $newContent = new WikitextContent( 'B' );
-               $slots->setContent( 'main', $newContent );
-               $this->assertSame( $newContent, $slots->getContent( 'main' ) );
+               $slots->setContent( SlotRecord::MAIN, $newContent );
+               $this->assertSame( $newContent, $slots->getContent( SlotRecord::MAIN ) );
        }
 
        public function testRemoveExistingSlot() {
-               $slotA = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $slotA = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $slots = new MutableRevisionSlots( [ $slotA ] );
 
                $this->assertSame( [ 'main' => $slotA ], $slots->getSlots() );
 
-               $slots->removeSlot( 'main' );
+               $slots->removeSlot( SlotRecord::MAIN );
                $this->assertSame( [], $slots->getSlots() );
                $this->setExpectedException( RevisionAccessException::class );
-               $slots->getSlot( 'main' );
+               $slots->getSlot( SlotRecord::MAIN );
        }
 
        public function testNewFromParentRevisionSlots() {
index 1d504de..7e1e1ee 100644 (file)
@@ -135,7 +135,7 @@ class NoContentModelRevisionStoreDbTest extends RevisionStoreDbTestBase {
                                                'slot_revision_id' => 'slots.rev_id',
                                                'slot_content_id' => 'NULL',
                                                'slot_origin' => 'slots.rev_id',
-                                               'role_name' => $db->addQuotes( 'main' ),
+                                               'role_name' => $db->addQuotes( SlotRecord::MAIN ),
                                        ]
                                ),
                                'joins' => [],
@@ -152,7 +152,7 @@ class NoContentModelRevisionStoreDbTest extends RevisionStoreDbTestBase {
                                                'slot_revision_id' => 'slots.rev_id',
                                                'slot_content_id' => 'NULL',
                                                'slot_origin' => 'slots.rev_id',
-                                               'role_name' => $db->addQuotes( 'main' ),
+                                               'role_name' => $db->addQuotes( SlotRecord::MAIN ),
                                                'content_size' => 'slots.rev_len',
                                                'content_sha1' => 'slots.rev_sha1',
                                                'content_address' =>
index 81f726c..3933986 100644 (file)
@@ -6,6 +6,7 @@ use CommentStoreComment;
 use Content;
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Storage\SlotRecord;
 use MediaWikiTestCase;
 use ParserOptions;
 use RecentChange;
@@ -72,7 +73,7 @@ class PageUpdaterTest extends MediaWikiTestCase {
 
                // TODO: MCR: test additional slots
                $content = new TextContent( 'Lorem Ipsum' );
-               $updater->setContent( 'main', $content );
+               $updater->setContent( SlotRecord::MAIN, $content );
 
                $parent = $updater->grabParentRevision();
 
@@ -102,7 +103,7 @@ class PageUpdaterTest extends MediaWikiTestCase {
                $this->assertInstanceOf( Revision::class, $updater->getStatus()->value['revision'] );
 
                $rev = $updater->getNewRevision();
-               $revContent = $rev->getContent( 'main' );
+               $revContent = $rev->getContent( SlotRecord::MAIN );
                $this->assertSame( 'Lorem Ipsum', $revContent->serialize(), 'revision content' );
 
                // were the WikiPage and Title objects updated?
@@ -128,7 +129,7 @@ class PageUpdaterTest extends MediaWikiTestCase {
 
                // re-edit with same content - should be a "null-edit"
                $updater = $page->newPageUpdater( $user );
-               $updater->setContent( 'main', $content );
+               $updater->setContent( SlotRecord::MAIN, $content );
 
                $summary = CommentStoreComment::newUnsavedComment( 'to to re-edit' );
                $rev = $updater->saveRevision( $summary );
@@ -167,7 +168,7 @@ class PageUpdaterTest extends MediaWikiTestCase {
                $this->assertTrue( $updater->hasEditConflict( 0 ), 'hasEditConflict' );
 
                // TODO: MCR: test additional slots
-               $updater->setContent( 'main', new TextContent( 'Lorem Ipsum' ) );
+               $updater->setContent( SlotRecord::MAIN, new TextContent( 'Lorem Ipsum' ) );
 
                // TODO: test all flags for saveRevision()!
                $summary = CommentStoreComment::newUnsavedComment( 'Just a test' );
@@ -189,7 +190,7 @@ class PageUpdaterTest extends MediaWikiTestCase {
                // TODO: Test null revision (with different user): new revision!
 
                $rev = $updater->getNewRevision();
-               $revContent = $rev->getContent( 'main' );
+               $revContent = $rev->getContent( SlotRecord::MAIN );
                $this->assertSame( 'Lorem Ipsum', $revContent->serialize(), 'revision content' );
 
                // were the WikiPage and Title objects updated?
@@ -210,7 +211,7 @@ class PageUpdaterTest extends MediaWikiTestCase {
 
                // re-edit
                $updater = $page->newPageUpdater( $user );
-               $updater->setContent( 'main', new TextContent( 'dolor sit amet' ) );
+               $updater->setContent( SlotRecord::MAIN, new TextContent( 'dolor sit amet' ) );
 
                $summary = CommentStoreComment::newUnsavedComment( 're-edit' );
                $updater->saveRevision( $summary );
@@ -242,7 +243,7 @@ class PageUpdaterTest extends MediaWikiTestCase {
                }
 
                $updater = $page->newPageUpdater( $user );
-               $updater->setContent( 'main', $content );
+               $updater->setContent( SlotRecord::MAIN, $content );
                $rev = $updater->saveRevision( $comment );
                return $rev;
        }
@@ -267,7 +268,7 @@ class PageUpdaterTest extends MediaWikiTestCase {
 
                // try creating the page - should trigger CAS failure.
                $summary = CommentStoreComment::newUnsavedComment( 'create?!' );
-               $updater->setContent( 'main', new TextContent( 'Lorem ipsum' ) );
+               $updater->setContent( SlotRecord::MAIN, new TextContent( 'Lorem ipsum' ) );
                $updater->saveRevision( $summary );
                $status = $updater->getStatus();
 
@@ -287,7 +288,7 @@ class PageUpdaterTest extends MediaWikiTestCase {
 
                // try creating the page - should trigger CAS failure.
                $summary = CommentStoreComment::newUnsavedComment( 'edit?!' );
-               $updater->setContent( 'main', new TextContent( 'dolor sit amet' ) );
+               $updater->setContent( SlotRecord::MAIN, new TextContent( 'dolor sit amet' ) );
                $updater->saveRevision( $summary );
                $status = $updater->getStatus();
 
@@ -311,7 +312,7 @@ class PageUpdaterTest extends MediaWikiTestCase {
 
                // update with EDIT_UPDATE flag should fail
                $summary = CommentStoreComment::newUnsavedComment( 'udpate?!' );
-               $updater->setContent( 'main', new TextContent( 'Lorem ipsum' ) );
+               $updater->setContent( SlotRecord::MAIN, new TextContent( 'Lorem ipsum' ) );
                $updater->saveRevision( $summary, EDIT_UPDATE );
                $status = $updater->getStatus();
 
@@ -326,7 +327,7 @@ class PageUpdaterTest extends MediaWikiTestCase {
                // update with EDIT_NEW flag should fail
                $summary = CommentStoreComment::newUnsavedComment( 'create?!' );
                $updater = $page->newPageUpdater( $user );
-               $updater->setContent( 'main', new TextContent( 'dolor sit amet' ) );
+               $updater->setContent( SlotRecord::MAIN, new TextContent( 'dolor sit amet' ) );
                $updater->saveRevision( $summary, EDIT_NEW );
                $status = $updater->getStatus();
 
@@ -356,7 +357,7 @@ class PageUpdaterTest extends MediaWikiTestCase {
                $updater = $page->newPageUpdater( $user );
 
                $summary = CommentStoreComment::newUnsavedComment( 'Lorem ipsum ' . $patrolled );
-               $updater->setContent( 'main', new TextContent( 'Lorem ipsum ' . $patrolled ) );
+               $updater->setContent( SlotRecord::MAIN, new TextContent( 'Lorem ipsum ' . $patrolled ) );
                $updater->setRcPatrolStatus( $patrolled );
                $rev = $updater->saveRevision( $summary );
 
@@ -375,24 +376,24 @@ class PageUpdaterTest extends MediaWikiTestCase {
 
                $updater = $page->newPageUpdater( $user );
                $summary = CommentStoreComment::newUnsavedComment( 'one' );
-               $updater->setContent( 'main', new TextContent( 'Lorem ipsum' ) );
+               $updater->setContent( SlotRecord::MAIN, new TextContent( 'Lorem ipsum' ) );
                $rev1 = $updater->saveRevision( $summary, EDIT_NEW );
 
                $updater = $page->newPageUpdater( $user );
                $summary = CommentStoreComment::newUnsavedComment( 'two' );
-               $updater->setContent( 'main', new TextContent( 'Foo Bar' ) );
+               $updater->setContent( SlotRecord::MAIN, new TextContent( 'Foo Bar' ) );
                $rev2 = $updater->saveRevision( $summary, EDIT_UPDATE );
 
                $updater = $page->newPageUpdater( $user );
                $summary = CommentStoreComment::newUnsavedComment( 'three' );
-               $updater->inheritSlot( $rev1->getSlot( 'main' ) );
+               $updater->inheritSlot( $rev1->getSlot( SlotRecord::MAIN ) );
                $rev3 = $updater->saveRevision( $summary, EDIT_UPDATE );
 
                $this->assertNotSame( $rev1->getId(), $rev3->getId() );
                $this->assertNotSame( $rev2->getId(), $rev3->getId() );
 
-               $main1 = $rev1->getSlot( 'main' );
-               $main3 = $rev3->getSlot( 'main' );
+               $main1 = $rev1->getSlot( SlotRecord::MAIN );
+               $main3 = $rev3->getSlot( SlotRecord::MAIN );
 
                $this->assertNotSame( $main1->getRevision(), $main3->getRevision() );
                $this->assertSame( $main1->getAddress(), $main3->getAddress() );
@@ -410,7 +411,7 @@ class PageUpdaterTest extends MediaWikiTestCase {
 
                $updater = $page->newPageUpdater( $user );
                $updater->setUseAutomaticEditSummaries( true );
-               $updater->setContent( 'main', new TextContent( 'Lorem Ipsum' ) );
+               $updater->setContent( SlotRecord::MAIN, new TextContent( 'Lorem Ipsum' ) );
 
                // empty comment triggers auto-summary
                $summary = CommentStoreComment::newUnsavedComment( '' );
@@ -423,7 +424,7 @@ class PageUpdaterTest extends MediaWikiTestCase {
                // check that this also works when blanking the page
                $updater = $page->newPageUpdater( $user );
                $updater->setUseAutomaticEditSummaries( true );
-               $updater->setContent( 'main', new TextContent( '' ) );
+               $updater->setContent( SlotRecord::MAIN, new TextContent( '' ) );
 
                $summary = CommentStoreComment::newUnsavedComment( '' );
                $updater->saveRevision( $summary, EDIT_AUTOSUMMARY );
@@ -438,7 +439,7 @@ class PageUpdaterTest extends MediaWikiTestCase {
 
                $updater = $page2->newPageUpdater( $user );
                $updater->setUseAutomaticEditSummaries( false );
-               $updater->setContent( 'main', new TextContent( 'Lorem Ipsum' ) );
+               $updater->setContent( SlotRecord::MAIN, new TextContent( 'Lorem Ipsum' ) );
 
                $summary = CommentStoreComment::newUnsavedComment( '' );
                $updater->saveRevision( $summary, EDIT_AUTOSUMMARY );
@@ -450,7 +451,7 @@ class PageUpdaterTest extends MediaWikiTestCase {
                // check that we don't do auto.summaries without the EDIT_AUTOSUMMARY flag
                $updater = $page2->newPageUpdater( $user );
                $updater->setUseAutomaticEditSummaries( true );
-               $updater->setContent( 'main', new TextContent( '' ) );
+               $updater->setContent( SlotRecord::MAIN, new TextContent( '' ) );
 
                $summary = CommentStoreComment::newUnsavedComment( '' );
                $updater->saveRevision( $summary, 0 );
@@ -477,7 +478,7 @@ class PageUpdaterTest extends MediaWikiTestCase {
                $updater = $page->newPageUpdater( $user );
                $updater->setUsePageCreationLog( $use );
                $summary = CommentStoreComment::newUnsavedComment( 'cmt' );
-               $updater->setContent( 'main', new TextContent( 'Lorem Ipsum' ) );
+               $updater->setContent( SlotRecord::MAIN, new TextContent( 'Lorem Ipsum' ) );
                $updater->saveRevision( $summary, EDIT_NEW );
 
                $rev = $updater->getNewRevision();
@@ -555,7 +556,7 @@ class PageUpdaterTest extends MediaWikiTestCase {
                $page = WikiPage::factory( $title );
                $updater = $page->newPageUpdater( $user );
 
-               $updater->setContent( 'main', new \WikitextContent( $wikitext ) );
+               $updater->setContent( SlotRecord::MAIN, new \WikitextContent( $wikitext ) );
 
                $summary = CommentStoreComment::newUnsavedComment( 'Just a test' );
                $rev = $updater->saveRevision( $summary, EDIT_UPDATE );
@@ -568,7 +569,7 @@ class PageUpdaterTest extends MediaWikiTestCase {
 
                $output = $page->getParserOutput( ParserOptions::newCanonical( 'canonical' ) );
                $html = $output->getText();
-               $text = $rev->getContent( 'main' )->serialize();
+               $text = $rev->getContent( SlotRecord::MAIN )->serialize();
 
                if ( $subst ) {
                        $this->assertContains( $expected, $text, 'In Wikitext' );
index f959d68..fad6228 100644 (file)
@@ -34,7 +34,7 @@ class RevisionArchiveRecordTest extends MediaWikiTestCase {
                $user = new UserIdentityValue( 11, 'Tester', 0 );
                $comment = CommentStoreComment::newUnsavedComment( 'Hello World' );
 
-               $main = SlotRecord::newUnsaved( 'main', new TextContent( 'Lorem Ipsum' ) );
+               $main = SlotRecord::newUnsaved( SlotRecord::MAIN, new TextContent( 'Lorem Ipsum' ) );
                $aux = SlotRecord::newUnsaved( 'aux', new TextContent( 'Frumious Bandersnatch' ) );
                $slots = new RevisionSlots( [ $main, $aux ] );
 
@@ -65,7 +65,7 @@ class RevisionArchiveRecordTest extends MediaWikiTestCase {
                $user = new UserIdentityValue( 11, 'Tester', 0 );
                $comment = CommentStoreComment::newUnsavedComment( 'Hello World' );
 
-               $main = SlotRecord::newUnsaved( 'main', new TextContent( 'Lorem Ipsum' ) );
+               $main = SlotRecord::newUnsaved( SlotRecord::MAIN, new TextContent( 'Lorem Ipsum' ) );
                $aux = SlotRecord::newUnsaved( 'aux', new TextContent( 'Frumious Bandersnatch' ) );
                $slots = new RevisionSlots( [ $main, $aux ] );
 
@@ -197,7 +197,7 @@ class RevisionArchiveRecordTest extends MediaWikiTestCase {
 
                $comment = CommentStoreComment::newUnsavedComment( 'Hello World' );
 
-               $main = SlotRecord::newUnsaved( 'main', new TextContent( 'Lorem Ipsum' ) );
+               $main = SlotRecord::newUnsaved( SlotRecord::MAIN, new TextContent( 'Lorem Ipsum' ) );
                $aux = SlotRecord::newUnsaved( 'aux', new TextContent( 'Frumious Bandersnatch' ) );
                $slots = new RevisionSlots( [ $main, $aux ] );
 
index 7f56c3a..165c27b 100644 (file)
@@ -2,6 +2,7 @@
 namespace MediaWiki\Tests\Storage;
 
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Storage\SlotRecord;
 use MediaWikiTestCase;
 use Revision;
 
@@ -737,7 +738,7 @@ class RevisionQueryInfoTest extends MediaWikiTestCase {
                                                'slot_revision_id' => 'slots.rev_id',
                                                'slot_content_id' => 'NULL',
                                                'slot_origin' => 'slots.rev_id',
-                                               'role_name' => $db->addQuotes( 'main' ),
+                                               'role_name' => $db->addQuotes( SlotRecord::MAIN ),
                                        ]
                                ),
                                'joins' => [],
@@ -758,7 +759,7 @@ class RevisionQueryInfoTest extends MediaWikiTestCase {
                                                'slot_revision_id' => 'slots.rev_id',
                                                'slot_content_id' => 'NULL',
                                                'slot_origin' => 'slots.rev_id',
-                                               'role_name' => $db->addQuotes( 'main' ),
+                                               'role_name' => $db->addQuotes( SlotRecord::MAIN ),
                                                'content_size' => 'slots.rev_len',
                                                'content_sha1' => 'slots.rev_sha1',
                                                'content_address' => $db->buildConcat( [
@@ -784,7 +785,7 @@ class RevisionQueryInfoTest extends MediaWikiTestCase {
                                                'slot_revision_id' => 'slots.rev_id',
                                                'slot_content_id' => 'NULL',
                                                'slot_origin' => 'slots.rev_id',
-                                               'role_name' => $db->addQuotes( 'main' ),
+                                               'role_name' => $db->addQuotes( SlotRecord::MAIN ),
                                                'content_size' => 'slots.rev_len',
                                                'content_sha1' => 'slots.rev_sha1',
                                                'content_address' => $db->buildConcat( [
@@ -810,7 +811,7 @@ class RevisionQueryInfoTest extends MediaWikiTestCase {
                                                'slot_revision_id' => 'slots.rev_id',
                                                'slot_content_id' => 'NULL',
                                                'slot_origin' => 'slots.rev_id',
-                                               'role_name' => $db->addQuotes( 'main' ),
+                                               'role_name' => $db->addQuotes( SlotRecord::MAIN ),
                                        ]
                                ),
                                'joins' => [],
@@ -831,7 +832,7 @@ class RevisionQueryInfoTest extends MediaWikiTestCase {
                                                'slot_revision_id' => 'slots.rev_id',
                                                'slot_content_id' => 'NULL',
                                                'slot_origin' => 'slots.rev_id',
-                                               'role_name' => $db->addQuotes( 'main' ),
+                                               'role_name' => $db->addQuotes( SlotRecord::MAIN ),
                                                'content_size' => 'slots.rev_len',
                                                'content_sha1' => 'slots.rev_sha1',
                                                'content_address' =>
index 20270d0..901b800 100644 (file)
@@ -189,17 +189,18 @@ trait RevisionRecordTests {
                $rev = $this->newRevision( [ 'rev_deleted' => $visibility ] );
 
                // NOTE: slot meta-data is never suppressed, just the content is!
-               $this->assertTrue( $rev->hasSlot( 'main' ), 'hasSlot is never suppressed' );
-               $this->assertNotNull( $rev->getSlot( 'main', RevisionRecord::RAW ), 'raw meta' );
-               $this->assertNotNull( $rev->getSlot( 'main', RevisionRecord::FOR_PUBLIC ), 'public meta' );
+               $this->assertTrue( $rev->hasSlot( SlotRecord::MAIN ), 'hasSlot is never suppressed' );
+               $this->assertNotNull( $rev->getSlot( SlotRecord::MAIN, RevisionRecord::RAW ), 'raw meta' );
+               $this->assertNotNull( $rev->getSlot( SlotRecord::MAIN, RevisionRecord::FOR_PUBLIC ),
+                       'public meta' );
 
                $this->assertNotNull(
-                       $rev->getSlot( 'main', RevisionRecord::FOR_THIS_USER, $user ),
+                       $rev->getSlot( SlotRecord::MAIN, RevisionRecord::FOR_THIS_USER, $user ),
                        'user can'
                );
 
                try {
-                       $rev->getSlot( 'main', RevisionRecord::FOR_PUBLIC )->getContent();
+                       $rev->getSlot( SlotRecord::MAIN, RevisionRecord::FOR_PUBLIC )->getContent();
                        $exception = null;
                } catch ( SuppressedDataException $ex ) {
                        $exception = $ex;
@@ -212,7 +213,7 @@ trait RevisionRecordTests {
                );
 
                try {
-                       $rev->getSlot( 'main', RevisionRecord::FOR_THIS_USER, $user )->getContent();
+                       $rev->getSlot( SlotRecord::MAIN, RevisionRecord::FOR_THIS_USER, $user )->getContent();
                        $exception = null;
                } catch ( SuppressedDataException $ex ) {
                        $exception = $ex;
@@ -234,16 +235,16 @@ trait RevisionRecordTests {
                $user = $this->getTestUser( $groups )->getUser();
                $rev = $this->newRevision( [ 'rev_deleted' => $visibility ] );
 
-               $this->assertNotNull( $rev->getContent( 'main', RevisionRecord::RAW ), 'raw can' );
+               $this->assertNotNull( $rev->getContent( SlotRecord::MAIN, RevisionRecord::RAW ), 'raw can' );
 
                $this->assertSame(
                        $publicCan,
-                       $rev->getContent( 'main', RevisionRecord::FOR_PUBLIC ) !== null,
+                       $rev->getContent( SlotRecord::MAIN, RevisionRecord::FOR_PUBLIC ) !== null,
                        'public can'
                );
                $this->assertSame(
                        $userCan,
-                       $rev->getContent( 'main', RevisionRecord::FOR_THIS_USER, $user ) !== null,
+                       $rev->getContent( SlotRecord::MAIN, RevisionRecord::FOR_THIS_USER, $user ) !== null,
                        'user can'
                );
        }
@@ -251,7 +252,7 @@ trait RevisionRecordTests {
        public function testGetSlot() {
                $rev = $this->newRevision();
 
-               $slot = $rev->getSlot( 'main' );
+               $slot = $rev->getSlot( SlotRecord::MAIN );
                $this->assertNotNull( $slot, 'getSlot()' );
                $this->assertSame( 'main', $slot->getRole(), 'getRole()' );
        }
@@ -259,14 +260,14 @@ trait RevisionRecordTests {
        public function testHasSlot() {
                $rev = $this->newRevision();
 
-               $this->assertTrue( $rev->hasSlot( 'main' ) );
+               $this->assertTrue( $rev->hasSlot( SlotRecord::MAIN ) );
                $this->assertFalse( $rev->hasSlot( 'xyz' ) );
        }
 
        public function testGetContent() {
                $rev = $this->newRevision();
 
-               $content = $rev->getSlot( 'main' );
+               $content = $rev->getSlot( SlotRecord::MAIN );
                $this->assertNotNull( $content, 'getContent()' );
                $this->assertSame( CONTENT_MODEL_TEXT, $content->getModel(), 'getModel()' );
        }
@@ -379,8 +380,8 @@ trait RevisionRecordTests {
 
        public function provideHasSameContent() {
                // Create some slots with content
-               $mainA = SlotRecord::newUnsaved( 'main', new TextContent( 'A' ) );
-               $mainB = SlotRecord::newUnsaved( 'main', new TextContent( 'B' ) );
+               $mainA = SlotRecord::newUnsaved( SlotRecord::MAIN, new TextContent( 'A' ) );
+               $mainB = SlotRecord::newUnsaved( SlotRecord::MAIN, new TextContent( 'B' ) );
                $auxA = SlotRecord::newUnsaved( 'aux', new TextContent( 'A' ) );
                $auxB = SlotRecord::newUnsaved( 'aux', new TextContent( 'A' ) );
 
index 52647c2..409e002 100644 (file)
@@ -46,11 +46,11 @@ class RevisionSlotsTest extends MediaWikiTestCase {
         * @covers \MediaWiki\Storage\RevisionSlots::getSlot
         */
        public function testGetSlot() {
-               $mainSlot = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $mainSlot = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $auxSlot = SlotRecord::newUnsaved( 'aux', new WikitextContent( 'B' ) );
                $slots = $this->newRevisionSlots( [ $mainSlot, $auxSlot ] );
 
-               $this->assertSame( $mainSlot, $slots->getSlot( 'main' ) );
+               $this->assertSame( $mainSlot, $slots->getSlot( SlotRecord::MAIN ) );
                $this->assertSame( $auxSlot, $slots->getSlot( 'aux' ) );
                $this->setExpectedException( RevisionAccessException::class );
                $slots->getSlot( 'nothere' );
@@ -60,11 +60,11 @@ class RevisionSlotsTest extends MediaWikiTestCase {
         * @covers \MediaWiki\Storage\RevisionSlots::hasSlot
         */
        public function testHasSlot() {
-               $mainSlot = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $mainSlot = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $auxSlot = SlotRecord::newUnsaved( 'aux', new WikitextContent( 'B' ) );
                $slots = $this->newRevisionSlots( [ $mainSlot, $auxSlot ] );
 
-               $this->assertTrue( $slots->hasSlot( 'main' ) );
+               $this->assertTrue( $slots->hasSlot( SlotRecord::MAIN ) );
                $this->assertTrue( $slots->hasSlot( 'aux' ) );
                $this->assertFalse( $slots->hasSlot( 'AUX' ) );
                $this->assertFalse( $slots->hasSlot( 'xyz' ) );
@@ -76,11 +76,11 @@ class RevisionSlotsTest extends MediaWikiTestCase {
        public function testGetContent() {
                $mainContent = new WikitextContent( 'A' );
                $auxContent = new WikitextContent( 'B' );
-               $mainSlot = SlotRecord::newUnsaved( 'main', $mainContent );
+               $mainSlot = SlotRecord::newUnsaved( SlotRecord::MAIN, $mainContent );
                $auxSlot = SlotRecord::newUnsaved( 'aux', $auxContent );
                $slots = $this->newRevisionSlots( [ $mainSlot, $auxSlot ] );
 
-               $this->assertSame( $mainContent, $slots->getContent( 'main' ) );
+               $this->assertSame( $mainContent, $slots->getContent( SlotRecord::MAIN ) );
                $this->assertSame( $auxContent, $slots->getContent( 'aux' ) );
                $this->setExpectedException( RevisionAccessException::class );
                $slots->getContent( 'nothere' );
@@ -90,7 +90,7 @@ class RevisionSlotsTest extends MediaWikiTestCase {
         * @covers \MediaWiki\Storage\RevisionSlots::getSlotRoles
         */
        public function testGetSlotRoles_someSlots() {
-               $mainSlot = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $mainSlot = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $auxSlot = SlotRecord::newUnsaved( 'aux', new WikitextContent( 'B' ) );
                $slots = $this->newRevisionSlots( [ $mainSlot, $auxSlot ] );
 
@@ -110,7 +110,7 @@ class RevisionSlotsTest extends MediaWikiTestCase {
         * @covers \MediaWiki\Storage\RevisionSlots::getSlots
         */
        public function testGetSlots() {
-               $mainSlot = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $mainSlot = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $auxSlot = SlotRecord::newUnsaved( 'aux', new WikitextContent( 'B' ) );
                $slotsArray = [ $mainSlot, $auxSlot ];
                $slots = $this->newRevisionSlots( $slotsArray );
@@ -122,7 +122,7 @@ class RevisionSlotsTest extends MediaWikiTestCase {
         * @covers \MediaWiki\Storage\RevisionSlots::getInheritedSlots
         */
        public function testGetInheritedSlots() {
-               $mainSlot = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $mainSlot = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $auxSlot = SlotRecord::newInherited(
                        SlotRecord::newSaved(
                                7, 7, 'foo',
@@ -139,7 +139,7 @@ class RevisionSlotsTest extends MediaWikiTestCase {
         * @covers \MediaWiki\Storage\RevisionSlots::getOriginalSlots
         */
        public function testGetOriginalSlots() {
-               $mainSlot = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $mainSlot = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $auxSlot = SlotRecord::newInherited(
                        SlotRecord::newSaved(
                                7, 7, 'foo',
index 07a6971..75a4718 100644 (file)
@@ -158,25 +158,25 @@ class RevisionSlotsUpdateTest extends MediaWikiTestCase {
        public function testRemoveSlot() {
                $slots = new RevisionSlotsUpdate();
 
-               $slotA = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $slotA = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $slots->modifySlot( $slotA );
 
                $this->assertSame( [ 'main' ], $slots->getModifiedRoles() );
 
-               $slots->removeSlot( 'main' );
+               $slots->removeSlot( SlotRecord::MAIN );
                $slots->removeSlot( 'other' );
                $this->assertSame( [], $slots->getModifiedRoles() );
                $this->assertSame( [ 'main', 'other' ], $slots->getRemovedRoles() );
-               $this->assertTrue( $slots->isRemovedSlot( 'main' ) );
+               $this->assertTrue( $slots->isRemovedSlot( SlotRecord::MAIN ) );
                $this->assertTrue( $slots->isRemovedSlot( 'other' ) );
-               $this->assertFalse( $slots->isModifiedSlot( 'main' ) );
+               $this->assertFalse( $slots->isModifiedSlot( SlotRecord::MAIN ) );
 
                // removing the same slot again should not trigger an error
-               $slots->removeSlot( 'main' );
+               $slots->removeSlot( SlotRecord::MAIN );
 
                // getting a slot after removing it should fail
                $this->setExpectedException( RevisionAccessException::class );
-               $slots->getModifiedSlot( 'main' );
+               $slots->getModifiedSlot( SlotRecord::MAIN );
        }
 
        public function testGetModifiedRoles() {
@@ -184,26 +184,26 @@ class RevisionSlotsUpdateTest extends MediaWikiTestCase {
 
                $this->assertSame( [], $slots->getModifiedRoles() );
 
-               $slots->modifyContent( 'main', new WikitextContent( 'A' ) );
+               $slots->modifyContent( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $slots->modifyContent( 'foo', new WikitextContent( 'Foo' ) );
                $this->assertSame( [ 'main', 'foo' ], $slots->getModifiedRoles() );
 
-               $slots->removeSlot( 'main' );
+               $slots->removeSlot( SlotRecord::MAIN );
                $this->assertSame( [ 'foo' ], $slots->getModifiedRoles() );
        }
 
        public function testGetRemovedRoles() {
-               $slotA = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $slotA = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $slots = new RevisionSlotsUpdate( [ $slotA ] );
 
                $this->assertSame( [], $slots->getRemovedRoles() );
 
-               $slots->removeSlot( 'main', new WikitextContent( 'A' ) );
+               $slots->removeSlot( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $slots->removeSlot( 'foo', new WikitextContent( 'Foo' ) );
 
                $this->assertSame( [ 'main', 'foo' ], $slots->getRemovedRoles() );
 
-               $slots->modifyContent( 'main', new WikitextContent( 'A' ) );
+               $slots->modifyContent( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $this->assertSame( [ 'foo' ], $slots->getRemovedRoles() );
        }
 
index 910cdc4..04b6aa8 100644 (file)
@@ -65,10 +65,6 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
         */
        abstract protected function getMcrTablesToReset();
 
-       public function needsDB() {
-               return true;
-       }
-
        public function setUp() {
                parent::setUp();
                $this->tablesUsed[] = 'archive';
@@ -302,9 +298,9 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
        }
 
        protected function assertRevisionCompleteness( RevisionRecord $r ) {
-               $this->assertTrue( $r->hasSlot( 'main' ) );
-               $this->assertInstanceOf( SlotRecord::class, $r->getSlot( 'main' ) );
-               $this->assertInstanceOf( Content::class, $r->getContent( 'main' ) );
+               $this->assertTrue( $r->hasSlot( SlotRecord::MAIN ) );
+               $this->assertInstanceOf( SlotRecord::class, $r->getSlot( SlotRecord::MAIN ) );
+               $this->assertInstanceOf( Content::class, $r->getContent( SlotRecord::MAIN ) );
 
                foreach ( $r->getSlotRoles() as $role ) {
                        $this->assertSlotCompleteness( $r, $r->getSlot( $role ) );
@@ -361,7 +357,7 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
        public function provideInsertRevisionOn_successes() {
                yield 'Bare minimum revision insertion' => [
                        [
-                               'slot' => SlotRecord::newUnsaved( 'main', new WikitextContent( 'Chicken' ) ),
+                               'slot' => SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'Chicken' ) ),
                                'page' => true,
                                'comment' => $this->getRandomCommentStoreComment(),
                                'timestamp' => '20171117010101',
@@ -370,7 +366,7 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
                ];
                yield 'Detailed revision insertion' => [
                        [
-                               'slot' => SlotRecord::newUnsaved( 'main', new WikitextContent( 'Chicken' ) ),
+                               'slot' => SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'Chicken' ) ),
                                'parent' => true,
                                'page' => true,
                                'comment' => $this->getRandomCommentStoreComment(),
@@ -458,7 +454,7 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
        public function testInsertRevisionOn_blobAddressExists() {
                $title = $this->getTestPageTitle();
                $revDetails = [
-                       'slot' => SlotRecord::newUnsaved( 'main', new WikitextContent( 'Chicken' ) ),
+                       'slot' => SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'Chicken' ) ),
                        'parent' => true,
                        'comment' => $this->getRandomCommentStoreComment(),
                        'timestamp' => '20171117010101',
@@ -475,14 +471,14 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
                $this->assertRevisionRecordsEqual( $revOne, $firstReturn );
 
                // Insert a second revision inheriting the same blob address
-               $revDetails['slot'] = SlotRecord::newInherited( $firstReturn->getSlot( 'main' ) );
+               $revDetails['slot'] = SlotRecord::newInherited( $firstReturn->getSlot( SlotRecord::MAIN ) );
                $revTwo = $this->getRevisionRecordFromDetailsArray( $revDetails );
                $secondReturn = $store->insertRevisionOn( $revTwo, wfGetDB( DB_MASTER ) );
                $this->assertLinkTargetsEqual( $title, $secondReturn->getPageAsLinkTarget() );
                $this->assertRevisionRecordsEqual( $revTwo, $secondReturn );
 
-               $firstMainSlot = $firstReturn->getSlot( 'main' );
-               $secondMainSlot = $secondReturn->getSlot( 'main' );
+               $firstMainSlot = $firstReturn->getSlot( SlotRecord::MAIN );
+               $secondMainSlot = $secondReturn->getSlot( SlotRecord::MAIN );
 
                $this->assertSameSlotContent( $firstMainSlot, $secondMainSlot );
 
@@ -514,7 +510,7 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
                ];
                yield 'no timestamp' => [
                        [
-                               'slot' => SlotRecord::newUnsaved( 'main', new WikitextContent( 'Chicken' ) ),
+                               'slot' => SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'Chicken' ) ),
                                'comment' => $this->getRandomCommentStoreComment(),
                                'user' => true,
                        ],
@@ -522,7 +518,7 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
                ];
                yield 'no comment' => [
                        [
-                               'slot' => SlotRecord::newUnsaved( 'main', new WikitextContent( 'Chicken' ) ),
+                               'slot' => SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'Chicken' ) ),
                                'timestamp' => '20171117010101',
                                'user' => true,
                        ],
@@ -530,7 +526,7 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
                ];
                yield 'no user' => [
                        [
-                               'slot' => SlotRecord::newUnsaved( 'main', new WikitextContent( 'Chicken' ) ),
+                               'slot' => SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'Chicken' ) ),
                                'comment' => $this->getRandomCommentStoreComment(),
                                'timestamp' => '20171117010101',
                        ],
@@ -721,7 +717,7 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
                $revRecord = $store->getRevisionById( $rev->getId() );
 
                $this->assertSame( $rev->getId(), $revRecord->getId() );
-               $this->assertTrue( $revRecord->getSlot( 'main' )->getContent()->equals( $content ) );
+               $this->assertTrue( $revRecord->getSlot( SlotRecord::MAIN )->getContent()->equals( $content ) );
                $this->assertSame( __METHOD__, $revRecord->getComment()->text );
        }
 
@@ -739,7 +735,7 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
                $revRecord = $store->getRevisionByTitle( $page->getTitle() );
 
                $this->assertSame( $rev->getId(), $revRecord->getId() );
-               $this->assertTrue( $revRecord->getSlot( 'main' )->getContent()->equals( $content ) );
+               $this->assertTrue( $revRecord->getSlot( SlotRecord::MAIN )->getContent()->equals( $content ) );
                $this->assertSame( __METHOD__, $revRecord->getComment()->text );
        }
 
@@ -757,7 +753,7 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
                $revRecord = $store->getRevisionByPageId( $page->getId() );
 
                $this->assertSame( $rev->getId(), $revRecord->getId() );
-               $this->assertTrue( $revRecord->getSlot( 'main' )->getContent()->equals( $content ) );
+               $this->assertTrue( $revRecord->getSlot( SlotRecord::MAIN )->getContent()->equals( $content ) );
                $this->assertSame( __METHOD__, $revRecord->getComment()->text );
        }
 
@@ -782,7 +778,7 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
                );
 
                $this->assertSame( $rev->getId(), $revRecord->getId() );
-               $this->assertTrue( $revRecord->getSlot( 'main' )->getContent()->equals( $content ) );
+               $this->assertTrue( $revRecord->getSlot( SlotRecord::MAIN )->getContent()->equals( $content ) );
                $this->assertSame( __METHOD__, $revRecord->getComment()->text );
        }
 
@@ -860,13 +856,14 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
                $this->assertSame( $expectedParent, $record->getParentId() );
                $this->assertSame( $rev->getSha1(), $record->getSha1() );
                $this->assertSame( $rev->getComment(), $record->getComment()->text );
-               $this->assertSame( $rev->getContentFormat(), $record->getContent( 'main' )->getDefaultFormat() );
-               $this->assertSame( $rev->getContentModel(), $record->getContent( 'main' )->getModel() );
+               $this->assertSame( $rev->getContentFormat(),
+                       $record->getContent( SlotRecord::MAIN )->getDefaultFormat() );
+               $this->assertSame( $rev->getContentModel(), $record->getContent( SlotRecord::MAIN )->getModel() );
                $this->assertLinkTargetsEqual( $rev->getTitle(), $record->getPageAsLinkTarget() );
 
                $revRec = $rev->getRevisionRecord();
-               $revMain = $revRec->getSlot( 'main' );
-               $recMain = $record->getSlot( 'main' );
+               $revMain = $revRec->getSlot( SlotRecord::MAIN );
+               $recMain = $record->getSlot( SlotRecord::MAIN );
 
                $this->assertSame( $revMain->hasOrigin(), $recMain->hasOrigin(), 'hasOrigin' );
                $this->assertSame( $revMain->hasAddress(), $recMain->hasAddress(), 'hasAddress' );
@@ -1015,7 +1012,7 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
                $record = $store->newRevisionFromArchiveRow( $row );
 
                $this->assertRevisionRecordMatchesRevision( $orig, $record );
-               $this->assertSame( $text, $record->getContent( 'main' )->serialize() );
+               $this->assertSame( $text, $record->getContent( SlotRecord::MAIN )->serialize() );
        }
 
        /**
@@ -1046,7 +1043,7 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
                $record = $store->newRevisionFromArchiveRow( $row );
 
                $this->assertRevisionRecordMatchesRevision( $orig, $record );
-               $this->assertSame( $text, $record->getContent( 'main' )->serialize() );
+               $this->assertSame( $text, $record->getContent( SlotRecord::MAIN )->serialize() );
        }
 
        /**
@@ -1169,8 +1166,8 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
                $this->assertRevisionRecordsEqual( $record, $restored );
 
                // does the new revision use the original slot?
-               $recMain = $record->getSlot( 'main' );
-               $restMain = $restored->getSlot( 'main' );
+               $recMain = $record->getSlot( SlotRecord::MAIN );
+               $restMain = $restored->getSlot( SlotRecord::MAIN );
                $this->assertSame( $recMain->getAddress(), $restMain->getAddress() );
                $this->assertSame( $recMain->getContentId(), $restMain->getContentId() );
                $this->assertSame( $recMain->getOrigin(), $restMain->getOrigin() );
@@ -1625,13 +1622,14 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
                                );
                        }
                } elseif ( isset( $array['text'] ) ) {
-                       $this->assertSame( $array['text'], $result->getSlot( 'main' )->getContent()->serialize() );
+                       $this->assertSame( $array['text'],
+                               $result->getSlot( SlotRecord::MAIN )->getContent()->serialize() );
                } elseif ( isset( $array['content_format'] ) ) {
                        $this->assertSame(
                                $array['content_format'],
-                               $result->getSlot( 'main' )->getContent()->getDefaultFormat()
+                               $result->getSlot( SlotRecord::MAIN )->getContent()->getDefaultFormat()
                        );
-                       $this->assertSame( $array['content_model'], $result->getSlot( 'main' )->getModel() );
+                       $this->assertSame( $array['content_model'], $result->getSlot( SlotRecord::MAIN )->getModel() );
                }
        }
 
index 1d6a9a0..12d950c 100644 (file)
@@ -34,7 +34,7 @@ class RevisionStoreRecordTest extends MediaWikiTestCase {
                $user = new UserIdentityValue( 11, 'Tester', 0 );
                $comment = CommentStoreComment::newUnsavedComment( 'Hello World' );
 
-               $main = SlotRecord::newUnsaved( 'main', new TextContent( 'Lorem Ipsum' ) );
+               $main = SlotRecord::newUnsaved( SlotRecord::MAIN, new TextContent( 'Lorem Ipsum' ) );
                $aux = SlotRecord::newUnsaved( 'aux', new TextContent( 'Frumious Bandersnatch' ) );
                $slots = new RevisionSlots( [ $main, $aux ] );
 
@@ -62,7 +62,7 @@ class RevisionStoreRecordTest extends MediaWikiTestCase {
                $user = new UserIdentityValue( 11, 'Tester', 0 );
                $comment = CommentStoreComment::newUnsavedComment( 'Hello World' );
 
-               $main = SlotRecord::newUnsaved( 'main', new TextContent( 'Lorem Ipsum' ) );
+               $main = SlotRecord::newUnsaved( SlotRecord::MAIN, new TextContent( 'Lorem Ipsum' ) );
                $aux = SlotRecord::newUnsaved( 'aux', new TextContent( 'Frumious Bandersnatch' ) );
                $slots = new RevisionSlots( [ $main, $aux ] );
 
@@ -220,7 +220,7 @@ class RevisionStoreRecordTest extends MediaWikiTestCase {
 
                $comment = CommentStoreComment::newUnsavedComment( 'Hello World' );
 
-               $main = SlotRecord::newUnsaved( 'main', new TextContent( 'Lorem Ipsum' ) );
+               $main = SlotRecord::newUnsaved( SlotRecord::MAIN, new TextContent( 'Lorem Ipsum' ) );
                $aux = SlotRecord::newUnsaved( 'aux', new TextContent( 'Frumious Bandersnatch' ) );
                $slots = new RevisionSlots( [ $main, $aux ] );
 
@@ -347,19 +347,20 @@ class RevisionStoreRecordTest extends MediaWikiTestCase {
                );
 
                // NOTE: slot meta-data is never suppressed, just the content is!
-               $this->assertNotNull( $rev->getSlot( 'main', RevisionRecord::RAW ), 'raw can' );
-               $this->assertNotNull( $rev->getSlot( 'main', RevisionRecord::FOR_PUBLIC ), 'public can' );
+               $this->assertNotNull( $rev->getSlot( SlotRecord::MAIN, RevisionRecord::RAW ), 'raw can' );
+               $this->assertNotNull( $rev->getSlot( SlotRecord::MAIN, RevisionRecord::FOR_PUBLIC ),
+                       'public can' );
 
                $this->assertNotNull(
-                       $rev->getSlot( 'main', RevisionRecord::FOR_THIS_USER, $user ),
+                       $rev->getSlot( SlotRecord::MAIN, RevisionRecord::FOR_THIS_USER, $user ),
                        'user can'
                );
 
-               $rev->getSlot( 'main', RevisionRecord::RAW )->getContent();
+               $rev->getSlot( SlotRecord::MAIN, RevisionRecord::RAW )->getContent();
                // NOTE: the content of the current revision is never suppressed!
                // Check that getContent() doesn't throw SuppressedDataException
-               $rev->getSlot( 'main', RevisionRecord::FOR_PUBLIC )->getContent();
-               $rev->getSlot( 'main', RevisionRecord::FOR_THIS_USER, $user )->getContent();
+               $rev->getSlot( SlotRecord::MAIN, RevisionRecord::FOR_PUBLIC )->getContent();
+               $rev->getSlot( SlotRecord::MAIN, RevisionRecord::FOR_THIS_USER, $user )->getContent();
        }
 
 }
index aac94b8..2ed6f28 100644 (file)
@@ -9,6 +9,7 @@ use Language;
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Storage\RevisionAccessException;
 use MediaWiki\Storage\RevisionStore;
+use MediaWiki\Storage\SlotRecord;
 use MediaWiki\Storage\SqlBlobStore;
 use MediaWikiTestCase;
 use MWException;
@@ -436,7 +437,7 @@ class RevisionStoreTest extends MediaWikiTestCase {
                        Title::newFromText( __METHOD__ . '-UTPage' )
                );
 
-               $this->assertSame( $text, $record->getContent( 'main' )->serialize() );
+               $this->assertSame( $text, $record->getContent( SlotRecord::MAIN )->serialize() );
        }
 
        /**
@@ -465,7 +466,7 @@ class RevisionStoreTest extends MediaWikiTestCase {
                        0,
                        Title::newFromText( __METHOD__ . '-UTPage' )
                );
-               $this->assertSame( 'Söme Content', $record->getContent( 'main' )->serialize() );
+               $this->assertSame( 'Söme Content', $record->getContent( SlotRecord::MAIN )->serialize() );
        }
 
        private function makeRow( array $array ) {
index 1aae16d..0db294e 100644 (file)
@@ -118,21 +118,21 @@ class SlotRecordTest extends MediaWikiTestCase {
        }
 
        public function testGetContentId_fails() {
-               $record = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $record = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $this->setExpectedException( IncompleteRevisionException::class );
 
                $record->getContentId();
        }
 
        public function testGetAddress_fails() {
-               $record = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $record = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $this->setExpectedException( IncompleteRevisionException::class );
 
                $record->getAddress();
        }
 
        public function provideIncomplete() {
-               $unsaved = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $unsaved = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                yield 'unsaved' => [ $unsaved ];
 
                $parent = new SlotRecord( $this->makeRow(), new WikitextContent( 'A' ) );
@@ -144,7 +144,7 @@ class SlotRecordTest extends MediaWikiTestCase {
         * @dataProvider provideIncomplete
         */
        public function testGetRevision_fails( SlotRecord $record ) {
-               $record = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $record = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $this->setExpectedException( IncompleteRevisionException::class );
 
                $record->getRevision();
@@ -154,7 +154,7 @@ class SlotRecordTest extends MediaWikiTestCase {
         * @dataProvider provideIncomplete
         */
        public function testGetOrigin_fails( SlotRecord $record ) {
-               $record = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $record = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $this->setExpectedException( IncompleteRevisionException::class );
 
                $record->getOrigin();
@@ -173,7 +173,7 @@ class SlotRecordTest extends MediaWikiTestCase {
 
                $this->assertSame( $hash, SlotRecord::base36Sha1( $text ) );
 
-               $record = SlotRecord::newUnsaved( 'main', new WikitextContent( $text ) );
+               $record = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( $text ) );
                $this->assertSame( $hash, $record->getSha1() );
        }
 
@@ -225,7 +225,7 @@ class SlotRecordTest extends MediaWikiTestCase {
 
        public function testNewSaved() {
                // This would happen while doing an edit, before saving revision meta-data.
-               $unsaved = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $unsaved = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
 
                // This would happen while doing an edit, after saving the revision meta-data
                // and content meta-data.
@@ -285,7 +285,7 @@ class SlotRecordTest extends MediaWikiTestCase {
        }
 
        public function provideNewSaved_InvalidArgumentException() {
-               $unsaved = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $unsaved = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
 
                yield 'bad revision id' => [ 'xyzzy', 5, 'address', $unsaved ];
                yield 'bad content id' => [ 7, 'xyzzy', 'address', $unsaved ];
index aa579ab..f36faf7 100644 (file)
@@ -555,6 +555,10 @@ class ApiErrorFormatterTest extends MediaWikiLangTestCase {
         * @param array $expect
         */
        public function testGetMessageFromException_BC( $exception, $options, $expect ) {
+               if ( $exception instanceof UsageException ) {
+                       $this->hideDeprecated( 'UsageException::getMessageArray' );
+               }
+
                $result = new ApiResult( 8388608 );
                $formatter = new ApiErrorFormatter_BackCompat( $result );
 
index 7f2c1a6..b20d43e 100644 (file)
@@ -97,8 +97,7 @@ class ApiParseTest extends ApiTestCase {
                        $this->assertCount( 1, $res[0] );
                } else {
                        $this->assertCount( 2, $res[0] );
-                       // This deliberately fails if there are extra warnings
-                       $this->assertSame( [ 'parse' => [ 'warnings' => $warnings ] ], $res[0]['warnings'] );
+                       $this->assertSame( [ 'warnings' => $warnings ], $res[0]['warnings']['parse'] );
                }
        }
 
@@ -827,7 +826,8 @@ class ApiParseTest extends ApiTestCase {
                        'disabletidy' => '',
                ] );
 
-               $this->assertParsedTo( "<p><b>Mixed <i>up</b></i>\n</p>", $res2 );
+               $this->assertParsedTo( "<p><b>Mixed <i>up</b></i>\n</p>", $res2,
+                       'The parameter "disabletidy" has been deprecated.' );
        }
 
        public function testFormatCategories() {
index 6532635..8e2c6d9 100644 (file)
@@ -2,6 +2,7 @@
 
 use MediaWiki\Linker\LinkTarget;
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Storage\SlotRecord;
 
 /**
  * @group medium
@@ -93,7 +94,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
                $page = WikiPage::factory( $title );
 
                $updater = $page->newPageUpdater( $user );
-               $updater->setContent( 'main', ContentHandler::makeContent( $content, $title ) );
+               $updater->setContent( SlotRecord::MAIN, ContentHandler::makeContent( $content, $title ) );
                $rev = $updater->saveRevision( $summary );
 
                $rc = MediaWikiServices::getInstance()->getRevisionStore()->getRecentChange( $rev );
index c770029..64c3224 100644 (file)
@@ -14,6 +14,7 @@ class ChangeTagsTest extends MediaWikiTestCase {
                $this->tablesUsed[] = 'change_tag';
                $this->tablesUsed[] = 'change_tag_def';
                $this->tablesUsed[] = 'tag_summary';
+               $this->tablesUsed[] = 'valid_tag';
        }
 
        // TODO only modifyDisplayQuery and getSoftwareTags are tested, nothing else is
@@ -592,4 +593,83 @@ class ChangeTagsTest extends MediaWikiTestCase {
 
                $this->assertEquals( [ 'tag1' => 2, 'tag2' => 1 ], ChangeTags::tagUsageStatistics() );
        }
+
+       public function testListExplicitlyDefinedTagsOld() {
+               $this->setMwGlobals( 'wgChangeTagsSchemaMigrationStage', MIGRATION_OLD );
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->delete( 'change_tag', '*' );
+               $dbw->delete( 'change_tag_def', '*' );
+               $dbw->delete( 'valid_tag', '*' );
+
+               $rcId = 123;
+               ChangeTags::updateTags( [ 'tag1', 'tag2' ], [], $rcId );
+               ChangeTags::defineTag( 'tag2' );
+
+               $this->assertEquals( [ 'tag2' ], ChangeTags::listExplicitlyDefinedTags() );
+               $dbr = wfGetDB( DB_REPLICA );
+               $res = $dbr->select( 'change_tag_def', [ 'ctd_name', 'ctd_user_defined' ], '' );
+               $this->assertEquals( [], iterator_to_array( $res, false ) );
+
+               $this->assertEquals( [ 'tag2' ], $dbr->selectFieldValues( 'valid_tag', 'vt_tag', '' ) );
+       }
+
+       public function testListExplicitlyDefinedTagsWriteBoth() {
+               $this->setMwGlobals( 'wgChangeTagsSchemaMigrationStage', MIGRATION_WRITE_BOTH );
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->delete( 'change_tag', '*' );
+               $dbw->delete( 'change_tag_def', '*' );
+               $dbw->delete( 'valid_tag', '*' );
+
+               $rcId = 123;
+               ChangeTags::updateTags( [ 'tag1', 'tag2' ], [], $rcId );
+               ChangeTags::defineTag( 'tag2' );
+
+               $this->assertEquals( [ 'tag2' ], ChangeTags::listExplicitlyDefinedTags() );
+               $dbr = wfGetDB( DB_REPLICA );
+
+               $expected = [
+                       (object)[
+                               'ctd_name' => 'tag1',
+                               'ctd_user_defined' => 0
+                       ],
+                       (object)[
+                               'ctd_name' => 'tag2',
+                               'ctd_user_defined' => 1
+                       ],
+               ];
+               $res = $dbr->select( 'change_tag_def', [ 'ctd_name', 'ctd_user_defined' ], '' );
+               $this->assertEquals( $expected, iterator_to_array( $res, false ) );
+
+               $this->assertEquals( [ 'tag2' ], $dbr->selectFieldValues( 'valid_tag', 'vt_tag', '' ) );
+       }
+
+       public function testListExplicitlyDefinedTagsNew() {
+               $this->setMwGlobals( 'wgChangeTagsSchemaMigrationStage', MIGRATION_NEW );
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->delete( 'change_tag', '*' );
+               $dbw->delete( 'change_tag_def', '*' );
+               $dbw->delete( 'valid_tag', '*' );
+
+               $rcId = 123;
+               ChangeTags::updateTags( [ 'tag1', 'tag2' ], [], $rcId );
+               ChangeTags::defineTag( 'tag2' );
+
+               $this->assertEquals( [ 'tag2' ], ChangeTags::listExplicitlyDefinedTags() );
+               $dbr = wfGetDB( DB_REPLICA );
+
+               $expected = [
+                       (object)[
+                               'ctd_name' => 'tag1',
+                               'ctd_user_defined' => 0
+                       ],
+                       (object)[
+                               'ctd_name' => 'tag2',
+                               'ctd_user_defined' => 1
+                       ],
+               ];
+               $res = $dbr->select( 'change_tag_def', [ 'ctd_name', 'ctd_user_defined' ], '' );
+               $this->assertEquals( $expected, iterator_to_array( $res, false ) );
+
+               $this->assertEquals( [], $dbr->selectFieldValues( 'valid_tag', 'vt_tag', '' ) );
+       }
 }
index 806038a..e469f12 100644 (file)
@@ -2,6 +2,7 @@
 
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Revision\SlotRenderingProvider;
+use MediaWiki\Storage\SlotRecord;
 
 /**
  * @group ContentHandler
@@ -373,7 +374,7 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
                $srp = $this->getMock( SlotRenderingProvider::class );
 
                $handler = new WikitextContentHandler();
-               $updates = $handler->getSecondaryDataUpdates( $title, $content, 'main', $srp );
+               $updates = $handler->getSecondaryDataUpdates( $title, $content, SlotRecord::MAIN, $srp );
 
                $this->assertEquals( [], $updates );
        }
@@ -385,7 +386,7 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
                $srp = $this->getMock( SlotRenderingProvider::class );
 
                $handler = new WikitextContentHandler();
-               $updates = $handler->getDeletionUpdates( $title, 'main' );
+               $updates = $handler->getDeletionUpdates( $title, SlotRecord::MAIN );
 
                $this->assertEquals( [], $updates );
        }
index 5c2aa2b..6b1ed7f 100644 (file)
@@ -11,15 +11,17 @@ use Wikimedia\TestingAccessWrapper;
 class DatabasePostgresTest extends MediaWikiTestCase {
 
        private function doTestInsertIgnore() {
-               $reset = new ScopedCallback( function () {
+               $fname = __METHOD__;
+               $reset = new ScopedCallback( function () use ( $fname ) {
                        if ( $this->db->explicitTrxActive() ) {
-                               $this->db->rollback( __METHOD__ );
+                               $this->db->rollback( $fname );
                        }
-                       $this->db->query( 'DROP TABLE IF EXISTS ' . $this->db->tableName( 'foo' ) );
+                       $this->db->query( 'DROP TABLE IF EXISTS ' . $this->db->tableName( 'foo' ), $fname );
                } );
 
                $this->db->query(
-                       "CREATE TEMPORARY TABLE {$this->db->tableName( 'foo' )} (i INTEGER NOT NULL PRIMARY KEY)"
+                       "CREATE TEMPORARY TABLE {$this->db->tableName( 'foo' )} (i INTEGER NOT NULL PRIMARY KEY)",
+                       __METHOD__
                );
                $this->db->insert( 'foo', [ [ 'i' => 1 ], [ 'i' => 2 ] ], __METHOD__ );
 
@@ -92,19 +94,22 @@ class DatabasePostgresTest extends MediaWikiTestCase {
        }
 
        private function doTestInsertSelectIgnore() {
-               $reset = new ScopedCallback( function () {
+               $fname = __METHOD__;
+               $reset = new ScopedCallback( function () use ( $fname ) {
                        if ( $this->db->explicitTrxActive() ) {
-                               $this->db->rollback( __METHOD__ );
+                               $this->db->rollback( $fname );
                        }
-                       $this->db->query( 'DROP TABLE IF EXISTS ' . $this->db->tableName( 'foo' ) );
-                       $this->db->query( 'DROP TABLE IF EXISTS ' . $this->db->tableName( 'bar' ) );
+                       $this->db->query( 'DROP TABLE IF EXISTS ' . $this->db->tableName( 'foo' ), $fname );
+                       $this->db->query( 'DROP TABLE IF EXISTS ' . $this->db->tableName( 'bar' ), $fname );
                } );
 
                $this->db->query(
-                       "CREATE TEMPORARY TABLE {$this->db->tableName( 'foo' )} (i INTEGER)"
+                       "CREATE TEMPORARY TABLE {$this->db->tableName( 'foo' )} (i INTEGER)",
+                       __METHOD__
                );
                $this->db->query(
-                       "CREATE TEMPORARY TABLE {$this->db->tableName( 'bar' )} (i INTEGER NOT NULL PRIMARY KEY)"
+                       "CREATE TEMPORARY TABLE {$this->db->tableName( 'bar' )} (i INTEGER NOT NULL PRIMARY KEY)",
+                       __METHOD__
                );
                $this->db->insert( 'bar', [ [ 'i' => 1 ], [ 'i' => 2 ] ], __METHOD__ );
 
index 55e5bbf..6b977a3 100644 (file)
@@ -20,11 +20,6 @@ class DeprecationHelperTest extends MediaWikiTestCase {
                $this->setMwGlobals( 'wgDevelopmentWarnings', false );
        }
 
-       public function tearDown() {
-               parent::tearDown();
-               MWDebug::clearLog();
-       }
-
        /**
         * @dataProvider provideGet
         */
index 07d02dd..e21ac3b 100644 (file)
@@ -216,9 +216,9 @@ class DifferenceEngineTest extends MediaWikiTestCase {
        }
 
        public function testSetRevisions() {
-               $main1 = SlotRecord::newUnsaved( 'main',
+               $main1 = SlotRecord::newUnsaved( SlotRecord::MAIN,
                        ContentHandler::makeContent( 'xxx', null, CONTENT_MODEL_TEXT ) );
-               $main2 = SlotRecord::newUnsaved( 'main',
+               $main2 = SlotRecord::newUnsaved( SlotRecord::MAIN,
                        ContentHandler::makeContent( 'yyy', null, CONTENT_MODEL_TEXT ) );
                $rev1 = $this->getRevisionRecord( $main1 );
                $rev2 = $this->getRevisionRecord( $main2 );
@@ -260,9 +260,9 @@ class DifferenceEngineTest extends MediaWikiTestCase {
        }
 
        public function provideGetDiffBody() {
-               $main1 = SlotRecord::newUnsaved( 'main',
+               $main1 = SlotRecord::newUnsaved( SlotRecord::MAIN,
                        ContentHandler::makeContent( 'xxx', null, CONTENT_MODEL_TEXT ) );
-               $main2 = SlotRecord::newUnsaved( 'main',
+               $main2 = SlotRecord::newUnsaved( SlotRecord::MAIN,
                        ContentHandler::makeContent( 'yyy', null, CONTENT_MODEL_TEXT ) );
                $slot1 = SlotRecord::newUnsaved( 'slot',
                        ContentHandler::makeContent( 'aaa', null, CONTENT_MODEL_TEXT ) );
index a70c005..83554d2 100644 (file)
@@ -127,9 +127,8 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
         * @covers BitmapMetadataHandler::png
         */
        public function testPNGXMP() {
-               if ( !extension_loaded( 'xml' ) ) {
-                       $this->markTestSkipped( "This test needs the xml extension." );
-               }
+               $this->checkPHPExtension( 'xml' );
+
                $handler = new BitmapMetadataHandler();
                $result = $handler->PNG( $this->filePath . 'xmp.png' );
                $expected = [
index 68cddd6..d07a9e1 100644 (file)
@@ -2,6 +2,7 @@
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Storage\MutableRevisionRecord;
 use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Storage\SlotRecord;
 use PHPUnit\Framework\MockObject\MockObject;
 
 /**
@@ -43,7 +44,7 @@ class ArticleViewTest extends MediaWikiTestCase {
                        }
 
                        $u = $page->newPageUpdater( $user );
-                       $u->setContent( 'main', $cont );
+                       $u->setContent( SlotRecord::MAIN, $cont );
                        $rev = $u->saveRevision( CommentStoreComment::newUnsavedComment( 'Rev ' . $key ) );
 
                        $revisions[ $key ] = $rev;
@@ -201,7 +202,7 @@ class ArticleViewTest extends MediaWikiTestCase {
                $rev->setComment( $dummyRev->getComment() );
                $rev->setTimestamp( $dummyRev->getTimestamp() );
 
-               $rev->setContent( 'main', $content );
+               $rev->setContent( SlotRecord::MAIN, $content );
 
                $rev = new Revision( $rev );
 
@@ -453,7 +454,7 @@ class ArticleViewTest extends MediaWikiTestCase {
                $this->setTemporaryHook(
                        'ArticleRevisionViewCustom',
                        function ( RevisionRecord $rev, Title $title, $oldid, OutputPage $output ) use ( $page ) {
-                               $content = $rev->getContent( 'main' );
+                               $content = $rev->getContent( SlotRecord::MAIN );
 
                                $this->assertSame( $page->getTitle(), $title, '$title' );
                                $this->assertSame( 'Test A', $content->getNativeData(), '$content' );
index 6757e78..476d5c2 100644 (file)
@@ -1,5 +1,6 @@
 <?php
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Storage\SlotRecord;
 use MediaWiki\Storage\SqlBlobStore;
 use MediaWiki\Tests\Storage\PreMcrSchemaOverride;
 
@@ -27,7 +28,7 @@ class PageArchivePreMcrTest extends PageArchiveTestBase {
                $blobStore = MediaWikiServices::getInstance()->getBlobStore();
 
                $textId = $blobStore->getTextIdFromAddress(
-                       $this->firstRev->getSlot( 'main' )->getAddress()
+                       $this->firstRev->getSlot( SlotRecord::MAIN )->getAddress()
                );
 
                $row = (object)[ 'ar_text_id' => $textId ];
@@ -61,7 +62,7 @@ class PageArchivePreMcrTest extends PageArchiveTestBase {
                                'ar_namespace' => '0',
                                'ar_title' => 'PageArchiveTest_thePage',
                                'ar_text_id' => (string)$blobStore->getTextIdFromAddress(
-                                       $this->ipRev->getSlot( 'main' )->getAddress()
+                                       $this->ipRev->getSlot( SlotRecord::MAIN )->getAddress()
                                ),
                                'ar_parent_id' => strval( $this->ipRev->getParentId() ),
                        ],
@@ -86,7 +87,7 @@ class PageArchivePreMcrTest extends PageArchiveTestBase {
                                'ar_namespace' => '0',
                                'ar_title' => 'PageArchiveTest_thePage',
                                'ar_text_id' => (string)$blobStore->getTextIdFromAddress(
-                                       $this->firstRev->getSlot( 'main' )->getAddress()
+                                       $this->firstRev->getSlot( SlotRecord::MAIN )->getAddress()
                                ),
                                'ar_parent_id' => '0',
                        ],
index 4cb2b47..67cbf58 100644 (file)
@@ -3,6 +3,7 @@
 use MediaWiki\Edit\PreparedEdit;
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Storage\RevisionSlotsUpdate;
+use MediaWiki\Storage\SlotRecord;
 use PHPUnit\Framework\MockObject\MockObject;
 use Wikimedia\TestingAccessWrapper;
 
@@ -1232,7 +1233,7 @@ more stuff
                );
 
                // TODO: MCR: assert origin once we write slot data
-               // $mainSlot = $page->getRevision()->getRevisionRecord()->getSlot( 'main' );
+               // $mainSlot = $page->getRevision()->getRevisionRecord()->getSlot( SlotRecord::MAIN );
                // $this->assertTrue( $mainSlot->isInherited(), 'isInherited' );
                // $this->assertSame( $rev2->getId(), $mainSlot->getOrigin(), 'getOrigin' );
        }
@@ -2416,10 +2417,10 @@ more stuff
 
                // provide context, so the cache can be kept in place
                $slotsUpdate = new revisionSlotsUpdate();
-               $slotsUpdate->modifyContent( 'main', $content );
+               $slotsUpdate->modifyContent( SlotRecord::MAIN, $content );
 
                $updater = $page->newPageUpdater( $user, $slotsUpdate );
-               $updater->setContent( 'main', $content );
+               $updater->setContent( SlotRecord::MAIN, $content );
                $revision = $updater->saveRevision(
                        CommentStoreComment::newUnsavedComment( 'test' ),
                        EDIT_NEW
@@ -2448,7 +2449,7 @@ more stuff
                $user = $revision->getUser();
 
                $slotsUpdate = new RevisionSlotsUpdate();
-               $slotsUpdate->modifyContent( 'main', new WikitextContent( 'Hello World' ) );
+               $slotsUpdate->modifyContent( SlotRecord::MAIN, new WikitextContent( 'Hello World' ) );
 
                // get a virgin updater
                $updater1 = $page->getDerivedDataUpdater( $user );
@@ -2460,7 +2461,7 @@ more stuff
                $this->assertSame( $updater1, $page->getDerivedDataUpdater( $user, $revision ) );
 
                $slotsUpdate = RevisionSlotsUpdate::newFromContent(
-                       [ 'main' => $revision->getContent( 'main' ) ]
+                       [ SlotRecord::MAIN => $revision->getContent( SlotRecord::MAIN ) ]
                );
                $this->assertSame( $updater1, $page->getDerivedDataUpdater( $user, null, $slotsUpdate ) );
 
index 1427f01..3e857f0 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 use MediaWiki\Storage\MutableRevisionRecord;
 use MediaWiki\Storage\RevisionStore;
+use MediaWiki\Storage\SlotRecord;
 use MediaWiki\User\UserIdentityValue;
 
 /**
@@ -235,7 +236,7 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
                $oldRevision->setId( 100 );
                $oldRevision->setUser( new UserIdentityValue( 7, 'FauxAuthor', 0 ) );
                $oldRevision->setTimestamp( '20141111111111' );
-               $oldRevision->setContent( 'main', new WikitextContent( 'FAUX' ) );
+               $oldRevision->setContent( SlotRecord::MAIN, new WikitextContent( 'FAUX' ) );
 
                $po = new ParserOptions( $frank );
                $po->setCurrentRevisionCallback( function () use ( $oldRevision ) {
@@ -263,7 +264,7 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
                $newRevision = new MutableRevisionRecord( $title );
                $newRevision->setUser( new UserIdentityValue( 9, 'NewAuthor', 0 ) );
                $newRevision->setTimestamp( '20180808000000' );
-               $newRevision->setContent( 'main', new WikitextContent( 'NEW' ) );
+               $newRevision->setContent( SlotRecord::MAIN, new WikitextContent( 'NEW' ) );
 
                $po = new ParserOptions( $frank );
                $po->setIsPreview( true );
@@ -298,7 +299,7 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
                $newRevision = new MutableRevisionRecord( $title );
                $newRevision->setUser( new UserIdentityValue( 9, 'NewAuthor', 0 ) );
                $newRevision->setTimestamp( '20180808000000' );
-               $newRevision->setContent( 'main', new WikitextContent( $text ) );
+               $newRevision->setContent( SlotRecord::MAIN, new WikitextContent( $text ) );
 
                $po = new ParserOptions( $frank );
                $po->setIsPreview( true );
@@ -329,13 +330,13 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
                $oldRevision->setId( 100 );
                $oldRevision->setUser( new UserIdentityValue( 7, 'OldAuthor', 0 ) );
                $oldRevision->setTimestamp( '20140404000000' );
-               $oldRevision->setContent( 'main', new WikitextContent( 'OLD' ) );
+               $oldRevision->setContent( SlotRecord::MAIN, new WikitextContent( 'OLD' ) );
 
                $currentRevision = new MutableRevisionRecord( $title );
                $currentRevision->setId( 200 );
                $currentRevision->setUser( new UserIdentityValue( 9, 'CurrentAuthor', 0 ) );
                $currentRevision->setTimestamp( '20160606000000' );
-               $currentRevision->setContent( 'main', new WikitextContent( 'CURRENT' ) );
+               $currentRevision->setContent( SlotRecord::MAIN, new WikitextContent( 'CURRENT' ) );
 
                $revisionStore = $this->getMockBuilder( RevisionStore::class )
                        ->disableOriginalConstructor()
index c6b9dee..a0beb45 100644 (file)
@@ -2,6 +2,7 @@
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Storage\MutableRevisionRecord;
 use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Storage\SlotRecord;
 
 /**
  * @covers PoolWorkArticleView
@@ -13,7 +14,7 @@ class PoolWorkArticleViewTest extends MediaWikiTestCase {
                $user = $this->getTestUser()->getUser();
                $updater = $page->newPageUpdater( $user );
 
-               $updater->setContent( 'main', new WikitextContent( $text ) );
+               $updater->setContent( SlotRecord::MAIN, new WikitextContent( $text ) );
                return $updater->saveRevision( CommentStoreComment::newUnsavedComment( 'testing' ) );
        }
 
@@ -57,7 +58,7 @@ class PoolWorkArticleViewTest extends MediaWikiTestCase {
                $fakeRev = new MutableRevisionRecord( $page->getTitle() );
                $fakeRev->setId( $rev->getId() );
                $fakeRev->setPageId( $page->getId() );
-               $fakeRev->setContent( 'main', new WikitextContent( 'YES!' ) );
+               $fakeRev->setContent( SlotRecord::MAIN, new WikitextContent( 'YES!' ) );
 
                $work = new PoolWorkArticleView( $page, $options, $rev->getId(), false, $fakeRev );
                $work->execute();
@@ -157,7 +158,7 @@ class PoolWorkArticleViewTest extends MediaWikiTestCase {
                $fakeRev = new MutableRevisionRecord( $page->getTitle() );
                $fakeRev->setId( $rev1->getId() );
                $fakeRev->setPageId( $page->getId() );
-               $fakeRev->setContent( 'main', new WikitextContent( 'SECRET' ) );
+               $fakeRev->setContent( SlotRecord::MAIN, new WikitextContent( 'SECRET' ) );
                $fakeRev->setVisibility( RevisionRecord::DELETED_TEXT );
 
                $work = new PoolWorkArticleView( $page, $options, $rev1->getId(), false, $fakeRev );
index d9e091d..71a3a4f 100644 (file)
@@ -678,6 +678,9 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
                $info = self::$default + [
                        'requires' => [
                                'MediaWiki' => '>= 1.25.0',
+                               'platform' => [
+                                       'php' => '>= 5.5.9'
+                               ],
                                'extensions' => [
                                        'Bar' => '*'
                                ]
index b668a9a..20f97bf 100644 (file)
@@ -9,10 +9,10 @@ class VersionCheckerTest extends PHPUnit\Framework\TestCase {
        use PHPUnit4And6Compat;
 
        /**
-        * @dataProvider provideCheck
+        * @dataProvider provideMediaWikiCheck
         */
-       public function testCheck( $coreVersion, $constraint, $expected ) {
-               $checker = new VersionChecker( $coreVersion );
+       public function testMediaWikiCheck( $coreVersion, $constraint, $expected ) {
+               $checker = new VersionChecker( $coreVersion, '7.0.0' );
                $this->assertEquals( $expected, !(bool)$checker->checkArray( [
                        'FakeExtension' => [
                                'MediaWiki' => $constraint,
@@ -20,7 +20,7 @@ class VersionCheckerTest extends PHPUnit\Framework\TestCase {
                ] ) );
        }
 
-       public static function provideCheck() {
+       public static function provideMediaWikiCheck() {
                return [
                        // [ $wgVersion, constraint, expected ]
                        [ '1.25alpha', '>= 1.26', false ],
@@ -44,11 +44,64 @@ class VersionCheckerTest extends PHPUnit\Framework\TestCase {
                ];
        }
 
+       /**
+        * @dataProvider providePhpValidCheck
+        */
+       public function testPhpValidCheck( $phpVersion, $constraint, $expected ) {
+               $checker = new VersionChecker( '1.0.0', $phpVersion );
+               $this->assertEquals( $expected, !(bool)$checker->checkArray( [
+                       'FakeExtension' => [
+                               'platform' => [
+                                       'php' => $constraint,
+                               ],
+                       ],
+               ] ) );
+       }
+
+       public static function providePhpValidCheck() {
+               return [
+                       // [ phpVersion, constraint, expected ]
+                       [ '7.0.23', '>= 7.0.0', true ],
+                       [ '7.0.23', '^7.1.0', false ],
+                       [ '7.0.23', '7.0.23', true ],
+               ];
+       }
+
+       /**
+        * @expectedException UnexpectedValueException
+        */
+       public function testPhpInvalidConstraint() {
+               $checker = new VersionChecker( '1.0.0', '7.0.0' );
+               $checker->checkArray( [
+                       'FakeExtension' => [
+                               'platform' => [
+                                       'php' => 'totallyinvalid',
+                               ],
+                       ],
+               ] );
+       }
+
+       /**
+        * @dataProvider providePhpInvalidVersion
+        * @expectedException UnexpectedValueException
+        */
+       public function testPhpInvalidVersion( $phpVersion ) {
+                $checker = new VersionChecker( '1.0.0', $phpVersion );
+       }
+
+       public static function providePhpInvalidVersion() {
+               return [
+                       // [ phpVersion ]
+                       [ '7.abc' ],
+                       [ '5.a.x' ],
+               ];
+       }
+
        /**
         * @dataProvider provideType
         */
        public function testType( $given, $expected ) {
-               $checker = new VersionChecker( '1.0.0' );
+               $checker = new VersionChecker( '1.0.0', '7.0.0' );
                $checker->setLoadedExtensionsAndSkins( [
                                'FakeDependency' => [
                                        'version' => '1.0.0',
@@ -150,7 +203,7 @@ class VersionCheckerTest extends PHPUnit\Framework\TestCase {
         * returns any error message.
         */
        public function testInvalidConstraint() {
-               $checker = new VersionChecker( '1.0.0' );
+               $checker = new VersionChecker( '1.0.0', '7.0.0' );
                $checker->setLoadedExtensionsAndSkins( [
                                'FakeDependency' => [
                                        'version' => 'not really valid',
@@ -169,7 +222,7 @@ class VersionCheckerTest extends PHPUnit\Framework\TestCase {
                        ],
                ] ) );
 
-               $checker = new VersionChecker( '1.0.0' );
+               $checker = new VersionChecker( '1.0.0', '7.0.0' );
                $checker->setLoadedExtensionsAndSkins( [
                                'FakeDependency' => [
                                        'version' => '1.24.3',
@@ -184,24 +237,49 @@ class VersionCheckerTest extends PHPUnit\Framework\TestCase {
                ] );
        }
 
-       /**
-        * T197478
-        */
-       public function testInvalidDependency() {
-               $checker = new VersionChecker( '1.0.0' );
-               $this->setExpectedException( UnexpectedValueException::class,
-                       'Dependency type skin unknown in FakeExtension' );
-               $this->assertEquals( [
+       public function provideInvalidDependency() {
+               return [
                        [
-                               'type' => 'invalid-version',
-                               'msg' => 'FakeDependency does not have a valid version string.',
+                               [
+                                       'FakeExtension' => [
+                                               'platform' => [
+                                                       'undefinedPlatformDependency' => '*',
+                                               ],
+                                       ],
+                               ],
+                               'undefinedPlatformDependency',
                        ],
-               ], $checker->checkArray( [
-                       'FakeExtension' => [
-                               'skin' => [
-                                       'FakeSkin' => '*',
+                       [
+                               [
+                                       'FakeExtension' => [
+                                               'undefinedDependencyType' => '*',
+                                       ],
                                ],
+                               'undefinedDependencyType',
                        ],
-               ] ) );
+                       // T197478
+                       [
+                               [
+                                       'FakeExtension' => [
+                                               'skin' => [
+                                                       'FakeSkin' => '*',
+                                               ],
+                                       ],
+                               ],
+                               'skin',
+                       ],
+               ];
+       }
+
+       /**
+        * @dataProvider provideInvalidDependency
+        */
+       public function testInvalidDependency( $depencency, $type ) {
+               $checker = new VersionChecker( '1.0.0', '7.0.0' );
+               $this->setExpectedException(
+                       UnexpectedValueException::class,
+                       "Dependency type $type unknown in FakeExtension"
+               );
+               $checker->checkArray( $depencency );
        }
 }
diff --git a/tests/phpunit/includes/specials/SpecialLogTest.php b/tests/phpunit/includes/specials/SpecialLogTest.php
new file mode 100644 (file)
index 0000000..d66280e
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+/**
+ * @license GPL-2.0-or-later
+ * @author Legoktm
+ */
+
+/**
+ * @covers SpecialLog
+ */
+class SpecialLogTest extends SpecialPageTestBase {
+
+       /**
+        * Returns a new instance of the special page under test.
+        *
+        * @return SpecialPage
+        */
+       protected function newSpecialPage() {
+               return new SpecialLog();
+       }
+
+       /**
+        * Verify that no exception was thrown for an invalid date
+        * @see T201411
+        */
+       public function testInvalidDate() {
+               list( $html, ) = $this->executeSpecialPage(
+                       '',
+                       // There is no 13th month
+                       new FauxRequest( [ 'wpdate' => '2018-13-01' ] ),
+                       'qqx'
+               );
+               $this->assertContains( '(log-summary)', $html );
+       }
+
+}
index ed99bd4..bc759e4 100644 (file)
@@ -1,4 +1,4 @@
-const Page = require( 'wdio-mediawiki/Page' );
+const Page = require( './Page' );
 
 class BlankPage extends Page {
        get heading() { return browser.element( '#firstHeading' ); }
index d07934b..8838530 100644 (file)
@@ -1,4 +1,4 @@
-const Page = require( 'wdio-mediawiki/Page' );
+const Page = require( './Page' );
 
 class LoginPage extends Page {
        get username() { return browser.element( '#wpName1' ); }
index 9d02d4d..50ac601 100644 (file)
@@ -1,5 +1,5 @@
 const MWBot = require( 'mwbot' ),
-       Page = require( 'wdio-mediawiki/Page' ),
+       Page = require( './Page' ),
        FRONTPAGE_REQUESTS_MAX_RUNS = 10; // (arbitrary) safe-guard against endless execution
 
 /**
index f9cadcd..2977479 100644 (file)
@@ -1,5 +1,5 @@
 const assert = require( 'assert' ),
-       BlankPage = require( 'wdio-mediawiki/BlankPage' );
+       BlankPage = require( './../BlankPage' );
 
 describe( 'BlankPage', function () {
        it( 'should have its title @daily', function () {