Merge "rdbms: make LoadBalancer::doWait() cast $timeout to an integer"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Mon, 16 Apr 2018 01:01:21 +0000 (01:01 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Mon, 16 Apr 2018 01:01:21 +0000 (01:01 +0000)
181 files changed:
Gruntfile.js
RELEASE-NOTES-1.31
composer.json
includes/DefaultSettings.php
includes/PHPVersionCheck.php
includes/Storage/NameTableStore.php
includes/Storage/RevisionStore.php
includes/api/ApiParse.php
includes/api/ApiQueryRecentChanges.php
includes/api/ApiQueryUserContributions.php
includes/api/ApiQueryWatchlist.php
includes/api/ApiUserrights.php
includes/api/i18n/fr.json
includes/api/i18n/he.json
includes/api/i18n/pt-br.json
includes/api/i18n/ru.json
includes/api/i18n/sv.json
includes/changes/RecentChange.php
includes/diff/DifferenceEngine.php
includes/filerepo/file/LocalFile.php
includes/gallery/ImageGalleryBase.php
includes/gallery/TraditionalImageGallery.php
includes/installer/i18n/ru.json
includes/jobqueue/JobQueueDB.php
includes/libs/CSSMin.php
includes/libs/StringUtils.php
includes/libs/rdbms/database/Database.php
includes/libs/rdbms/database/DatabaseSqlite.php
includes/libs/rdbms/loadbalancer/ILoadBalancer.php
includes/libs/rdbms/loadbalancer/LoadBalancer.php
includes/logging/LogEntry.php
includes/logging/PatrolLog.php
includes/objectcache/SqlBagOStuff.php
includes/page/WikiPage.php
includes/revisiondelete/RevDelLogItem.php
includes/revisiondelete/RevDelRevisionItem.php
includes/specialpage/ChangesListSpecialPage.php
includes/specialpage/LoginSignupSpecialPage.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialVersion.php
includes/specials/SpecialWatchlist.php
includes/specials/pagers/NewFilesPager.php
includes/specials/pagers/NewPagesPager.php
includes/user/User.php
includes/watcheditem/WatchedItemQueryService.php
languages/i18n/af.json
languages/i18n/ais.json
languages/i18n/ar.json
languages/i18n/ast.json
languages/i18n/ba.json
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/bg.json
languages/i18n/bho.json
languages/i18n/bn.json
languages/i18n/br.json
languages/i18n/bs.json
languages/i18n/ca.json
languages/i18n/ce.json
languages/i18n/ckb.json
languages/i18n/cs.json
languages/i18n/cy.json
languages/i18n/da.json
languages/i18n/de.json
languages/i18n/el.json
languages/i18n/en.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/eu.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/gcr.json
languages/i18n/gl.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hif-latn.json
languages/i18n/hr.json
languages/i18n/hsb.json
languages/i18n/hu.json
languages/i18n/ia.json
languages/i18n/id.json
languages/i18n/ilo.json
languages/i18n/io.json
languages/i18n/is.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/jv.json
languages/i18n/ka.json
languages/i18n/km.json
languages/i18n/ko.json
languages/i18n/lb.json
languages/i18n/lfn.json
languages/i18n/li.json
languages/i18n/lij.json
languages/i18n/lt.json
languages/i18n/lv.json
languages/i18n/mg.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/mr.json
languages/i18n/my.json
languages/i18n/nb.json
languages/i18n/nds-nl.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/oc.json
languages/i18n/pl.json
languages/i18n/ps.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/ro.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/sa.json
languages/i18n/sah.json
languages/i18n/sat.json
languages/i18n/sco.json
languages/i18n/sd.json
languages/i18n/sk.json
languages/i18n/skr-arab.json
languages/i18n/sl.json
languages/i18n/sq.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/su.json
languages/i18n/sv.json
languages/i18n/tay.json
languages/i18n/te.json
languages/i18n/th.json
languages/i18n/tr.json
languages/i18n/ug-arab.json
languages/i18n/uk.json
languages/i18n/ur.json
languages/i18n/vi.json
languages/i18n/yi.json
languages/i18n/yue.json
languages/i18n/zgh.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
maintenance/Maintenance.php
mw-config/config.css
package.json
resources/lib/oojs-ui/oojs-ui-core-apex.css
resources/lib/oojs-ui/oojs-ui-windows-apex.css
resources/src/jquery/jquery.makeCollapsible.css
resources/src/jquery/jquery.makeCollapsible.js
resources/src/mediawiki.widgets/mw.widgets.TitleOptionWidget.js
tests/common/TestsAutoLoader.php
tests/parser/ParserTestRunner.php
tests/phan/config.php
tests/phan/stubs/phpunit4.php [new file with mode: 0644]
tests/phan/stubs/wikidiff.php
tests/phpunit/HamcrestPHPUnitIntegration.php [new file with mode: 0644]
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/PHPUnit4And6Compat.php
tests/phpunit/includes/MediaWikiServicesTest.php
tests/phpunit/includes/Storage/NameTableStoreTest.php
tests/phpunit/includes/TestUserRegistry.php
tests/phpunit/includes/api/ApiMainTest.php
tests/phpunit/includes/api/ApiParseTest.php
tests/phpunit/includes/api/ApiTestCase.php
tests/phpunit/includes/api/ApiUserrightsTest.php [new file with mode: 0644]
tests/phpunit/includes/auth/AuthManagerTest.php
tests/phpunit/includes/db/LBFactoryTest.php
tests/phpunit/includes/db/LoadBalancerTest.php
tests/phpunit/includes/debug/logger/monolog/KafkaHandlerTest.php
tests/phpunit/includes/jobqueue/JobQueueTest.php
tests/phpunit/includes/libs/CSSMinTest.php
tests/phpunit/includes/libs/rdbms/database/DBConnRefTest.php
tests/phpunit/includes/parser/TidyTest.php
tests/phpunit/includes/registration/VersionCheckerTest.php
tests/phpunit/includes/specialpage/ChangesListSpecialPageTest.php
tests/phpunit/includes/utils/BatchRowUpdateTest.php
tests/phpunit/includes/watcheditem/WatchedItemQueryServiceUnitTest.php
tests/phpunit/includes/watcheditem/WatchedItemStoreUnitTest.php
tests/phpunit/phpunit.php
tests/selenium/selenium.sh [new file with mode: 0755]
tests/selenium/wdio.conf.jenkins.js [deleted file]
tests/selenium/wdio.conf.js

index cb9a20d..69a123c 100644 (file)
@@ -4,7 +4,6 @@ module.exports = function ( grunt ) {
 
        var wgServer = process.env.MW_SERVER,
                wgScriptPath = process.env.MW_SCRIPT_PATH,
-               WebdriverIOconfigFile,
                karmaProxy = {};
 
        grunt.loadNpmTasks( 'grunt-banana-checker' );
@@ -21,12 +20,6 @@ module.exports = function ( grunt ) {
                changeOrigin: true
        };
 
-       if ( process.env.JENKINS_HOME ) {
-               WebdriverIOconfigFile = './tests/selenium/wdio.conf.jenkins.js';
-       } else {
-               WebdriverIOconfigFile = './tests/selenium/wdio.conf.js';
-       }
-
        grunt.initConfig( {
                eslint: {
                        all: [
@@ -116,7 +109,7 @@ module.exports = function ( grunt ) {
                // Configure WebdriverIO task
                webdriver: {
                        test: {
-                               configFile: WebdriverIOconfigFile
+                               configFile: './tests/selenium/wdio.conf.js'
                        }
                }
 
index f40a422..0ae6a83 100644 (file)
@@ -31,6 +31,10 @@ production.
 * (T188472) The 'comma' value for $wgArticleCountMethod is no longer supported for
   performance reasons, and installations with this setting will now work as if it
   was configured with 'any'.
+* (T185753) MediaWiki now defaults to using RemexHtml to tidy up user input, rather than
+  being off by default. If you wish to disable HTML tidying entirely, set $wgTidyConfig
+  to null; if you wish to use the old, deprecated Tidy external binary, both
+  set $wgTidyConfig to null and also set $wgUseTidy to true.
 * $wgLogAutopatrol now defaults to false instead of true.
 * $wgValidateAllHtml was removed and will be ignored.
 
@@ -80,6 +84,12 @@ production.
   extensions. Pass --with-extensions to enable that feature.
 * (T184791) rc_patrolled now has three states: "0" for unpatrolled,
   "1" for manually patrolled and "2" for autopatrolled actions.
+* Extensions can now set their type to "editor" if they provide an editor
+  or enhance the editing experience.
+* Extensions can use a PSR-4 autoloader by setting an "AutoloadNamespaces" property
+  in extension.json. See
+  <https://www.mediawiki.org/wiki/Manual:Extension.json/Schema#AutoloadNamespaces>
+  for more details and an example.
 
 === External library changes in 1.31 ===
 
@@ -331,6 +341,8 @@ changes to languages because of Phabricator reports.
 * The type string for the parameter $lang of DateFormatter::getInstance is
   deprecated.
 * Wikimedia\Rdbms\SavepointPostgres is deprecated.
+* The DO_MAINTENANCE constant is deprecated. RUN_MAINTENANCE_IF_MAIN should be
+  used instead.
 
 === Other changes in 1.31 ===
 * Browser support for Internet Explorer 10 was lowered from Grade A to Grade C.
index 9cb4ba9..321a941 100644 (file)
@@ -59,7 +59,7 @@
                "monolog/monolog": "~1.22.1",
                "nikic/php-parser": "3.1.3",
                "nmred/kafka-php": "0.1.5",
-               "phpunit/phpunit": "4.8.36",
+               "phpunit/phpunit": "4.8.36 || ^6.5",
                "psy/psysh": "0.8.11",
                "wikimedia/avro": "1.8.0",
                "wikimedia/testing-access-wrapper": "~1.0",
index 22f587e..c12f2f2 100644 (file)
@@ -4264,8 +4264,9 @@ $wgAllowImageTag = false;
 
 /**
  * Configuration for HTML postprocessing tool. Set this to a configuration
- * array to enable an external tool. Dave Raggett's "HTML Tidy" is typically
- * used. See https://www.w3.org/People/Raggett/tidy/
+ * array to enable an external tool. By default, we now use the RemexHtml
+ * library; historically, Dave Raggett's "HTML Tidy" was typically used.
+ * See https://www.w3.org/People/Raggett/tidy/
  *
  * If this is null and $wgUseTidy is true, the deprecated configuration
  * parameters will be used instead.
@@ -4286,7 +4287,7 @@ $wgAllowImageTag = false;
  *  - tidyBin: For RaggettExternal, the path to the tidy binary.
  *  - tidyCommandLine: For RaggettExternal, additional command line options.
  */
-$wgTidyConfig = null;
+$wgTidyConfig = [ 'driver' => 'RemexHtml' ];
 
 /**
  * Set this to true to use the deprecated tidy configuration parameters.
@@ -6861,14 +6862,6 @@ $wgUseNPPatrol = true;
  */
 $wgUseFilePatrol = true;
 
-/**
- * Log autopatrol actions to the log table
- * The default used to be true before 1.31
- *
- * @since 1.22
- */
-$wgLogAutopatrol = false;
-
 /**
  * Provide syndication feeds (RSS, Atom) for, e.g., Recentchanges, Newpages
  */
index 46452d9..37d4632 100644 (file)
@@ -115,7 +115,8 @@ class PHPVersionCheck {
                                . "{$otherInfo['minSupported']}, you are using {$phpInfo['implementation']} "
                                . "{$phpInfo['version']}.";
 
-                       $longText = "Error: You might be using an older {$phpInfo['implementation']} version. \n"
+                       $longText = "Error: You might be using an older {$phpInfo['implementation']} version "
+                               . "({$phpInfo['implementation']} {$phpInfo['version']}). \n"
                                . "MediaWiki $this->mwVersion needs {$phpInfo['implementation']}"
                                . " $minimumVersion or higher or {$otherInfo['implementation']} version "
                                . "{$otherInfo['minSupported']}.\n\nCheck if you have a"
index a1eba74..ebce3da 100644 (file)
@@ -138,7 +138,7 @@ class NameTableStore {
                                // RACE: $name was already in the db, probably just inserted, so load from master
                                // Use DBO_TRX to avoid missing inserts due to other threads or REPEATABLE-READs
                                $table = $this->loadTable(
-                                       $this->getDBConnection( DB_MASTER, LoadBalancer::CONN_TRX_AUTO )
+                                       $this->getDBConnection( DB_MASTER, LoadBalancer::CONN_TRX_AUTOCOMMIT )
                                );
                                $searchResult = array_search( $name, $table, true );
                                if ( $searchResult === false ) {
@@ -321,7 +321,8 @@ class NameTableStore {
                                'name' => $this->nameField
                        ],
                        [],
-                       __METHOD__
+                       __METHOD__,
+                       [ 'ORDER BY' => 'id' ]
                );
 
                $assocArray = [];
index 584142b..1f0afae 100644 (file)
@@ -636,7 +636,7 @@ class RevisionStore
         */
        public function getRcIdIfUnpatrolled( RevisionRecord $rev ) {
                $rc = $this->getRecentChange( $rev );
-               if ( $rc && $rc->getAttribute( 'rc_patrolled' ) == 0 ) {
+               if ( $rc && $rc->getAttribute( 'rc_patrolled' ) == RecentChange::PRC_UNPATROLLED ) {
                        return $rc->getAttribute( 'rc_id' );
                } else {
                        return 0;
index cbd62a9..099d278 100644 (file)
@@ -243,12 +243,6 @@ class ApiParse extends ApiBase {
                        if ( $params['onlypst'] ) {
                                // Build a result and bail out
                                $result_array = [];
-                               if ( $this->contentIsDeleted ) {
-                                       $result_array['textdeleted'] = true;
-                               }
-                               if ( $this->contentIsSuppressed ) {
-                                       $result_array['textsuppressed'] = true;
-                               }
                                $result_array['text'] = $this->pstContent->serialize( $format );
                                $result_array[ApiResult::META_BC_SUBELEMENTS][] = 'text';
                                if ( isset( $prop['wikitext'] ) ) {
@@ -400,8 +394,8 @@ class ApiParse extends ApiBase {
                }
 
                if ( isset( $prop['displaytitle'] ) ) {
-                       $result_array['displaytitle'] = $p_result->getDisplayTitle() ?:
-                               $titleObj->getPrefixedText();
+                       $result_array['displaytitle'] = $p_result->getDisplayTitle() !== false
+                               ? $p_result->getDisplayTitle() : $titleObj->getPrefixedText();
                }
 
                if ( isset( $prop['headitems'] ) ) {
@@ -490,12 +484,7 @@ class ApiParse extends ApiBase {
                        }
 
                        $wgParser->startExternalParse( $titleObj, $popts, Parser::OT_PREPROCESS );
-                       $dom = $wgParser->preprocessToDom( $this->content->getNativeData() );
-                       if ( is_callable( [ $dom, 'saveXML' ] ) ) {
-                               $xml = $dom->saveXML();
-                       } else {
-                               $xml = $dom->__toString();
-                       }
+                       $xml = $wgParser->preprocessToDom( $this->content->getNativeData() )->__toString();
                        $result_array['parsetree'] = $xml;
                        $result_array[ApiResult::META_BC_SUBELEMENTS][] = 'parsetree';
                }
@@ -578,7 +567,7 @@ class ApiParse extends ApiBase {
                        } else {
                                $this->content = $page->getContent( Revision::FOR_THIS_USER, $this->getUser() );
                                if ( !$this->content ) {
-                                       $this->dieWithError( [ 'apierror-missingcontent-pageid', $pageId ] );
+                                       $this->dieWithError( [ 'apierror-missingcontent-pageid', $page->getId() ] );
                                }
                        }
                        $this->contentIsDeleted = $isDeleted;
@@ -602,7 +591,7 @@ class ApiParse extends ApiBase {
                        $pout = $page->getParserOutput( $popts, $revId, $suppressCache );
                }
                if ( !$pout ) {
-                       $this->dieWithError( [ 'apierror-nosuchrevid', $revId ?: $page->getLatest() ] );
+                       $this->dieWithError( [ 'apierror-nosuchrevid', $revId ?: $page->getLatest() ] ); // @codeCoverageIgnore
                }
 
                return $pout;
index 9ff4149..326debc 100644 (file)
@@ -235,15 +235,21 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        if ( isset( $show['unpatrolled'] ) ) {
                                // See ChangesList::isUnpatrolled
                                if ( $user->useRCPatrol() ) {
-                                       $this->addWhere( 'rc_patrolled = 0' );
+                                       $this->addWhere( 'rc_patrolled = ' . RecentChange::PRC_UNPATROLLED );
                                } elseif ( $user->useNPPatrol() ) {
-                                       $this->addWhere( 'rc_patrolled = 0' );
+                                       $this->addWhere( 'rc_patrolled = ' . RecentChange::PRC_UNPATROLLED );
                                        $this->addWhereFld( 'rc_type', RC_NEW );
                                }
                        }
 
-                       $this->addWhereIf( 'rc_patrolled != 2', isset( $show['!autopatrolled'] ) );
-                       $this->addWhereIf( 'rc_patrolled = 2', isset( $show['autopatrolled'] ) );
+                       $this->addWhereIf(
+                               'rc_patrolled != ' . RecentChange::PRC_AUTOPATROLLED,
+                               isset( $show['!autopatrolled'] )
+                       );
+                       $this->addWhereIf(
+                               'rc_patrolled = ' . RecentChange::PRC_AUTOPATROLLED,
+                               isset( $show['autopatrolled'] )
+                       );
 
                        // Don't throw log entries out the window here
                        $this->addWhereIf(
@@ -552,9 +558,9 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
 
                /* Add the patrolled flag */
                if ( $this->fld_patrolled ) {
-                       $vals['patrolled'] = $row->rc_patrolled != 0;
+                       $vals['patrolled'] = $row->rc_patrolled != RecentChange::PRC_UNPATROLLED;
                        $vals['unpatrolled'] = ChangesList::isUnpatrolled( $row, $user );
-                       $vals['autopatrolled'] = $row->rc_patrolled == 2;
+                       $vals['autopatrolled'] = $row->rc_patrolled == RecentChange::PRC_AUTOPATROLLED;
                }
 
                if ( $this->fld_loginfo && $row->rc_type == RC_LOG ) {
index f6bc8cb..12f42ed 100644 (file)
@@ -540,10 +540,22 @@ class ApiQueryContributions extends ApiQueryBase {
 
                        $this->addWhereIf( 'rev_minor_edit = 0', isset( $show['!minor'] ) );
                        $this->addWhereIf( 'rev_minor_edit != 0', isset( $show['minor'] ) );
-                       $this->addWhereIf( 'rc_patrolled = 0', isset( $show['!patrolled'] ) );
-                       $this->addWhereIf( 'rc_patrolled != 0', isset( $show['patrolled'] ) );
-                       $this->addWhereIf( 'rc_patrolled != 2', isset( $show['!autopatrolled'] ) );
-                       $this->addWhereIf( 'rc_patrolled = 2', isset( $show['autopatrolled'] ) );
+                       $this->addWhereIf(
+                               'rc_patrolled = ' . RecentChange::PRC_UNPATROLLED,
+                               isset( $show['!patrolled'] )
+                       );
+                       $this->addWhereIf(
+                               'rc_patrolled != ' . RecentChange::PRC_UNPATROLLED,
+                               isset( $show['patrolled'] )
+                       );
+                       $this->addWhereIf(
+                               'rc_patrolled != ' . RecentChange::PRC_AUTOPATROLLED,
+                               isset( $show['!autopatrolled'] )
+                       );
+                       $this->addWhereIf(
+                               'rc_patrolled = ' . RecentChange::PRC_AUTOPATROLLED,
+                               isset( $show['autopatrolled'] )
+                       );
                        $this->addWhereIf( $idField . ' != page_latest', isset( $show['!top'] ) );
                        $this->addWhereIf( $idField . ' = page_latest', isset( $show['top'] ) );
                        $this->addWhereIf( 'rev_parent_id != 0', isset( $show['!new'] ) );
index 52ad26c..bb09838 100644 (file)
@@ -375,9 +375,9 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase {
 
                /* Add the patrolled flag */
                if ( $this->fld_patrol ) {
-                       $vals['patrolled'] = $recentChangeInfo['rc_patrolled'] != 0;
+                       $vals['patrolled'] = $recentChangeInfo['rc_patrolled'] != RecentChange::PRC_UNPATROLLED;
                        $vals['unpatrolled'] = ChangesList::isUnpatrolled( (object)$recentChangeInfo, $user );
-                       $vals['autopatrolled'] = $recentChangeInfo['rc_patrolled'] == 2;
+                       $vals['autopatrolled'] = $recentChangeInfo['rc_patrolled'] == RecentChange::PRC_AUTOPATROLLED;
                }
 
                if ( $this->fld_loginfo && $recentChangeInfo['rc_type'] == RC_LOG ) {
index 3813aba..56c2c84 100644 (file)
@@ -58,14 +58,16 @@ class ApiUserrights extends ApiBase {
                $params = $this->extractRequestParams();
 
                // Figure out expiry times from the input
-               // $params['expiry'] may not be set in subclasses
+               // $params['expiry'] is not set in CentralAuth's ApiGlobalUserRights subclass
                if ( isset( $params['expiry'] ) ) {
                        $expiry = (array)$params['expiry'];
                } else {
                        $expiry = [ 'infinity' ];
                }
                $add = (array)$params['add'];
-               if ( count( $expiry ) !== count( $add ) ) {
+               if ( !$add ) {
+                       $expiry = [];
+               } elseif ( count( $expiry ) !== count( $add ) ) {
                        if ( count( $expiry ) === 1 ) {
                                $expiry = array_fill( 0, count( $add ), $expiry[0] );
                        } else {
@@ -186,6 +188,7 @@ class ApiUserrights extends ApiBase {
                                ApiBase::PARAM_ISMULTI => true
                        ],
                ];
+               // CentralAuth's ApiGlobalUserRights subclass can't handle expiries
                if ( !$this->getUserRightsPage()->canProcessExpiries() ) {
                        unset( $a['expiry'] );
                }
index 30b262e..5ce2331 100644 (file)
                        "Umherirrender",
                        "Thibaut120094",
                        "KATRINE1992",
-                       "Kenjiraw"
+                       "Kenjiraw",
+                       "Framawiki"
                ]
        },
-       "apihelp-main-extended-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Documentation]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Liste de diffusion]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annonces de l’API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bogues et demandes]\n</div>\n<strong>État :</strong>L’API MédiaWiki est une interface stable et mature qui est supportée et améliorée de façon active. Bien que nous essayions de l’éviter, nous pouvons avoir parfois besoin de faire des modifications impactantes ; inscrivez-vous à [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la liste de diffusion mediawiki-api-announce] pour être informé des mises à jour.\n\n<strong>Requêtes erronées :</strong> Si des requêtes erronées sont envoyées à l’API, un entête HTTP sera renvoyé avec la clé « MediaWiki-API-Error ». La valeur de cet entête et le code d’erreur renvoyé prendront la même valeur. Pour plus d’information, voyez [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Errors and warnings]].\n\n<p class=\"mw-apisandbox-link\"><strong>Test :</strong> Pour faciliter le test des requêtes de l’API, voyez [[Special:ApiSandbox]].</p>",
+       "apihelp-main-extended-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Documentation]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Liste de diffusion]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annonces de l’API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bogues et demandes]\n</div>\n<strong>État :</strong> L’API MédiaWiki est une interface stable et mature qui est supportée et améliorée de façon active. Bien que nous essayions de l’éviter, nous pouvons avoir parfois besoin de faire des modifications impactantes ; inscrivez-vous à [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la liste de diffusion mediawiki-api-announce] pour être informé des mises à jour.\n\n<strong>Requêtes erronées :</strong> Si des requêtes erronées sont envoyées à l’API, un entête HTTP sera renvoyé avec la clé « MediaWiki-API-Error ». La valeur de cet entête et le code d’erreur renvoyé prendront la même valeur. Pour plus d’information, voyez [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Errors and warnings]].\n\n<p class=\"mw-apisandbox-link\"><strong>Test :</strong> Pour faciliter le test des requêtes de l’API, voyez [[Special:ApiSandbox]].</p>",
        "apihelp-main-param-action": "Quelle action effectuer.",
        "apihelp-main-param-format": "Le format de sortie.",
        "apihelp-main-param-maxlag": "La latence maximale peut être utilisée quand MédiaWiki est installé sur un cluster de base de données répliqué. Pour éviter des actions provoquant un supplément de latence de réplication de site, ce paramètre peut faire attendre le client jusqu’à ce que la latence de réplication soit inférieure à une valeur spécifiée. En cas de latence excessive, le code d’erreur <samp>maxlag</samp> est renvoyé avec un message tel que <samp>Attente de $host : $lag secondes de délai</samp>.<br />Voyez [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Manuel: Maxlag parameter]] pour plus d’information.",
index c6810a9..aaa6aed 100644 (file)
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=חייב להיות ריק|יכול להיות ריק או $2}}",
        "api-help-param-limit": "מספר הפרמטרים לא יכול להיות גדול מ־$1.",
        "api-help-param-limit2": "המספר המרבי המותר הוא $1 (עבור בוטים – $2).",
-       "api-help-param-integer-min": "ה{{PLURAL:$1|1=ערך|2=ערכים}} לא יכולים להיות קטנים מ־$2.",
-       "api-help-param-integer-max": "ה{{PLURAL:$1|1=ערך לא יכול להיות גדול|2=ערכים לא יכולים להיות גדולים}} מ־$3.",
-       "api-help-param-integer-minmax": "ה{{PLURAL:$1|1=ערך חייב|2=ערכים חייבים}} להיות בין $2 ל־$3.",
+       "api-help-param-integer-min": "{{PLURAL:$1|1=הערך לא יכול להיות קטן|2=הערכים לא יכולים להיות קטנים}} מ־$2.",
+       "api-help-param-integer-max": "{{PLURAL:$1|1=הערך לא יכול להיות גדול|2=הערכים לא יכולים להיות גדולים}} מ־$3.",
+       "api-help-param-integer-minmax": "{{PLURAL:$1|1=הערך חייב|2=הערכים חייבים}} להיות בין $2 ל־$3.",
        "api-help-param-upload": "חייב להישלח (posted) בתור העלאת קובץ באמצעות multipart/form-data.",
        "api-help-param-multi-separate": "הפרדה בין ערכים נעשית באמצעות <kbd>|</kbd> או [[Special:ApiHelp/main#main/datatypes|תו חלופי]].",
        "api-help-param-multi-max": "מספר הערכים המרבי הוא {{PLURAL:$1|$1}} (עבור בוטים – {{PLURAL:$2|$2}}).",
index 1e550ad..9330ca7 100644 (file)
@@ -26,7 +26,7 @@
        "apihelp-main-param-assert": "Verifique se o usuário está logado se configurado para <kbd>user</kbd> ou tem o direito do usuário do bot se <kbd>bot</kbd>.",
        "apihelp-main-param-assertuser": "Verificar que o usuário atual é o utilizador nomeado.",
        "apihelp-main-param-requestid": "Qualquer valor dado aqui será incluído na resposta. Pode ser usado para distinguir requisições.",
-       "apihelp-main-param-servedby": "Inclua o nome de host que atendeu a solicitação nos resultados.",
+       "apihelp-main-param-servedby": "Incluir nos resultados o nome do servidor que serviu o pedido.",
        "apihelp-main-param-curtimestamp": "Inclui o timestamp atual no resultado.",
        "apihelp-main-param-responselanginfo": "Inclua os idiomas usados para <var>uselang</var> e <var>errorlang</var> no resultado.",
        "apihelp-main-param-origin": "Ao acessar a API usando uma solicitação AJAX por domínio cruzado (CORS), defina isto como o domínio de origem. Isto deve estar incluso em toda solicitação ''pre-flight'', sendo portanto parte do URI da solicitação (ao invés do corpo do POST).\n\nPara solicitações autenticadas, isto deve corresponder a uma das origens no cabeçalho <code>Origin</code>, para que seja algo como <kbd>https://pt.wikipedia.org</kbd> ou <kbd>https://meta.wikimedia.org</kbd>. Se este parâmetro não corresponder ao cabeçalho <code>Origin</code>, uma resposta 403 será retornada. Se este parâmetro corresponder ao cabeçalho <code>Origin</code> e a origem for permitida (''whitelisted''), os cabeçalhos <code>Access-Control-Allow-Origin</code> e <code>Access-Control-Allow-Credentials</code> serão definidos.\n\nPara solicitações não autenticadas, especifique o valor <kbd>*</kbd>. Isto fará com que o cabeçalho <code>Access-Control-Allow-Origin</code> seja definido, porém o <code>Access-Control-Allow-Credentials</code> será <code>false</code> e todos os dados específicos para usuários tornar-se-ão restritos.",
        "apihelp-query+info-paramvalue-prop-readable": "Se o usuário pode ler esta página.",
        "apihelp-query+info-paramvalue-prop-preload": "Fornece o texto retornado por EditFormPreloadText.",
        "apihelp-query+info-paramvalue-prop-displaytitle": "Fornece o modo como o título da página é exibido.",
+       "apihelp-query+info-paramvalue-prop-varianttitles": "Fornece o título de apresentação em todas as variantes da língua de conteúdo da wiki.",
        "apihelp-query+info-param-testactions": "Testa se o usuário atual pode executar determinadas ações na página.",
        "apihelp-query+info-param-token": "Use [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] em vez.",
        "apihelp-query+info-example-simple": "Obter informações sobre a página <kbd>Main Page</kbd>.",
index 1ee4405..7c8c169 100644 (file)
@@ -29,7 +29,8 @@
                        "Facenapalm",
                        "Jack who built the house",
                        "Mouse21",
-                       "Happy13241"
+                       "Happy13241",
+                       "Ole Yves"
                ]
        },
        "apihelp-main-extended-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Документация]]\n* [[mw:Special:MyLanguage/API:FAQ|ЧаВО]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Почтовая рассылка]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Новости API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Ошибки и запросы]\n</div>\n<strong>Статус:</strong> MediaWiki API — зрелый и стабильный интерфейс, активно поддерживаемый и улучшаемый. Мы стараемся избегать ломающих изменений, однако изредка они могут быть необходимы. Подпишитесь на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ почтовую рассылку mediawiki-api-announce], чтобы быть в курсе обновлений.\n\n<strong>Ошибочные запросы:</strong> Если API получает запрос с ошибкой, вернётся заголовок HTTP с ключом «MediaWiki-API-Error», после чего значение заголовка и код ошибки будут отправлены обратно и установлены в то же значение. Более подробную информацию см. [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Ошибки и предупреждения]].\n\n<p class=\"mw-apisandbox-link\"><strong>Тестирование:</strong> для удобства тестирования API-запросов, см. [[Special:ApiSandbox]].</p>",
        "apihelp-opensearch-summary": "Поиск по вики с использованием протокола OpenSearch.",
        "apihelp-opensearch-param-search": "Строка поиска.",
        "apihelp-opensearch-param-limit": "Максимальное число возвращаемых результатов.",
-       "apihelp-opensearch-param-namespace": "Пространства имён для поиска.",
+       "apihelp-opensearch-param-namespace": "Пространства имён для поиска. Игнорируется, если <var>$1search</var> начинается с корректного префикса пространства имён.",
        "apihelp-opensearch-param-suggest": "Ничего не делать, если <var>[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> ложно.",
        "apihelp-opensearch-param-redirects": "Как обрабатывать перенаправления:\n;return: Вернуть само перенаправление.\n;resolve: Вернуть целевую страницу. Может вернуть меньше $1limit результатов.\nПо историческим причинам значением по умолчанию является «return» для $1format=json и «resolve» для остальных форматов.",
        "apihelp-opensearch-param-format": "Формат вывода.",
        "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": "Теги patrollable Ñ\80едакÑ\82иÑ\80ованиÑ\8f ÐºÐ°Ðº Ð°Ð²Ñ\82омаÑ\82иÑ\87еÑ\81кие Ð¸Ð»Ð¸ Ð½ÐµÑ\82.",
+       "apihelp-query+recentchanges-paramvalue-prop-autopatrolled": "Ð\9eÑ\82меÑ\87аеÑ\82 Ð¿Ð°Ñ\82Ñ\80Ñ\83лиÑ\80Ñ\83емÑ\8bе Ð¿Ñ\80авки ÐºÐ°Ðº Ð¾Ñ\82паÑ\82Ñ\80Ñ\83лиÑ\80ованнÑ\8bе Ð¸Ð»Ð¸ Ð½ÐµÐ¾Ñ\82паÑ\82Ñ\80Ñ\83лиÑ\80ованнÑ\8bе.",
        "apihelp-query+recentchanges-paramvalue-prop-loginfo": "Добавляет информацию о записи журнала (идентификатор записи, её тип, и так далее).",
        "apihelp-query+recentchanges-paramvalue-prop-tags": "Перечисляет метки записи.",
        "apihelp-query+recentchanges-paramvalue-prop-sha1": "Добавляет значение контрольных сумм для записей, связанных с версией.",
        "apihelp-query+usercontribs-paramvalue-prop-sizediff": "Добавляет разницу между размерами страницы до и после правки.",
        "apihelp-query+usercontribs-paramvalue-prop-flags": "Добавляет флаги правки.",
        "apihelp-query+usercontribs-paramvalue-prop-patrolled": "Отмечает отпатрулированные правки.",
-       "apihelp-query+usercontribs-paramvalue-prop-autopatrolled": "Теги Ð°Ð²Ñ\82омаÑ\82иÑ\87еÑ\81ки Ñ\80едакÑ\82иÑ\80Ñ\83Ñ\8eÑ\82Ñ\81Ñ\8f.",
+       "apihelp-query+usercontribs-paramvalue-prop-autopatrolled": "Ð\9eÑ\82меÑ\87аеÑ\82 Ð°Ð²Ñ\82омаÑ\82иÑ\87еÑ\81ки Ð¾Ñ\82паÑ\82Ñ\80Ñ\83лиÑ\80ованнÑ\8bе Ð¿Ñ\80авки.",
        "apihelp-query+usercontribs-paramvalue-prop-tags": "Перечисляет метки правки.",
        "apihelp-query+usercontribs-param-show": "Показать только элементы, удовлетворяющие данным критериям, например, только не малые правки: <kbd>$2show=!minor</kbd>.\n\nЕсли установлено <kbd>$2show=patrolled</kbd> или <kbd>$2show=!patrolled</kbd>, правки старее <var>[[mw:Special:MyLanguage/Manual:$wgRCMaxAge|$wgRCMaxAge]]</var> ($1 {{PLURAL:$1|секунды|секунд}}) не будут показаны.",
        "apihelp-query+usercontribs-param-tag": "Только правки с заданной меткой.",
        "apihelp-query+watchlist-paramvalue-prop-parsedcomment": "Добавляет распарсенное описание правки.",
        "apihelp-query+watchlist-paramvalue-prop-timestamp": "Добавляет временную метку правки.",
        "apihelp-query+watchlist-paramvalue-prop-patrol": "Определяет, была ли правка отпатрулирована.",
-       "apihelp-query+watchlist-paramvalue-prop-autopatrol": "Ð\98Ñ\81пÑ\80авленÑ\8b Ñ\82еги, ÐºÐ¾Ñ\82оÑ\80Ñ\8bе Ð°Ð²Ñ\82омаÑ\82иÑ\87еÑ\81ки Ð¾Ð±Ñ\80абаÑ\82Ñ\8bваÑ\8eÑ\82Ñ\81Ñ\8f.",
+       "apihelp-query+watchlist-paramvalue-prop-autopatrol": "Ð\9eÑ\82меÑ\87аеÑ\82 Ð°Ð²Ñ\82омаÑ\82иÑ\87еÑ\81ки Ð¾Ñ\82паÑ\82Ñ\80Ñ\83лиÑ\80ованнÑ\8bе Ð¿Ñ\80авки.",
        "apihelp-query+watchlist-paramvalue-prop-sizes": "Добавляет старую и новую длину страницы.",
        "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "Добавляет метку времени, когда участник был уведомлён о правке.",
        "apihelp-query+watchlist-paramvalue-prop-loginfo": "Добавляет информацию о журнале, где уместно.",
index d22ec34..ebb0b45 100644 (file)
        "apihelp-query+extlinks-param-limit": "Hur många länkar som ska returneras.",
        "apihelp-query+extlinks-example-simple": "Hämta en lista över externa länkar på <kbd>Main Page</kbd>.",
        "apihelp-query+exturlusage-param-limit": "Hur många sidor att returnera.",
+       "apihelp-query+exturlusage-example-simple": "Visa sidor som länkar till <kbd>https://www.mediawiki.org</kbd>.",
        "apihelp-query+filearchive-param-limit": "Hur många bilder att returnera totalt.",
        "apihelp-query+filearchive-param-dir": "Riktningen att lista mot.",
        "apihelp-query+filearchive-paramvalue-prop-timestamp": "Lägger till tidsstämpel för den uppladdade versionen.",
index b051120..8e8b93f 100644 (file)
@@ -622,7 +622,7 @@ class RecentChange {
                $dbw->update(
                        'recentchanges',
                        [
-                               'rc_patrolled' => 1
+                               'rc_patrolled' => self::PRC_PATROLLED
                        ],
                        [
                                'rc_id' => $this->getAttribute( 'rc_id' )
@@ -704,9 +704,6 @@ class RecentChange {
                        function () use ( $rc, $tags ) {
                                $rc->addTags( $tags );
                                $rc->save();
-                               if ( $rc->mAttribs['rc_patrolled'] ) {
-                                       PatrolLog::record( $rc, true, $rc->getPerformer() );
-                               }
                        },
                        DeferredUpdates::POSTSEND,
                        wfGetDB( DB_MASTER )
@@ -780,9 +777,6 @@ class RecentChange {
                        function () use ( $rc, $tags ) {
                                $rc->addTags( $tags );
                                $rc->save();
-                               if ( $rc->mAttribs['rc_patrolled'] ) {
-                                       PatrolLog::record( $rc, true, $rc->getPerformer() );
-                               }
                        },
                        DeferredUpdates::POSTSEND,
                        wfGetDB( DB_MASTER )
@@ -890,7 +884,7 @@ class RecentChange {
                        'rc_last_oldid' => 0,
                        'rc_bot' => $user->isAllowed( 'bot' ) ? (int)$wgRequest->getBool( 'bot', true ) : 0,
                        'rc_ip' => self::checkIPAddress( $ip ),
-                       'rc_patrolled' => $markPatrolled ? 1 : 0,
+                       'rc_patrolled' => $markPatrolled ? self::PRC_PATROLLED : self::PRC_UNPATROLLED,
                        'rc_new' => 0, # obsolete
                        'rc_old_len' => null,
                        'rc_new_len' => null,
@@ -976,7 +970,7 @@ class RecentChange {
                        'rc_last_oldid' => $oldRevId,
                        'rc_bot' => $bot ? 1 : 0,
                        'rc_ip' => self::checkIPAddress( $ip ),
-                       'rc_patrolled' => 1, // Always patrolled, just like log entries
+                       'rc_patrolled' => self::PRC_PATROLLED, // Always patrolled, just like log entries
                        'rc_new' => 0, # obsolete
                        'rc_old_len' => null,
                        'rc_new_len' => null,
index 037a80f..8f57c57 100644 (file)
@@ -542,7 +542,7 @@ class DifferenceEngine extends ContextSource {
                                [
                                        'rc_timestamp' => $db->timestamp( $this->mNewRev->getTimestamp() ),
                                        'rc_this_oldid' => $this->mNewid,
-                                       'rc_patrolled' => 0
+                                       'rc_patrolled' => RecentChange::PRC_UNPATROLLED
                                ],
                                __METHOD__
                        );
index 7fc45eb..0464f07 100644 (file)
@@ -3344,9 +3344,9 @@ class LocalFileMoveBatch {
                        __METHOD__,
                        [ 'FOR UPDATE' ]
                );
-               $oldRowCount = $dbw->selectField(
+               $oldRowCount = $dbw->selectRowCount(
                        'oldimage',
-                       'COUNT(*)',
+                       '*',
                        [ 'oi_name' => $this->oldName ],
                        __METHOD__,
                        [ 'FOR UPDATE' ]
index 3183297..09e40a2 100644 (file)
@@ -58,6 +58,15 @@ abstract class ImageGalleryBase extends ContextSource {
         */
        protected $mCaption = false;
 
+       /**
+        * Length to truncate filename to in caption when using "showfilename".
+        * A value of 'true' will truncate the filename to one line using CSS
+        * and will be the behaviour after deprecation.
+        *
+        * @var bool|int
+        */
+       protected $mCaptionLength = true;
+
        /**
         * @var bool Hide blacklisted images?
         */
index 7a520bc..1cb7e6d 100644 (file)
@@ -195,13 +195,13 @@ class TraditionalImageGallery extends ImageGalleryBase {
                                Linker::linkKnown(
                                        $nt,
                                        htmlspecialchars(
-                                               $this->mCaptionLength !== true ?
-                                                       $lang->truncate( $nt->getText(), $this->mCaptionLength ) :
+                                               is_int( $this->getCaptionLength() ) ?
+                                                       $lang->truncate( $nt->getText(), $this->getCaptionLength() ) :
                                                        $nt->getText()
                                        ),
                                        [
                                                'class' => 'galleryfilename' .
-                                                       ( $this->mCaptionLength === true ? ' galleryfilename-truncate' : '' )
+                                                       ( $this->getCaptionLength() === true ? ' galleryfilename-truncate' : '' )
                                        ]
                                ) . "\n" :
                                '';
@@ -209,11 +209,15 @@ class TraditionalImageGallery extends ImageGalleryBase {
                        $galleryText = $textlink . $text . $meta;
                        $galleryText = $this->wrapGalleryText( $galleryText, $thumb );
 
+                       $gbWidth = $this->getGBWidth( $thumb ) . 'px';
+                       if ( $this->getGBWidthOverwrite( $thumb ) ) {
+                               $gbWidth = $this->getGBWidthOverwrite( $thumb );
+                       }
                        # Weird double wrapping (the extra div inside the li) needed due to FF2 bug
                        # Can be safely removed if FF2 falls completely out of existence
                        $output .= "\n\t\t" . '<li class="gallerybox" style="width: '
-                               . $this->getGBWidth( $thumb ) . 'px">'
-                               . '<div style="width: ' . $this->getGBWidth( $thumb ) . 'px">'
+                               . $gbWidth . '">'
+                               . '<div style="width: ' . $gbWidth . '">'
                                . $thumbhtml
                                . $galleryText
                                . "\n\t\t</div></li>";
@@ -272,6 +276,17 @@ class TraditionalImageGallery extends ImageGalleryBase {
                return 8;
        }
 
+       /**
+        * Length to truncate filename to in caption when using "showfilename" (if int).
+        * A value of 'true' will truncate the filename to one line using CSS, while
+        * 'false' will disable truncating.
+        *
+        * @return int|bool
+        */
+       protected function getCaptionLength() {
+               return $this->mCaptionLength;
+       }
+
        /**
         * Get total padding.
         *
@@ -319,7 +334,7 @@ class TraditionalImageGallery extends ImageGalleryBase {
        }
 
        /**
-        * Width of gallerybox <li>.
+        * Computed width of gallerybox <li>.
         *
         * Generally is the width of the image, plus padding on image
         * plus padding on gallerybox.
@@ -332,6 +347,21 @@ class TraditionalImageGallery extends ImageGalleryBase {
                return $this->mWidths + $this->getThumbPadding() + $this->getGBPadding();
        }
 
+       /**
+        * Allows overwriting the computed width of the gallerybox <li> with a string,
+        * like '100%'.
+        *
+        * Generally is the width of the image, plus padding on image
+        * plus padding on gallerybox.
+        *
+        * @note Important: parameter will be false if no thumb used.
+        * @param MediaTransformOutput|bool $thumb MediaTransformObject object or false.
+        * @return bool|string Ignored if false.
+        */
+       protected function getGBWidthOverwrite( $thumb ) {
+               return false;
+       }
+
        /**
         * Get a list of modules to include in the page.
         *
index f47e3f7..b002d85 100644 (file)
@@ -95,7 +95,7 @@
        "config-no-uri": "'''Ошибка:''' Не могу определить текущий URI.\nУстановка прервана.",
        "config-no-cli-uri": "'''Предупреждение''': нет задан параметр <code>--scriptpath</code>, используется по умолчанию: <code>$1</code> .",
        "config-using-server": "Используется имя сервера «<nowiki>$1</nowiki>».",
-       "config-using-uri": "Используется имя сервера \"<nowiki>$1$2</nowiki>\".",
+       "config-using-uri": "Используется URL сервера \"<nowiki>$1$2</nowiki>\".",
        "config-uploads-not-safe": "'''Внимание:''' директория, используемая по умолчанию для загрузок (<code>$1</code>) уязвима к выполнению произвольных скриптов.\nХотя MediaWiki проверяет все загружаемые файлы на наличие угроз, настоятельно рекомендуется [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security закрыть данную уязвимость] перед включением загрузки файлов.",
        "config-no-cli-uploads-check": "'''Предупреждение:''' каталог для загрузки по умолчанию ( <code>$1</code> ) не проверялся на уязвимости\n на выполнение произвольного сценария во время установки CLI.",
        "config-brokenlibxml": "В вашей системе имеется сочетание версий PHP и libxml2, которое может привести к скрытым повреждениям данных в MediaWiki и других веб-приложениях.\nОбновите libxml2 до версии 2.7.3 или старше ([https://bugs.php.net/bug.php?id=45996 сведения об ошибке]).\nУстановка прервана.",
index b68fdae..f01ba63 100644 (file)
@@ -190,7 +190,7 @@ class JobQueueDB extends JobQueue {
                // If the connection is busy with a transaction, then defer the job writes
                // until right before the main round commit step. Any errors that bubble
                // up will rollback the main commit round.
-               // b) mysql/postgres; DB connection is generally a separate CONN_TRX_AUTO handle.
+               // b) mysql/postgres; DB connection is generally a separate CONN_TRX_AUTOCOMMIT handle.
                // No transaction is active nor will be started by writes, so enqueue the jobs
                // now so that any errors will show up immediately as the interface expects. Any
                // errors that bubble up will rollback the main commit round.
@@ -780,7 +780,7 @@ class JobQueueDB extends JobQueue {
                return ( $lb->getServerType( $lb->getWriterIndex() ) !== 'sqlite' )
                        // Keep a separate connection to avoid contention and deadlocks;
                        // However, SQLite has the opposite behavior due to DB-level locking.
-                       ? $lb->getConnectionRef( $index, [], $this->wiki, $lb::CONN_TRX_AUTO )
+                       ? $lb->getConnectionRef( $index, [], $this->wiki, $lb::CONN_TRX_AUTOCOMMIT )
                        // Jobs insertion will be defered until the PRESEND stage to reduce contention.
                        : $lb->getConnectionRef( $index, [], $this->wiki );
        }
index 1cbcbde..73825e8 100644 (file)
@@ -173,18 +173,14 @@ class CSSMin {
 
        /**
         * Serialize a string (escape and quote) for use as a CSS string value.
-        * http://www.w3.org/TR/2013/WD-cssom-20131205/#serialize-a-string
+        * https://www.w3.org/TR/2016/WD-cssom-1-20160317/#serialize-a-string
         *
         * @param string $value
         * @return string
-        * @throws Exception
         */
        public static function serializeStringValue( $value ) {
-               if ( strstr( $value, "\0" ) ) {
-                       throw new Exception( "Invalid character in CSS string" );
-               }
-               $value = strtr( $value, [ '\\' => '\\\\', '"' => '\\"' ] );
-               $value = preg_replace_callback( '/[\x01-\x1f\x7f-\x9f]/', function ( $match ) {
+               $value = strtr( $value, [ "\0" => "\\fffd ", '\\' => '\\\\', '"' => '\\"' ] );
+               $value = preg_replace_callback( '/[\x01-\x1f\x7f]/', function ( $match ) {
                        return '\\' . base_convert( ord( $match[0] ), 10, 16 ) . ' ';
                }, $value );
                return '"' . $value . '"';
index 9638706..7915ccf 100644 (file)
@@ -39,19 +39,7 @@ class StringUtils {
         * @return bool Whether the given $value is a valid UTF-8 encoded string
         */
        static function isUtf8( $value ) {
-               $value = (string)$value;
-
-               // HHVM 3.4 and older come with an outdated version of libmbfl that
-               // incorrectly allows values above U+10FFFF, so we have to check
-               // for them separately. (This issue also exists in PHP 5.3 and
-               // older, which are no longer supported.)
-               static $newPHP;
-               if ( $newPHP === null ) {
-                       $newPHP = !mb_check_encoding( "\xf4\x90\x80\x80", 'UTF-8' );
-               }
-
-               return mb_check_encoding( $value, 'UTF-8' ) &&
-                       ( $newPHP || preg_match( "/\xf4[\x90-\xbf]|[\xf5-\xff]/S", $value ) === 0 );
+               return mb_check_encoding( (string)$value, 'UTF-8' );
        }
 
        /**
index f681795..1779880 100644 (file)
@@ -1181,8 +1181,7 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
                                        } else {
                                                # Nothing prior was there to lose from the transaction,
                                                # so just roll it back.
-                                               $this->doRollback( __METHOD__ . " ($fname)" );
-                                               $this->trxStatus = self::STATUS_TRX_OK;
+                                               $this->rollback( __METHOD__ . " ($fname)", self::FLUSHING_INTERNAL );
                                        }
                                        $this->trxStatusIgnoredCause = null;
                                } else {
index 601a62f..a6a153a 100644 (file)
@@ -120,7 +120,7 @@ class DatabaseSqlite extends Database {
        protected function doInitConnection() {
                if ( $this->dbPath !== null ) {
                        // Standalone .sqlite file mode.
-                       $this->openFile( $this->dbPath );
+                       $this->openFile( $this->dbPath, $this->connectionParams['dbname'] );
                } elseif ( $this->dbDir !== null ) {
                        // Stock wiki mode using standard file names per DB
                        if ( strlen( $this->connectionParams['dbname'] ) ) {
@@ -173,11 +173,7 @@ class DatabaseSqlite extends Database {
                        $this->conn = false;
                        throw new DBConnectionError( $this, "SQLite database not accessible" );
                }
-               $this->openFile( $fileName );
-
-               if ( $this->conn ) {
-                       $this->dbName = $dbName;
-               }
+               $this->openFile( $fileName, $dbName );
 
                return (bool)$this->conn;
        }
@@ -186,10 +182,11 @@ class DatabaseSqlite extends Database {
         * Opens a database file
         *
         * @param string $fileName
+        * @param string $dbName
         * @throws DBConnectionError
         * @return PDO|bool SQL connection or false if failed
         */
-       protected function openFile( $fileName ) {
+       protected function openFile( $fileName, $dbName ) {
                $err = false;
 
                $this->dbPath = $fileName;
@@ -211,6 +208,7 @@ class DatabaseSqlite extends Database {
 
                $this->opened = is_object( $this->conn );
                if ( $this->opened ) {
+                       $this->dbName = $dbName;
                        # Set error codes only, don't raise exceptions
                        $this->conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT );
                        # Enforce LIKE to be case sensitive, just like MySQL
@@ -1081,6 +1079,16 @@ class DatabaseSqlite extends Database {
                }
        }
 
+       public function resetSequenceForTable( $table, $fname = __METHOD__ ) {
+               $encTable = $this->addIdentifierQuotes( 'sqlite_sequence' );
+               $encName = $this->addQuotes( $this->tableName( $table, 'raw' ) );
+               $this->query( "DELETE FROM $encTable WHERE name = $encName", $fname );
+       }
+
+       public function databasesAreIndependent() {
+               return true;
+       }
+
        /**
         * @return string
         */
index 715f4e4..a699b23 100644 (file)
@@ -85,6 +85,8 @@ interface ILoadBalancer {
        const DOMAIN_ANY = '';
 
        /** @var int DB handle should have DBO_TRX disabled and the caller will leave it as such */
+       const CONN_TRX_AUTOCOMMIT = 1;
+       /** @var int Alias for CONN_TRX_AUTOCOMMIT for b/c; deprecated since 1.31 */
        const CONN_TRX_AUTO = 1;
 
        /**
@@ -173,15 +175,15 @@ interface ILoadBalancer {
        /**
         * Get a connection handle by server index
         *
-        * The CONN_TRX_AUTO flag is ignored for databases with ATTR_DB_LEVEL_LOCKING
+        * The CONN_TRX_AUTOCOMMIT flag is ignored for databases with ATTR_DB_LEVEL_LOCKING
         * (e.g. sqlite) in order to avoid deadlocks. ILoadBalancer::getServerAttributes()
         * can be used to check such flags beforehand.
         *
-        * If the caller uses $domain or sets CONN_TRX_AUTO in $flags, then it must also
+        * If the caller uses $domain or sets CONN_TRX_AUTOCOMMIT in $flags, then it must also
         * call ILoadBalancer::reuseConnection() on the handle when finished using it.
         * In all other cases, this is not necessary, though not harmful either.
         *
-        * @param int $i Server index or DB_MASTER/DB_REPLICA
+        * @param int $i Server index (overrides $groups) or DB_MASTER/DB_REPLICA
         * @param array|string|bool $groups Query group(s), or false for the generic reader
         * @param string|bool $domain Domain ID, or false for the current domain
         * @param int $flags Bitfield of CONN_* class constants
@@ -209,7 +211,7 @@ interface ILoadBalancer {
         *
         * The handle's methods simply wrap those of a Database handle
         *
-        * The CONN_TRX_AUTO flag is ignored for databases with ATTR_DB_LEVEL_LOCKING
+        * The CONN_TRX_AUTOCOMMIT flag is ignored for databases with ATTR_DB_LEVEL_LOCKING
         * (e.g. sqlite) in order to avoid deadlocks. ILoadBalancer::getServerAttributes()
         * can be used to check such flags beforehand.
         *
@@ -218,7 +220,7 @@ interface ILoadBalancer {
         * @param int $i Server index or DB_MASTER/DB_REPLICA
         * @param array|string|bool $groups Query group(s), or false for the generic reader
         * @param string|bool $domain Domain ID, or false for the current domain
-        * @param int $flags Bitfield of CONN_* class constants (e.g. CONN_TRX_AUTO)
+        * @param int $flags Bitfield of CONN_* class constants (e.g. CONN_TRX_AUTOCOMMIT)
         * @return DBConnRef
         */
        public function getConnectionRef( $i, $groups = [], $domain = false, $flags = 0 );
@@ -228,7 +230,7 @@ interface ILoadBalancer {
         *
         * The handle's methods simply wrap those of a Database handle
         *
-        * The CONN_TRX_AUTO flag is ignored for databases with ATTR_DB_LEVEL_LOCKING
+        * The CONN_TRX_AUTOCOMMIT flag is ignored for databases with ATTR_DB_LEVEL_LOCKING
         * (e.g. sqlite) in order to avoid deadlocks. ILoadBalancer::getServerAttributes()
         * can be used to check such flags beforehand.
         *
@@ -237,7 +239,7 @@ interface ILoadBalancer {
         * @param int $i Server index or DB_MASTER/DB_REPLICA
         * @param array|string|bool $groups Query group(s), or false for the generic reader
         * @param string|bool $domain Domain ID, or false for the current domain
-        * @param int $flags Bitfield of CONN_* class constants (e.g. CONN_TRX_AUTO)
+        * @param int $flags Bitfield of CONN_* class constants (e.g. CONN_TRX_AUTOCOMMIT)
         * @return DBConnRef
         */
        public function getLazyConnectionRef( $i, $groups = [], $domain = false, $flags = 0 );
@@ -247,7 +249,7 @@ interface ILoadBalancer {
         *
         * The handle's methods simply wrap those of a Database handle
         *
-        * The CONN_TRX_AUTO flag is ignored for databases with ATTR_DB_LEVEL_LOCKING
+        * The CONN_TRX_AUTOCOMMIT flag is ignored for databases with ATTR_DB_LEVEL_LOCKING
         * (e.g. sqlite) in order to avoid deadlocks. ILoadBalancer::getServerAttributes()
         * can be used to check such flags beforehand.
         *
@@ -256,7 +258,7 @@ interface ILoadBalancer {
         * @param int $db Server index or DB_MASTER/DB_REPLICA
         * @param array|string|bool $groups Query group(s), or false for the generic reader
         * @param string|bool $domain Domain ID, or false for the current domain
-        * @param int $flags Bitfield of CONN_* class constants (e.g. CONN_TRX_AUTO)
+        * @param int $flags Bitfield of CONN_* class constants (e.g. CONN_TRX_AUTOCOMMIT)
         * @return MaintainableDBConnRef
         */
        public function getMaintenanceConnectionRef( $db, $groups = [], $domain = false, $flags = 0 );
@@ -267,11 +269,11 @@ interface ILoadBalancer {
         * The index must be an actual index into the array. If a connection to the server is
         * already open and not considered an "in use" foreign connection, this simply returns it.
         *
-        * Avoid using CONN_TRX_AUTO for databases with ATTR_DB_LEVEL_LOCKING (e.g. sqlite) in
+        * Avoid using CONN_TRX_AUTOCOMMIT for databases with ATTR_DB_LEVEL_LOCKING (e.g. sqlite) in
         * order to avoid deadlocks. ILoadBalancer::getServerAttributes() can be used to check
         * such flags beforehand.
         *
-        * If the caller uses $domain or sets CONN_TRX_AUTO in $flags, then it must also
+        * If the caller uses $domain or sets CONN_TRX_AUTOCOMMIT in $flags, then it must also
         * call ILoadBalancer::reuseConnection() on the handle when finished using it.
         * In all other cases, this is not necessary, though not harmful either.
         *
@@ -279,7 +281,7 @@ interface ILoadBalancer {
         *
         * @param int $i Server index (does not support DB_MASTER/DB_REPLICA)
         * @param string|bool $domain Domain ID, or false for the current domain
-        * @param int $flags Bitfield of CONN_* class constants (e.g. CONN_TRX_AUTO)
+        * @param int $flags Bitfield of CONN_* class constants (e.g. CONN_TRX_AUTOCOMMIT)
         * @return Database|bool Returns false on errors
         * @throws DBAccessError
         */
index 96b6180..96ea949 100644 (file)
@@ -575,7 +575,6 @@ class LoadBalancer implements ILoadBalancer {
                        if ( !empty( $connsByServer[$i] ) ) {
                                /** @var IDatabase[] $serverConns */
                                $serverConns = $connsByServer[$i];
-
                                return reset( $serverConns );
                        }
                }
@@ -689,7 +688,7 @@ class LoadBalancer implements ILoadBalancer {
                        $domain = false; // local connection requested
                }
 
-               if ( ( $flags & self::CONN_TRX_AUTO ) === self::CONN_TRX_AUTO ) {
+               if ( ( $flags & self::CONN_TRX_AUTOCOMMIT ) === self::CONN_TRX_AUTOCOMMIT ) {
                        // Assuming all servers are of the same type (or similar), which is overwhelmingly
                        // the case, use the master server information to get the attributes. The information
                        // for $i cannot be used since it might be DB_REPLICA, which might require connection
@@ -700,8 +699,9 @@ class LoadBalancer implements ILoadBalancer {
                                // rows (e.g. FOR UPDATE) or (b) make small commits during a larger transactions
                                // to reduce lock contention. None of these apply for sqlite and using separate
                                // connections just causes self-deadlocks.
-                               $flags &= ~self::CONN_TRX_AUTO;
-                               $this->connLogger->info( __METHOD__ . ': ignoring CONN_TRX_AUTO to avoid deadlocks.' );
+                               $flags &= ~self::CONN_TRX_AUTOCOMMIT;
+                               $this->connLogger->info( __METHOD__ .
+                                       ': ignoring CONN_TRX_AUTOCOMMIT to avoid deadlocks.' );
                        }
                }
 
@@ -714,7 +714,7 @@ class LoadBalancer implements ILoadBalancer {
 
                if ( $i == self::DB_MASTER ) {
                        $i = $this->getWriterIndex();
-               } else {
+               } elseif ( $i == self::DB_REPLICA ) {
                        # Try to find an available server in any the query groups (in order)
                        foreach ( $groups as $group ) {
                                $groupIndex = $this->getReaderIndex( $group, $domain );
@@ -859,7 +859,7 @@ class LoadBalancer implements ILoadBalancer {
                // main set of DB connections but rather its own pool since:
                // a) those are usually set to implicitly use transaction rounds via DBO_TRX
                // b) those must support the use of explicit transaction rounds via beginMasterChanges()
-               $autoCommit = ( ( $flags & self::CONN_TRX_AUTO ) == self::CONN_TRX_AUTO );
+               $autoCommit = ( ( $flags & self::CONN_TRX_AUTOCOMMIT ) == self::CONN_TRX_AUTOCOMMIT );
 
                if ( $domain !== false ) {
                        // Connection is to a foreign domain
@@ -937,7 +937,7 @@ class LoadBalancer implements ILoadBalancer {
                $domainInstance = DatabaseDomain::newFromId( $domain );
                $dbName = $domainInstance->getDatabase();
                $prefix = $domainInstance->getTablePrefix();
-               $autoCommit = ( ( $flags & self::CONN_TRX_AUTO ) == self::CONN_TRX_AUTO );
+               $autoCommit = ( ( $flags & self::CONN_TRX_AUTOCOMMIT ) == self::CONN_TRX_AUTOCOMMIT );
 
                if ( $autoCommit ) {
                        $connFreeKey = self::KEY_FOREIGN_FREE_NOROUND;
@@ -1220,7 +1220,7 @@ class LoadBalancer implements ILoadBalancer {
        }
 
        public function closeConnection( IDatabase $conn ) {
-               $serverIndex = $conn->getLBInfo( 'serverIndex' ); // second index level of mConns
+               $serverIndex = $conn->getLBInfo( 'serverIndex' );
                foreach ( $this->conns as $type => $connsByServer ) {
                        if ( !isset( $connsByServer[$serverIndex] ) ) {
                                continue;
index c672ef7..e17ac03 100644 (file)
@@ -782,13 +782,6 @@ class ManualLogEntry extends LogEntryBase {
                                        if ( $to === 'udp' || $to === 'rcandudp' ) {
                                                $rc->notifyRCFeeds();
                                        }
-
-                                       // Log the autopatrol if the log entry is patrollable
-                                       if ( $this->getIsPatrollable() &&
-                                               $rc->getAttribute( 'rc_patrolled' ) === 2
-                                       ) {
-                                               PatrolLog::record( $rc, true, $this->getPerformer() );
-                                       }
                                }
                        },
                        DeferredUpdates::POSTSEND,
index d1de2cd..9b2e098 100644 (file)
@@ -27,6 +27,7 @@
  * logs of patrol events
  */
 class PatrolLog {
+
        /**
         * Record a log event for a change being patrolled
         *
@@ -39,10 +40,8 @@ class PatrolLog {
         * @return bool
         */
        public static function record( $rc, $auto = false, User $user = null, $tags = null ) {
-               global $wgLogAutopatrol;
-
-               // do not log autopatrolled edits if setting disables it
-               if ( $auto && !$wgLogAutopatrol ) {
+               // Do not log autopatrol actions: T184485
+               if ( $auto ) {
                        return false;
                }
 
index 6d35658..8ff14ed 100644 (file)
@@ -181,7 +181,7 @@ class SqlBagOStuff extends BagOStuff {
                                $index = $this->replicaOnly ? DB_REPLICA : DB_MASTER;
                                if ( $lb->getServerType( $lb->getWriterIndex() ) !== 'sqlite' ) {
                                        // Keep a separate connection to avoid contention and deadlocks
-                                       $db = $lb->getConnection( $index, [], false, $lb::CONN_TRX_AUTO );
+                                       $db = $lb->getConnection( $index, [], false, $lb::CONN_TRX_AUTOCOMMIT );
                                        // @TODO: Use a blank trx profiler to ignore expections as this is a cache
                                } else {
                                        // However, SQLite has the opposite behavior due to DB-level locking.
index f3860c6..afe266b 100644 (file)
@@ -3288,7 +3288,7 @@ class WikiPage implements Page, IDBAccessObject {
 
                if ( $wgUseRCPatrol ) {
                        // Mark all reverted edits as patrolled
-                       $set['rc_patrolled'] = 1;
+                       $set['rc_patrolled'] = RecentChange::PRC_PATROLLED;
                }
 
                if ( count( $set ) ) {
index 198a28b..36198cd 100644 (file)
@@ -75,7 +75,7 @@ class RevDelLogItem extends RevDelItem {
                $dbw->update( 'recentchanges',
                        [
                                'rc_deleted' => $bits,
-                               'rc_patrolled' => 1
+                               'rc_patrolled' => RecentChange::PRC_PATROLLED
                        ],
                        [
                                'rc_logid' => $this->row->log_id,
index cb5ce48..7b5d130 100644 (file)
@@ -83,7 +83,7 @@ class RevDelRevisionItem extends RevDelItem {
                $dbw->update( 'recentchanges',
                        [
                                'rc_deleted' => $bits,
-                               'rc_patrolled' => 1
+                               'rc_patrolled' => RecentChange::PRC_PATROLLED
                        ],
                        [
                                'rc_this_oldid' => $this->revision->getId(), // condition
index eb2cada..ac13f11 100644 (file)
@@ -87,9 +87,12 @@ abstract class ChangesListSpecialPage extends SpecialPage {
 
        // Same format as filterGroupDefinitions, but for a single group (reviewStatus)
        // that is registered conditionally.
+       private $legacyReviewStatusFilterGroupDefinition;
+
+       // Single filter group registered conditionally
        private $reviewStatusFilterGroupDefinition;
 
-       // Single filter registered conditionally
+       // Single filter group registered conditionally
        private $hideCategorizationFilterDefinition;
 
        /**
@@ -301,7 +304,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                ]
                        ],
 
-                       // reviewStatus (conditional)
+                       // significance (conditional)
 
                        [
                                'name' => 'significance',
@@ -457,17 +460,14 @@ abstract class ChangesListSpecialPage extends SpecialPage {
 
                ];
 
-               $this->reviewStatusFilterGroupDefinition = [
+               $this->legacyReviewStatusFilterGroupDefinition = [
                        [
-                               'name' => 'reviewStatus',
+                               'name' => 'legacyReviewStatus',
                                'title' => 'rcfilters-filtergroup-reviewstatus',
                                'class' => ChangesListBooleanFilterGroup::class,
-                               'priority' => -5,
                                'filters' => [
                                        [
                                                'name' => 'hidepatrolled',
-                                               'label' => 'rcfilters-filter-patrolled-label',
-                                               'description' => 'rcfilters-filter-patrolled-description',
                                                // rcshowhidepatr-show, rcshowhidepatr-hide
                                                // wlshowhidepatr
                                                'showHideSuffix' => 'showhidepatr',
@@ -475,29 +475,77 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                                'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
                                                        &$query_options, &$join_conds
                                                ) {
-                                                       $conds[] = 'rc_patrolled = 0';
-                                               },
-                                               'cssClassSuffix' => 'patrolled',
-                                               'isRowApplicableCallable' => function ( $ctx, $rc ) {
-                                                       return $rc->getAttribute( 'rc_patrolled' );
+                                                       $conds['rc_patrolled'] = RecentChange::PRC_UNPATROLLED;
                                                },
+                                               'isReplacedInStructuredUi' => true,
                                        ],
                                        [
                                                'name' => 'hideunpatrolled',
-                                               'label' => 'rcfilters-filter-unpatrolled-label',
-                                               'description' => 'rcfilters-filter-unpatrolled-description',
                                                'default' => false,
                                                'queryCallable' => function ( $specialClassName, $ctx, $dbr, &$tables, &$fields, &$conds,
                                                        &$query_options, &$join_conds
                                                ) {
-                                                       $conds[] = 'rc_patrolled != 0';
+                                                       $conds[] = 'rc_patrolled != ' . RecentChange::PRC_UNPATROLLED;
+                                               },
+                                               'isReplacedInStructuredUi' => true,
+                                       ],
+                               ],
+                       ]
+               ];
+
+               $this->reviewStatusFilterGroupDefinition = [
+                       [
+                               'name' => 'reviewStatus',
+                               'title' => 'rcfilters-filtergroup-reviewstatus',
+                               'class' => ChangesListStringOptionsFilterGroup::class,
+                               'isFullCoverage' => true,
+                               'priority' => -5,
+                               'filters' => [
+                                       [
+                                               'name' => 'unpatrolled',
+                                               'label' => 'rcfilters-filter-reviewstatus-unpatrolled-label',
+                                               'description' => 'rcfilters-filter-reviewstatus-unpatrolled-description',
+                                               'cssClassSuffix' => 'reviewstatus-unpatrolled',
+                                               'isRowApplicableCallable' => function ( $ctx, $rc ) {
+                                                       return $rc->getAttribute( 'rc_patrolled' ) == RecentChange::PRC_UNPATROLLED;
                                                },
-                                               'cssClassSuffix' => 'unpatrolled',
+                                       ],
+                                       [
+                                               'name' => 'manual',
+                                               'label' => 'rcfilters-filter-reviewstatus-manual-label',
+                                               'description' => 'rcfilters-filter-reviewstatus-manual-description',
+                                               'cssClassSuffix' => 'reviewstatus-manual',
                                                'isRowApplicableCallable' => function ( $ctx, $rc ) {
-                                                       return !$rc->getAttribute( 'rc_patrolled' );
+                                                       return $rc->getAttribute( 'rc_patrolled' ) == RecentChange::PRC_PATROLLED;
+                                               },
+                                       ],
+                                       [
+                                               'name' => 'auto',
+                                               'label' => 'rcfilters-filter-reviewstatus-auto-label',
+                                               'description' => 'rcfilters-filter-reviewstatus-auto-description',
+                                               'cssClassSuffix' => 'reviewstatus-auto',
+                                               'isRowApplicableCallable' => function ( $ctx, $rc ) {
+                                                       return $rc->getAttribute( 'rc_patrolled' ) == RecentChange::PRC_AUTOPATROLLED;
                                                },
                                        ],
                                ],
+                               'default' => ChangesListStringOptionsFilterGroup::NONE,
+                               'queryCallable' => function ( $specialPageClassName, $ctx, $dbr,
+                                       &$tables, &$fields, &$conds, &$query_options, &$join_conds, $selected
+                               ) {
+                                       if ( $selected === [] ) {
+                                               return;
+                                       }
+                                       $rcPatrolledValues = [
+                                               'unpatrolled' => RecentChange::PRC_UNPATROLLED,
+                                               'manual' => RecentChange::PRC_PATROLLED,
+                                               'auto' => RecentChange::PRC_AUTOPATROLLED,
+                                       ];
+                                       // e.g. rc_patrolled IN (0, 2)
+                                       $conds['rc_patrolled'] = array_map( function ( $s ) use ( $rcPatrolledValues ) {
+                                               return $rcPatrolledValues[ $s ];
+                                       }, $selected );
+                               }
                        ]
                ];
 
@@ -910,6 +958,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                // information to all users just because the user that saves the edit can
                // patrol or is logged in)
                if ( !$this->including() && $this->getUser()->useRCPatrol() ) {
+                       $this->registerFiltersFromDefinitions( $this->legacyReviewStatusFilterGroupDefinition );
                        $this->registerFiltersFromDefinitions( $this->reviewStatusFilterGroupDefinition );
                }
 
@@ -1339,7 +1388,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
        }
 
        /**
-        * Replace old options 'hideanons' or 'hideliu' with structured UI equivalent
+        * Replace old options with their structured UI equivalents
         *
         * @param FormOptions $opts
         * @return bool True if the change was made
@@ -1349,21 +1398,40 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                        return false;
                }
 
+               $changed = false;
+
                // At this point 'hideanons' and 'hideliu' cannot be both true,
                // because fixBackwardsCompatibilityOptions resets (at least) 'hideanons' in such case
                if ( $opts[ 'hideanons' ] ) {
                        $opts->reset( 'hideanons' );
                        $opts[ 'userExpLevel' ] = 'registered';
-                       return true;
+                       $changed = true;
                }
 
                if ( $opts[ 'hideliu' ] ) {
                        $opts->reset( 'hideliu' );
                        $opts[ 'userExpLevel' ] = 'unregistered';
-                       return true;
+                       $changed = true;
                }
 
-               return false;
+               if ( $this->getFilterGroup( 'legacyReviewStatus' ) ) {
+                       if ( $opts[ 'hidepatrolled' ] ) {
+                               $opts->reset( 'hidepatrolled' );
+                               $opts[ 'reviewStatus' ] = 'unpatrolled';
+                               $changed = true;
+                       }
+
+                       if ( $opts[ 'hideunpatrolled' ] ) {
+                               $opts->reset( 'hideunpatrolled' );
+                               $opts[ 'reviewStatus' ] = implode(
+                                       ChangesListStringOptionsFilterGroup::SEPARATOR,
+                                       [ 'manual', 'auto' ]
+                               );
+                               $changed = true;
+                       }
+               }
+
+               return $changed;
        }
 
        /**
index d6ace0a..1c54d13 100644 (file)
@@ -515,7 +515,6 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
         * @private
         */
        protected function mainLoginForm( array $requests, $msg = '', $msgtype = 'error' ) {
-               $titleObj = $this->getPageTitle();
                $user = $this->getUser();
                $out = $this->getOutput();
 
index cb2f420..bfef5e0 100644 (file)
@@ -208,8 +208,12 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                $reviewStatus = $this->getFilterGroup( 'reviewStatus' );
                if ( $reviewStatus !== null ) {
                        // Conditional on feature being available and rights
-                       $hidePatrolled = $reviewStatus->getFilter( 'hidepatrolled' );
-                       $hidePatrolled->setDefault( $user->getBoolOption( 'hidepatrolled' ) );
+                       if ( $user->getBoolOption( 'hidepatrolled' ) ) {
+                               $reviewStatus->setDefault( 'unpatrolled' );
+                               $legacyReviewStatus = $this->getFilterGroup( 'legacyReviewStatus' );
+                               $legacyHidePatrolled = $legacyReviewStatus->getFilter( 'hidepatrolled' );
+                               $legacyHidePatrolled->setDefault( true );
+                       }
                }
 
                $changeType = $this->getFilterGroup( 'changeType' );
index 1088d72..6590756 100644 (file)
@@ -368,6 +368,7 @@ class SpecialVersion extends SpecialPage {
                if ( self::$extensionTypes === false ) {
                        self::$extensionTypes = [
                                'specialpage' => wfMessage( 'version-specialpages' )->text(),
+                               'editor' => wfMessage( 'version-editors' )->text(),
                                'parserhook' => wfMessage( 'version-parserhooks' )->text(),
                                'variable' => wfMessage( 'version-variables' )->text(),
                                'media' => wfMessage( 'version-mediahandlers' )->text(),
index 3fe6c1e..dda1dac 100644 (file)
@@ -264,8 +264,12 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                $reviewStatus = $this->getFilterGroup( 'reviewStatus' );
                if ( $reviewStatus !== null ) {
                        // Conditional on feature being available and rights
-                       $hidePatrolled = $reviewStatus->getFilter( 'hidepatrolled' );
-                       $hidePatrolled->setDefault( $user->getBoolOption( 'watchlisthidepatrolled' ) );
+                       if ( $user->getBoolOption( 'watchlisthidepatrolled' ) ) {
+                               $reviewStatus->setDefault( 'unpatrolled' );
+                               $legacyReviewStatus = $this->getFilterGroup( 'legacyReviewStatus' );
+                               $legacyHidePatrolled = $legacyReviewStatus->getFilter( 'hidepatrolled' );
+                               $legacyHidePatrolled->setDefault( true );
+                       }
                }
 
                $authorship = $this->getFilterGroup( 'authorship' );
index 57cdad9..c214f1f 100644 (file)
@@ -110,7 +110,7 @@ class NewFilesPager extends RangeChronologicalPager {
                        $tables[] = 'recentchanges';
                        $conds['rc_type'] = RC_LOG;
                        $conds['rc_log_type'] = 'upload';
-                       $conds['rc_patrolled'] = 0;
+                       $conds['rc_patrolled'] = RecentChange::PRC_UNPATROLLED;
                        $conds['rc_namespace'] = NS_FILE;
 
                        if ( $wgActorTableSchemaMigrationStage === MIGRATION_NEW ) {
index efdc75a..f16a5cb 100644 (file)
@@ -82,7 +82,7 @@ class NewPagesPager extends ReverseChronologicalPager {
 
                # If this user cannot see patrolled edits or they are off, don't do dumb queries!
                if ( $this->opts->getValue( 'hidepatrolled' ) && $this->getUser()->useNPPatrol() ) {
-                       $conds['rc_patrolled'] = 0;
+                       $conds['rc_patrolled'] = RecentChange::PRC_UNPATROLLED;
                }
 
                if ( $this->opts->getValue( 'hidebots' ) ) {
index 3e6b212..ea395f4 100644 (file)
@@ -3084,7 +3084,7 @@ class User implements IDBAccessObject, UserIdentity {
         * Get the user's current setting for a given option.
         *
         * @param string $oname The option to check
-        * @param string $defaultOverride A default value returned if the option does not exist
+        * @param string|array $defaultOverride A default value returned if the option does not exist
         * @param bool $ignoreHidden Whether to ignore the effects of $wgHiddenPrefs
         * @return string|array|int|null User's current value for the option
         * @see getBoolOption()
index bf419a9..506ee00 100644 (file)
@@ -498,15 +498,15 @@ class WatchedItemQueryService {
                        // TODO: not sure if this should simply ignore patrolled filters if user does not have the patrol
                        // right, or maybe rather fail loud at this point, same as e.g. ApiQueryWatchlist does?
                        if ( in_array( self::FILTER_PATROLLED, $options['filters'] ) ) {
-                               $conds[] = 'rc_patrolled != 0';
+                               $conds[] = 'rc_patrolled != ' . RecentChange::PRC_UNPATROLLED;
                        } elseif ( in_array( self::FILTER_NOT_PATROLLED, $options['filters'] ) ) {
-                               $conds[] = 'rc_patrolled = 0';
+                               $conds['rc_patrolled'] = RecentChange::PRC_UNPATROLLED;
                        }
 
                        if ( in_array( self::FILTER_AUTOPATROLLED, $options['filters'] ) ) {
-                               $conds[] = 'rc_patrolled = 2';
+                               $conds['rc_patrolled'] = RecentChange::PRC_AUTOPATROLLED;
                        } elseif ( in_array( self::FILTER_NOT_AUTOPATROLLED, $options['filters'] ) ) {
-                               $conds[] = 'rc_patrolled != 2';
+                               $conds[] = 'rc_patrolled != ' . RecentChange::PRC_AUTOPATROLLED;
                        }
                }
 
index f635f9a..53c5d08 100644 (file)
        "rcfilters-filter-humans-label": "Menslik (nie 'n bot)",
        "rcfilters-filter-humans-description": "Wysigings wat deur mense gemaak is.",
        "rcfilters-filtergroup-reviewstatus": "Beoordelingsstatus",
-       "rcfilters-filter-patrolled-label": "Gekontroleerd",
-       "rcfilters-filter-patrolled-description": "Wysigings wat as gekontroleerd gemerk is.",
-       "rcfilters-filter-unpatrolled-label": "Nie gekontroleerd",
-       "rcfilters-filter-unpatrolled-description": "Wysigings wat nie as gekontroleerd gemerk is nie.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Nie gekontroleerd",
        "rcfilters-filtergroup-significance": "Belangrikheid",
        "rcfilters-filter-minor-label": "Klein wysigings",
        "rcfilters-filter-minor-description": "Wysigings wat deur die outeur as klein gemerk is.",
index 5109460..755e6e0 100644 (file)
        "rcfilters-filter-humans-label": "tademaw (caay ku kikay-tademaw)",
        "rcfilters-filter-humans-description": "nay ku tademaw mikawaway-kalumyitiay patahkalay a mikawaway-kalumyiti.",
        "rcfilters-filtergroup-reviewstatus": "ciwsya setyitase",
-       "rcfilters-filter-patrolled-label": "tayza mikibi tuway",
-       "rcfilters-filter-patrolled-description": "silusi tayza-mikibi a mikawaway-kalumyiti tuway.",
-       "rcfilters-filter-unpatrolled-label": "caay henay tayza mikibi",
-       "rcfilters-filter-unpatrolled-description": "caay henay masilusi tayza-mikibi a mikawaway-kalumyiti.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "caay henay tayza mikibi",
        "rcfilters-filtergroup-significance": "kakilulen",
        "rcfilters-filter-minor-label": "cayka yadah ku misumad",
        "rcfilters-filter-minor-description": "masacudaday sacuzu’ tuway mikilulay a mikawaway-kalumyiti.",
index 918e01c..88ba7bc 100644 (file)
        "rcfilters-filter-humans-label": "بشري (ليس بوت)",
        "rcfilters-filter-humans-description": "التعديلات بواسطة المحررين البشريين.",
        "rcfilters-filtergroup-reviewstatus": "حالة المراجعة",
-       "rcfilters-filter-patrolled-label": "مراجعة",
-       "rcfilters-filter-patrolled-description": "التعديلات المعلم عليها كمراجعة.",
-       "rcfilters-filter-unpatrolled-label": "غير مراجعة",
-       "rcfilters-filter-unpatrolled-description": "التعديلات غير المعلم عليها كمراجعة.",
+       "rcfilters-filter-reviewstatus-unpatrolled-description": "التعديلات التي لم يتم وضع علامة عليها يدويا أو تلقائيا كمراجعة.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "غير مراجعة",
+       "rcfilters-filter-reviewstatus-manual-description": "التعديلات التي تم تعليمها يدويا كمراجعة.",
+       "rcfilters-filter-reviewstatus-manual-label": "مراجعة يدويا",
+       "rcfilters-filter-reviewstatus-auto-description": "التعديلات بواسطة المستخدمين المتقدمين الذين يتم تعليم عملهم تلقائيا كمراجع.",
+       "rcfilters-filter-reviewstatus-auto-label": "المراجعة تلقائيا",
        "rcfilters-filtergroup-significance": "الأهمية",
        "rcfilters-filter-minor-label": "تعديلات طفيفة",
        "rcfilters-filter-minor-description": "التعديلات التي علم عليها المستخدم كطفيفة.",
        "version-specialpages": "صفحات خاصة",
        "version-parserhooks": "خطاطيف المحلل",
        "version-variables": "المتغيرات",
+       "version-editors": "المحررون",
        "version-antispam": "منع البريد المزعج",
        "version-api": "إيه بي آي",
        "version-other": "أخرى",
index 9eed2c7..39fa8dd 100644 (file)
        "rcfilters-filter-humans-label": "Ser humanu (non bot)",
        "rcfilters-filter-humans-description": "Ediciones feches por editores humanos.",
        "rcfilters-filtergroup-reviewstatus": "Estáu de revisión",
-       "rcfilters-filter-patrolled-label": "Patrullaes",
-       "rcfilters-filter-patrolled-description": "Ediciones marcaes como patrullaes.",
-       "rcfilters-filter-unpatrolled-label": "Sin patrullar",
-       "rcfilters-filter-unpatrolled-description": "Ediciones sin marcar como patrullaes.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Sin patrullar",
        "rcfilters-filtergroup-significance": "Significación",
        "rcfilters-filter-minor-label": "Ediciones menores",
        "rcfilters-filter-minor-description": "Ediciones que l'autor etiquetó como menores.",
index 0b3a63f..af2e9b0 100644 (file)
        "rcfilters-filter-humans-label": "Кеше (бот түгел)",
        "rcfilters-filter-humans-description": "Мөхәррирҙәр индерген төҙәтеүҙәр",
        "rcfilters-filtergroup-reviewstatus": "Тикшереү статусы",
-       "rcfilters-filter-patrolled-label": "Тикшерелгән",
-       "rcfilters-filter-patrolled-description": "Тикшерелгән тип билдәләнгән төҙәтеүҙәр",
-       "rcfilters-filter-unpatrolled-label": "Тикшерелмәгәндәр",
-       "rcfilters-filter-unpatrolled-description": "Тикшерелгән тип күрһәтелмәгән төҙәтеүҙәр",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Тикшерелмәгәндәр",
        "rcfilters-filtergroup-significance": "Мәғәнәһе",
        "rcfilters-filter-minor-label": "Аҙ ғына төҙәтеүҙәр",
        "rcfilters-filter-minor-description": "Автор аҙ ғына тип күрһәткән төҙәтеүҙәр",
index c35dc0e..da1d85c 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": "Вы можаце выкарыстаць гэтую старонку для замены вашых наладаў на налады сайту па змоўчаньні.\nГэтае дзеяньне ня можа быць адмененае.",
        "right-editcontentmodel": "рэдагаваньне мадэлі зьместу старонкі",
        "right-editinterface": "Рэдагаваньне інтэрфэйсу карыстальніка",
        "right-editusercss": "Рэдагаваньне CSS-файлаў іншых удзельнікаў",
+       "right-edituserjson": "Рэдагаваньне JSON-файлаў іншых удзельнікаў",
        "right-edituserjs": "Рэдагаваньне JavaScript-файлаў іншых удзельнікаў",
        "right-editmyusercss": "Рэдагаваць свае карыстальніцкія CSS-файлы",
+       "right-editmyuserjson": "Рэдагаваньне вашых уласных JSON-файлаў",
        "right-editmyuserjs": "Рэдагаваць свае карыстальніцкія JavaScript-файлы",
        "right-viewmywatchlist": "Праглядаць уласны сьпіс назіраньня",
        "right-editmywatchlist": "Рэдагаваньне ўласнага сьпісу назіраньня. Некаторыя дзеяньні будуць дадаваць туды старонкі нават бяз гэтага права.",
        "action-move-rootuserpages": "перанос карэнных старонак удзельнікаў",
        "action-move-categorypages": "перанос старонак катэгорыяў",
        "action-movefile": "перайменаваньне гэтага файлу",
-       "action-upload": "загрузку гэтага файла",
+       "action-upload": "загрузку гэтага файлу",
        "action-reupload": "перазапіс гэтага файла",
-       "action-reupload-shared": "перакрыцьцё гэтага файла ў агульным сховішчы",
+       "action-reupload-shared": "перакрыцьцё гэтага файлу ў агульным сховішчы",
        "action-upload_by_url": "загрузку гэтага файла з URL-адрасу",
        "action-writeapi": "выкарыстаньне API для запісаў",
        "action-delete": "выдаленьне гэтай старонкі",
        "rcfilters-filter-humans-label": "Чалавек (ня робат)",
        "rcfilters-filter-humans-description": "Праўкі, зробленыя людзьмі.",
        "rcfilters-filtergroup-reviewstatus": "Статус праверкі",
-       "rcfilters-filter-patrolled-label": "Правераныя",
-       "rcfilters-filter-patrolled-description": "Праўкі, пазначаныя як правераныя.",
-       "rcfilters-filter-unpatrolled-label": "Неправераныя",
-       "rcfilters-filter-unpatrolled-description": "Рэдагаваньні, не пазначаныя як правераныя.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Неправераныя",
        "rcfilters-filtergroup-significance": "Значэньне",
        "rcfilters-filter-minor-label": "Дробныя праўкі",
        "rcfilters-filter-minor-description": "Праўкі, якія аўтар пазначыў як дробныя.",
index 3e6de40..67289d5 100644 (file)
        "rcfilters-filter-bots-label": "Бот",
        "rcfilters-filter-humans-label": "Чалавек (не бот)",
        "rcfilters-filter-humans-description": "Праўкі, зробленыя людзьмі",
-       "rcfilters-filter-patrolled-label": "Дагледжаны",
-       "rcfilters-filter-unpatrolled-label": "Недагледжаны",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Недагледжаны",
        "rcfilters-filtergroup-lastRevision": "Цяперашняя версія",
        "rcfilters-filter-lastrevision-label": "Актуальная версія",
        "rcfilters-exclude-button-on": "За выключэннем выбранага",
index ef47981..2adb632 100644 (file)
        "rcfilters-filter-humans-label": "Човек (не бот)",
        "rcfilters-filter-humans-description": "Редакции, направени от редактори.",
        "rcfilters-filtergroup-reviewstatus": "Проверка на статуса",
-       "rcfilters-filter-patrolled-label": "Патрулирано",
-       "rcfilters-filter-patrolled-description": "Редакции, отбелязани като патрулирани.",
-       "rcfilters-filter-unpatrolled-label": "Непатрулирано",
-       "rcfilters-filter-unpatrolled-description": "Редакции, неотбелязани като патрулирани.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Непатрулирано",
        "rcfilters-filtergroup-significance": "Значимост",
        "rcfilters-filter-minor-label": "Малки промени",
        "rcfilters-filter-minor-description": "Редакции, които не са отбелязани като малки промени.",
index 93f1abc..56baf3c 100644 (file)
        "rcfilters-filter-humans-label": "मनुष्य (बॉट ना)",
        "rcfilters-filter-humans-description": "मनुष्य संपादकन के कइल संपादन।",
        "rcfilters-filtergroup-reviewstatus": "समीक्षा स्थिति",
-       "rcfilters-filter-patrolled-label": "जाँचल",
-       "rcfilters-filter-patrolled-description": "जाँचल निशानदेही वाला संपादन।",
-       "rcfilters-filter-unpatrolled-label": "बिनाजाँचल",
-       "rcfilters-filter-unpatrolled-description": "जाँचल निशानदेही के बिना वाला संपादन।",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "बिनाजाँचल",
        "rcfilters-filtergroup-significance": "महत्व",
        "rcfilters-filter-minor-label": "छोट संपादन",
        "rcfilters-filter-minor-description": "लेखक द्वारा छोट चिन्हित कइल संपादन।",
index ecfcb37..da0544f 100644 (file)
@@ -86,7 +86,7 @@
        "tog-prefershttps": "অ্যাকাউন্টে প্রবেশ করার সময় সবসময় নিরাপদ সংযোগ ব্যবহার করুন",
        "underline-always": "সব সময়",
        "underline-never": "কখনো নয়",
-       "underline-default": "সà§\8dà¦\95িন à¦\85থবা ব্রাউজারে যেমনভাবে নির্দিষ্ট করা আছে",
+       "underline-default": "à¦\86বরণ বা ব্রাউজারে যেমনভাবে নির্দিষ্ট করা আছে",
        "editfont-style": "সম্পাদনা এলাকার ফন্ট শৈলী:",
        "editfont-monospace": "মনোস্পেস ফন্ট",
        "editfont-sansserif": "স্যান্স-সেরিফ ফন্ট",
        "variants": "বিকল্পসমূহ",
        "navigation-heading": "পরিভ্রমণ বাছাইতালিকা",
        "errorpagetitle": "ত্রুটি",
-       "returnto": "$1 পাতায় ফেরত যান।",
+       "returnto": "$1-এ ফেরত যান।",
        "tagline": "{{SITENAME}} থেকে",
        "help": "সাহায্য",
        "search": "অনুসন্ধান",
        "versionrequiredtext": "এই পাতাটি ব্যবহার করার জন্য মিডিয়াউইকির $1 নং সংস্করণ প্রয়োজন। [[Special:Version|সংস্করণ পাতা]] দেখুন।",
        "ok": "ঠিক আছে",
        "retrievedfrom": "'$1' থেকে আনীত",
-       "youhavenewmessages": "আপনার $1 এসেছে ($2)৷",
-       "youhavenewmessagesfromusers": "আপনি {{PLURAL:$3|অন্য ব্যবহারকারীর|$3 ব্যবহারকারীর}} কাছ থেকে $1 পেয়েছেন ($2)।",
+       "youhavenewmessages": "{{PLURAL:$3|আপনার}} $1 এসেছে ($2)৷",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|আপনি}} {{PLURAL:$3|অন্য ব্যবহারকারীর|$3 জন ব্যবহারকারীর}} কাছ থেকে $1 পেয়েছেন ($2)।",
        "youhavenewmessagesmanyusers": "আপনি অনেক ব্যবহারকারীর কাছ থেকে $1 পেয়েছেন ($2)।",
        "newmessageslinkplural": "{{PLURAL:$1|একটি নতুন বার্তা|999=নতুন বার্তা}}",
        "newmessagesdifflinkplural": "সর্বশেষ {{PLURAL:$1|পরিবর্তন|999=পরিবর্তনসমূহ}}",
        "rcfilters-filter-humans-label": "মানুষ (বট নয়)",
        "rcfilters-filter-humans-description": "মানুষের করা সম্পাদনা।",
        "rcfilters-filtergroup-reviewstatus": "পর্যালোচনার অবস্থা",
-       "rcfilters-filter-patrolled-label": "পরীক্ষিত",
-       "rcfilters-filter-patrolled-description": "সম্পাদনা পরীক্ষিত হিসেবে চিহ্নিত করা হয়েছে।",
-       "rcfilters-filter-unpatrolled-label": "অপরীক্ষিত",
-       "rcfilters-filter-unpatrolled-description": "সম্পাদনা পরীক্ষিত হিসেবে চিহ্নিত করা হয় নি।",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "অপরীক্ষিত",
+       "rcfilters-filter-reviewstatus-auto-label": "স্বয়ংপরীক্ষিত",
        "rcfilters-filtergroup-significance": "তাৎপর্য",
        "rcfilters-filter-minor-label": "অনুল্লেখ্য সম্পাদনা",
        "rcfilters-filter-minor-description": "যেসব সম্পাদনাকে লেখক অনুল্লেখ্য হিসেবে চিহ্নিত করেছেন।",
        "ipb-confirm": "বাধা নিশ্চিতকরণ",
        "badipaddress": "আইপি (IP) ঠিকানাটি অগ্রহনযোগ্য",
        "blockipsuccesssub": "বাধা সফল",
-       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] কে বাধা দেয়া হয়েছে।<br />\nবাধা দেয়া পুনর্বিবেচনা করতে হলে [[Special:BlockList|বাধা দেয়া তালিকা]] দেখুন।",
+       "blockipsuccesstext": "[[Special:Contributions/$1|$1]] কে বাধা দেয়া হয়েছে।<br />\nবাধা দেয়া পুনর্বিবেচনা করতে হলে [[Special:BlockList|বাধা দেয়ার তালিকাটি]] দেখুন।",
        "ipb-blockingself": "আপনি নিজেকেই বাধাপ্রদান করতে যাচ্ছেন! আপনি কী নিশ্চিত যে আপনি এটি-ই করতে চান?",
        "ipb-confirmhideuser": "আপনি \"ব্যবহারকারী লুকানো\" অধিকার যুক্ত একজন ব্যবহারকারীকে বাধা দিতে যাচ্ছেন। এর মাধ্যমে এই ব্যবহারকারীর নাম সকল তালিকা এবং লগের ভুক্তি থেকে সরিয়ে ফেলা হবে। আপনি কি নিশ্চিতভাবে এটি করতে চান?",
        "ipb-confirmaction": "আপনি যদি নিশ্চিত হন আপনি এটি সত্যিকার অর্থেই করতে চান তাহলে অনুগ্রহ করে উপরের \"{{int:ipb-confirm}}\" ঘরটি দেখুন।",
        "pageinfo-authors": "সর্বমোট সতন্ত্র সম্পাদকের সংখ্যা",
        "pageinfo-recent-edits": "সর্বশেষ সম্পাদনা করা হয়েছে (গত $1)",
        "pageinfo-recent-authors": "সাম্প্রতিক সতন্ত্র সম্পাদকের সংখ্যা",
-       "pageinfo-magic-words": "মà§\8dযাà¦\9cিà¦\95 {{PLURAL:$1|শব্দ|শব্দসমূহ}} ($1)",
+       "pageinfo-magic-words": "à¦\9cাদà§\81 {{PLURAL:$1|শব্দ|শব্দসমূহ}} ($1)",
        "pageinfo-hidden-categories": "লুকানো {{PLURAL:$1|বিষয়শ্রেণী|বিষয়শ্রেণীসমূহ}} ($1)",
        "pageinfo-templates": "সংযুক্ত {{PLURAL:$1|টেমপ্লেট|টেমপ্লেটসমূহ}} ($1)",
        "pageinfo-transclusions": "{{PLURAL:$1|পাতা|পাতাসমূহ}} ট্রান্সক্লুড করার সময় ($1)",
index cc25a65..943667e 100644 (file)
        "rcfilters-filter-humans-label": "Den (ket ur robot)",
        "rcfilters-filter-humans-description": "Kemmoù graet gant tud kig-hag-eskern.",
        "rcfilters-filtergroup-reviewstatus": "Adwelet ar statud",
-       "rcfilters-filter-patrolled-label": "Gwiriet",
-       "rcfilters-filter-patrolled-description": "Merkañ ar c'hemmoù evel gwiriet.",
-       "rcfilters-filter-unpatrolled-label": "Anwiriet",
-       "rcfilters-filter-unpatrolled-description": "Kemmoù n'int ket merket evit gwiriet.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Anwiriet",
        "rcfilters-filtergroup-significance": "Talvoudegezh",
        "rcfilters-filter-minor-label": "Kemmoù dister",
        "rcfilters-filter-minor-description": "Kemmoù merket evel dister gant an aozer.",
index 7f61393..12c68c2 100644 (file)
        "rcfilters-filter-humans-label": "Čovjek (ne bot)",
        "rcfilters-filter-humans-description": "Izmjene koje su napravili ljudi.",
        "rcfilters-filtergroup-reviewstatus": "Pregledanost",
-       "rcfilters-filter-patrolled-label": "Patrolirano",
-       "rcfilters-filter-patrolled-description": "Izmjene označene patroliranim.",
-       "rcfilters-filter-unpatrolled-label": "Nepatrolirano",
-       "rcfilters-filter-unpatrolled-description": "Izmjene koje nisu označene patroliranim.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Nepatrolirano",
        "rcfilters-filtergroup-significance": "Značaj",
        "rcfilters-filter-minor-label": "Manje izmjene",
        "rcfilters-filter-minor-description": "Izmjene koje je njihov autor označio manjim.",
index 94112f1..61f003e 100644 (file)
        "rcfilters-filter-humans-label": "Humà (no bot)",
        "rcfilters-filter-humans-description": "Modificacions fetes per editors humans.",
        "rcfilters-filtergroup-reviewstatus": "Estat de revisió",
-       "rcfilters-filter-patrolled-label": "Patrullat",
-       "rcfilters-filter-patrolled-description": "Modificacions marcades com a patrullades.",
-       "rcfilters-filter-unpatrolled-label": "No patrullat",
-       "rcfilters-filter-unpatrolled-description": "Modificacions no marcades com a patrullades.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "No patrullat",
        "rcfilters-filtergroup-significance": "Significació",
        "rcfilters-filter-minor-label": "Modificacions menors",
        "rcfilters-filter-minor-description": "Modificacions que l'autor va etiquetar com a menors.",
index 18ef910..7f26366 100644 (file)
        "rcfilters-filter-bots-description": "Авто-гӀирсашца дина нисдарш.",
        "rcfilters-filter-humans-label": "Адам ду (бот яц)",
        "rcfilters-filter-humans-description": "Декъашхоша дина нисдарш.",
-       "rcfilters-filter-patrolled-label": "Патрулйина",
        "rcfilters-filtergroup-significance": "МаьӀна",
        "rcfilters-filter-minor-label": "Жим нисдарш",
        "rcfilters-filter-minor-description": "Авторс жима ду аьлла билгалдина нисдарш.",
index 32ac529..57a1f10 100644 (file)
        "rcfilters-filter-bots-description": "ئەو دەستکارییانەی بە ئامرازە خۆگەڕەکان کراون",
        "rcfilters-filter-humans-label": "مرۆڤ (بۆت نییە)",
        "rcfilters-filter-humans-description": "دەستکارییەکانی لەلایەن مرۆڤەکانەوە ئەنجام دراون",
-       "rcfilters-filter-patrolled-label": "پاسدراو",
-       "rcfilters-filter-patrolled-description": "ئەو دەستکارییانەی وەک پاسدراو دیاریکراون",
-       "rcfilters-filter-unpatrolled-label": "پاسنەدراوەکان",
-       "rcfilters-filter-unpatrolled-description": "ئەو دەستکارییانەی وەک پاسدراو دیارینەکراون",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "پاسنەدراوەکان",
        "rcfilters-filtergroup-significance": "بەسوود",
        "rcfilters-filter-minor-label": "دەستکارییە بچووکەکان",
        "rcfilters-filter-minor-description": "ئەو دەستکارییانەی کە دەستکاریکەر وەک بچووک ناوی بردووە",
index 63fe35f..45c2c31 100644 (file)
@@ -40,7 +40,8 @@
                        "Ilimanaq29",
                        "Patriccck",
                        "Ed g2s",
-                       "Radana"
+                       "Radana",
+                       "Jan Růžička"
                ]
        },
        "tog-underline": "Podtrhávat odkazy:",
@@ -77,7 +78,7 @@
        "tog-watchlisthideminor": "Na seznamu sledovaných stránek skrýt malé editace",
        "tog-watchlisthideliu": "Na seznamu sledovaných stránek skrýt editace přihlášených uživatelů",
        "tog-watchlistreloadautomatically": "Při změně filtru automaticky aktualizovat seznam sledovaných stránek (vyžaduje JavaScript)",
-       "tog-watchlistunwatchlinks": "K položkám sledovaných stránek přidat odkazy pro sledování/nesledování (rychlé přepnutí vyžaduje JavaScript)",
+       "tog-watchlistunwatchlinks": "K položkám sledovaných stránek přidat značky pro sledování/nesledování ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) (rychlé přepnutí vyžaduje JavaScript)",
        "tog-watchlisthideanons": "Na seznamu sledovaných stránek skrýt editace nepřihlášených uživatelů",
        "tog-watchlisthidepatrolled": "Skrýt prověřené editace ve sledovaných stránkách",
        "tog-watchlisthidecategorization": "Skrýt kategorizaci stránek",
        "savechanges": "Uložit změny",
        "publishpage": "Zveřejnit stránku",
        "publishchanges": "Zveřejnit změny",
-       "savearticle-start": "Uložit stránku…",
+       "savearticle-start": "Uložit změny…",
        "savechanges-start": "Uložit změny…",
        "publishpage-start": "Zveřejnit stránku…",
        "publishchanges-start": "Zveřejnit změny…",
        "rcfilters-filter-humans-label": "Člověk (ne robot)",
        "rcfilters-filter-humans-description": "Editace provedené lidmi.",
        "rcfilters-filtergroup-reviewstatus": "Stav prověření",
-       "rcfilters-filter-patrolled-label": "Prověřené",
-       "rcfilters-filter-patrolled-description": "Editace označené jako prověřené.",
-       "rcfilters-filter-unpatrolled-label": "Neprověřené",
-       "rcfilters-filter-unpatrolled-description": "Editace označené jako neprověřené.",
+       "rcfilters-filter-reviewstatus-unpatrolled-description": "Editace, které nebyly ručně nebo automaticky označeny jako prověřené.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Neprověřené",
+       "rcfilters-filter-reviewstatus-manual-description": "Editace ručně označené jako prověřené.",
+       "rcfilters-filter-reviewstatus-manual-label": "Ručně prověřené",
+       "rcfilters-filter-reviewstatus-auto-description": "Editace pokročilých uživatelů, jejichž práce je autoamticky označena jako prověřená.",
+       "rcfilters-filter-reviewstatus-auto-label": "Automaticky prověřené",
        "rcfilters-filtergroup-significance": "Důležitost",
        "rcfilters-filter-minor-label": "Malé editace",
        "rcfilters-filter-minor-description": "Editace, které autor označil jako malé.",
        "uploadstash-bad-path": "Cesta neexistuje.",
        "uploadstash-bad-path-invalid": "Cesta není platná.",
        "uploadstash-bad-path-unknown-type": "Neznámý typ „$1“.",
+       "uploadstash-bad-path-bad-format": "Klíč \"$1\" není správně naformátovaný.",
        "uploadstash-file-not-found-no-thumb": "Nepodařilo se získat náhled.",
        "uploadstash-file-not-found-no-object": "Nepodařilo se vytvořit objekt lokálního souboru pro náhled.",
        "uploadstash-file-not-found-no-remote-thumb": "Načtení náhledu se nepodařilo: $1\nURL = $2",
        "uploadstash-not-logged-in": "Není přihlášen žádný uživatel, soubory musí patřit uživatelům.",
        "uploadstash-wrong-owner": "Tento soubor ($1) nepatří aktuálnímu uživateli.",
        "uploadstash-no-such-key": "Uvedený klíč ($1) neexistuje, nelze odebrat.",
+       "uploadstash-no-extension": "Přípona je nulová.",
        "uploadstash-zero-length": "Soubor má nulovou délku.",
        "invalid-chunk-offset": "Neplatný posun bloku",
        "img-auth-accessdenied": "Přístup odepřen",
index 2ecc67a..69330e1 100644 (file)
        "rcfilters-filter-humans-label": "Dynol (nid bot)",
        "rcfilters-filter-humans-description": "Golygiadau a wnaed gan olygyddion go-iawn.",
        "rcfilters-filtergroup-reviewstatus": "Statws adolygu",
-       "rcfilters-filter-patrolled-label": "Wedi derbyn patrol",
-       "rcfilters-filter-patrolled-description": "Marciwyd y golygiadau fel rhai sydd wedi derbyn patrol.",
-       "rcfilters-filter-unpatrolled-label": "Heb ei gadarnhau (''Unpatrolled'')",
-       "rcfilters-filter-unpatrolled-description": "Ni farciwyd y golygiadau fel rhai sydd wedi derbyn patrol.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Heb ei gadarnhau (''Unpatrolled'')",
        "rcfilters-filtergroup-significance": "Arwyddocaol",
        "rcfilters-filter-minor-label": "Golygiadau bach",
        "rcfilters-filter-minor-description": "Golygiadau a nodwyd gan y golygydd fel rhai bach.",
index 234d3a0..a10f22e 100644 (file)
        "rcfilters-filter-humans-label": "Menneske (ikke bot)",
        "rcfilters-filter-humans-description": "Redigeringer udført af mennesker.",
        "rcfilters-filtergroup-reviewstatus": "Gennemgangsstatus",
-       "rcfilters-filter-patrolled-label": "Patruljerede",
-       "rcfilters-filter-patrolled-description": "Redigeringer markerede som patruljerede.",
-       "rcfilters-filter-unpatrolled-label": "Upatruljerede",
-       "rcfilters-filter-unpatrolled-description": "Redigeringer ikke markerede som patruljerede.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Upatruljerede",
        "rcfilters-filtergroup-significance": "Betydning",
        "rcfilters-filter-minor-label": "Mindre redigeringer",
        "rcfilters-filter-minor-description": "Redigeringer som ophavsmanden har markeret som mindre.",
index 461d7c0..22d7192 100644 (file)
        "rcfilters-filter-humans-label": "Mensch (kein Bot)",
        "rcfilters-filter-humans-description": "Bearbeitungen, die von menschlichen Autoren durchgeführt wurden.",
        "rcfilters-filtergroup-reviewstatus": "Überprüfungsstatus",
-       "rcfilters-filter-patrolled-label": "Kontrolliert",
-       "rcfilters-filter-patrolled-description": "Bearbeitungen, die als kontrolliert markiert sind.",
-       "rcfilters-filter-unpatrolled-label": "Unkontrolliert",
-       "rcfilters-filter-unpatrolled-description": "Bearbeitungen, die nicht als kontrolliert markiert sind.",
+       "rcfilters-filter-reviewstatus-unpatrolled-description": "Bearbeitungen, die nicht manuell oder automatisch als kontrolliert markiert wurden.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Unkontrolliert",
+       "rcfilters-filter-reviewstatus-manual-description": "Bearbeitungen, die manuell als kontrolliert markiert wurden.",
+       "rcfilters-filter-reviewstatus-manual-label": "Manuell kontrolliert",
+       "rcfilters-filter-reviewstatus-auto-description": "Bearbeitungen von erweiterten Benutzern, deren Arbeit automatisch als kontrolliert markiert wurde.",
+       "rcfilters-filter-reviewstatus-auto-label": "Automatisch kontrolliert",
        "rcfilters-filtergroup-significance": "Bedeutung",
        "rcfilters-filter-minor-label": "Kleine Änderungen",
        "rcfilters-filter-minor-description": "Bearbeitungen, die der Autor als geringfügig markiert hat.",
        "version-specialpages": "Erweiterungen mit Spezialseiten",
        "version-parserhooks": "Parsererweiterungen",
        "version-variables": "Erweiterungen mit Variablen",
+       "version-editors": "Editoren",
        "version-antispam": "Spamschutzerweiterungen",
        "version-api": "API-Erweiterungen",
        "version-other": "Sonstige Erweiterungen",
index 8b081f7..ca4eed2 100644 (file)
        "rcfilters-filter-humans-label": "Ανθρώπινες (όχι από ρομπότ)",
        "rcfilters-filter-humans-description": "Επεξεργασίες που έγιναν από ανθρώπους συντάκτες.",
        "rcfilters-filtergroup-reviewstatus": "Έλεγχος κατάστασης",
-       "rcfilters-filter-patrolled-label": "Ελεγμένες",
-       "rcfilters-filter-patrolled-description": "Ελεγμένες επεξεργασίες",
-       "rcfilters-filter-unpatrolled-label": "Μη ελεγμένες",
-       "rcfilters-filter-unpatrolled-description": "Μη ελεγμένες επεξεργασίες",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Μη ελεγμένες",
        "rcfilters-filtergroup-significance": "Σημαντικότητα",
        "rcfilters-filter-minor-label": "Μικροεπεξεργασίες",
        "rcfilters-filter-minor-description": "Επεξεργασίες που ο συντάκτης χαρακτήρισε ως μικροεπεξεργασίες.",
        "version-specialpages": "Ειδικές σελίδες",
        "version-parserhooks": "Άγκιστρα του συντακτικού αναλυτή",
        "version-variables": "Παράμετροι",
+       "version-editors": "Συντάκτες",
        "version-antispam": "Πρόληψη spam",
        "version-other": "Άλλα",
        "version-mediahandlers": "Χειριστές των μέσων",
index 4bdf97e..168ce07 100644 (file)
        "rcfilters-filter-humans-label": "Human (not bot)",
        "rcfilters-filter-humans-description": "Edits made by human editors.",
        "rcfilters-filtergroup-reviewstatus": "Review status",
-       "rcfilters-filter-patrolled-label": "Patrolled",
-       "rcfilters-filter-patrolled-description": "Edits marked as patrolled.",
-       "rcfilters-filter-unpatrolled-label": "Unpatrolled",
-       "rcfilters-filter-unpatrolled-description": "Edits not marked as patrolled.",
+       "rcfilters-filter-reviewstatus-unpatrolled-description": "Edits not manually or automatically marked as patrolled.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Unpatrolled",
+       "rcfilters-filter-reviewstatus-manual-description": "Edits manually marked as patrolled.",
+       "rcfilters-filter-reviewstatus-manual-label": "Manually patrolled",
+       "rcfilters-filter-reviewstatus-auto-description": "Edits by advanced users whose work is automatically marked as patrolled.",
+       "rcfilters-filter-reviewstatus-auto-label": "Autopatrolled",
        "rcfilters-filtergroup-significance": "Significance",
        "rcfilters-filter-minor-label": "Minor edits",
        "rcfilters-filter-minor-description": "Edits the author labeled as minor.",
        "version-specialpages": "Special pages",
        "version-parserhooks": "Parser hooks",
        "version-variables": "Variables",
+       "version-editors": "Editors",
        "version-antispam": "Spam prevention",
        "version-api": "API",
        "version-other": "Other",
index d7a174b..21e7816 100644 (file)
        "rcfilters-filter-humans-label": "Ser humano (no bot)",
        "rcfilters-filter-humans-description": "Ediciones realizadas por editores humanos.",
        "rcfilters-filtergroup-reviewstatus": "Estado de revisión",
-       "rcfilters-filter-patrolled-label": "Patrulladas",
-       "rcfilters-filter-patrolled-description": "Ediciones marcadas como patrulladas.",
-       "rcfilters-filter-unpatrolled-label": "No patrulladas",
-       "rcfilters-filter-unpatrolled-description": "Ediciones no marcadas como patrulladas.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "No patrulladas",
        "rcfilters-filtergroup-significance": "Significación",
        "rcfilters-filter-minor-label": "Ediciones menores",
        "rcfilters-filter-minor-description": "Ediciones etiquetadas por el autor como menores.",
index c8c9109..3705666 100644 (file)
        "rcfilters-filter-humans-label": "Pole robot",
        "rcfilters-filter-humans-description": "Vahetult inimese tehtud muudatused.",
        "rcfilters-filtergroup-reviewstatus": "Ülevaatuse seis",
-       "rcfilters-filter-patrolled-label": "Kontrollitud",
-       "rcfilters-filter-patrolled-description": "Kontrollituks märgitud muudatused.",
-       "rcfilters-filter-unpatrolled-label": "Kontrollimata",
-       "rcfilters-filter-unpatrolled-description": "Muudatused, mida pole märgitud kontrollituks.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Kontrollimata",
        "rcfilters-filtergroup-significance": "Olulisus",
        "rcfilters-filter-minor-label": "Pisimuudatused",
        "rcfilters-filter-minor-description": "Muudatused, mille autor märkis pisimuudatuseks.",
index 90c620b..521f98e 100644 (file)
        "rcfilters-filter-humans-label": "Gizaki (ez bot)",
        "rcfilters-filter-humans-description": "Gizaki editoreek egindako aldaketak.",
        "rcfilters-filtergroup-reviewstatus": "Berrikuspenaren egoera",
-       "rcfilters-filter-patrolled-label": "Patruiladunak",
-       "rcfilters-filter-patrolled-description": "Patroiladun marka duten aldaketak",
-       "rcfilters-filter-unpatrolled-label": "Patruilagabea",
-       "rcfilters-filter-unpatrolled-description": "Patruiladun marka ez duten aldaketak.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Patruilagabea",
        "rcfilters-filtergroup-significance": "Munta",
        "rcfilters-filter-minor-label": "Aldaketa txikiak",
        "rcfilters-filter-minor-description": "Egileak sailkatutako aldaketa txikiak.",
index e0cfc6d..b64f1d1 100644 (file)
        "rcfilters-filter-humans-label": "انسان (ربات نه)",
        "rcfilters-filter-humans-description": "ویرایش توسط انسان.",
        "rcfilters-filtergroup-reviewstatus": "وضعیت بازبینی",
-       "rcfilters-filter-patrolled-label": "گشت‌خورده",
-       "rcfilters-filter-patrolled-description": "ویرایش‌های گشت‌خورده.",
-       "rcfilters-filter-unpatrolled-label": "گشت‌نخورده",
-       "rcfilters-filter-unpatrolled-description": "ویرایش‌های گشت‌نخورده.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "گشت‌نخورده",
        "rcfilters-filtergroup-significance": "اهمیت",
        "rcfilters-filter-minor-label": "ویرایش‌های جزئی",
        "rcfilters-filter-minor-description": "ویرایش‌هایی که به عنوان جزئی برچسب خورده‌اند.",
index c93ef98..01a9fcf 100644 (file)
        "saveusergroups": "Tallenna {{GENDER:$1|käyttäjän}} ryhmät",
        "userrights-groupsmember": "Jäsenenä ryhmissä:",
        "userrights-groupsmember-auto": "Automaattisesti jäsenenä ryhmissä:",
-       "userrights-groups-help": "Voit muuttaa ryhmiä, joissa tämä käyttäjä on.\n* Merkattu valintaruutu tarkoittaa, että käyttäjä on kyseisessä ryhmässä.\n* Merkkaamaton valintaruutu tarkoittaa, että käyttäjä ei ole kyseisessä ryhmässä.\n* <nowiki>*</nowiki> tarkoittaa, että et pysty poistamaan ryhmää, kun olet sen lisännyt tai päinvastoin.\n* # tarkoittaa että voit vain siirtää tämän ryhmän jäsenten vanhentumisaikaa menneisyyttä kohti etkä lisätä aikaa.",
+       "userrights-groups-help": "Voit muuttaa ryhmiä, joissa tämä käyttäjä on.\n* Merkattu valintaruutu tarkoittaa, että käyttäjä on kyseisessä ryhmässä.\n* Merkkaamaton valintaruutu tarkoittaa, että käyttäjä ei ole kyseisessä ryhmässä.\n* <nowiki>*</nowiki> tarkoittaa, että et pysty enää poistamaan käyttäjää ryhmästä, kun olet hänet siihen lisännyt, tai päinvastoin.\n* <nowiki>#</nowiki> tarkoittaa, että voit ainoastaan pidentää tämän ryhmän jäsenten oikeuksien vanhentumisen määräaikaa, mutta et voi lyhentää sitä.",
        "userrights-reason": "Syy:",
        "userrights-no-interwiki": "Sinulla ei ole oikeutta muokata käyttöoikeuksia muissa wikeissä.",
        "userrights-nodatabase": "Tietokantaa $1 ei ole tai se ei ole paikallinen.",
        "rcfilters-filter-humans-label": "Ihminen (ei botti)",
        "rcfilters-filter-humans-description": "Ihmisten tekemät muokkaukset.",
        "rcfilters-filtergroup-reviewstatus": "Sivun partioinnin status",
-       "rcfilters-filter-patrolled-label": "Partioidut",
-       "rcfilters-filter-patrolled-description": "Muokkaukset, jotka on merkitty partioiduiksi.",
-       "rcfilters-filter-unpatrolled-label": "Ei ole partioitu",
-       "rcfilters-filter-unpatrolled-description": "Muutokset, joita ei ole merkitty partioiduiksi.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Ei ole partioitu",
        "rcfilters-filtergroup-significance": "Merkitys",
        "rcfilters-filter-minor-label": "Pienet muutokset",
        "rcfilters-filter-minor-description": "Muokkaukset, jotka on merkitty pieniksi.",
        "version-specialpages": "Toimintosivut",
        "version-parserhooks": "Jäsenninkytkökset",
        "version-variables": "Muuttujat",
+       "version-editors": "Muokkaajat",
        "version-antispam": "Roskalinkkien estäminen",
        "version-other": "Muut",
        "version-mediahandlers": "Median käsittelijät",
index fc59bfc..39cf7d0 100644 (file)
        "rcfilters-filter-humans-label": "Humain (non robot)",
        "rcfilters-filter-humans-description": "Modifications faites par des éditeurs humains.",
        "rcfilters-filtergroup-reviewstatus": "Etat de révision",
-       "rcfilters-filter-patrolled-label": "Patrouillé",
-       "rcfilters-filter-patrolled-description": "Modifications marquées comme relues.",
-       "rcfilters-filter-unpatrolled-label": "Non patrouillé",
-       "rcfilters-filter-unpatrolled-description": "Modifications non marquées comme étant relues.",
+       "rcfilters-filter-reviewstatus-unpatrolled-description": "Modifications non marquées comme patrouillées, manuellement ou automatiquement.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Non patrouillé",
+       "rcfilters-filter-reviewstatus-manual-description": "Modifications manuellement marquées comme patrouillées.",
+       "rcfilters-filter-reviewstatus-manual-label": "Patrouillé manuellement",
+       "rcfilters-filter-reviewstatus-auto-description": "Modifications par des utilisateurs avancés dont le travail est marqué comme patrouillé automatiquement",
+       "rcfilters-filter-reviewstatus-auto-label": "Patrouillé automatiquement",
        "rcfilters-filtergroup-significance": "Signification",
        "rcfilters-filter-minor-label": "Modifications mineures",
        "rcfilters-filter-minor-description": "Modifications que l’auteur a marquées comme mineures.",
        "apisandbox-results-login-suppressed": "Cette requête a été exécutée en tant qu'utilisateur déconnecté et aurait pu être utilisée pour évincer la sécurité concernant le contrôle de la même source dans le navigateur. Notez que la gestion automatique du jeton de l'API du bac à sable ne fonctionne pas correctement avec de telles requêtes; vous devez les remplir manuellement.",
        "apisandbox-request-selectformat-label": "Afficher les données de la requête comme :",
        "apisandbox-request-format-url-label": "Chaîne de requête de l’URL",
-       "apisandbox-request-url-label": "Requête URL :",
+       "apisandbox-request-url-label": "URL de la requête :",
        "apisandbox-request-format-json-label": "JSON",
-       "apisandbox-request-json-label": "Demander du JSON :",
+       "apisandbox-request-json-label": "Représentation JSON de requête :",
        "apisandbox-request-time": "Durée de la demande: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Corrigez le jeton et renvoyez",
        "apisandbox-results-fixtoken-fail": "Impossible de récupérer le jeton \"$1\"",
        "tooltip-publish": "Publier vos modifications",
        "tooltip-preview": "Merci de prévisualiser vos modifications avant de les publier",
        "tooltip-diff": "Afficher les modifications que vous avez apportées au texte",
-       "tooltip-compareselectedversions": "Afficher les différences entre les deux versions selectionnées de cette page",
+       "tooltip-compareselectedversions": "Afficher les différences entre les deux versions sélectionnées de cette page",
        "tooltip-watch": "Ajouter cette page à votre liste de suivi",
        "tooltip-watchlistedit-normal-submit": "Enlever les titres",
        "tooltip-watchlistedit-raw-submit": "Mise à jour de la liste de suivi",
index d74d7df..0aad8bc 100644 (file)
        "password-login-forbidden": "Itilizasyon-an di sa non d'itilizatò oben di sa mo di pas té entèrdit.",
        "mailmypassword": "Réyinisyalizé mo di pas",
        "passwordremindertitle": "Nouvèl mo di pas tanporèr pou {{SITENAME}}",
+       "passwordremindertext": "Tchèk moun (dipi adrès IP $1) doumandé roun mo di pas nòv pou {{SITENAME}} ($4). Oun mo di pas tanporèr pou itilizatò-a\n« $2 » té kréyé é sa « $3 ». Si sala té zòt entansyon,\nzòt divèt konèkté zòt kò é chwézi roun mo di pas nòv.\nZòt mo di pas tanporèr ké èkspiré andan $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 mo di pas é zòt pli ka swété an chanjé, zòt pouvé ignoré sa mésaj é kontinwé di itilizé zòt ansyen mo di pas.",
        "noemail": "Pyès adrès di kouryé té anréjistré pou itilizat{{GENDER:$1|ò|ris}}-a « $1 ».",
        "noemailcreate": "Zòt divèt fourni roun adrès di kouryé valid",
+       "passwordsent": "Roun nouvèl mo di pas té voyé kot adrès-a di kouryé di itilizat{{GENDER:$1|ò|ris}} « $1 ».\nSouplé, roukonèkté zòt kò aprè ki zòt rousouvri li.",
+       "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",
+       "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.",
+       "noemailprefs": "Endiké roun adrès di kouryé annan zòt préférans pou itilizé sa fonksyon.",
+       "emailconfirmlink": "Konfirmé zòt adrès di kouryé",
+       "invalidemailaddress": "Sa adrès kouryé pa pouvé fika asèpté pas so fòrma ka parèt enkorèk.\nAntré roun adrès korèkman fòrmaté oben lésé sa chan vid.",
+       "cannotchangeemail": "Adrès di kouryé dé kont pa pouvé fika modifyé asou sa wiki.",
+       "emaildisabled": "Sa sit pa pouvé voyé di kouryé.",
        "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ò.",
+       "login-throttled": "Zòt tanté dèrnyèrman roun nonm tròp élvé di konèksyon.\nSouplé, antann $1 anvan di éséyé òkò.",
+       "login-abort-generic": "Zòt échwé zòt tantativ di konèksyon",
+       "login-migrated-generic": "Zòt kont té migré, é zòt non d'itilizatò pa ka ègzisté òkò asou sa wiki.",
        "loginlanguagelabel": "Lanng : $1",
+       "suspicious-userlogout": "Zòt doumann di konèksyon té réfizé pas i sanblé ki li té voyé pa roun navigatò défèktyé oben dipi kach-a di roun sèrvis mandatèr.",
+       "createacct-another-realname-tip": "Véritab non sa òpsyonèl.\nSi zòt désidé di fourni li, i ké fika itilizé pou krédité lotò di so travay.",
        "pt-login": "Konèkté so kò",
        "pt-login-button": "Konèkté so kò",
+       "pt-login-continue-button": "Kontinwé konèksyon-an",
        "pt-createaccount": "Kréyé roun kont",
        "pt-userlogout": "Dékonèkté so kò",
+       "php-mail-error-unknown": "Érò enkonèt annan fonksyon-an <code>mail()</code> 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",
+       "resetpass_announce": "Pou tèrminé zòt enskripsyon, zòt divèt fourni roun mo di pas nòv.",
+       "resetpass_header": "Chanjé mo di pas di kont",
+       "oldpassword": "Ansyen mo di pas :",
+       "newpassword": "Mo di pas nòv :",
+       "retypenew": "Konfirmé mo di pas nòv :",
+       "resetpass_submit": "Chanjé mo di pas é konèkté so kò.",
+       "changepassword-success": "Zòt mo di pas té modifyé !",
+       "changepassword-throttled": "Zòt fè tròp di tantativ di konèksyon résaman. \nSouplé, antann $1 anvan di rééséyé.",
+       "botpasswords": "Mo di pas di robo",
+       "botpasswords-summary": "<em>Mo di pas di robo</em> ka pèrmèt di aksédé à roun kont itilizatò via API-a san itilizé idantifyan-yan di konèksyon prensipal. Drwè itilizatò disponib lò to konèkté ké roun mo di pas robo pouvé fika rédjwi.\n\nSi zòt wè pou kisa zòt ké lé fè sa, a ki zòt pa benzwen di fè sa. Pésonn divèt janmè doumandé zòt di jénéré roun é di bay li.",
+       "botpasswords-disabled": "Mo di pas di robo sa dézaktivé.",
+       "botpasswords-no-central-id": "Pou itilizé mo di pas di robo, zòt divèt fika konèkté à roun kont santralizé.",
+       "botpasswords-existing": "Mo di pas di robo ègzistan",
+       "botpasswords-createnew": "Kréyé roun mo di pas nòv di robo",
+       "botpasswords-editexisting": "Modifyé roun mo di pas di robo ègzistan",
+       "botpasswords-label-appid": "Non di robo :",
+       "botpasswords-label-create": "Kréyé",
+       "botpasswords-label-update": "Mété à jou",
+       "botpasswords-label-cancel": "Anilé",
+       "botpasswords-label-delete": "Souprimé",
+       "botpasswords-label-resetpassword": "Réyinisyalizé mo di pas",
+       "botpasswords-label-grants": "Drwè aplikab :",
+       "botpasswords-help-grants": "Otorizasyon-yan ka pèrmèt di aksédé o drwè ki ja akòrdé à zòt kont itilizatò. Aktivé roun otorizasyon isi pa ka fourni laksè à pyès drwè ki zòt kont itilizatò pé ké gen dayò. Wè [[Special:ListGrants|tablo dé otorizasyon]] pou plis d’enfò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-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": "Mo di pas nòv pou konèkté so kò à<strong>$1</strong> sa <strong>$2</strong>. <em>Souplé, anréjistré li pou fè référans di li iltèryèrman.</em><br> (Pou ansyen robo ki ka nésésité ki non fourni pou konèksyon-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 mo di pas).",
+       "botpasswords-no-provider": "BotPasswordsSessionProvider pa disponib.",
+       "botpasswords-restriction-failed": "Rèstriksyon-yan di mo di pas di robo ka anpéché sa konèksyon.",
+       "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 ».",
+       "resetpass_forbidden": "Mo di pas pa pouvé fika chanjé.",
+       "resetpass_forbidden-reason": "Mo di pas pa pouvé fika modifyé : $1",
+       "resetpass-no-info": "Zòt divèt fika konèkté pou aksédé dirèkman à sa paj.",
+       "resetpass-submit-loggedin": "Chanjé di mo di pas",
+       "resetpass-submit-cancel": "Anilé",
+       "resetpass-wrong-oldpass": "Mo di pas atchwèl oben tanporèr envalid.\nZòt pitèt ja chanjé zòt mo di pas oben doumandé roun mo di pas nòv tanporèr.",
+       "resetpass-recycled": "Souplé, réyinisyalizé zòt mo di pas an tchèk kichoz di ròt ki atchwèl-a.",
+       "resetpass-temp-emailed": "Zòt konèkté ké roun kod tanporèr fourni pa kouryé.\nPou tèrminé konèksyon-an, zòt divèt fourni roun mo di pas nòv isi :",
+       "resetpass-temp-password": "Mo di pas tanporèr :",
+       "resetpass-expired-soft": "Zòt mo di pas èkspiré, é divèt fika réyinisyalizé. Souplé, chwézi roun nouvèl atchwèlman oben kliké asou « {{int:authprovider-resetpass-skip-label}} » pou fè li plita.",
+       "resetpass-validity-soft": "Zòt mo di pas pa valid : $1\n\nSouplé, chwézi roun mo di pas nòv atchwèlman, oben kliké asou « {{int:authprovider-resetpass-skip-label}} » pou réyinisyalizé li plita.",
        "passwordreset": "Réyinisyalizasyon di mo di pas",
+       "passwordreset-text-one": "Ranplisé sa fòrmilèr pou zòt mo di pas.",
+       "passwordreset-emaildisabled": "Fonksyonalité-ya di kouryé té dézaktivé asou sa wiki.",
+       "passwordreset-username": "Non di itilizatò :",
+       "passwordreset-domain": "Domenn :",
+       "passwordreset-email": "Adrès di kouryé :",
+       "passwordreset-emailtitle": "Détay di kont asou {{SITENAME}}",
+       "passwordreset-emailelement": "Non di itilizatò : \n$1\n\nMo di pas tanporèr : \n$2",
+       "passwordreset-nocaller": "Oun apélan divèt fika fourni",
+       "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-no-info": "Zòt divèt fika konèkté pou aksédé dirèkman à sa paj.",
+       "changeemail-oldemail": "Adrès di kouryé atchwèl :",
+       "changeemail-newemail": "Nouvèl adrès di kouryé :",
+       "changeemail-none": "(pyès)",
+       "changeemail-password": "Zòt mo di pas asou {{SITENAME}} :",
+       "changeemail-submit": "Chanjé adrès di kouryé",
+       "changeemail-throttled": "Zòt fè tròp di tantativ di konèksyon. \nSouplé, antann $1 anvan di rééséyé.",
+       "changeemail-nochange": "Souplé, sézi roun nouvèl adrès di kouryé diférant di présédant-a.",
+       "resettokens": "Réyinisyalizé jéton-yan.",
+       "resettokens-no-tokens": "I pa gen pyès jéton pou réyinisyalizé.",
+       "resettokens-tokens": "Jéton :",
+       "resettokens-token-label": "$1 (valò atchwèl : $2)",
+       "resettokens-watchlist-token": "Jéton pou flux (Atom/RSS) web di [[Special:Watchlist|modifikasyon di paj di zòt lis di swivi]]",
+       "resettokens-done": "Jéton réyinisyalizé.",
+       "resettokens-resetbutton": "Réyinisyalizé jéton-yan ki sékèksyoné",
        "bold_sample": "Tèks gra",
        "bold_tip": "Tèks gra",
        "italic_sample": "Tèks italik",
        "sig_tip": "Zòt signatir ké dat",
        "hr_tip": "Lign orizontal (pa an abizé)",
        "summary": "Rézimé :",
+       "subject": "Sijè :",
        "minoredit": "Sa modifikasyon sa minò.",
        "watchthis": "Swiv sa paj",
        "savearticle": "Anréjistré",
+       "savechanges": "Anréjistré modifikasyon-yan",
+       "publishpage": "Pibliyé paj-a",
+       "publishchanges": "Pibliyé modifikasyon-yan",
+       "savearticle-start": "Anréjistré paj-a…",
+       "savechanges-start": "Anréjistré modifikasyon-yan…",
+       "publishpage-start": "Pibliyé paj-a…",
+       "publishchanges-start": "Pibliyé modifikasyon-yan…",
        "preview": "Prévizwalizasyon",
        "showpreview": "Prévizwalizé",
        "showdiff": "Wè modifikasyon-yan",
index 7d467a0..8fd4712 100644 (file)
        "rcfilters-filter-humans-label": "Humano (non bot)",
        "rcfilters-filter-humans-description": "Edicións realizadas por editores humanos.",
        "rcfilters-filtergroup-reviewstatus": "Estado de revisión",
-       "rcfilters-filter-patrolled-label": "Patrulladas",
-       "rcfilters-filter-patrolled-description": "Edicións marcadas como patrulladas.",
-       "rcfilters-filter-unpatrolled-label": "Sen patrullar",
-       "rcfilters-filter-unpatrolled-description": "Edicións non marcadas como patrulladas.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Sen patrullar",
        "rcfilters-filtergroup-significance": "Importancia",
        "rcfilters-filter-minor-label": "Edicións menores",
        "rcfilters-filter-minor-description": "Edicións que o autor etiquetou como menores.",
index f3ee776..d7bb1f8 100644 (file)
        "botpasswords-restriction-failed": "כניסה זו נמנעה בשל הגבלות על סיסמאות בוט.",
        "botpasswords-invalid-name": "שם המשתמש שניתן אינו מכיל את תו הפרדת סיסמאות הבוט (\"$1\").",
        "botpasswords-not-exist": "{{GENDER:$1|למשתמש|למשתמשת}} \"$1\" אין סיסמת בוט בשם \"$2\".",
-       "resetpass_forbidden": "לא ניתן לשנות סיסמאות.",
+       "resetpass_forbidden": "לא ניתן לשנות סיסמאות",
        "resetpass_forbidden-reason": "לא ניתן לשנות את הסיסמאות: $1",
        "resetpass-no-info": "נדרשת כניסה לחשבון כדי לגשת לדף זה באופן ישיר.",
        "resetpass-submit-loggedin": "שינוי סיסמה",
        "content-model-text": "טקסט רגיל",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
-       "content-json-empty-object": "אוביקט ריק",
+       "content-json-empty-object": "×\90×\95×\91×\99×\99ק×\98 ×¨×\99ק",
        "content-json-empty-array": "מערך ריק",
-       "deprecated-self-close-category": "דפים שמשתמשים בתגיות HTML עם סגירה עצמית בלתי תקינה",
-       "deprecated-self-close-category-desc": "הדף מכיל תגיות HTML עם סגירה עצמית בלתי תקינה, כגון <code dir=\"ltr\">&lt;b/></code> או <code dir=\"ltr\">&lt;span/></code>. ההתנהגות של תגיות אלה תשתנה בקרוב לצורך תאימות עם מפרט HTML5, ולכן יש להימנע משימוש בהן בקוד ויקי.",
+       "deprecated-self-close-category": "דפים שמשתמשים בתגיות HTML עם סגירה עצמית בלתי־תקינה",
+       "deprecated-self-close-category-desc": "הדף מכיל תגיות HTML עם סגירה עצמית בלתי־תקינה, כגון <code dir=\"ltr\">&lt;b/></code> או <code dir=\"ltr\">&lt;span/></code>. ההתנהגות של תגיות אלה תשתנה בקרוב לצורך תאימות עם מפרט HTML5, ולכן יש להימנע משימוש בהן בקוד ויקי.",
        "duplicate-args-warning": "<strong>אזהרה:</strong> [[:$1]] קורא לדף [[:$2]] עם יותר מערך אחד עבור הפרמטר \"$3\". ייעשה שימוש רק בערך האחרון.",
        "duplicate-args-category": "דפים שמשתמשים בפרמטרים כפולים בקריאות לתבניות",
        "duplicate-args-category-desc": "הדף מכיל קריאות לתבניות שמשתמשות בפרמטרים כפולים, כגון <code><nowiki>{{תאריך|יום=1|יום=2}}</nowiki></code> או <code><nowiki>{{שעה|חמש|1=שש}}</nowiki></code>.",
-       "expensive-parserfunction-warning": "'''אזהרה:''' דף זה כולל יותר מדי קריאות לפונקציות מפענח שגוזלות משאבים.\n\nנדרש {{PLURAL:$2|שתהיה בו לכל היותר קריאה אחת|שתהיינה בו לכל היותר $2 קריאות}} לפונקציות כאלה, אך כרגע יש בו {{PLURAL:$1|קריאה אחת|$1 קריאות}}.",
+       "expensive-parserfunction-warning": "<strong>אזהרה:</strong> דף זה כולל יותר מדי קריאות לפונקציות מפענח שגוזלות משאבים.\n\nנדרש {{PLURAL:$2|שתהיה בו לכל היותר קריאה אחת|שתהיינה בו לכל היותר $2 קריאות}} לפונקציות כאלה, אך כרגע יש בו {{PLURAL:$1|קריאה אחת|$1 קריאות}}.",
        "expensive-parserfunction-category": "דפים עם יותר מדי קריאות למשתנים הגוזלים משאבים",
-       "post-expand-template-inclusion-warning": "'''אזהרה:''' התבניות המוכללות בדף זה גדולות מדי.\nחלק מהתבניות לא יוכללו.",
+       "post-expand-template-inclusion-warning": "<strong>אזהרה:</strong> התבניות המוכללות בדף זה גדולות מדי.\nחלק מהתבניות לא יוכללו.",
        "post-expand-template-inclusion-category": "דפים שבהם ההכללה גדולה מדי",
-       "post-expand-template-argument-warning": "'''אזהרה:''' דף זה כולל לפחות תבנית אחת שבה פרמטרים גדולים מדי.\nפרמטרים אלה הושמטו.",
+       "post-expand-template-argument-warning": "<strong>אזהרה:</strong> דף זה מכיל לפחות תבנית אחת שבה פרמטרים גדולים מדי.\nפרמטרים אלה הושמטו.",
        "post-expand-template-argument-category": "דפים שבהם הושמטו פרמטרים של תבניות",
        "parser-template-loop-warning": "נמצאה תבנית הקוראת לעצמה: [[$1]]",
        "template-loop-category": "דפים עם לולאות בתבנית",
        "template-loop-category-desc": "הדף הזה מכיל לולאה בתבנית, כלומר תבנית שקוראת לעצמה באופן רקורסיבי.",
-       "template-loop-warning": "<strong>אזהרה:</strong> הדף הזה קורא ל[[:$1]], וזה גורם ללולאה בתבנית (קריאה רקורסיבית אינסופית).",
+       "template-loop-warning": "<strong>אזהרה:</strong> הדף הזה קורא לדף [[:$1]], וזה גורם ללולאה בתבנית (קריאה רקורסיבית אינסופית).",
        "parser-template-recursion-depth-warning": "עומק התבניות המוכללות זו בזו עבר את המגבלה ($1)",
-       "language-converter-depth-warning": "×¢×\95×\9eק ×\9e×\9e×\99ר השפה עבר את המגבלה ($1)",
+       "language-converter-depth-warning": "×¢×\95×\9eק ×\94×\9eרת השפה עבר את המגבלה ($1)",
        "node-count-exceeded-category": "דפים שבהם מספר הצמתים גדול מדי",
        "node-count-exceeded-category-desc": "מספר הצמתים בדף גדול מהמספר המרבי.",
        "node-count-exceeded-warning": "מספר הצמתים בדף גדול מדי",
        "unstrip-size-warning": "אורך הפריסה גדול מדי ($1)",
        "unstrip-size-category": "דפים שבהם אורך הפריסה גדול מדי",
        "converter-manual-rule-error": "התגלתה שגיאה בכלל המרת שפה ידני",
-       "undo-success": "ניתן לבטל את העריכה.\nאנא {{GENDER:|בדוק|בִדקי|בִדקו}} את השוואת הגרסאות שלהלן כדי לוודא שזה אכן מה ש{{GENDER:|אתה רוצה|את רוצה|אתם רוצים}} לעשות, ולאחר מכן {{GENDER:|שמור|שִמרי|שִמרו}} את השינויים למטה כדי לסיים את ביטול העריכה.",
+       "undo-success": "ניתן לבטל את העריכה.\nאנא {{GENDER:|בדוק|בדקי|בדקו}} את השוואת הגרסאות שלהלן כדי לוודא שזה אכן מה {{GENDER:|שאתה רוצה|שאת רוצה|שאתם רוצים}} לעשות, ולאחר מכן {{GENDER:|שמור|שמרי|שמרו}} את השינויים למטה כדי לסיים את ביטול העריכה.",
        "undo-failure": "לא ניתן היה לבטל את העריכה עקב התנגשות עם עריכות מאוחרות יותר.",
        "undo-norev": "לא ניתן היה לבטל את העריכה כי היא אינה קיימת או כי היא נמחקה.",
        "undo-nochange": "נראה שהעריכה כבר בוטלה.",
        "undo-summary": "ביטול גרסה $1 של [[Special:Contributions/$2|$2]] ([[User talk:$2|שיחה]])",
        "undo-summary-username-hidden": "ביטול גרסה $1 של משתמש מוסתר",
-       "cantcreateaccount-text": "אפשרות יצירת החשבונות מכתובת ה־IP הזאת (<strong>$1</strong>) נחסמה על־ידי [[User:$3|$3]].\n\nהסיבה שניתנה על־ידי $3 היא \"$2\".",
-       "cantcreateaccount-range-text": "אפשרות יצירת החשבונות מכתובות IP בתוך הטווח <strong>$1</strong>, כולל כתובת ה־IP שלך (<strong>$4</strong>), נחסמה על־ידי [[User:$3|$3]].\n\nהסיבה שניתנה על־ידי $3 היא \"$2\".",
+       "cantcreateaccount-text": "אפשרות יצירת החשבונות מכתובת ה־IP הזאת (<strong>$1</strong>) נחסמה על־ידי [[User:$3|$3]].\n\nהסיבה שניתנה על־ידי $3 היא: <em>$2</em>",
+       "cantcreateaccount-range-text": "אפשרות יצירת החשבונות מכתובות IP בתוך הטווח <strong>$1</strong>, כולל כתובת ה־IP שלך (<strong>$4</strong>), נחסמה על־ידי [[User:$3|$3]].\n\nהסיבה שניתנה על־ידי $3 היא: <em>$2</em>",
        "viewpagelogs": "הצגת יומנים עבור דף זה",
        "nohistory": "אין היסטוריית שינויים עבור דף זה.",
        "currentrev": "גרסה אחרונה",
        "last": "קודמת",
        "page_first": "ראשון",
        "page_last": "אחרון",
-       "histlegend": "בחירת גרסאות להשוואה: {{GENDER:|בחר|בחרי|בחרו}} את הגרסאות ש{{GENDER:|ברצונך|ברצונך|ברצונכם}} להשוות ולאחר מכן {{GENDER:|הקש|הקישי|הקישו}} על Enter או {{GENDER:|לחץ|לחצי|לחצו}} על הכפתור שלמטה.<br />\nמקרא: <strong>({{int:cur}})</strong> = השוואה עם הגרסה הנוכחית, <strong>({{int:last}})</strong> = השוואה עם הגרסה הקודמת, <strong>{{int:minoreditletter}}</strong> = עריכה משנית.",
+       "histlegend": "בחירת גרסאות להשוואה: יש לבחור את הגרסאות שברצונך להשוות ולאחר מכן להקיש על Enter או ללחוץ על הכפתור שלמטה.<br />\nמקרא: <strong>({{int:cur}})</strong> = השוואה עם הגרסה הנוכחית, <strong>({{int:last}})</strong> = השוואה עם הגרסה הקודמת, <strong>{{int:minoreditletter}}</strong> = עריכה משנית.",
        "history-fieldset-title": "חיפוש גרסאות",
        "history-show-deleted": "גרסאות מוסתרות בלבד",
        "histfirst": "הישנות ביותר",
        "revdelete-selected-text": "{{PLURAL:$1|הגרסה שנבחרה|הגרסאות שנבחרו}} מתוך הדף [[:$2]]:",
        "revdelete-selected-file": "{{PLURAL:$1|גרסת הקובץ שנבחרה|גרסאות הקובץ שנבחרו}} מתוך [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|פעולת היומן שנבחרה|פעולות היומן שנבחרו}}:",
-       "revdelete-text-text": "×\92רס×\90×\95ת ×©×\94×\95סתר×\95 ×¢×\93×\99×\99×\9f ×\99×\95פ×\99×¢×\95 בהיסטוריית הדף, אבל התוכן שלהן לא יהיה זמין לציבור.",
-       "revdelete-text-file": "×\92רס×\90×\95ת ×§×\91צ×\99×\9d ×©×\94×\95סתר×\95 ×¢×\93×\99×\99×\9f ×\99×\95פ×\99×¢×\95 בהיסטוריית הקובץ, אבל התוכן שלהן לא יהיה זמין לציבור.",
-       "logdelete-text": "פע×\95×\9c×\95ת ×\99×\95×\9e×\9f ×©×\94×\95סתר×\95 ×¢×\93×\99×\99×\9f ×\99×\95פ×\99×¢×\95 בדפי היומנים, אבל התוכן שלהן לא יהיה זמין לציבור.",
+       "revdelete-text-text": "×\92רס×\90×\95ת ×©×\94×\95סתר×\95 ×¢×\93×\99×\99×\9f ×ª×\95פענ×\94 בהיסטוריית הדף, אבל התוכן שלהן לא יהיה זמין לציבור.",
+       "revdelete-text-file": "×\92רס×\90×\95ת ×§×\91צ×\99×\9d ×©×\94×\95סתר×\95 ×¢×\93×\99×\99×\9f ×ª×\95פענ×\94 בהיסטוריית הקובץ, אבל התוכן שלהן לא יהיה זמין לציבור.",
+       "logdelete-text": "פע×\95×\9c×\95ת ×\99×\95×\9e×\9f ×©×\94×\95סתר×\95 ×¢×\93×\99×\99×\9f ×ª×\95פענ×\94 בדפי היומנים, אבל התוכן שלהן לא יהיה זמין לציבור.",
        "revdelete-text-others": "מפעילי מערכת אחרים עדיין יוכלו לגשת לתוכן המוסתר ואף לשחזר אותו, אלא אם כן תוגדרנה הגבלות נוספות.",
        "revdelete-confirm": "אנא אשרו שזה אכן מה שאתם מתכוונים לעשות, שאתם מבינים את התוצאות של מעשה כזה, ושהמעשה מבוצע בהתאם ל[[{{MediaWiki:Policy-url}}|נוהלי האתר]].",
        "revdelete-suppress-text": "יש להשתמש בהעלמה <strong>אך ורק</strong> במקרים הבאים:\n* מידע שעלול להיות לשון הרע\n* חשיפת מידע אישי\n*: <em>כתובות בתים ומספרי טלפון, מספרי זהות, וכו'</em>",
        "rcfilters-filter-humans-label": "בני אדם (לא בוטים)",
        "rcfilters-filter-humans-description": "עריכות שבוצעו על־ידי עורכים אנושיים.",
        "rcfilters-filtergroup-reviewstatus": "מצב סקירה",
-       "rcfilters-filter-patrolled-label": "בדוקות",
-       "rcfilters-filter-patrolled-description": "עריכות שסומנו כבדוקות.",
-       "rcfilters-filter-unpatrolled-label": "לא בדוקות",
-       "rcfilters-filter-unpatrolled-description": "עריכות שלא סומנו כבדוקות.",
+       "rcfilters-filter-reviewstatus-unpatrolled-description": "עריכות שלא סומנו כבדוקות באופן ידני או באופן אוטומטי.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "לא בדוקות",
+       "rcfilters-filter-reviewstatus-manual-description": "עריכות שסומנו כבדוקות באופן ידני.",
+       "rcfilters-filter-reviewstatus-manual-label": "בדוקות ידנית",
+       "rcfilters-filter-reviewstatus-auto-description": "עריכות שנעשו על־ידי משתמשים מנוסים ושמסומנות כבדוקות באופן אוטומטי.",
+       "rcfilters-filter-reviewstatus-auto-label": "בדוקות אוטומטית",
        "rcfilters-filtergroup-significance": "חשיבות",
        "rcfilters-filter-minor-label": "עריכות משניות",
        "rcfilters-filter-minor-description": "עריכות שהוגדרו על־ידי העורכים כמשניות.",
        "version-specialpages": "דפים מיוחדים",
        "version-parserhooks": "הרחבות מפענח",
        "version-variables": "משתנים",
+       "version-editors": "כלי עריכה",
        "version-antispam": "מניעת ספאם",
        "version-other": "אחר",
        "version-mediahandlers": "מציגי מדיה",
index 6257060..9d139d8 100644 (file)
@@ -90,7 +90,8 @@
                        "Dcljr",
                        "Bhatakati aatma",
                        "Shypoetess",
-                       "Innocentbunny"
+                       "Innocentbunny",
+                       "TryKid"
                ]
        },
        "tog-underline": "कड़ी रेखांकन:",
        "rcfilters-filter-humans-label": "मानव (बॉट नहीं)",
        "rcfilters-filter-humans-description": "मानव संपादक द्वारा किए गए संपादन।",
        "rcfilters-filtergroup-reviewstatus": "पुनरीक्षण स्थिति",
-       "rcfilters-filter-patrolled-label": "परीक्षित",
-       "rcfilters-filter-patrolled-description": "परीक्षित चिन्हित किए सम्पादन।",
-       "rcfilters-filter-unpatrolled-label": "अपरीक्षित",
-       "rcfilters-filter-unpatrolled-description": "परीक्षित चिन्हित न किए सम्पादन।",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "अपरीक्षित",
+       "rcfilters-filter-reviewstatus-auto-label": "सवापरिक्षित",
        "rcfilters-filtergroup-significance": "महत्व",
        "rcfilters-filter-minor-label": "छोटा संपादन",
        "rcfilters-filter-minor-description": "लेखक का संपादन छोटा संपादन के रूप में लेबल किया गया है।",
index f470fdd..a556582 100644 (file)
        "rcfilters-filter-humans-label": "Human (not bot)",
        "rcfilters-filter-humans-description": "Edit, jiske human editors karin hai.",
        "rcfilters-filtergroup-reviewstatus": "Review status",
-       "rcfilters-filter-patrolled-label": "Paahra dewa gais hai",
-       "rcfilters-filter-patrolled-description": "Badlao jiske patrolled mark karaa gais hai.",
-       "rcfilters-filter-unpatrolled-label": "Patrol nai karaa gais hai",
-       "rcfilters-filter-unpatrolled-description": "Badlao jiske patrolled nai mark karaa gais hai.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Patrol nai karaa gais hai",
        "rcfilters-filtergroup-significance": "Significance",
        "rcfilters-filter-minor-label": "Chhotaa badlao",
        "rcfilters-filter-minor-description": "Edits the author labeled as minor.",
index 2ff1f91..7acb447 100644 (file)
        "rcfilters-filter-humans-label": "Osoba (ne bot)",
        "rcfilters-filter-humans-description": "Uređivanja koja su napravili suradnici.",
        "rcfilters-filtergroup-reviewstatus": "Stanje pregledanja",
-       "rcfilters-filter-patrolled-label": "Ophođeno",
-       "rcfilters-filter-patrolled-description": "Uređivanja označena ophođenima.",
-       "rcfilters-filter-unpatrolled-label": "Neophođeno",
-       "rcfilters-filter-unpatrolled-description": "Uređivanja koja nisu označena ophođenima.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Neophođeno",
        "rcfilters-filtergroup-significance": "Važnost",
        "rcfilters-filter-minor-label": "Manja uređivanja",
        "rcfilters-filter-minor-description": "Uređivanja koja je suradnik označio manjim.",
index 46bca4d..2b53024 100644 (file)
        "rcfilters-filter-humans-label": "Čłowjek (žadyn bot)",
        "rcfilters-filter-humans-description": "Změny wot čłowjeskich wužiwarjow.",
        "rcfilters-filtergroup-reviewstatus": "Status přepruwowanja",
-       "rcfilters-filter-patrolled-label": "Kontrolowane",
-       "rcfilters-filter-patrolled-description": "Změny, kotrež markěrowachu so jako kontrolowane.",
-       "rcfilters-filter-unpatrolled-label": "Njekontrolowane",
-       "rcfilters-filter-unpatrolled-description": "Změny, kotrež njemarkěrowachu so jako kontrolowane.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Njekontrolowane",
        "rcfilters-filtergroup-significance": "Wuznam",
        "rcfilters-filter-minor-label": "Snadne změny",
        "rcfilters-filter-major-label": "Njemałe změny",
index a50d51e..422de69 100644 (file)
        "rcfilters-filter-humans-label": "Ember (nem bot)",
        "rcfilters-filter-humans-description": "Emberi szerkesztők szerkesztései",
        "rcfilters-filtergroup-reviewstatus": "Felülvizsgálati státusz",
-       "rcfilters-filter-patrolled-label": "Ellenőrzött",
-       "rcfilters-filter-patrolled-description": "Ellenőrzöttnek jelölt szerkesztések",
-       "rcfilters-filter-unpatrolled-label": "Ellenőrizetlen",
-       "rcfilters-filter-unpatrolled-description": "Ellenőrzöttnek nem jelölt szerkesztések",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Ellenőrizetlen",
        "rcfilters-filtergroup-significance": "Fontosság",
        "rcfilters-filter-minor-label": "Apró szerkesztések",
        "rcfilters-filter-minor-description": "Szerző által aprónak jelölt szerkesztések",
        "apisandbox-dynamic-error-exists": "A(z) „$1” nevű paraméter már létezik.",
        "apisandbox-deprecated-parameters": "Elavult paraméterek",
        "apisandbox-fetch-token": "A token automatikus kitöltése",
+       "apisandbox-add-multi": "Hozzáadás",
        "apisandbox-submit-invalid-fields-title": "Egyes mezők érvénytelenek",
        "apisandbox-submit-invalid-fields-message": "Javítsd ki a jelzett mezőket, és próbáld újra.",
        "apisandbox-results": "Eredmények",
index 4910918..8e65a55 100644 (file)
        "rcfilters-filter-humans-label": "Persona (non robot)",
        "rcfilters-filter-humans-description": "Modificationes facite per esseres human.",
        "rcfilters-filtergroup-reviewstatus": "Stato de revision",
-       "rcfilters-filter-patrolled-label": "Patruliate",
-       "rcfilters-filter-patrolled-description": "Modificationes marcate como patruliate.",
-       "rcfilters-filter-unpatrolled-label": "Non patruliate",
-       "rcfilters-filter-unpatrolled-description": "Modificationes non marcate como patruliate.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Non patruliate",
        "rcfilters-filtergroup-significance": "Importantia",
        "rcfilters-filter-minor-label": "Modificationes minor",
        "rcfilters-filter-minor-description": "Modificationes que le autor ha marcate como minor.",
index 4e58912..c7ef358 100644 (file)
        "rcfilters-filter-humans-label": "Manusia (bukan bot)",
        "rcfilters-filter-humans-description": "Suntingan yang dibuat oleh penyunting manusia.",
        "rcfilters-filtergroup-reviewstatus": "Status peninjauan",
-       "rcfilters-filter-patrolled-label": "Telah dipatroli",
-       "rcfilters-filter-patrolled-description": "Suntingan ditandai sebagai terpatroli",
-       "rcfilters-filter-unpatrolled-label": "Belum terpatroli",
-       "rcfilters-filter-unpatrolled-description": "Suntingan yang tidak ditandai sebagai terpatroli.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Belum terpatroli",
        "rcfilters-filtergroup-significance": "Kepentingan",
        "rcfilters-filter-minor-label": "Suntingan kecil",
        "rcfilters-filter-minor-description": "Suntingan yang ditandai penyunting sebagai suntingan kecil",
index 7af5424..f18a583 100644 (file)
        "rcfilters-filter-humans-label": "Tao (saan a bot)",
        "rcfilters-filter-humans-description": "Dagiti inurnos nga inaramid babaen dagiti editor a tao.",
        "rcfilters-filtergroup-reviewstatus": "Irepaso ti kasasaad",
-       "rcfilters-filter-patrolled-label": "Napatruliaan",
-       "rcfilters-filter-patrolled-description": "Dagiti inurnos a namarkaan a kas napatruliaan.",
-       "rcfilters-filter-unpatrolled-label": "Di napatruliaan",
-       "rcfilters-filter-unpatrolled-description": "Dagiti inurnos a saan a namarkaan a kas napatruliaan.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Di napatruliaan",
        "rcfilters-filtergroup-significance": "Kaimudingan",
        "rcfilters-filter-minor-label": "Dagiti bassit a panagurnos",
        "rcfilters-filter-minor-description": "Dagiti panagurnos a minarkaan ti mannurat a kas bassit.",
index c99651a..7389382 100644 (file)
        "deprecated-self-close-category": "Pagini qui uzas nevalida etiketi HTML por klozajo",
        "duplicate-args-category": "Pagini kun argumenti duopligita che shabloni",
        "parser-unstrip-loop-warning": "Renkontresis nefinita procedo ('loop') en la funciono \"Unstrip\"",
+       "undo-success": "La redakto ne povas desfacesar.\nVerifikez adinfre per komparo inter la du versioni se to esas fakte quon vu deziras facar; pose 'salvez' la modifiki por kompletigar la redakto.",
        "undo-failure": "Ne povis nuligar la redakto pro konflikti kun intermeza redakti.",
        "viewpagelogs": "Videz registrari por ca pagino",
        "nohistory": "Ne esas redakto-historio por ica pagino.",
        "last": "lasta",
        "page_first": "unesma",
        "page_last": "finala",
-       "histlegend": "Selektado por diferi: markizez la versioni por komparar e lore presez 'Enter' o la butono infre.<br />\nSurskriburo: '''({{int:cur}})''' = diferi kun l'aktuala versiono,\n'''({{int:last}})''' = diferi kun l'antea versiono,\n'''{{int:minoreditletter}}''' = mikra redakto.",
+       "histlegend": "Selektado por diferi: markizez la versioni por komparar e presez 'Enter' o la butono adinfre.<br />\nSurskriburo: '''({{int:cur}})''' = diferi kun la nuna versiono,\n'''({{int:last}})''' = diferi kun l'antea versiono,\n'''{{int:minoreditletter}}''' = mikra redakturo.",
        "history-fieldset-title": "Serchar revizi",
        "history-show-deleted": "Nur efacita",
        "histfirst": "Maxim anciena",
        "prefs-personal": "Personala informo",
        "prefs-rc": "Recenta chanji",
        "prefs-watchlist": "Surveyo-listo",
+       "prefs-editwatchlist": "Modifikez surveyo-listo",
        "prefs-editwatchlist-edit": "Vidar e removar tituli de vua surveyo-listo",
+       "prefs-editwatchlist-raw": "Modifikez vua surveyo-listo en formo di texto",
+       "prefs-editwatchlist-clear": "Efacar vua surveyo-listo",
        "prefs-watchlist-days": "Dii montrata en la surveyo-listo:",
        "prefs-watchlist-days-max": "Admaxime $1 {{PLURAL:$1|dio|dii}}",
        "prefs-watchlist-edits-max": "Maxima nombro: 1000",
        "right-suppressrevision": "Vidar, celar e deskovrar specifika revizi di pagini de irga uzero",
        "right-blockemail": "Blokusar uzero pri sendar e-posto",
        "right-rollback": "Rapide retrorular la redakti da la lasta uzero qua redaktis specigita pagino",
+       "right-managechangetags": "Kreo e (des)uzo di [[Special:Tags|etiketi]]",
+       "grant-editmywatchlist": "Modifikez vua surveyo-listo",
        "newuserlogpage": "Uzero-kreo-registro",
        "rightslog": "Uzero-yuri-registraro",
        "action-read": "lektar ca pagino",
        "action-movefile": "movar ca arkivo",
        "action-upload": "adkargar ca arkivo",
        "action-browsearchive": "serchar pagini efacita",
+       "action-managechangetags": "krear e (des)uzar etiketi",
        "nchanges": "$1 {{PLURAL:$1|chanjo|chanji}}",
        "enhancedrc-history": "Versionaro",
        "recentchanges": "Recenta chanji",
        "shared-repo-name-wikimediacommons": "Wikimedia Commons",
        "upload-disallowed-here": "Vu ne povas modifikar ica arkivo.",
        "filerevert-comment": "Motivo:",
+       "filerevert-success": "<strong>[[Media:$1|$1]]</strong> restauresis a la [$4 versiono de $2, ye $3].",
        "filedelete": "Efacar $1",
        "filedelete-legend": "Efacar arkivo",
        "filedelete-intro": "Vu efacas '''[[Media:$1|$1]]''' kun olua tota versionaro.",
        "allpages-bad-ns": "{{SITENAME}} ne havas nomaro \"$1\".",
        "allpages-hide-redirects": "Celar ridirekti",
        "categories": "Kategorii",
-       "deletedcontributions": "Efacita uzero-kontributadi",
-       "deletedcontributions-title": "Efacita uzero-kontributadi",
+       "deletedcontributions": "Efacita uzero-kontributaji",
+       "deletedcontributions-title": "Efacita uzero-kontributaji",
        "linksearch": "Sercho di extera ligili",
        "linksearch-ns": "Nomaro:",
        "linksearch-ok": "Serchez",
        "listgrouprights": "Permisi dil grupo di uzeri",
        "listgrouprights-group": "Grupo",
        "listgrouprights-members": "(listo di membri)",
+       "restricted-displaytitle-ignored-desc": "La pagino havas nekonocita titulo <code><nowiki>{{DISPLAYTITLE}}</nowiki></code>, pro ol ne esas equivalanta a la nuna titulo di ica pagino.",
        "mailnologin": "Ne sendar adreso",
        "mailnologintext": "Vu mustas [[Special:UserLogin|enirir]] e havar valida e-adreso en vua [[Special:Preferences|preferaji]] por sendar e-posto ad altra uzanti.",
        "emailuser": "Sendar e-posto a ca uzero",
        "mywatchlist": "Surveyaji",
        "watchlistfor2": "Por $1 $2",
        "nowatchlist": "Vu ne havas objekti en vua listo di surveyaji.",
+       "watchlistanontext": "Voluntez facar 'log in' por vidar o modifikar artikli de vua surveyo-listo",
        "watchnologin": "Vu ne startis sesiono",
        "addedwatchtext": "\"[[:$1]]\" atachesis a vua [[Special:Watchlist|listo di surveyaji]].",
        "removedwatchtext": "\"[[:$1]]\" ed relatanta diskutado forigesis de [[Special:Watchlist|vua surveyado]].",
        "undeletepagetext": "La sequanta {{PLURAL:$1|pagino|pagini}} efacesis ma {{PLURAL:$1|ol|li}} ankore esas en la arkivo ed esas restaurebla. La arkivo povas netigesar periodale.",
        "undeleterevisions": "$1 {{PLURAL:$1|revizo|revizi}} efacita",
        "undeletehistory": "Se vu restauros la pagino, omna antea revizi restauresos en la korespondanta historiala pagino.\nSe nova pagino kun la sama titulo kreesis pos l'efaco, la restaurita revizuri aparos en lua historiala pagino.",
+       "undeleterevision-missing": "Nevalida o mankanta revizo.\nSive vu skribis la ligilo nekorekte, sive la revizo restauresis o removesis del arkivo.",
        "undeletebtn": "Restaurar",
        "undeletelink": "vidar/restaurar",
        "undeleteviewlink": "videz",
        "undeletecomment": "Motivo:",
+       "undeletedpage": "<strong>$1 restauresis</strong>\n\nVidez la [[Special:Log/delete|'log' pri efaci]] por vidar omna recenta efaci e restauri.",
        "undelete-search-box": "Serchez efacita pagini",
        "undelete-search-submit": "Serchar",
        "undelete-show-file-submit": "Yes",
        "month": "De monato (e plu frue):",
        "year": "De yaro (e plu frue):",
        "sp-contributions-newbies": "Montrez nur kontributadi di la nova uzeri",
-       "sp-contributions-newbies-sub": "Di nova konti",
+       "sp-contributions-newbies-sub": "Dil nova uzeri",
+       "sp-contributions-newbies-title": "Kontributaji dil nova uzeri",
        "sp-contributions-blocklog": "blokusar-registraro",
+       "sp-contributions-suppresslog": "efacita kontributaji dil {{GENDER:$1|uzero}}",
        "sp-contributions-deleted": "efacita {{GENDER:$1|uzero}}-kontributadi",
        "sp-contributions-uploads": "sendita arkivi",
        "sp-contributions-logs": "registrari",
        "ipaddressorusername": "IP-adreso od uzantonomo:",
        "ipbexpiry": "Expiro:",
        "ipbreason": "Motivo:",
-       "ipbreason-dropdown": "*Ordinara motivi por blokuso\n** Insertar nevera informi\n** Efacar kontenajo de pagini\n** Insertadar ligili ad extera reti\n** Insertar radoto aden pagini\n** Timidiganta ago\n** Trouzar multa konti\n** Neaceptebla uzeronomo",
+       "ipbreason-dropdown": "*Ordinara motivi por blokuso\n** Insertar nevera informi\n** Efacar kontenajo de pagini\n** Insertadar ligili 'spam' ad extera reti\n** Insertar radoto aden pagini\n** Timidiganta ago kontre uzeri\n** Trouzar multopla konti\n** Neaceptebla uzeronomo",
        "ipb-hardblock": "Impedar redakturi e modifikuri de uzeri qui facas 'login' de ica IP-adreso",
        "ipbcreateaccount": "Preventez kreo di konti",
        "ipbemailban": "Impedar l'uzero sendar e-posto",
        "blockipsuccesssub": "Blokusado sucesis",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] blokusesis.<br />\nVidez [[Special:BlockList|IP-blokuslisto]] por revizor blokusadi.",
        "ipb-edit-dropdown": "Redaktar blokuso-motivi",
+       "ipb-blocklist-contribs": "Kontributadi dil uzero {{GENDER:$1|$1}}",
        "unblockip": "Desblokusar uzero",
        "unblockiptext": "Uzez la sequanta formularo por restaurar la skribo-aceso ad IP-adreso qua blokusesis antee.",
        "ipusubmit": "Desblokusar",
        "ipblocklist-submit": "Serchar",
        "ipblocklist-otherblocks": "Altra {{PLURAL:$1|blokuso|blokusi}}",
        "infiniteblock": "nefinita",
+       "blocklist-nousertalk": "ne povas redaktar lua propra diskuto-pagino",
        "blocklink": "blokusar",
        "unblocklink": "desblokusar",
        "change-blocklink": "chanjar blokuso",
        "unblocklogentry": "desblokusis \"$1\"",
        "block-log-flags-nocreate": "ne povas krear konto",
        "block-log-flags-noemail": "e-posto blokusita",
+       "block-log-flags-nousertalk": "ne povas redaktar lua propra diskuto-pagino",
        "ipb_expiry_invalid": "Nevalida expiro-tempo.",
        "ipb-otherblocks-header": "Altra {{PLURAL:$1|blokuso|blokusi}}",
        "ip_range_invalid": "Nevalida IP-rango.",
        "autosumm-replace": "Kontenajo remplasigesis kun '$1'",
        "autoredircomment": "Ridirektas a [[$1]]",
        "autosumm-new": "Pagino kreesis kun '$1'",
+       "watchlistedit-normal-title": "Modifikez surveyo-listo",
        "watchlistedit-normal-legend": "Removar tituli de surveyo-listo",
        "watchlistedit-normal-explain": "La tituli de vua surveyo-listo montresas adinfre.\nPor removar ula titulo, markizez la buxo proxim ol, e kliktez \"{{int:Watchlistedit-normal-submit}}\".\nVu anke povas [[Special:EditWatchlist/raw|redaktar direkte la 'kruda' listo]].",
        "watchlistedit-normal-submit": "Removar tituli",
        "watchlistedit-normal-done": "{{PLURAL:$1|Singla titulo|$1 tituli}} removesis de vua surveyo-listo:",
        "watchlistedit-raw-title": "Redaktar texto di surveyo-listo",
-       "watchlistedit-raw-legend": "Redaktar texto di surveyo-listo",
+       "watchlistedit-raw-legend": "Redaktar vua surveyo-listo en formo di texto",
        "watchlistedit-raw-explain": "Tituli en vua surveyo-listo montresas adinfre, e povas modifikesar per adjuntado od eskarto de la listo; nur un titulo per lineo.\nKande vu finos, kliktez \"{{int:Watchlistedit-raw-submit}}\".\nVu anke povas [[Special:EditWatchlist|uzar la redaktero ordinara ('standard')]].",
        "watchlistedit-raw-titles": "Tituli:",
        "watchlistedit-raw-submit": "Aktualigar surveyo-listo",
        "tags-hitcount": "$1 {{PLURAL:$1|chanjo|chanji}}",
        "tags-create-explanation": "Segun predefino, la nova etiketi kreita divenos disponebla por uzado, sive da uzeri, sive da informatikoprogrami 'bot'.",
        "tags-create-warnings-above": "La sequanta {{PLURAL:$2|avizo|avizi}} renkontresis, probante kreir l'etiketo \"$1\":",
+       "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-not-found": "L'etiketo \"$1\" ne existas.",
        "htmlform-reset": "Desfacar chanji",
        "htmlform-selectorother-other": "Altra",
        "htmlform-cloner-create": "Adjuntar plue",
index 434a6a8..ff64a21 100644 (file)
        "rcfilters-filter-humans-label": "Manneskja (ekki vélmenni)",
        "rcfilters-filter-humans-description": "Breytingar gerðar af mönnum.",
        "rcfilters-filtergroup-reviewstatus": "Staða yfirferðar",
-       "rcfilters-filter-patrolled-label": "Vaktað",
-       "rcfilters-filter-patrolled-description": "Breytingar merktar sem vaktaðar.",
-       "rcfilters-filter-unpatrolled-label": "Óvaktaðar",
-       "rcfilters-filter-unpatrolled-description": "Breytingar ekki merktar sem vaktaðar.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Óvaktaðar",
        "rcfilters-filtergroup-significance": "Mikilvægi",
        "rcfilters-filter-minor-label": "Minniháttar breytingar",
        "rcfilters-filter-minor-description": "Breytingar sem höfundurinn merkti sem minniháttar.",
index de87cad..cc65318 100644 (file)
        "rcfilters-filter-humans-label": "Umani (non bot)",
        "rcfilters-filter-humans-description": "Modifiche effettuate da contributori umani.",
        "rcfilters-filtergroup-reviewstatus": "Stato revisione",
-       "rcfilters-filter-patrolled-label": "Verificate",
-       "rcfilters-filter-patrolled-description": "Modifiche contrassegnate come verificate.",
-       "rcfilters-filter-unpatrolled-label": "Non verificate",
-       "rcfilters-filter-unpatrolled-description": "Modifiche non contrassegnate come verificate.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Non verificate",
+       "rcfilters-filter-reviewstatus-manual-label": "Verificato manualmente",
+       "rcfilters-filter-reviewstatus-auto-label": "Autoverificato",
        "rcfilters-filtergroup-significance": "Significato",
        "rcfilters-filter-minor-label": "Modifiche minori",
        "rcfilters-filter-minor-description": "Modifiche che sono state indicate come minori.",
index e2c85cf..6e2bac9 100644 (file)
        "tog-watchlisthideminor": "細部の編集をウォッチリストに表示しない",
        "tog-watchlisthideliu": "ログイン利用者による編集をウォッチリストに表示しない",
        "tog-watchlistreloadautomatically": "フィルタが変更されるたびに、ウォッチリストを自動的に再読み込みする (JavaScript が必要)",
-       "tog-watchlistunwatchlinks": "ウォッチリストの項目に直接、追加/除去のリンクを表示 (トグル切り替えには JavaScript が必要)",
+       "tog-watchlistunwatchlinks": "ウォッチリストの項目に直接、追加/除去のリンク({{int:Watchlist-unwatch-undo}}/{{int:Watchlist-unwatch}})を表示 (トグル切り替えには JavaScript が必要)",
        "tog-watchlisthideanons": "匿名利用者による編集をウォッチリストに表示しない",
        "tog-watchlisthidepatrolled": "巡回済みの編集をウォッチリストに表示しない",
        "tog-watchlisthidecategorization": "ページのカテゴリ追加・除去を表示しない",
        "rcfilters-filter-humans-label": "人間(ボットではない)",
        "rcfilters-filter-humans-description": "人間の手作業による編集",
        "rcfilters-filtergroup-reviewstatus": "ステータスの確認",
-       "rcfilters-filter-patrolled-label": "巡回済み",
-       "rcfilters-filter-patrolled-description": "巡回済みとマークされた編集。",
-       "rcfilters-filter-unpatrolled-label": "未巡回",
-       "rcfilters-filter-unpatrolled-description": "まだ巡回済みとマークされていない編集。",
+       "rcfilters-filter-reviewstatus-unpatrolled-description": "手動または自動で巡回されていない編集。",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "未巡回",
+       "rcfilters-filter-reviewstatus-manual-description": "巡回済みと手動でマークされた編集。",
        "rcfilters-filtergroup-significance": "重要度",
        "rcfilters-filter-minor-label": "細部の編集",
        "rcfilters-filter-minor-description": "編集者が細部の編集とマークしたもの。",
        "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": "結果",
index 48cef66..4bb3387 100644 (file)
        "rcfilters-filter-humans-label": "Manungsa (dudu bot)",
        "rcfilters-filter-humans-description": "Besutan gawéané pambesut manungsa.",
        "rcfilters-filtergroup-reviewstatus": "Tinjo kalungguhan",
-       "rcfilters-filter-patrolled-label": "Diawasi",
-       "rcfilters-filter-patrolled-description": "Besutan ditengeri yèn diawasi.",
-       "rcfilters-filter-unpatrolled-label": "Uculi pangawasan",
-       "rcfilters-filter-unpatrolled-description": "Besutan ora ditengeri yèn diawasi.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Uculi pangawasan",
        "rcfilters-filtergroup-significance": "Kawigatèn",
        "rcfilters-filter-minor-label": "Besutan cilik",
        "rcfilters-filter-minor-description": "Besutan sing ditandhani pangriptané minangka besutan cilik.",
index b75bb4b..ea510bc 100644 (file)
        "rcfilters-filter-humans-label": "რედაქტორი (არა ბოტით)",
        "rcfilters-filter-humans-description": "რედაქტორების მიერ შესრულებული რედაქტირებები.",
        "rcfilters-filtergroup-reviewstatus": "შემოწმების სტატუსი",
-       "rcfilters-filter-patrolled-label": "პატრულირებულია",
-       "rcfilters-filter-patrolled-description": "ცვლილებები მონიშნულია მატრულირებულად.",
-       "rcfilters-filter-unpatrolled-label": "გაუპატრულირებული",
-       "rcfilters-filter-unpatrolled-description": "ცვლილებები არ არის მონიშნული პატრულირებულად",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "გაუპატრულირებული",
        "rcfilters-filtergroup-significance": "მნიშვნელობა",
        "rcfilters-filter-minor-label": "მცირე რედაქტირებები",
        "rcfilters-filter-minor-description": "რედაქტირებები, რომლებიც ავტორმა მონიშნა როგორც მცირე.",
index 815faba..83d1338 100644 (file)
        "october": "ខែតុលា",
        "november": "ខែវិច្ឆិកា",
        "december": "ខែធ្នូ",
-       "january-gen": "មករា",
-       "february-gen": "កុម្ភៈ",
-       "march-gen": "មីនា",
-       "april-gen": "មេសា",
-       "may-gen": "ឧសភា",
-       "june-gen": "មិថុនា",
-       "july-gen": "កក្កដា",
-       "august-gen": "សីហា",
-       "september-gen": "កញ្ញា",
-       "october-gen": "តុលា",
-       "november-gen": "វិច្ឆិកា",
-       "december-gen": "ធ្នូ",
+       "january-gen": "á\9e\81á\9f\82á\9e\98á\9e\80á\9e\9aá\9e¶",
+       "february-gen": "á\9e\81á\9f\82á\9e\80á\9e»á\9e\98á\9f\92á\9e\97á\9f\88",
+       "march-gen": "á\9e\81á\9f\82á\9e\98á\9e¸á\9e\93á\9e¶",
+       "april-gen": "á\9e\81á\9f\82á\9e\98á\9f\81á\9e\9fá\9e¶",
+       "may-gen": "á\9e\81á\9f\82á\9e§á\9e\9fá\9e\97á\9e¶",
+       "june-gen": "á\9e\81á\9f\82á\9e\98á\9e·á\9e\90á\9e»á\9e\93á\9e¶",
+       "july-gen": "á\9e\81á\9f\82á\9e\80á\9e\80á\9f\92á\9e\80á\9e\8aá\9e¶",
+       "august-gen": "á\9e\81á\9f\82á\9e\9fá\9e¸á\9e á\9e¶",
+       "september-gen": "á\9e\81á\9f\82á\9e\80á\9e\89á\9f\92á\9e\89á\9e¶",
+       "october-gen": "á\9e\81á\9f\82á\9e\8fá\9e»á\9e\9bá\9e¶",
+       "november-gen": "á\9e\81á\9f\82á\9e\9cá\9e·á\9e\85á\9f\92á\9e\86á\9e·á\9e\80á\9e¶",
+       "december-gen": "á\9e\81á\9f\82á\9e\92á\9f\92á\9e\93á\9e¼",
        "jan": "មករា",
        "feb": "កុម្ភៈ",
        "mar": "មីនា",
        "wrongpasswordempty": "ពាក្យសម្ងាត់មិនបានវាយបញ្ចូលទេ។\n\nសូមព្យាយាម​ម្តងទៀត។",
        "passwordtooshort": "ពាក្យសម្ងាត់ត្រូវ​មាន​យ៉ាងតិចណាស់​ {{PLURAL:$1|១ តួអក្សរ|$1តួអក្សរ}}។",
        "passwordtoolong": "ពាក្យសម្ងាត់មិនអាចវែងជាង{{PLURAL:$1|1 តួ|$1 តួ}}ទេ។",
-       "passwordtoopopular": "á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\8aá\9f\82á\9e\9bá\9e\98á\9e¶á\9e\93á\9e\82á\9f\81á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\87á\9e¶á\9e\91á\9e¼á\9e\91á\9f\85á\9e\98á\9e·á\9e\93á\9e¢á\9e¶á\9e\85á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9e¶á\9e\93á\9e\91á\9f\81á\9f\94 á\9e\9fá\9e¼á\9e\98á\9e\87á\9f\92á\9e\9aá\9e¾á\9e\9fá\9e\9aá\9e¾á\9e\9fá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\8aá\9f\82á\9e\9bá\9e\96á\9e·á\9e\9fá\9f\81á\9e\9fá\9e\81á\9e»á\9e\9fá\9e\82á\9f\81។",
+       "passwordtoopopular": "á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\8aá\9f\82á\9e\9bá\9e\98á\9e¶á\9e\93á\9e\82á\9f\81á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\87á\9e¶á\9e\91á\9e¼á\9e\91á\9f\85á\9e\98á\9e·á\9e\93á\9e¢á\9e¶á\9e\85á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9e¶á\9e\93á\9e\91á\9f\81á\9f\94 á\9e\9fá\9e¼á\9e\98á\9e\87á\9f\92á\9e\9aá\9e¾á\9e\9fá\9e\9aá\9e¾á\9e\9fá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\8aá\9f\82á\9e\9bá\9e\82á\9f\81á\9e\96á\9e·á\9e\94á\9e¶á\9e\80á\9e\9fá\9f\92á\9e\98á\9e¶á\9e\93á\9e\8aá\9e¹á\9e\84á\9e\87á\9e¶á\9e\84á\9e\93á\9f\81á\9f\87។",
        "password-name-match": "ពាក្យសម្ងាត់ត្រូវតែខុសគ្នាពីអត្តនាមរបស់អ្នក។",
        "password-login-forbidden": "ហាមប្រាមមិនអោយប្រើអត្តនាមនិងពាក្យសម្ងាត់នេះ។",
        "mailmypassword": "កំណត់​ពាក្យសម្ងាត់​សាឡើងវិញ",
        "passwordremindertitle": "ពាក្យសម្ងាត់បណ្តោះអាសន្នថ្មីសម្រាប់{{SITENAME}}",
-       "passwordremindertext": "á\9e\98á\9e¶á\9e\93á\9e¢á\9f\92á\9e\93á\9e\80á\9e\8eá\9e¶á\9e\98á\9f\92á\9e\93á\9e¶á\9e\80á\9f\8b (á\9e\94á\9f\92á\9e\9aá\9e á\9f\82á\9e\9bá\9e\87á\9e¶á\9e¢á\9f\92á\9e\93á\9e\80, á\9e\96á\9e¸á\9e¢á\9e¶á\9e\9fá\9e\99á\9e\8aá\9f\92á\9e\8bá\9e¶á\9e\93 IP $1) á\9e\94á\9e¶á\9e\93á\9e\9fá\9f\92á\9e\93á\9e¾á\9e\9fá\9e»á\9f\86á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\90á\9f\92á\9e\98á\9e¸á\9e\98á\9e½á\9e\99á\9e\96á\9e¸ {{SITENAME}} ($4)á\9f\94\ná\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\94á\9e\8eá\9f\92á\9e\8aá\9f\84á\9f\87á\9e¢á\9e¶á\9e\9fá\9e\93á\9f\92á\9e\93á\9e\98á\9e½á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\9aá\9e¶á\9e\94á\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8b \"$2\" á\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9cá\9e\94á\9e¶á\9e\93á\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\91á\9f\85á\9e\87á\9e¶ \"$3\"á\9f\94 á\9e\94á\9e¾á\9e\9fá\9e·á\9e\93á\9e\87á\9e¶á\9e\93á\9f\81á\9f\87á\9e\87á\9e¶á\9e\85á\9f\81á\9e\8fá\9e\93á\9e¶á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80 á\9e\9fá\9e¼á\9e\98á\9e¢á\9f\92á\9e\93á\9e\80á\9e\80á\9e\8fá\9f\8bá\9e\88á\9f\92á\9e\98á\9f\84á\9f\87á\9e\85á\9e¼á\9e\9bâ\80\8bá\9e á\9e¾á\9e\99á\9e\87á\9f\92á\9e\9aá\9e¾á\9e\9fá\9e\94á\9f\92á\9e\9aá\9e¾á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\90á\9f\92á\9e\98á\9e¸á\9f\94\ná\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bâ\80\8bá\9e\94á\9e\8eá\9f\92á\9e\8aá\9f\84á\9f\87á\9e¢á\9e¶á\9e\9fá\9e\93á\9f\92á\9e\93â\80\8bá\9e\9aá\9e\94á\9e\9fá\9f\8bâ\80\8bá\9e¢á\9f\92á\9e\93á\9e\80 á\9e\93á\9e¹á\9e\84â\80\8bá\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9câ\80\8bá\9e\95á\9e»á\9e\8fá\9e\80á\9f\86á\9e\8eá\9e\8fá\9f\8bâ\80\8bá\9e\80á\9f\92á\9e\93á\9e»á\9e\84â\80\8bá\9e\9aá\9e\99á\9f\88á\9e\96á\9f\81á\9e\9b {{PLURAL:$5|á\9e\98á\9e½á\9e\99â\80\8bá\9e\90á\9f\92á\9e\84á\9f\83|$5á\9e\90á\9f\92á\9e\84á\9f\83}} á\9f\94\n\ná\9e\80á\9f\92á\9e\93á\9e»á\9e\84á\9e\80á\9e\9aá\9e\8eá\9e¸á\9e\98á\9e¶á\9e\93á\9e¢á\9f\92á\9e\93á\9e\80á\9e\8eá\9e¶á\9e\95á\9f\92á\9e\9fá\9f\81á\9e\84á\9e\92á\9f\92á\9e\9cá\9e¾á\9e\80á\9e¶á\9e\9aá\9e\9fá\9f\92á\9e\93á\9e¾á\9e\9fá\9e»á\9f\86á\9e\93á\9f\81á\9f\87 á\9e¬ á\9e¢á\9f\92á\9e\93á\9e\80á\9e\93á\9e¹á\9e\80á\9e\83á\9e¾á\9e\89á\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\85á\9e¶á\9e\9fá\9f\8bá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\9cá\9e·á\9e\89 á\9e á\9e¾á\9e\99á\9e\98á\9e·á\9e\93á\9e\85á\9e\84á\9f\8bá\9e\95á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9aá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\91á\9f\81á\9e\93á\9f\84á\9f\87 á\9e\9fá\9e¼á\9e\98á\9e¢á\9f\92á\9e\93á\9e\80á\9e¢á\9e¶á\9e\85á\9e\94á\9f\86á\9e\97á\9f\92á\9e\9bá\9f\81á\9e\85á\9e\96á\9e¸á\9e\9fá\9e¶á\9e\9aá\9e\93á\9f\81á\9f\87 á\9e á\9e¾á\9e\99á\9e\94á\9e\93á\9f\92á\9e\8fá\9e\94á\9f\92á\9e\9aá\9e¾á\9e\94á\9f\92á\9e\9aá\9e¶á\9e\9fá\9f\8bá\9e\96á\9e¶á\9e\80á\9f\92á\9e\99á\9e\9fá\9e\98á\9f\92á\9e\84á\9e¶á\9e\8fá\9f\8bá\9e\85á\9e¶á\9e\9fá\9f\8bá\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¢á\9f\92á\9e\93á\9e\80á\9e\94á\9e\93á\9f\92á\9e\8fá\9e\91á\9f\80á\9e\8fá\9f\94",
+       "passwordremindertext": "មានអ្នកណាម្នាក់ (ពីអាសយដ្ឋាន IP $1) បានស្នើសុំពាក្យសម្ងាត់ថ្មីមួយពី {{SITENAME}} ($4)។\nពាក្យសម្ងាត់បណ្ដោះអាសន្នមួយសម្រាប់អ្នកប្រើប្រាស់ \"$2\" ត្រូវបានប្ដូរទៅជា \"$3\"។ បើសិនជានេះជាចេតនារបស់អ្នក សូមអ្នកកត់ឈ្មោះចូល​ហើយជ្រើសប្រើពាក្យសម្ងាត់ថ្មី។\nពាក្យសម្ងាត់​បណ្ដោះអាសន្ន​របស់​អ្នក នឹង​ត្រូវ​ផុតកំណត់​ក្នុង​រយៈពេល {{PLURAL:$5|មួយ​ថ្ងៃ|$5ថ្ងៃ}} ។\n\nក្នុងករណីមានអ្នកណាផ្សេងធ្វើការស្នើសុំនេះ ឬ អ្នកនឹកឃើញពាក្យសម្ងាត់ចាស់របស់អ្នកវិញ ហើយមិនចង់ផ្លាស់ប្តូរពាក្យសម្ងាត់ទេនោះ សូមអ្នកអាចបំភ្លេចពីសារនេះ ហើយបន្តប្រើប្រាស់ពាក្យសម្ងាត់ចាស់របស់អ្នកបន្តទៀត។",
        "noemail": "គ្មានអាសយដ្ឋានអ៊ីមែលណាមួយត្រូវបានកត់ត្រាទុកសម្រាប់អ្នកប្រើឈ្មោះ \"$1\" ទេ។",
        "noemailcreate": "អ្នកត្រូវតែផ្ដល់អាសយដ្ឋានអ៊ីមែលត្រឹមត្រូវមួយ",
        "passwordsent": "ពាក្យសម្ងាត់​ថ្មី​ត្រូវ​បាន​ផ្ញើទៅ​អាសយដ្ឋាន​អ៊ីមែល​ដែល​បាន​ចុះបញ្ជី​សម្រាប់អ្នកប្រើឈ្មោះ \"$1\" ។\n\nសូម​កត់ឈ្មោះចូល​ម្តងទៀត​បន្ទាប់ពី​អ្នក​បាន​ទទួល​ពាក្យសម្ងាត់ថ្មីនោះ។",
        "botpasswords-label-grants-column": "ផ្ដល់សិទ្ធិហើយ",
        "botpasswords-bad-appid": "ឈ្មោះរូបយន្ត«$1»ប្រើមិនបានទេ។",
        "resetpass_forbidden": "ពាក្យសម្ងាត់មិនអាចផ្លាស់ប្តូរបានទេ",
+       "resetpass_forbidden-reason": "‎ពាក្យសម្ងាត់មិនអាចផ្លាស់ប្តូរបានទេ៖ $1",
        "resetpass-no-info": "អ្នក​ចាំបាច់​ត្រូវតែ​កត់ឈ្មោះចូល ដើម្បី​ចូលទៅកាន់​ទំព័រ​នេះ​ដោយផ្ទាល់​។",
        "resetpass-submit-loggedin": "ប្តូរពាក្យសម្ងាត់",
        "resetpass-submit-cancel": "បោះបង់",
        "passwordreset-emailtext-ip": "មាននរណាម្នាក់ (ប្រហែលជាខ្លួនអ្នកផ្ទាល់, មកពីអាស័យដ្ឋាន IP $1) បានស្នើសុំស្ដារពាក្យសម្ងាត់របស់អ្នកសម្រាប់ {{SITENAME}} ($4)។ {{PLURAL:$3|គណនី|គណនី}}អ្នកប្រើប្រាស់ដូចតទៅនេះ\nមានជាប់ទាក់ទិននឹងអាសយដ្ឋានអ៊ីមែលនេះ៖\n\n$2\n\n{{PLURAL:$3|ពាក្យសម្ងាត់បណ្ដោះអាសន្ននេះ|ពាក្យសម្ងាត់បណ្ដោះអាសន្នទាំងនេះ}} និងហួសសុពលភាពក្នុងរយៈពេល {{PLURAL:$5|មួយថ្ងៃ|$5 ថ្ងៃ}}។\nយកល្អអ្នកគួរតែកត់ឈ្មោះចូលរួចជ្រើសរើសពាក្យសម្ងាត់ថ្មីមួយ។ ប្រសិនបើមាននរណាម្នាក់ផ្សេងធ្វើការស្នើសុំនេះ \nឬប្រសិនបើអ្នកនឹកឃើញពាក្យសម្ងាត់ដើមរបស់អ្នក ហើយអ្នកមិនប្រាថ្នាផ្លាស់ប្ដូរវាទៀតទេនោះ អ្នកគ្រាន់តែ\nបំភ្លេចអំពីសារមួយនេះ ហើយបន្តប្រើប្រាស់ពាក្យសម្ងាត់ចាស់របស់អ្នកទៅបានហើយ។",
        "passwordreset-emailtext-user": "អ្នកប្រើប្រាស់ $1 នៅក្នុង {{SITENAME}} បានស្នើសុំស្ដារពាក្យសម្ងាត់របស់អ្នកនៅក្នុង {{SITENAME}} ($4)។\n {{PLURAL:$3|គណនី|គណនី}}អ្នកប្រើប្រាស់ដូចតទៅនេះមានជាប់ទាក់ទិននឹងអាសយដ្ឋានអ៊ីមែលនេះ៖\n\n$2\n\n{{PLURAL:$3|ពាក្យសម្ងាត់បណ្ដោះអាសន្ននេះ|ពាក្យសម្ងាត់បណ្ដោះអាសន្នទាំងនេះ}} និងហួសសុពលភាពក្នុងរយៈពេល {{PLURAL:$5|មួយថ្ងៃ|$5 ថ្ងៃ}}។\nយកល្អអ្នកគួរតែកត់ឈ្មោះចូលរួចជ្រើសរើសពាក្យសម្ងាត់ថ្មីមួយ។ ប្រសិនបើមាននរណាម្នាក់ផ្សេងធ្វើការស្នើសុំនេះ \nឬប្រសិនបើអ្នកនឹកឃើញពាក្យសម្ងាត់ដើមរបស់អ្នក ហើយអ្នកមិនប្រាថ្នាផ្លាស់ប្ដូរវាទៀតទេនោះ អ្នកគ្រាន់តែ\nបំភ្លេចអំពីសារមួយនេះ ហើយបន្តប្រើប្រាស់ពាក្យសម្ងាត់ចាស់របស់អ្នកទៅបានហើយ។",
        "passwordreset-emailelement": "អត្តនាម៖ \n$1\n\nពាក្យសម្ងាត់បណ្ដោះអាសន្ន៖ \n$2",
-       "passwordreset-emailsentemail": "បើសិនជានេះអាសយដ្ឋានអ៊ីមែលដែលត្រូវបានចុះឈ្មោះសម្រាប់គណនីរបស់អ្នក នោះអ៊ីមែលសម្រាប់ស្ដារពាក្យសម្ងាត់មួយនឹងត្រូវបានផ្ញើទៅ។",
+       "passwordreset-emailsentemail": "បើសិនជាអាសយដ្ឋានអ៊ីមែលនេះត្រូវបានភ្ជាប់ជាមួយគណនីរបស់អ្នក នោះអ៊ីមែលសម្រាប់ស្ដារពាក្យសម្ងាត់មួយនឹងត្រូវបានផ្ញើទៅ។",
+       "passwordreset-emailsentusername": "បើសិនជាអាសយដ្ឋានអ៊ីមែលនេះត្រូវបានភ្ជាប់ជាមួយអត្តនាមនេះ នោះអ៊ីមែលសម្រាប់ស្ដារពាក្យសម្ងាត់មួយនឹងត្រូវបានផ្ញើទៅ។",
        "passwordreset-invalidemail": "អាសយដ្ឋាន​អ៊ីមែល​មិន​ត្រឹម​ត្រូវ",
        "changeemail": "ផ្លាស់ប្ដូរឬលុបអាសយដ្ឋានអ៊ីមែល",
        "changeemail-header": "សូមបំពេញសំណុំបែបបទនេះដើម្បីផ្លាស់ប្ដូរអាសយដ្ឋានអ៊ីមែល។ បើសិនជាអ្នកចង់លុបការតភ្ជាប់អាសយដ្ឋានអ៊ីមែលពីគណនីរបស់អ្នក សូមដាក់ប្រឡោះអាសយដ្ឋានថ្មីអោយនៅទំនេរពេលសម្រេចដាក់សំណុំបែបបទ។",
        "cantcreateaccount-text": "ការបង្កើតគណនីពីអាសយដ្ឋាន IP ('''$1''') នេះ ត្រូវបានរារាំងដោយ [[User:$3|$3]]។\n\nហេតុផលដែលត្រូវលើកឡើងដោយ $3 គឺ ''$2''",
        "viewpagelogs": "មើលកំណត់ហេតុសម្រាប់ទំព័រនេះ",
        "nohistory": "មិនមានប្រវត្តិកំណែប្រែ​ចំពោះទំព័រនេះ។",
-       "currentrev": "á\9e\80á\9f\86á\9e\8eá\9f\82á\9e\94á\9e\85á\9f\92á\9e\85á\9e»á\9e\94á\9f\92á\9e\94á\9e\93á\9f\92á\9e\93",
-       "currentrev-asof": "á\9e\80á\9f\86á\9e\8eá\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\94á\9e\85á\9f\92á\9e\85á\9e»á\9e\94á\9f\92á\9e\94á\9e\93á\9f\92á\9e\93 $1",
+       "currentrev": "á\9e\80á\9f\86á\9e\8eá\9f\82á\9e\90á\9f\92á\9e\98á\9e¸á\9e\94á\9f\86á\9e\95á\9e»á\9e\8f",
+       "currentrev-asof": "á\9e\80á\9f\86á\9e\8eá\9f\82á\9e\90á\9f\92á\9e\98á\9e¸á\9e\94á\9f\86á\9e\95á\9e»á\9e\8fá\9e\93á\9f\85 $1",
        "revisionasof": "កំណែនៅ $1",
        "revision-info": "កំណែ​នៅ $1 ដោយ {{GENDER:$6|$2}}$7",
-       "previousrevision": "â\86\90 á\9e\80á\9f\86á\9e\8eá\9f\82â\80\8bá\9e\98á\9e»á\9e\93",
-       "nextrevision": "á\9e\80á\9f\86á\9e\8eá\9f\82á\9e\94á\9e\93á\9f\92á\9e\91á\9e¶á\9e\94á\9f\8b →",
-       "currentrevisionlink": "á\9e\80á\9f\86á\9e\8eá\9f\82á\9e\94á\9e\85á\9f\92á\9e\85á\9e»á\9e\94á\9f\92á\9e\94á\9e\93á\9f\92á\9e\93",
+       "previousrevision": "â\86\90 á\9e\80á\9f\86á\9e\8eá\9f\82â\80\8bá\9e\85á\9e¶á\9e\9fá\9f\8bá\9e\87á\9e¶á\9e\84",
+       "nextrevision": "á\9e\80á\9f\86á\9e\8eá\9f\82á\9e\90á\9f\92á\9e\98á\9e¸á\9e\87á\9e¶á\9e\84 →",
+       "currentrevisionlink": "á\9e\80á\9f\86á\9e\8eá\9f\82á\9e\90á\9f\92á\9e\98á\9e¸á\9e\94á\9f\86á\9e\95á\9e»á\9e\8f",
        "cur": "បច្ចុប្បន្ន",
        "next": "បន្ទាប់",
        "last": "មុន",
-       "page_first": "á\9e\8aá\9f\86á\9e\94á\9e¼á\9e\84",
-       "page_last": "á\9e\98á\9e»á\9e\93",
+       "page_first": "á\9e\8aá\9e¾á\9e\98á\9e\82á\9f\81",
+       "page_last": "á\9e\85á\9e»á\9e\84á\9e\82á\9f\81",
        "histlegend": "ជម្រើសប្រៀបធៀប៖ សូមគូសក្នុងកូនប្រអប់ពីមុខកំណែដែលអ្នកចង់ប្រៀបធៀប រួចចុចច្នុច ENTER ឬប៊ូតុងនៅខាងក្រោម។<br />\nសម្គាល់៖ <strong>({{int:cur}})</strong> = ភាពខុសគ្នាជាមួយនឹងកំណែបច្ចុប្បន្ន, <strong>({{int:last}})</strong> = ភាពខុសគ្នាជាមួយនឹងកំណែមុន, <strong>{{int:minoreditletter}}</strong> =  កំណែប្រែតិចតួច។",
        "history-fieldset-title": "ស្វែងរកកំណែប្រែ",
        "history-show-deleted": "តែកំណែប្រែលុបចោលប៉ុណ្ណោះ",
        "stub-threshold-disabled": "មិនប្រើ",
        "recentchangesdays": "ចំនួនថ្ងៃបង្ហាញក្នុងទំព័របន្លាស់ប្តូរថ្មីៗ៖",
        "recentchangesdays-max": "(អតិបរមា $1 {{PLURAL:$1|ថ្ងៃ|ថ្ងៃ}})",
-       "recentchangescount": "á\9e\85á\9f\86á\9e\93á\9e½á\9e\93â\80\8bá\9e\80á\9f\86á\9e\8eá\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82â\80\8bá\9e\8aá\9f\82á\9e\9bâ\80\8bá\9e\8fá\9f\92á\9e\9aá\9e¼á\9e\9câ\80\8bá\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89â\80\8bá\9e\8fá\9e¶á\9e\98á\9e\9bá\9f\86á\9e\93á\9e¶á\9f\86á\9e\8aá\9e¾á\9e\98:",
-       "prefs-help-recentchangescount": "á\9e\9aá\9e¶á\9e\94á\9f\8bá\9e\94á\9e\89á\9f\92á\9e\85á\9e¼á\9e\9bá\9e\91á\9e¶á\9f\86á\9e\84á\9e\80á\9e¶á\9e\9aá\9e\80á\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82á\9e\93á\9e¶á\9e\96á\9f\81á\9e\9bá\9e\90á\9f\92á\9e\98á\9e¸ á\9e\94á\9f\92á\9e\9aá\9e\9cá\9e\8fá\9f\92á\9e\8fá\9e·á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9aá\9e\93á\9e·á\9e\84á\9e\80á\9f\86á\9e\8eá\9e\8fá\9f\8bá\9e á\9f\81á\9e\8fá\9e»á\9e\93á\9e¶á\9e\93á\9e¶á\9f\94",
+       "recentchangescount": "á\9e\85á\9f\86á\9e\93á\9e½á\9e\93â\80\8bá\9e\80á\9f\86á\9e\8eá\9f\82á\9e\94á\9f\92á\9e\9aá\9f\82â\80\8bá\9e\9fá\9e\98á\9f\92á\9e\9aá\9e¶á\9e\94á\9f\8bá\9e\94á\9e\84á\9f\92á\9e á\9e¶á\9e\89á\9e\80á\9f\92á\9e\93á\9e»á\9e\84á\9e\94á\9e\93á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\90á\9f\92á\9e\98á\9e¸á\9f\97 á\9e\94á\9f\92á\9e\9aá\9e\9cá\9e\8fá\9f\92á\9e\8fá\9e·á\9e\91á\9f\86á\9e\96á\9f\90á\9e\9a á\9e\93á\9e·á\9e\84á\9e\80á\9f\92á\9e\93á\9e»á\9e\84á\9e\80á\9f\86á\9e\8eá\9e\8fá\9f\8bá\9e\8fá\9f\92á\9e\9aá\9e¶â\80\8bá\9e\8fá\9e¶á\9e\98á\9e\9bá\9f\86á\9e\93á\9e¶á\9f\86á\9e\8aá\9e¾á\9e\98á\9f\96",
+       "prefs-help-recentchangescount": "á\9e\85á\9f\86á\9e\93á\9e½á\9e\93á\9e¢á\9e\8fá\9e·á\9e\94á\9e\9aá\9e\98á\9e¶á\9f\96 á\9f¡á\9f á\9f á\9f ",
        "prefs-help-watchlist-token2": "នេះជាសោរសម្ងាត់សម្រាប់មើលបញ្ជីតាមដានរបស់អ្នកតាម web feed ។\nអ្នកដែលដឹងសោរសម្ងាត់នេះនឹងអាចមើលបញ្ជីតាមដានរបស់អ្នក ហេតុនេះសូមកុំចែកចាយអោយគេដឹង។\nបើអ្នកចង់ [[Special:ResetTokens|អ្នកអាចកំណត់វាឡើងវិញ]]។",
        "savedprefs": "ចំណង់ចំណូលចិត្តនានារបស់អ្នកត្រូវបានរក្សាទុកហើយ។",
        "savedrights": "ក្រុមអ្នកប្រើប្រាស់{{GENDER:$1|$1}} ត្រូវបានរក្សាទុក។",
        "default": "លំនាំដើម",
        "prefs-files": "ឯកសារ",
        "prefs-custom-css": "CSSកម្លាយ",
+       "prefs-custom-json": "JSONកម្លាយ",
        "prefs-custom-js": "JavaScriptកម្លាយ",
-       "prefs-common-config": "CSS/JavaScriptរួមសម្រាប់សំបកទាំងអស់៖",
+       "prefs-common-config": "CSS/JSON/JavaScriptរួមសម្រាប់សំបកទាំងអស់៖",
        "prefs-reset-intro": "អ្នក​អាច​ប្រើ​ទំព័រ​នេះ​ដើម្បី​កំណត់​ចំណង់ចំណូល​ចិត្ត​របស់​អ្នក​ដូច​លំនាំ​ដើម​ឡើង​វិញ​។\nសកម្មភាព​នេះ​មិន​អាច​ឈប់ធ្វើ​ឡើង​វិញ​បាន​ទេ​។",
        "prefs-emailconfirm-label": "បញ្ជាក់ទទួលស្គាល់អ៊ីមែល៖",
        "youremail": "អ៊ីមែល៖",
        "rcfilters-highlightbutton-title": "ផាត់ពណ៌លទ្ធផល",
        "rcfilters-highlightmenu-title": "ជ្រើសរើសពណ៌",
        "rcfilters-highlightmenu-help": "ជ្រើសរើសពណ៌ដើម្បីផាត់",
+       "rcfilters-filterlist-noresults": "រកមិនឃើញតម្រង",
+       "rcfilters-noresults-conflict": "រកមិនឃើញលទ្ធផលព្រោះលក្ខខណ្ឌសម្រាប់ស្វែងរកទាស់ទែងគ្នា",
        "rcfilters-filtergroup-authorship": "ម្ចាស់កម្មសិទ្ធិការរួមចំណែក",
        "rcfilters-filter-editsbyself-label": "បន្លាស់ប្ដូរដែលអ្នកបានធ្វើ",
        "rcfilters-filter-editsbyself-description": "ការរួមចំណែករបស់អ្នក។",
        "rcfilters-filter-categorization-description": "កំណត់ត្រាពីការបន្ថែមឬដកចេញទំព័រពីចំណាត់ថ្នាក់ក្រុម។",
        "rcfilters-filter-logactions-label": "កំណត់ត្រាសកម្មភាព",
        "rcfilters-filter-logactions-description": "សកម្មភាពរបស់អភិបាល ការបង្កើតគណនី ការលុបអត្ថបទចោល ការផ្ទុកឯកសារឡើង...",
+       "rcfilters-filtergroup-lastRevision": "កំណែថ្មីបំផុត",
+       "rcfilters-filter-lastrevision-label": "កំណែថ្មីបំផុត",
+       "rcfilters-filter-lastrevision-description": "បង្ហាញតែបន្លាស់ប្ដូរថ្មីៗបំផុតរបស់ទំព័រមួយ។",
+       "rcfilters-filter-previousrevision-label": "មិនមែនកំណែថ្មីបំផុត",
+       "rcfilters-filter-previousrevision-description": "រាល់បន្លាស់ប្ដូរដែលដែលមិនមែនជា«កំណែថ្មីបំផុត»។",
+       "rcfilters-filter-excluded": "លើកលែង",
+       "rcfilters-tag-prefix-namespace-inverted": "<strong>:មិនមែនជា</strong> $1",
+       "rcfilters-exclude-button-off": "លើកលែងលំហឈ្មោះជ្រើសហើយ",
+       "rcfilters-exclude-button-on": "លំហឈ្មោះជ្រើសហើយកំពុងលើកលែង",
+       "rcfilters-view-tags": "កំណែប្រែមានស្លាកសម្គាល់",
+       "rcfilters-view-namespaces-tooltip": "ដាក់តម្រងលទ្ធផលតាមលំហឈ្មោះ",
+       "rcfilters-view-tags-tooltip": "ដាក់តម្រងលទ្ធផលដោយប្រើស្លាកសម្គាល់កំណែប្រែ",
+       "rcfilters-view-return-to-default-tooltip": "ត្រឡប់ទៅបញ្ជីតម្រងដើម",
+       "rcfilters-view-tags-help-icon-tooltip": "ស្វែងយល់បន្ថែមអំពីកំណែប្រែមានស្លាកសម្គាល់",
        "rcfilters-liveupdates-button": "ព្រឹត្តិការណ៍ថ្មីៗទាន់ចិត្ត",
        "rcfilters-liveupdates-button-title-on": "បិទព្រឹត្តិការណ៍ថ្មីៗទាន់ចិត្ត",
        "rcfilters-liveupdates-button-title-off": "បង្ហាញបន្លាស់ប្ដូរថ្មីៗពេលមានគេធ្វើឡើងភ្លាមៗ",
        "listfiles_size": "ទំហំ",
        "listfiles_description": "ការពិពណ៌នា",
        "listfiles_count": "កំណែ",
-       "listfiles-show-all": "á\9e\9aá\9e¶á\9e\94á\9f\8bá\9e\94á\9e\89á\9f\92á\9e\85á\9e¼á\9e\9bá\9e\91á\9e¶á\9f\86á\9e\84á\9e\80á\9f\86á\9e\8eá\9f\82á\9e\85á\9e¶á\9e\9fá\9f\8bá\9f\97á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e\9aá\9e¼á\9e\94á\9e\97á\9e¶á\9e\96",
+       "listfiles-show-all": "á\9e\9aá\9e¶á\9e\94á\9f\8bá\9e\94á\9e\89á\9f\92á\9e\85á\9e¼á\9e\9bá\9e\91á\9e¶á\9f\86á\9e\84á\9e\80á\9f\86á\9e\8eá\9f\82á\9e\85á\9e¶á\9e\9fá\9f\8bá\9f\97á\9e\9aá\9e\94á\9e\9fá\9f\8bá\9e¯á\9e\80á\9e\9fá\9e¶á\9e\9a",
        "listfiles-latestversion": "កំណែបច្ចុប្បន្ន",
        "listfiles-latestversion-yes": "បាទ/ចាស៎",
        "listfiles-latestversion-no": "ទេ",
        "statistics-users": "[[Special:ListUsers|អ្នកប្រើប្រាស់]]ដែលបានចុះឈ្មោះ",
        "statistics-users-active": "អ្នកប្រើប្រាស់សកម្ម",
        "statistics-users-active-desc": "អ្នក​ប្រើប្រាស់​ដែល​បាន​អនុវត្ត​សកម្មភាព​ក្នុង​{{PLURAL:$1|ថ្ងៃ​}}ចុង​ក្រោយ​",
+       "pageswithprop-submit": "ទៅ",
        "doubleredirects": "ទំព័របញ្ជូនបន្តទ្វេដង",
        "doubleredirectstext": "ទំព័រនេះរាយឈ្មោះទំព័រដែលបញ្ជូនបន្តទៅទំព័របញ្ជូនបន្ដផ្សេងទៀត។\n\nជួរនីមួយៗមានតំនភ្ជាប់ទៅកាន់ទំព័របញ្ជូនបន្តទី១និងទី២ ព្រមជាមួយទំព័រគោលដៅរបស់ទំព័របញ្ជូនបន្តទី២(ដែលជាធម្មតានេះក៏ជាទំព័រគោលដៅ\"ពិត\"របស់ទំព័របញ្ជូនបន្តទី១ដែរ)។",
        "double-redirect-fixed-move": "[[$1]] ត្រូវបានប្ដូរទីតាំង។\nវាត្រូវបានបន្ទាន់សម័យនិងត្រូវបានបញ្ជូនបន្តទៅ [[$2]]។",
        "protectedpages-performer": "អ្នកប្រើប្រាស់កំពុងការពារ",
        "protectedpages-params": "ប៉ារ៉ាម៉ែត្រនៃការការពារ",
        "protectedpages-reason": "មូល​ហេតុ",
+       "protectedpages-submit": "បង្ហាញទំព័រ",
        "protectedpages-unknown-timestamp": "មិនស្គាល់",
        "protectedpages-unknown-performer": "អ្នកប្រើប្រាស់មិនស្គាល់",
        "protectedtitles": "ចំណងជើងត្រូវបានការពារ",
        "protectedtitles-summary": "ទំព័រនេះរាយបញ្ជីចំណងជើងទាំងឡាយដែលស្ថិតនៅក្រោមការការពារមិនអោយបង្កើត។ សម្រាប់បញ្ជីទំព័រដែលកំពុងត្រូវបានការពារ សូមមើលនៅ [[{{#special:ProtectedPages}}|{{int:protectedpages}}]]។",
        "protectedtitlesempty": "មិន​មាន​ចំណងជើង​ណា​ដែល​ត្រូវ​បាន​ការពារ​ជាមួយនឹង​ប៉ារ៉ាម៉ែត​ទាំងនេះ​ទេ​នាពេលថ្មីៗនេះ។",
+       "protectedtitles-submit": "បង្ហាញចំណងជើង",
        "listusers": "បញ្ជីអ្នកប្រើប្រាស់",
        "listusers-editsonly": "បង្ហាញតែអ្នកប្រើប្រាស់ដែលបានកែប្រែអត្ថបទប៉ុណ្ណោះ",
        "listusers-creationsort": "តម្រៀបតាមលំដាប់កាលបរិច្ឆេទបង្កើត",
        "activeusers-count": "{{PLURAL:$1|សកម្មភាព|សកម្មភាព}}ចំនួន$1 ក្នុងរយៈពេល{{PLURAL:$3|១ថ្ងៃ|$3 ថ្ងៃ}}ចុងក្រោយ",
        "activeusers-from": "បង្ហាញអត្តនាមផ្ដើមដោយ៖",
        "activeusers-noresult": "អ្នកប្រើប្រាស់​រកមិនឃើញ​។​",
+       "activeusers-submit": "បង្ហាញអ្នកប្រើប្រាស់សកម្ម",
        "listgrouprights": "សិទ្ធិនិងក្រុមអ្នកប្រើប្រាស់",
        "listgrouprights-summary": "ខាងក្រោមនេះជាបញ្ជីរាយឈ្មោះក្រុមអ្នកប្រើប្រាស់ដែលបានកំណត់ជាមួយនឹងសិទ្ធិរបស់គេនៅលើវិគីនេះ។ មាន[[{{MediaWiki:Listgrouprights-helppage}}|ព័ត៌មានបន្ថែម]] អំពីសិទ្ធិផ្ទាល់ខ្លួន។",
        "listgrouprights-key": "កំណត់សម្គាល់៖\n* <span class=\"listgrouprights-granted\">សិទ្ធិ​ដែល​បាន​ផ្តល់​ជូន​</span>\n* <span class=\"listgrouprights-revoked\">សិទ្ធិ​ដែល​បាន​ដក​ហូត​</span>",
        "enotif_body_intro_moved": "ទំព័រ {{SITENAME}} មានចំណងជើងថា $1 ត្រូវបាន {{GENDER:$2|ប្ដូរទីតាំង}} នៅ $PAGEEDITDATE ដោយ $2។ សូមអាន $3 សម្រាប់កំណែបច្ចុប្បន្ន។",
        "enotif_body_intro_restored": "ទំព័រ {{SITENAME}} មានចំណងជើងថា $1 ត្រូវបាន {{GENDER:$2|ស្ដារឡើងវិញ}} នៅ $PAGEEDITDATE ដោយ $2។ សូមអាន $3 សម្រាប់កំណែបច្ចុប្បន្ន។",
        "enotif_body_intro_changed": "ទំព័រ {{SITENAME}} មានចំណងជើងថា $1 ត្រូវបាន {{GENDER:$2|ផ្លាស់ប្ដូរ}} នៅ $PAGEEDITDATE ដោយ $2។ សូមអាន $3 សម្រាប់កំណែបច្ចុប្បន្ន។",
-       "enotif_lastvisited": "á\9e\96á\9e·á\9e\93á\9e·á\9e\8fá\9f\92á\9e\99 $1 á\9e\9fá\9e\98á\9f\92á\9e\9aá\9e¶á\9e\94á\9f\8bá\9e\82á\9f\92á\9e\9aá\9e\94á\9f\8bá\9e\94á\9e\93á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9aá\9e\8fá\9e¶á\9f\86á\9e\84á\9e\96á\9e¸á\9e\96á\9f\81á\9e\9bá\9e\85á\9e¼á\9e\9bá\9e\98á\9e¾á\9e\9bá\9e\85á\9e»á\9e\84á\9e\80á\9f\92á\9e\9aá\9f\84á\9e\99។",
-       "enotif_lastdiff": "á\9e\9fá\9e¼á\9e\98á\9e\96á\9e·á\9e\93á\9e·á\9e\8fá\9f\92á\9e\99 $1 á\9e\8aá\9e¾á\9e\98á\9f\92á\9e\94á\9e¸á\9e\98á\9e¾á\9e\9bá\9e\94á\9f\86á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9aá\9e\93á\9f\81á\9f\87á\9f\94",
+       "enotif_lastvisited": "á\9e\98á\9e¾á\9e\9bá\9e\94á\9e\93á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8fá\9e¼á\9e\9aá\9e\91á\9e¶á\9f\86á\9e\84á\9e¢á\9e\9fá\9f\8bá\9e\8fá\9e¶á\9f\86á\9e\84á\9e\96á\9e¸á\9e\96á\9f\81á\9e\9bá\9e\85á\9e¼á\9e\9bá\9e\98á\9e¾á\9e\9bá\9e\85á\9e»á\9e\84á\9e\80á\9f\92á\9e\9aá\9f\84á\9e\99á\9e\93á\9f\85 $1។",
+       "enotif_lastdiff": "á\9e\98á\9e¾á\9e\9bá\9e\94á\9e\93á\9f\92á\9e\9bá\9e¶á\9e\9fá\9f\8bá\9e\94á\9f\92á\9e\8aá\9e¼á\9e\9aá\9e\93á\9f\81á\9f\87á\9e\93á\9f\85 $1",
        "enotif_anon_editor": "អ្នកប្រើប្រាស់អនាមិក $1",
        "enotif_body": "ជូនចំពោះ $WATCHINGUSERNAME ជាទីរាប់អាន,\n\n$PAGEINTRO $NEWPAGE\n\nចំណារពន្យល់របស់អ្នកកែប្រែ៖ $PAGESUMMARY $PAGEMINOREDIT\n\nទាក់ទង​អ្នកកែប្រែ៖\nអ៊ីមែល៖ $PAGEEDITOR_EMAIL\nវិគី៖ $PAGEEDITOR_WIKI\n\nនឹងមិនមាន​ការផ្ដល់ដំណឹង​ជាលាយលក្សណ៍អក្សរ​ផ្សេងទៀតពេលមានសកម្មភាពលើសពីនេះទេ លើកលែងតែ​អ្នកចូលមើល​ទំព័រនេះដោយកត់ឈ្មោះចូលរួចសិន។ អ្នកក៏អាចកំណត់ឡើងវិញអំពីការផ្ដល់ដំណឹងសម្រាប់​ទំព័រដែលអ្នកកំពុងតាមដានផងដែរ។\n\nពីប្រព័ន្ធផ្តល់ដំណឹង {{SITENAME}}\n\n--\nដើម្បីផ្លាស់ប្តូរការកំណត់ការផ្ដល់ដំណឹងតាមអ៊ីមែលរបស់អ្នក, សូមទៅកាន់\n{{canonicalurl:{{#special:Preferences}}}}\n\n\nដើម្បីផ្លាស់ប្តូរការកំណត់បញ្ជីតាមដានរបស់អ្នក, សូមទៅកាន់\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\n\nដើម្បីដកទំព័រចេញពីបញ្ជីតាមដានរបស់អ្នក, សូមទៅកាន់\n$UNWATCHURL\n\nមតិ​យោបល់​និងជំនួយបន្ថែម ៖\n$HELPPAGE",
+       "enotif_minoredit": "នេះជា​កំណែប្រែតិចតួចប៉ុណ្ណោះ",
        "created": "បានបង្កើត",
        "changed": "បានផ្លាស់ប្តូរ",
        "deletepage": "លុបទំព័រចោល",
        "confirm": "ផ្ទៀងផ្ទាត់បញ្ជាក់",
        "excontent": "ខ្លឹមសារគឺ៖ '$1'",
-       "excontentauthor": "អត្ថន័យគឺ៖ '$1' (ហើយអ្នករួមចំណែកតែម្នាក់គត់គឺ '[[Special:Contributions/$2|$2]]')",
-       "exbeforeblank": "អត្ថន័យមុនពេលលុបចេញ៖ '$1'",
+       "excontentauthor": "អត្ថន័យគឺ៖ \"$1\" ហើយអ្នករួមចំណែកតែម្នាក់គត់គឺ '[[Special:Contributions/$2|$2]]' ([[User talk:$2|ការពិភាក្សា]])",
+       "exbeforeblank": "អត្ថន័យមុនពេលលុបចេញ៖ \"$1\"",
        "delete-confirm": "លុប\"$1\"ចោល",
        "delete-legend": "លុបចោល",
        "historywarning": "'''ប្រយ័ត្ន​៖''' ទំព័រដែលអ្នកបំរុងនឹងលុប មានប្រវត្តិ​ចំនួនប្រហែល $1 {{PLURAL:$1|កំណែ|កំណែ}}៖",
        "isredirect": "ទំព័របញ្ជូនបន្ត",
        "istemplate": "ការដាក់បញ្ចូល",
        "isimage": "តំណភ្ជាប់ឯកសារ",
-       "whatlinkshere-prev": "{{PLURAL:$1|មុន|មុន $1}}",
-       "whatlinkshere-next": "{{PLURAL:$1|បន្ទាប់|បន្ទាប់ $1}}",
+       "whatlinkshere-prev": "{{PLURAL:$1|មុន|$1មុន}}",
+       "whatlinkshere-next": "{{PLURAL:$1|បន្ទាប់|$1បន្ទាប់}}",
        "whatlinkshere-links": "← តំណភ្ជាប់",
        "whatlinkshere-hideredirs": "$1ការបញ្ជូនបន្ត",
        "whatlinkshere-hidetrans": "$1 ការរាប់បញ្ចូល",
        "whatlinkshere-hidelinks": "$1តំណភ្ជាប់",
        "whatlinkshere-hideimages": "$1តំណភ្ជាប់រូបភាព",
-       "whatlinkshere-filters": "តម្រងការពារនានា",
+       "whatlinkshere-filters": "តម្រង",
+       "whatlinkshere-submit": "ទៅ",
        "autoblockid": "ដាក់ការហាមឃាត់ជាស្វ័យប្រវត្តិលើ #$1",
        "block": "ដាក់ការហាមឃាត់លើអ្នកប្រើប្រាស់",
        "unblock": "ដកការហាមឃាត់លើអ្នកប្រើប្រាស់",
        "ipb-unblock": "ដកការហាមឃាត់លើអ្នកប្រើប្រាស់ ឬ អាសយដ្ឋាន IP",
        "ipb-blocklist": "មើលការហាមឃាត់ដែលមានហើយ",
        "ipb-blocklist-contribs": "ការរួមចំណែកសម្រាប់ {{GENDER:$1|$1}}",
+       "ipb-blocklist-duration-left": "នៅសល់ $1",
        "unblockip": "ដកការហាមឃាត់លើអ្នកប្រើប្រាស់",
        "unblockiptext": "សូម​ប្រើប្រាស់​ទម្រង់​បែបបទ​ខាងក្រោម​នេះ ដើម្បី​បើក​សិទ្ឋិ​សរសេរ​ឡើងវិញ សម្រាប់​អាសយដ្ឋាន​IP​ឬ​អ្នកប្រើប្រាស់​ដែល​ត្រូវ​បាន​ហាមឃាត់ពីមុន​។",
        "ipusubmit": "ដក​ការហាមឃាត់នេះ​ចេញ",
        "pageinfo-length": "ប្រវែងទំព័រ (គិតជាបៃ)",
        "pageinfo-article-id": "អត្តលេខទំព័រ",
        "pageinfo-language": "ភាសារបស់ខ្លឹមសារទំព័រ",
+       "pageinfo-language-change": "ផ្លាស់ប្តូរ",
+       "pageinfo-content-model-change": "ផ្លាស់ប្តូរ",
        "pageinfo-robot-policy": "ដាក់ក្នុងលិបិក្រមដោយរូបយន្ត",
        "pageinfo-robot-index": "អនុញ្ញាត",
        "pageinfo-robot-noindex": "មិនអនុញ្ញាត",
        "compare-submit": "ប្រៀបធៀប",
        "compare-invalid-title": "ចំណងជើងដែលអ្នកបានផ្ដល់អោយមិនត្រឹមត្រូវទេ",
        "compare-title-not-exists": "ចំណងជើងដែលអ្នកផ្ដល់អោយមិនមានទេ។",
-       "diff-form": "'''សំនុំ​បែប​បទ'''មួយ​",
+       "diff-form": "ចំណុចខុសគ្នា",
        "diff-form-submit": "បង្ហាញភាពខុសគ្នា",
        "dberr-problems": "សូមអភ័យទោស! វិបសាយនេះកំពុងជួបបញ្ហាបច្ចេកទេស។",
        "dberr-again": "សូមរង់ចាំប៉ុន្មាននាទីសិនហើយផ្ទុកឡើងវិញម្ដងទៀត។",
        "expand_templates_remove_comments": "ដកចេញ វិចារនានា",
        "expand_templates_preview": "បង្ហាញការមើលជាមុន",
        "pagelanguage": "ប្ដូរភាសាទំព័រ",
+       "pagelang-name": "ទំព័រ",
        "pagelang-language": "ភាសា",
        "pagelang-use-default": "ប្រើភាសាតាមលំនាំដើម",
        "pagelang-select-lang": "ជ្រើសរើស​ភាសា​",
+       "pagelang-reason": "មូល​ហេតុ",
+       "pagelang-submit": "ដាក់ស្នើ",
        "pagelang-unchanged-language": "ភាសាទំព័រ $1 ត្រូវបានកំណត់ជា $2 រួចហើយ។",
        "pagelang-unchanged-language-default": "ភាសាទំព័រ $1 ត្រូវបានកំណត់ជាភាសាអត្ថបទលំនាំដើមរបស់វិគីរួចហើយ។",
        "right-pagelang": "ប្ដូរភាសាទំព័រ",
index ee670e9..4c31b99 100644 (file)
        "tog-watchlisthideminor": "주시문서 목록에서 사소한 편집을 숨기기",
        "tog-watchlisthideliu": "주시문서 목록에서 로그인한 사용자의 편집을 숨기기",
        "tog-watchlistreloadautomatically": "필터가 수정될 때마다 주시문서 목록 자동으로 새로 고치기 (자바스크립트 필요)",
-       "tog-watchlistunwatchlinks": "주ì\8b\9c문ì\84\9c ëª©ë¡\9d í\95­ëª©ì\97\90 ë\8c\80í\95\9c ì§\81ì \91ì \81ì\9d¸ ì£¼ì\8b\9c/주ì\8b\9cí\95´ì \9c ë§\81í\81¬를 추가합니다 (토글 기능을 위해 자바스크립트가 필요합니다)",
+       "tog-watchlistunwatchlinks": "주ì\8b\9c문ì\84\9c ëª©ë¡\9d í\95­ëª©ì\97\90 ë\8c\80í\95\9c ì§\81ì \91ì \81ì\9d¸ ì£¼ì\8b\9c/주ì\8b\9cí\95´ì \9c ë§\88커 ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) 를 추가합니다 (토글 기능을 위해 자바스크립트가 필요합니다)",
        "tog-watchlisthideanons": "주시문서 목록에서 익명 사용자의 편집을 숨기기",
        "tog-watchlisthidepatrolled": "주시문서 목록에서 점검한 편집을 숨기기",
        "tog-watchlisthidecategorization": "페이지 분류 숨기기",
        "blocked-notice-logextract": "이 사용자는 현재 차단되어 있습니다.\n해당 사용자의 최신 차단 기록을 참조하십시오:",
        "clearyourcache": "<strong>참고:</strong> 설정을 저장한 후에 바뀐 점을 확인하기 위해서는 브라우저의 캐시를 새로 고쳐야 합니다.\n* <strong>파이어폭스 / 사파리</strong>: <em>Shift</em> 키를 누르면서 새로 고침을 클릭하거나, <em>Ctrl-F5</em> 또는 <em>Ctrl-R</em>을 입력 (Mac에서는 <em>⌘-R</em>)\n* <strong>구글 크롬</strong>: <em>Ctrl-Shift-R</em>키를 입력 (Mac에서는 <em>⌘-Shift-R</em>)\n* <strong>인터넷 익스플로러</strong>: <em>Ctrl</em> 키를 누르면서 새로 고침을 클릭하거나, <em>Ctrl-F5</em>를 입력.\n* <strong>오페라:</strong> <em>메뉴 → 설정</em>(맥의 경우 <em>오페라 → 환경 설정</em>)으로 이동한 다음 <em>개인 정보 보호 및 보안 → 검색 데이터 지우기 → 캐시한 영상 및 파일</em>을 누름.",
        "usercssyoucanpreview": "'''안내''': CSS 문서를 저장하기 전에 \"{{int:showpreview}}\" 기능을 통해 작동을 확인해주세요.",
+       "userjsonyoucanpreview": "<strong>안내:</strong> 새로운 JSON을 저장하기 전에 \"{{int:showpreview}}\" 버튼을 통해 작동을 확인해주세요.",
        "userjsyoucanpreview": "'''안내''': 자바스크립트 문서를 저장하기 전에 \"{{int:showpreview}}\" 기능을 통해 작동을 확인해주세요.",
        "usercsspreview": "'''사용자 CSS의 미리 보기입니다.'''\n'''아직 저장하지 않았습니다!'''",
        "userjsonpreview": "<strong>사용자 JSON 구성을 테스트/미리 보기만 하고 있습니다.\n아직 저장하지 않았습니다!</strong>",
        "userjspreview": "'''사용자 자바스크립트 미리 보기입니다.'''\n'''아직 저장하지 않았습니다!'''",
        "sitecsspreview": "'''이 CSS의 미리 보기입니다.'''\n'''아직 저장하지 않았습니다!'''",
+       "sitejsonpreview": "<strong>JSON 구성의 미리 보기입니다.\n아직 저장하지 않았습니다!</strong>",
        "sitejspreview": "'''이 자바스크립트 코드의 미리 보기입니다.'''\n'''아직 저장하지 않았습니다!'''",
        "userinvalidconfigtitle": "<strong>경고:</strong> \"$1\" 스킨은 없습니다.\n.css, .json, .js 문서의 제목은 {{ns:user}}:Foo/vector.css 처럼 소문자로 써야 합니다. {{ns:user}}:Foo/Vector.css 와 같이 대문자로 쓸 경우 작동하지 않습니다.",
        "updated": "(바뀜)",
        "revdelete-edit-reasonlist": "삭제 이유 편집",
        "revdelete-offender": "판 작성자:",
        "suppressionlog": "감추기 기록",
-       "suppressionlogtext": "다음은 관리자로부터 감춰진 내용에 관한 삭제와 차단 기록입니다.\n현재 차단된 사용자 목록을 보려면 [[Special:BlockList|차단된 사용자 목록]]을 참조하세요.",
+       "suppressionlogtext": "다음은 삭제와 차단 기록 중 관리자도 보지 못하게 감춰진 내용의 목록입니다.\n현재 차단된 사용자 목록을 보려면 [[Special:BlockList|차단된 사용자 목록]]을 참조하세요.",
        "mergehistory": "문서 역사 합치기",
        "mergehistory-header": "이 페이지는 새 문서 안으로 한 원본 문서의 편집 역사를 합치게 됩니다.\n이전 문서의 바뀜을 역사적 기록으로 계속 남겨둘 것인지 확인해주세요.",
        "mergehistory-box": "두 문서의 판 합치기:",
        "rcfilters-filter-humans-label": "사람 (봇이 아님)",
        "rcfilters-filter-humans-description": "사람이 한 편집.",
        "rcfilters-filtergroup-reviewstatus": "검토 상태",
-       "rcfilters-filter-patrolled-label": "점검됨",
-       "rcfilters-filter-patrolled-description": "검토한 것으로 표시된 편집들.",
-       "rcfilters-filter-unpatrolled-label": "점검 안 됨",
-       "rcfilters-filter-unpatrolled-description": "검토한 것으로 표시되지 않은 편집들.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "점검 안 됨",
+       "rcfilters-filter-reviewstatus-manual-description": "수동으로 검토된 편집들.",
+       "rcfilters-filter-reviewstatus-manual-label": "수동으로 검토됨",
+       "rcfilters-filter-reviewstatus-auto-label": "점검 면제자",
        "rcfilters-filtergroup-significance": "의미",
        "rcfilters-filter-minor-label": "사소한 편집",
        "rcfilters-filter-minor-description": "기여자가 사소한 기여로 표시한 편집.",
        "lockmanager-fail-closelock": "\"$1\"에 대한 잠금 파일을 닫지 못했습니다.",
        "lockmanager-fail-deletelock": "\"$1\"에 대한 잠금 파일을 삭제하지 못했습니다.",
        "lockmanager-fail-acquirelock": "\"$1\"에 대한 잠금이 실패했습니다.",
-       "lockmanager-fail-openlock": "\"$1\"에 대한 잠금 파일을 열지 못했습니다.",
+       "lockmanager-fail-openlock": "\"$1\"에 대한 잠금 파일을 열지 못했습니다. 업로드 디렉토리가 제대로 설정되어 있고 웹 서버가 해당 디렉토리를 편집할 권한이 있는지 확인하세요. 더 많은 정보를 https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgUploadDirectory 에서 확인할 수 있습니다.",
        "lockmanager-fail-releaselock": "\"$1\"에 대한 잠금을 풀지 못했습니다.",
        "lockmanager-fail-db-bucket": "데이터베이스의 버킷 $1의 잠금을 풀지 못했습니다.",
        "lockmanager-fail-db-release": "데이터베이스 $1의 잠금을 풀지 못했습니다.",
        "uploadstash-bad-path-unrecognized-thumb-name": "인식되지 않은 썸네일 이름",
        "uploadstash-bad-path-no-handler": "파일 $2의 mime $1에 대한 핸들러를 찾을 수 없습니다.",
        "uploadstash-bad-path-bad-format": "\"$1\" 키는 적절한 포맷이 아닙니다.",
+       "uploadstash-file-not-found": "저장소에서 \"$1\" 키를 찾지 못했습니다.",
        "uploadstash-file-not-found-no-thumb": "섬네일을 가져오지 못했습니다.",
        "uploadstash-file-not-found-no-object": "섬네일을 위한 로컬 파일 객체를 만들 수 없습니다.",
        "uploadstash-file-not-found-no-remote-thumb": "섬네일 가져오기를 실패했습니다: $1\nURL = $2",
        "import-mapping-subpage": "이 문서의 하위문서로 들여오기:",
        "import-upload-filename": "파일 이름:",
        "import-upload-username-prefix": "인터위키 접두어:",
+       "import-assign-known-users": "사용자가 로컬에 존재하는 경우 편집을 사용자와 연동합니다",
        "import-comment": "요약:",
        "importtext": "원본 위키에서 [[Special:Export|내보내기]] 기능을 사용해 파일을 내려받으세요.\n그리고 당신의 컴퓨터에 저장해 둔 후 여기에 올려주세요.",
        "importstart": "문서를 가져오는 중...",
        "variantname-zh-hans": "간체",
        "variantname-zh-hant": "번체",
        "metadata": "메타데이터",
-       "metadata-help": "ì\9d´ í\8c\8cì\9d¼ì\9d\80 ì¹´ë©\94ë\9d¼ë\82\98 ì\8a¤ìº\90ë\84\88ê°\80 í\8c\8cì\9d¼ì\9d\84 ë§\8cë\93¤ê±°ë\82\98 ë\94\94ì§\80í\84¸í\99\94í\95\98ë\8a\94 ë\8d° ì\82¬ì\9a©í\95\98기ì\9c\84í\95´ ê¸°ë¡\9dí\95\9c ë¶\80ê°\80 ì \95보를 í\8f¬í\95¨í\95\98ê³  있습니다.\n프로그램에서 파일을 편집한 경우, 새로 저장한 파일에 일부 부가 정보가 빠질 수 있습니다.",
+       "metadata-help": "ì\9d´ í\8c\8cì\9d¼ì\97\90ë\8a\94 ì¹´ë©\94ë\9d¼ë\82\98 ì\8a¤ìº\90ë\84\88ê°\80 í\8c\8cì\9d¼ì\9d\84 ë§\8cë\93¤ê±°ë\82\98 ë\94\94ì§\80í\84¸í\99\94í\95\98ë\8a\94 ë\8d° ì\82¬ì\9a©í\95\98기 ì\9c\84í\95´ ê¸°ë¡\9dí\95\9c ë¶\80ê°\80 ì \95ë³´ê°\80 í\8f¬í\95¨ë\90\98ì\96´ 있습니다.\n프로그램에서 파일을 편집한 경우, 새로 저장한 파일에 일부 부가 정보가 빠질 수 있습니다.",
        "metadata-expand": "자세한 정보 보이기",
        "metadata-collapse": "자세한 정보 숨기기",
        "metadata-fields": "그림 메타데이터 표가 접혀 있을 때, 이 메시지에 나열되어 있는 다음 메타데이터 필드가 그림 문서 표시에 포함됩니다.\n나머지는 기본적으로 숨겨집니다.\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",
        "version-specialpages": "특수 문서",
        "version-parserhooks": "파서 훅",
        "version-variables": "변수",
+       "version-editors": "편집자",
        "version-antispam": "스팸 막기",
        "version-other": "기타",
        "version-mediahandlers": "미디어 핸들러",
        "version-poweredby-others": "그 외 다른 개발자",
        "version-poweredby-translators": "translatewiki.net 번역자",
        "version-credits-summary": "[[Special:Version|미디어위키]]에 기여한 다음 사람에게 감사드립니다.",
-       "version-license-info": "미디어위키는 자유 소프트웨어입니다. 당신은 자유 소프트웨어 재단이 발표한 GNU 일반 공중 사용 허가서 버전 2나 그 이후 버전에 따라 이 파일을 재배포하거나 수정할 수 있습니다.\n\n미디어위키가 유용하게 사용될 수 있기를 바라지만 '''상용으로 사용'''되거나 '''특정 목적에 맞을 것'''이라는 것을 '''보증하지 않습니다'''. 자세한 내용은 GNU 일반 공중 사용 허가서 전문을 참조하십시오.\n\n당신은 이 프로그램을 통해 [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU 일반 공중 사용 허가서 전문]을 받았습니다. 그렇지 않다면, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA로 편지를 보내주시거나 [//www.gnu.org/licenses/old-licenses/gpl-2.0.html 온라인으로 읽어보시기] 바랍니다.",
+       "version-license-info": "미디어위키는 자유 소프트웨어입니다. 당신은 자유 소프트웨어 재단이 발표한 GNU 일반 공중 사용 허가서 버전 2나 그 이후 버전에 따라 이 파일을 재배포하거나 수정할 수 있습니다.\n\n미디어위키가 유용하게 사용될 수 있기를 바라지만 <em>상용으로 사용</em>되거나 <strong>특정 목적에 맞을 것</strong>이라는 것을 <strong>보증하지 않습니다</strong>. 자세한 내용은 GNU 일반 공중 사용 허가서 전문을 참조하십시오.\n\n당신은 이 프로그램을 통해 [{{SERVER}}{{SCRIPTPATH}}/COPYING GNU 일반 공중 사용 허가서 전문]을 받았습니다. 그렇지 않다면, Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA로 편지를 보내주시거나 [//www.gnu.org/licenses/old-licenses/gpl-2.0.html 온라인으로 읽어보시기] 바랍니다.",
        "version-software": "설치된 소프트웨어",
        "version-software-product": "제품",
        "version-software-version": "버전",
        "unlinkaccounts-success": "계정의 연결이 해제되었습니다.",
        "authenticationdatachange-ignored": "인증 데이터 변경을 처리하지 못했습니다. 제공자를 설정하지 않으셨습니까?",
        "userjsispublic": "주목해 주십시오: 자바스크립트의 하위 문서들은 다른 사용자들이 볼 수 있기 때문에 기밀 데이터를 포함해서는 안 됩니다.",
+       "userjsonispublic": "주의해 주십시오: JSON 하위 문서는 다른 사용자가 볼 수 있으므로 기밀 데이터를 포함하지 않는 것이 좋습니다.",
        "usercssispublic": "주목해 주십시오: CSS의 하위 문서들은 다른 사용자들이 볼 수 있기 때문에 기밀 데이터를 포함해서는 안 됩니다.",
        "restrictionsfield-badip": "유효하지 않은 IP 주소나 대역: $1",
        "restrictionsfield-label": "허용된 IP 대역:",
index acb7354..b41ab45 100644 (file)
        "rcfilters-filter-humans-label": "Mënsch (kee Bot)",
        "rcfilters-filter-humans-description": "Ännerungen, déi vu mënschlechen Auteure gemaach goufen.",
        "rcfilters-filtergroup-reviewstatus": "Status nokucken",
-       "rcfilters-filter-patrolled-label": "Nogekuckt",
-       "rcfilters-filter-patrolled-description": "Ännerungen déi als nogekuckt markéiert sinn.",
-       "rcfilters-filter-unpatrolled-label": "Net nogekuckt",
-       "rcfilters-filter-unpatrolled-description": "Ännerungen déi net als nogekuckt markéiert sinn.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Net nogekuckt",
        "rcfilters-filtergroup-significance": "Bedeitung",
        "rcfilters-filter-minor-label": "Kleng Ännerungen",
        "rcfilters-filter-minor-description": "Ännerungen déi den Auteur als kleng markéiert huet.",
        "version-specialpages": "Spezialsäiten",
        "version-parserhooks": "Parser-Erweiderungen",
        "version-variables": "Variabelen",
+       "version-editors": "Editeuren",
        "version-antispam": "Spam-Preventioun",
        "version-other": "Aner",
        "version-mediahandlers": "Medien-Ënnerstëtzung",
index 99037d4..aa7cd79 100644 (file)
        "rcfilters-filter-humans-label": "Umana (no bot)",
        "rcfilters-filter-humans-description": "Editas par editores umana.",
        "rcfilters-filtergroup-reviewstatus": "State de validi",
-       "rcfilters-filter-patrolled-label": "Patrulia",
-       "rcfilters-filter-patrolled-description": "Editas marcada como patruliada.",
-       "rcfilters-filter-unpatrolled-label": "Nonpatruliada",
-       "rcfilters-filter-unpatrolled-description": "Editas no marcada como patruliada.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Nonpatruliada",
        "rcfilters-filtergroup-significance": "Importa",
        "rcfilters-filter-minor-label": "Editas minor",
        "rcfilters-filter-minor-description": "Editas cual la autor ia descrive como minor.",
index 4e3f213..5ec8fb6 100644 (file)
        "rcfilters-filter-humans-label": "Minsjelik (geine bot)",
        "rcfilters-filter-humans-description": "Bewirkinge door miensjelike gebroekers.",
        "rcfilters-filtergroup-reviewstatus": "Beoeardeilingsstaot",
-       "rcfilters-filter-patrolled-label": "Gecontroleerd",
-       "rcfilters-filter-patrolled-description": "Bewirkinge gemarkeerd es gecontroleerd.",
-       "rcfilters-filter-unpatrolled-label": "Óngecontroleerd",
-       "rcfilters-filter-unpatrolled-description": "Bewirkinge die neet zeen gemarkeerd wore es gecontroleerd.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Óngecontroleerd",
        "rcfilters-filtergroup-significance": "Wichtigheid",
        "rcfilters-filter-minor-label": "Klein bewirkinge",
        "rcfilters-filter-minor-description": "Bewirkinge die zeen gelabeld door de gebroeker es klein.",
        "apisandbox-dynamic-error-exists": "'ne Paramaeter mit de naam \"$1\" besteit al.",
        "apisandbox-deprecated-parameters": "Vereljerde paramaeters",
        "apisandbox-fetch-token": "Völ 't teike autematis in",
+       "apisandbox-add-multi": "Veug tou",
        "apisandbox-submit-invalid-fields-title": "Sommige veljer zint óngeljig",
        "apisandbox-submit-invalid-fields-message": "Verbaeter de gemarkeerde veljer en perbeer 't oppernuuj.",
        "apisandbox-results": "Rizzeltaote",
        "tooltip-undo": "Mit \"óngedaon make\" driejs te dees bewirking trök en koms te in 't bewirkingsvinster.\nDoe kans in de bewirkingssamevatting 'n reej opgaeve.",
        "tooltip-preferences-save": "Veurkäöre opsjlaon",
        "tooltip-summary": "Veur 'n kórte samevatting in",
+       "common.json": "/* JSON dae hie wuuertj geplaats haet invlood op alle pagina's veur alle gebroekers. */",
        "anonymous": "{{PLURAL:$1|Anonieme gebroeker|Anoniem gebroekers}} ven {{SITENAME}}",
        "siteuser": "{{SITENAME}} gebroeker $1",
        "anonuser": "anonieme gebroeker óp {{SITENAME}} $1",
        "svg-long-error": "Óngeljig SVG-bestandj: $1",
        "show-big-image": "Oearsprunkelik bestandj",
        "show-big-image-preview": "Gruutde van dees veurvertuining: $1.",
+       "show-big-image-preview-differ": "Aafmaetinge van dees veurbesjoewing van 't type $3 van dit $2-bestandj: $1",
        "show-big-image-other": "Anger {{PLURAL:$2|resolutie|resoluties}}: $1.",
        "show-big-image-size": "$1 × $2 pixels",
        "file-info-gif-looped": "herhaolendj",
        "version-specialpages": "Speciaal pazjena's",
        "version-parserhooks": "Parserheuk",
        "version-variables": "Variabele",
+       "version-editors": "Bewirkers",
        "version-antispam": "Spampreventie",
        "version-other": "Euverige",
        "version-mediahandlers": "Mediaverwerkers",
        "tags-activate": "aktiveer",
        "tags-deactivate": "deaktiveer",
        "tags-hitcount": "$1 {{PLURAL:$1|wieziging|wieziginge}}",
+       "tags-manage-no-permission": "Doe höbs gein rechte veur labeles te behieëre.",
+       "tags-manage-blocked": "Doe kans gein labels behieëre wen {{GENDER:$1|se}} bös geblokkeerd.",
+       "tags-create-heading": "Maak e nuuj label aan",
+       "tags-create-explanation": "Standerd waere nuuj-aangemaakde label besjikbaar gestèld veur gebroek door gebroekers en bots.",
+       "tags-create-tag-name": "Labelnaam:",
+       "tags-create-reason": "Raeje:",
+       "tags-create-submit": "Maak aan",
+       "tags-create-no-name": "Doe mós 'ne labelnaam opgaeve.",
+       "tags-create-invalid-chars": "Labelname moge gein komma's (<code>,</code>), sloesteikes (<code>|</code>), of slashes (<code>/</code>) bevatte.",
+       "tags-create-invalid-title-chars": "Labelname moge gein teikes bevatte die neet kónne waere gebroek in paginaname.",
+       "tags-create-already-exists": "'t Label \"$1\" besteit al.",
+       "tags-create-warnings-above": "De volgende {{PLURAL:$2|waorsjoewing is|waorsjoewinge zint}} opgetraoje bie 't aanmake van 't label \"$1\":",
+       "tags-create-warnings-below": "Wils se wiejergaon mit 't aanmake van 't label?",
+       "tags-delete-title": "Haol label eweg",
+       "tags-delete-explanation-initial": "Doe bös 't label \"$1\" eweg 'nt haole oete databank.",
+       "tags-delete-reason": "Raeje:",
+       "tags-delete-submit": "Haol dit label eweg zónger det 't kan waere trögkgedrejd",
+       "tags-delete-not-allowed": "Labeles die waere bepaoldj door 'n oetbreijing kónne neet waeren eweggehaold, behauve wen de oetbreijing dit specefiek tousteit.",
+       "tags-delete-not-found": "'t Label \"$1\" besteit neet.",
        "tags-deactivate-reason": "Raeje:",
        "tags-deactivate-submit": "Deaktiveer",
        "comparepages": "Vergeliek pazjena's",
        "htmlform-submit": "Opsjlaon",
        "htmlform-reset": "Maak verangeringe óngedaon",
        "htmlform-selectorother-other": "Anges",
+       "htmlform-date-placeholder": "JJJJ-MM-DD",
+       "htmlform-time-placeholder": "HH:MM:SS",
+       "htmlform-datetime-placeholder": "JJJJ-MM-DD HH:MM:SS",
        "logentry-delete-delete": "$1 {{GENDER:$1|haet}} de pagina $3 gewösj",
        "logentry-delete-restore": "$1 {{GENDER:$2|haet}} de pagina $3 ($4) trögkgezatte",
        "logentry-delete-event": "$1 {{GENDER:$2|haet}} de zichbaarheid van {{PLURAL:$5|'ne logbookregel|$5 logbookregels}} van $3 gewiezig: $4",
        "logentry-move-move": "$1 {{GENDER:$2|verplaatsde}} pagina $3 nao $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|verplaatsde}} pagina $3 nao $4 zónger 'ne redirek achter te laote",
        "logentry-move-move_redir": "$1 {{GENDER:$2|verplaatsde}} pagina $3 nao $4 euver 'ne redirek",
-       "logentry-move-move_redir-noredirect": "$1 verplaatsde pagina $3 nao $4 euver 'ne redirek zonger 'n doorverwiezing achter te laote",
-       "logentry-patrol-patrol": "$1 haet versie $4 van pagina $3 es gecontroleerd gemarkeerd",
+       "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|verplaatsde}} pagina $3 nao $4 euver 'ne redirek zonger 'n doorverwiezing achter te laote",
+       "logentry-patrol-patrol": "$1 {{GENDER:$2|haet}} versie $4 van pagina $3 es gecontroleerd gemarkeerd",
        "logentry-patrol-patrol-auto": "$1 {{GENDER:$2|haet}} versie $4 van pagina $3 autematis gemarkeerd es gecontroleerd",
-       "logentry-newusers-newusers": "$1 haet 'ne gebroeker aangemaak",
+       "logentry-newusers-newusers": "$1 haet 'ne {{GENDER:$2|gebroeker}} aangemaak",
        "logentry-newusers-create": "Gebroeker $1 {{GENDER:$2|is}} aangemaak gewaore",
        "logentry-newusers-create2": "$1 haet 'ne gebroeker $3 aangemaak",
        "logentry-newusers-autocreate": "De gebroeker $1 {{GENDER:$2|is}} autematis aangemaak gewaore",
        "log-action-filter-delete-restore": "Trökplaatse van pazjena",
        "log-action-filter-delete-event": "Ewegsjaffe van logbookregele",
        "log-action-filter-delete-revision": "Ewegsjaffe van versies",
-       "log-action-filter-import-interwiki": "Transwikiimport"
+       "log-action-filter-import-interwiki": "Transwikiimport",
+       "pagedata-bad-title": "Óngeljigen titel: $1."
 }
index 1038a88..a1e720b 100644 (file)
        "rcfilters-filter-humans-label": "Umoen (non bot)",
        "rcfilters-filter-humans-description": "Modiffiche effettoæ da di contributoî umoen.",
        "rcfilters-filtergroup-reviewstatus": "Stato da revixon",
-       "rcfilters-filter-patrolled-label": "Veificæ",
-       "rcfilters-filter-patrolled-description": "Modiffiche contrassegnæ comme veificæ.",
-       "rcfilters-filter-unpatrolled-label": "Non veificæ",
-       "rcfilters-filter-unpatrolled-description": "Modiffiche non contrassegnæ comme veificæ.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Non veificæ",
        "rcfilters-filtergroup-significance": "Scignificou",
        "rcfilters-filter-minor-label": "Cangiamenti menoî",
        "rcfilters-filter-minor-description": "Modiffiche che l'aoto o l'ha indicou comme minoî.",
index 3e09410..70ae64c 100644 (file)
        "rcfilters-filter-humans-label": "Žmogaus (ne roboto)",
        "rcfilters-filter-humans-description": "Keitimai atlikti žmonių.",
        "rcfilters-filtergroup-reviewstatus": "Peržiūrėti statusą",
-       "rcfilters-filter-patrolled-label": "Stebimas",
-       "rcfilters-filter-patrolled-description": "Pakeitimai pažymėti kaip stebimi.",
-       "rcfilters-filter-unpatrolled-label": "Nestebimas",
-       "rcfilters-filter-unpatrolled-description": "Pakeitimai pažymėti kaip nestebimi.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Nestebimas",
        "rcfilters-filtergroup-significance": "Reikšmė",
        "rcfilters-filter-minor-label": "Smulkūs pakeitimai",
        "rcfilters-filter-minor-description": "Keitimai, kuriuos autorius pažymėjo kaip smulkius.",
index 9eab4a3..47498e8 100644 (file)
        "rcfilters-filter-humans-label": "Cilvēki (ne boti)",
        "rcfilters-filter-humans-description": "Cilvēku veikti labojumi.",
        "rcfilters-filtergroup-reviewstatus": "Pārskatīšanas statuss",
-       "rcfilters-filter-patrolled-label": "Patrulēti",
-       "rcfilters-filter-patrolled-description": "Labojumi, kas atzīmēti kā patrulēti.",
-       "rcfilters-filter-unpatrolled-label": "Nepatrulēti",
-       "rcfilters-filter-unpatrolled-description": "Labojumi, kas nav atzīmēti kā patrulēti.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Nepatrulēti",
        "rcfilters-filtergroup-significance": "Nozīmīgums",
        "rcfilters-filter-minor-label": "Maznozīmīgi labojumi",
        "rcfilters-filter-minor-description": "Labojumi, kas atzīmēti kā maznozīmīgi.",
index 0e92f0c..3f45cf4 100644 (file)
        "rcfilters-filter-humans-label": "Olona (tsy rôbô)",
        "rcfilters-filter-humans-description": "Fiovana nataon'ny olombelona mpikambana.",
        "rcfilters-filtergroup-reviewstatus": "Satan'ny reviziôna",
-       "rcfilters-filter-patrolled-label": "Voatsidika",
-       "rcfilters-filter-patrolled-description": "Fiovana nomarihana ho voatsidika.",
-       "rcfilters-filter-unpatrolled-label": "Tsy mbola voatsidika",
-       "rcfilters-filter-unpatrolled-description": "Fiovana tsy voamarika ho voatsidika.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Tsy mbola voatsidika",
        "rcfilters-filtergroup-significance": "Dikany",
        "rcfilters-filter-minor-label": "Fiovana madinika",
        "rcfilters-filter-minor-description": "Fiovana nataon'ny tompony ho madinika.",
index 7f5e81f..a10585b 100644 (file)
@@ -59,7 +59,7 @@
        "tog-watchlisthideminor": "Скриј ги ситните уредувања во набљудуваните",
        "tog-watchlisthideliu": "Скриј ги уредувањата на најавените корисници во набљудуваните",
        "tog-watchlistreloadautomatically": "Превчитувај ги набљудувањата автоматски кога ќе се смени филтерот (бара JavaScript)",
-       "tog-watchlistunwatchlinks": "Ð\94одаÑ\98 Ð½ÐµÐ¿Ð¾Ñ\81Ñ\80едни Ð²Ñ\80Ñ\81ки Ð´Ð¾ Ð½Ð°Ð±Ñ\99Ñ\83дÑ\83ваниÑ\82е (бара JavaScript)",
+       "tog-watchlistunwatchlinks": "Ð\94одаÑ\98 Ð½ÐµÐ¿Ð¾Ñ\81Ñ\80едни Ð±ÐµÐ»ÐµÐ¶Ð½Ð¸Ñ\86и Ð·Ð° Ñ\82Ñ\80гаÑ\9aе/Ñ\81Ñ\82аваÑ\9aе Ð²Ð¾ Ð½Ð°Ð±Ñ\99Ñ\83дÑ\83ваниÑ\82е ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) ÐºÐ¾Ð½ Ð½Ð°Ð±Ñ\99Ñ\83дÑ\83ваниÑ\82е Ñ\81Ñ\82Ñ\80аниÑ\86и Ñ\81о Ð¿Ñ\80омени (пÑ\80еÑ\84Ñ\80лаÑ\9aеÑ\82о бара JavaScript)",
        "tog-watchlisthideanons": "Скриј ги уредувањата од анонимни корисници во набљудуваните",
        "tog-watchlisthidepatrolled": "Скриј испатролирани уредувања од мојот список на набљудувања",
        "tog-watchlisthidecategorization": "Сокриј ја категоризацијата на страниците",
        "rcfilters-filter-humans-label": "Човечки (неботовски)",
        "rcfilters-filter-humans-description": "Уредувања направени од човечки уредници.",
        "rcfilters-filtergroup-reviewstatus": "Провереност",
-       "rcfilters-filter-patrolled-label": "Проверено",
-       "rcfilters-filter-patrolled-description": "Уредувања кои се означени како проверени.",
-       "rcfilters-filter-unpatrolled-label": "Непроверено",
-       "rcfilters-filter-unpatrolled-description": "Уредувања кои не се означени како проверени.",
+       "rcfilters-filter-reviewstatus-unpatrolled-description": "Уредувања кои не се рачно или автоматски означени како проверени.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Непроверено",
+       "rcfilters-filter-reviewstatus-manual-description": "Уредувања кои се рачно означени како провереи.",
+       "rcfilters-filter-reviewstatus-manual-label": "Рачно проверени",
+       "rcfilters-filter-reviewstatus-auto-description": "Уредувања од напредни корисници чија работа автоматски се означува како проверена.",
+       "rcfilters-filter-reviewstatus-auto-label": "Автопроверени",
        "rcfilters-filtergroup-significance": "Значајност",
        "rcfilters-filter-minor-label": "Ситни уредувања",
        "rcfilters-filter-minor-description": "Уредувања кои авторот ги означил како ситни.",
        "version-specialpages": "Службени страници",
        "version-parserhooks": "Расчленувачки пресретници",
        "version-variables": "Променливи",
+       "version-editors": "Уредници",
        "version-antispam": "Спречување на спам",
        "version-api": "Извршници",
        "version-other": "Друго",
index f58f918..7feb18c 100644 (file)
@@ -68,7 +68,7 @@
        "tog-watchlisthideminor": "ഞാൻ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽനിന്ന് ചെറുതിരുത്തുകൾ മറയ്ക്കുക",
        "tog-watchlisthideliu": "ഞാൻ ശ്രദ്ധിക്കുന്ന താളുകളിലെ മാറ്റങ്ങളിൽ നിന്നും ലോഗിൻ ചെയ്തിട്ടുള്ളവരുടെ തിരുത്തുകൾ മറയ്ക്കുക",
        "tog-watchlistreloadautomatically": "ഒരു അരിപ്പയിൽ മാറ്റമുണ്ടായാൽ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടിക സ്വയം വീണ്ടുമെടുക്കുക (ജാവാസ്ക്രിപ്റ്റ് ആവശ്യമാണ്)",
-       "tog-watchlistunwatchlinks": "à´¶àµ\8dà´°à´¦àµ\8dധിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dനവയിലàµ\86 à´\89ൾപàµ\8dà´ªàµ\86à´\9fàµ\81à´¤àµ\8dതലàµ\81à´\95ൾà´\95àµ\8dà´\95àµ\8d à´¨àµ\87à´°à´¿à´\9fàµ\8dà´\9fàµ\81à´³àµ\8dà´³ à´¶àµ\8dà´°à´¦àµ\8dധിà´\95àµ\8dà´\95ാതിരിà´\95àµ\8dà´\95àµ\81à´\95/à´¶àµ\8dà´°à´¦àµ\8dധിà´\95àµ\8dà´\95àµ\81à´\95 à´\95à´£àµ\8dണിà´\95ൾ ചേർക്കുക (മാറ്റൽ സൗകര്യത്തിന് ജാവാസ്ക്രിപ്റ്റ് ആവശ്യമാണ്)",
+       "tog-watchlistunwatchlinks": "à´¶àµ\8dà´°à´¦àµ\8dധിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dനവയിലàµ\86 à´®à´¾à´±àµ\8dà´±à´\99àµ\8dà´\99à´³àµ\81à´³àµ\8dà´³ à´¤à´¾à´³àµ\81à´\95à´³àµ\8bà´\9fàµ\8aà´ªàµ\8dà´ªà´\82 à´¨àµ\87à´°à´¿à´\9fàµ\8dà´\9fàµ\81à´³àµ\8dà´³ à´¶àµ\8dà´°à´¦àµ\8dധിà´\95àµ\8dà´\95ാതിരിà´\95àµ\8dà´\95àµ\81à´\95/à´¶àµ\8dà´°à´¦àµ\8dധിà´\95àµ\8dà´\95àµ\81à´\95 à´¸àµ\97à´\95à´°àµ\8dà´¯à´\82 ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) ചേർക്കുക (മാറ്റൽ സൗകര്യത്തിന് ജാവാസ്ക്രിപ്റ്റ് ആവശ്യമാണ്)",
        "tog-watchlisthideanons": "ഞാൻ ശ്രദ്ധിക്കുന്ന താളുകളിലെ മാറ്റങ്ങളിൽ നിന്നും അജ്ഞാത ഉപയോക്താക്കളുടെ തിരുത്തുകൾ മറയ്ക്കുക",
        "tog-watchlisthidepatrolled": "ഞാൻ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽനിന്ന് റോന്തുചുറ്റിയ തിരുത്തുകൾ മറയ്ക്കുക",
        "tog-watchlisthidecategorization": "താളുകളുടെ വർഗ്ഗീകരണം മറയ്ക്കുക",
        "savechanges": "മാറ്റങ്ങൾ സേവ് ചെയ്യുക",
        "publishpage": "താൾ പ്രസിദ്ധീകരിക്കുക",
        "publishchanges": "മാറ്റങ്ങൾ പ്രസിദ്ധീകരിക്കുക",
+       "savearticle-start": "താൾ സേവ് ചെയ്യുക...",
+       "savechanges-start": "മാറ്റങ്ങൾ സേവ് ചെയ്യുക...",
+       "publishpage-start": "താൾ പ്രസിദ്ധീകരിക്കുക...",
+       "publishchanges-start": "മാറ്റങ്ങൾ പ്രസിദ്ധീകരിക്കുക...",
        "preview": "എങ്ങനെയുണ്ടെന്നു കാണുക",
        "showpreview": "എങ്ങനെയുണ്ടെന്നു കാണുക",
        "showdiff": "മാറ്റങ്ങൾ കാണിക്കുക",
        "blockedtitle": "ഉപയോക്താവിനെ തടഞ്ഞിരിക്കുന്നു",
        "blockedtext": "'''താങ്കളുടെ ഉപയോക്തൃനാമത്തേയോ താങ്കൾ ഇപ്പോൾ ലോഗിൻ ചെയ്തിട്ടുള്ള ഐ.പി. വിലാസത്തേയോ ഈ വിക്കി തിരുത്തുന്നതിൽ നിന്നു തടഞ്ഞിരിക്കുന്നു'''\n\n$1 ആണ് ഈ തടയൽ നടത്തിയത്. ''$2'' എന്നതാണു് അതിനു രേഖപ്പെടുത്തിയിട്ടുള്ള കാരണം.\n\n* തടയലിന്റെ തുടക്കം: $8\n* തടയലിന്റെ കാലാവധി: $6\n* തടയപ്പെട്ട ഉപയോക്താവ്: $7\n\nഈ തടയലിനെ പറ്റി ചർച്ച ചെയ്യാൻ താങ്കൾക്ക് $1 എന്ന ഉപയോക്താവിനേയോ മറ്റ് [[{{MediaWiki:Grouppage-sysop}}|കാര്യനിർവാഹകരെയോ]] സമീപിക്കാവുന്നതാണ്. [[Special:Preferences|താങ്കളുടെ ക്രമീകരണങ്ങളിൽ]] താങ്കൾ സാധുവായ ഇമെയിൽ വിലാസം കൊടുത്തിട്ടുണ്ടെങ്കിൽ, അതു അയക്കുന്നതിൽ നിന്നു താങ്കൾ തടയപ്പെട്ടിട്ടില്ലെങ്കിൽ, 'ഇദ്ദേഹത്തിന് ഇമെയിൽ അയക്കൂ' എന്ന സം‌വിധാനം ഉപയോഗിച്ച് താങ്കൾക്ക് മറ്റുപയോക്താക്കളുമായി ബന്ധപ്പെടാം. താങ്കളുടെ നിലവിലുള്ള ഐ.പി. വിലാസം $3 ഉം, താങ്കളുടെ തടയൽ ഐ.ഡി. #$5 ഉം ആണ്. ഇവ രണ്ടും താങ്കൾ കാര്യനിർവാഹകനെ ബന്ധപ്പെടുമ്പോൾ ചേർക്കുക.",
        "autoblockedtext": "താങ്കളുടെ ഐ.പി. വിലാസം സ്വയം തടയപ്പെട്ടിരിക്കുന്നു, മറ്റൊരു ഉപയോക്താവ് ഉപയോഗിച്ച കാരണത്താൽ $1 എന്ന കാര്യനിർവാഹകനാണ് തടഞ്ഞുവെച്ചത്.\nഇതിനു കാരണമായി നൽകിയിട്ടുള്ളത്:\n\n:''$2''\n\n* തടയൽ തുടങ്ങിയത്: $8\n* തടയൽ അവസാനിക്കുന്നത്: $6\n* തടയാൻ ഉദ്ദേശിച്ചത്: $7\n\nഈ തടയലിനെ കുറിച്ച് ചർച്ച ചെയ്യാൻ താങ്കൾക്കു $1 എന്ന കാര്യനിവാഹകനേയോ മറ്റു [[{{MediaWiki:Grouppage-sysop}}|കാര്യനിർവാഹകരെയോ]] ബന്ധപ്പെടാവുന്നതാണ്.\n\nശ്രദ്ധിക്കുക [[Special:Preferences|താങ്കളുടെ ക്രമീകരണങ്ങളിൽ]] സാധുവായ ഇമെയിൽ വിലാസം രേഖപ്പെടുത്താതിരിക്കുകയോ, അത് ഉപയോഗിക്കുന്നതിൽ നിന്ന് താങ്കളെ തടയുകയോ ചെയ്തിട്ടുണ്ടെങ്കിൽ \"ഇദ്ദേഹത്തിന് ഇമെയിൽ അയക്കൂ\" എന്ന സം‌വിധാനം പ്രവർത്തന രഹിതമായിരിക്കും.\n\nതാങ്കളുടെ നിലവിലുള്ള ഐ.പി. വിലാസം $3 ആണ്, താങ്കളുടെ തടയലിന്റെ ഐ.ഡി. #$5 ആകുന്നു.\nദയവായി മുകളിൽ കൊടുത്തിരിക്കുന്ന വിവരങ്ങളെല്ലാം താങ്കൾ നടത്തുന്ന അന്വേഷണങ്ങളിൽ ഉൾപ്പെടുത്തുവാൻ ശ്രദ്ധിക്കുക.",
+       "systemblockedtext": "താങ്കളുടെ ഉപയോക്തൃനാമം അല്ലെങ്കിൽ ഐ.പി. വിലാസം മീഡിയവിക്കി സ്വയം തടഞ്ഞിരിക്കുന്നു.\nതടയാനുള്ള കാരണം:\n\n:<em>$2</em>\n\n* തടയൽ തുടങ്ങിയത്: $8\n* തടയൽ കാലഹരണപ്പെടുന്നത്: $6\n* തടയാനുദ്ദേശിച്ചയാൾ: $7\n\nതാങ്കളുടെ നിലവിലെ ഐ.പി. വിലാസം $3 ആണ്.\nതാങ്കൾക്കെന്തെങ്കിലും ചോദ്യങ്ങളുണ്ടെങ്കിൽ മുകളിലെ എല്ലാ വിവരങ്ങളും ഉൾപ്പെടുത്തുക.",
        "blockednoreason": "കാരണമൊന്നും സൂചിപ്പിച്ചിട്ടില്ല",
        "whitelistedittext": "താളുകൾ തിരുത്താൻ താങ്കൾ $1 ചെയ്യേണ്ടതാണ്",
        "confirmedittext": "താളുകൾ തിരുത്തുന്നതിനു മുൻപ് താങ്കൾ താങ്കളുടെ ഇമെയിൽ വിലാസം സ്ഥിരീകരിക്കേണ്ടതാണ്‌. ഇമെയിൽ വിലാസം ക്രമപ്പെടുത്തി സാധുത പരിശോധിക്കാൻ [[Special:Preferences|എന്റെ ക്രമീകരണങ്ങൾ]] എന്ന സം‌വിധാനം ഉപയോഗിക്കുക.",
        "blocked-notice-logextract": "ഈ ഉപയോക്താവ് ഇപ്പോൾ തടയപ്പെട്ടിരിക്കുകയാണ്.\nതടയൽ രേഖയിലെ പുതിയ ഉൾപ്പെടുത്തൽ അവലംബമായി താഴെ നൽകിയിരിക്കുന്നു:",
        "clearyourcache": "<strong>ശ്രദ്ധിക്കുക:</strong> സേവ് ചെയ്തശേഷം മാറ്റങ്ങൾ കാണാനായി താങ്കൾക്ക് ബ്രൗസറിന്റെ കാഷെ ഒഴിവാക്കേണ്ടി വന്നേക്കാം.\n* <strong>ഫയർഫോക്സ് / സഫാരി:</strong>  <em>Reload</em> ബട്ടൺ അമർത്തുമ്പോൾ <em>Shift</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>Refresh</em> ബട്ടൺ അമർത്തുമ്പോൾ <em>Ctrl</em> കീ അമർത്തിപിടിക്കുക. അല്ലെങ്കിൽ <em>Ctrl-F5</em> അമർത്തുക\n* <strong>ഓപ്പറ:</strong>  <em>Menu → Settings</em> എടുക്കുക  (മാക്കിൽ <em>Opera → Preferences</em>) എന്നിട്ട് <em>Privacy & security → Clear browsing data → Cached images and files</em> ചെയ്യുക.",
        "usercssyoucanpreview": "'''വഴികാട്ടി:''' താങ്കളുടെ പുതിയ CSS സേവ് ചെയ്യുന്നതിനു മുമ്പ് \"{{int:showpreview}}\" എന്ന ബട്ടൻ ഉപയോഗിച്ച് പരിശോധിക്കുക.",
+       "userjsonyoucanpreview": "<strong>വഴികാട്ടി:</strong> താങ്കളുടെ പുതിയ JSON സേവ് ചെയ്യുന്നതിനു മുമ്പ് \"{{int:showpreview}}\" എന്ന ബട്ടൻ ഉപയോഗിച്ച് പരിശോധിക്കുക.",
        "userjsyoucanpreview": "'''വഴികാട്ടി:''' താങ്കളുടെ പുതിയ ജാവാസ്ക്രിപ്റ്റ് സേവ് ചെയ്യുന്നതിനു മുമ്പ് \"{{int:showpreview}}\" എന്ന ബട്ടൻ ഉപയോഗിച്ച് പരിശോധിക്കുക.",
        "usercsspreview": "'''താങ്കൾ താങ്കളുടെ സ്വന്തം സി.എസ്.എസ്. പ്രിവ്യൂ ചെയ്യുക മാത്രമേ ചെയ്യുന്നുള്ളൂ എന്ന കാര്യം ഓർമ്മിക്കുക.'''\n'''ഇതു സേവ് ചെയ്തിട്ടില്ല!'''",
+       "userjsonpreview": "<strong>താങ്കൾ താങ്കളുടെ സ്വന്തം JSON ക്രമീകരണങ്ങൾ പരീക്ഷിക്കുന്നു/പ്രിവ്യൂ ചെയ്യുക മാത്രമേ ചെയ്യുന്നുള്ളൂ എന്ന കാര്യം ഓർമ്മിക്കുക. ഇതു സേവ് ചെയ്തിട്ടില്ല!</strong>",
        "userjspreview": "'''താങ്കൾ താങ്കളുടെ സ്വന്തം ജാവസ്ക്രിപ്റ്റ് പ്രിവ്യൂ ചെയ്യുക മാത്രമേ ചെയ്യുന്നുള്ളൂ എന്ന കാര്യം ഓർമ്മിക്കുക. ഇതു സേവ് ചെയ്തിട്ടില്ല!'''",
        "sitecsspreview": "'''താങ്കൾ ഈ സി.എസ്.എസ്.ന്റെ പ്രിവ്യൂ കാണുക മാത്രമേ ചെയ്യുന്നുള്ളൂ എന്ന കാര്യം ഓർമ്മിക്കുക.'''\n'''ഇതു സേവ് ചെയ്തിട്ടില്ല!'''",
+       "sitejsonpreview": "<strong>താങ്കൾ ഈ JSON ക്രമീകരണത്തിന്റെ പ്രിവ്യൂ കാണുക മാത്രമേ ചെയ്യുന്നുള്ളൂ എന്ന കാര്യം ഓർമ്മിക്കുക. ഇതു സേവ് ചെയ്തിട്ടില്ല!</strong>",
        "sitejspreview": "'''താങ്കൾ ഈ ജാവസ്ക്രിപ്റ്റ് കോഡിന്റെ പ്രിവ്യൂ കാണുക മാത്രമേ ചെയ്യുന്നുള്ളൂ എന്ന കാര്യം ഓർമ്മിക്കുക.'''\n'''ഇതു സേവ് ചെയ്തിട്ടില്ല!'''",
        "userinvalidconfigtitle": "<strong>മുന്നറിയിപ്പ്:</strong> \"$1\" എന്ന പേരിൽ ഒരു ദൃശ്യരൂപം ഇല്ല. ഐച്ഛികാനുസരണമുള്ള .css, .json, .js താളുകൾ ഇംഗ്ലീഷ് ചെറിയക്ഷര തലക്കെട്ട് ആണ്‌ ഉപയോഗിക്കുന്നതെന്നോർക്കുക. ഉദാ: {{ns:user}}:Foo/Vector.css എന്നതിനു പകരം {{ns:user}}:Foo/vector.css എന്നാണു ഉപയോഗിക്കേണ്ടത്.",
        "updated": "(പുതുക്കിയിരിക്കുന്നു)",
        "yourtext": "താങ്കൾ എഴുതി ചേർത്തത്",
        "storedversion": "മുമ്പേയുള്ള നാൾപതിപ്പ്",
        "editingold": "'''മുന്നറിയിപ്പ്: താങ്കൾ ഈ താളിന്റെ ഒരു പഴയ പതിപ്പാണ്‌ തിരുത്തുന്നത്. ഇപ്പോൾ താങ്കൾ വരുത്തിയ മാറ്റങ്ങൾ സേവ് ചെയ്താൽ ഈ പതിപ്പിനു ശേഷം വന്ന മാറ്റങ്ങളെല്ലാം നഷ്ടമാകും.'''",
+       "unicode-support-fail": "താങ്കളുടെ ബ്രൗസർ യൂണീകോഡ് പിന്തുണയ്ക്കുന്നില്ലെന്ന് കാണുന്നു. താളുകൾ തിരുത്താൻ അതാവശ്യമാണ്, അതുകൊണ്ട് താങ്കളുടെ തിരുത്ത് സേവ് ചെയ്തില്ല.",
        "yourdiff": "വ്യത്യാസങ്ങൾ",
        "copyrightwarning": "{{SITENAME}} സംരംഭത്തിൽ എഴുതപ്പെടുന്ന ലേഖനങ്ങളെല്ലാം $2 പ്രകാരം സ്വതന്ത്രമാണ് (വിശദാംശങ്ങൾക്ക് $1 കാണുക). താങ്കൾ എഴുതുന്ന ലേഖനം തിരുത്തപ്പെടുന്നതിലോ ഒഴിവാക്കപ്പെടുന്നതിലോ എതിർപ്പുണ്ടെങ്കിൽ ദയവായി ലേഖനമെഴുതാതിരിക്കുക.\n\nഈ ലേഖനം താങ്കൾത്തന്നെ എഴുതിയതാണെന്നും അതല്ലെങ്കിൽ പകർപ്പവകാശനിയമങ്ങളുടെ പരിധിയിലില്ലാത്ത ഉറവിടങ്ങളിൽനിന്ന് പകർത്തിയതാണെന്നും ഉറപ്പാക്കുക.\n\n'''പകർപ്പവകാശ സംരക്ഷണമുള്ള സൃഷ്ടികൾ ഒരു കാരണവശാലും ഇവിടെ പ്രസിദ്ധീകരിക്കരുത്.'''",
        "copyrightwarning2": "{{SITENAME}} സംരംഭത്തിൽ താങ്കൾ എഴുതി ചേർക്കുന്നതെല്ലാം മറ്റുപയോക്താക്കൾ തിരുത്തുകയോ, മാറ്റം വരുത്തുകയോ, ഒഴിവാക്കുകയോ ചെയ്തേക്കാം. താങ്കൾ എഴുതി ചേർക്കുന്നതു മറ്റ് ഉപയോക്താക്കൾ തിരുത്തുന്നതിലോ ഒഴിവാക്കുന്നതിലോ താങ്കൾക്ക് എതിർപ്പുണ്ടെങ്കിൽ ദയവായി ലേഖനമെഴുതാതിരിക്കുക.\nഇതു താങ്കൾത്തന്നെ എഴുതിയതാണെന്നും, അതല്ലെങ്കിൽ പകർപ്പവകാശ നിയമങ്ങളുടെ പരിധിയിലില്ലാത്ത ഉറവിടങ്ങളിൽനിന്നും പകർത്തിയതാണെന്നും ഉറപ്പാക്കുക (കുടുതൽ വിവരത്തിനു $1 കാണുക).\n'''പകർപ്പവകാശ സംരക്ഷണമുള്ള സൃഷ്ടികൾ ഒരു കാരണവശാലും ഇവിടെ പ്രസിദ്ധീകരിക്കരുത്!'''",
        "longpageerror": "'''പിഴവ്: താങ്കൾ സമർപ്പിച്ച എഴുത്തുകൾക്ക് {{PLURAL:$1|ഒരു കിലോബൈറ്റ്|$1 കിലോബൈറ്റ്സ്}} വലിപ്പമുണ്ട്. പരമാവധി അനുവദനീയമായ വലിപ്പം {{PLURAL:$2|ഒരു കിലോബൈറ്റ്|$2 കിലോബൈറ്റ്സ്}} ആണ്‌. അതിനാലിതു സേവ് ചെയ്യാൻ സാദ്ധ്യമല്ല.'''",
        "readonlywarning": "<strong>മുന്നറിയിപ്പ്: ഡേറ്റാബേസ് പരിപാലനത്തിനു വേണ്ടി ബന്ധിച്ചിരിക്കുന്നു, അതുകൊണ്ട് താങ്കളിപ്പോൾ വരുത്തിയ മാറ്റങ്ങൾ സേവ് ചെയ്യാൻ സാദ്ധ്യമല്ല.</strong>\nതാങ്കൾ വരുത്തിയ മാറ്റങ്ങൾ ഒരു ടെക്സ്റ്റ് ഫയലിലേക്ക് പകർത്തി (കോപ്പി & പേസ്റ്റ്)  പിന്നീടുപയോഗിക്കുന്നതിനായി കരുതിവക്കാൻ താല്പര്യപ്പെടുന്നു. \n\nഡേറ്റാബേസ് ബന്ധിച്ച സിസ്റ്റം അഡ്മിനിസ്ട്രേറ്റർ നൽകിയ വിശദീകരണം: $1",
        "protectedpagewarning": "'''മുന്നറിയിപ്പ്:  ഈ താൾ കാര്യനിർവാഹക പദവിയുള്ളവർക്കു മാത്രം തിരുത്താൻ സാധിക്കാവുന്ന തരത്തിൽ സം‌രക്ഷിക്കപ്പെട്ടിരിക്കുന്നു.''' അവലംബമായി രേഖകളിൽ ലഭ്യമായ ഏറ്റവും പുതിയ വിവരം താഴെ നൽകിയിരിക്കുന്നു:",
-       "semiprotectedpagewarning": "'''ശ്രദ്ധിക്കുക:'''അംഗത്വമെടുത്തിട്ടുള്ളവർക്കുമാത്രം തിരുത്താൻ സാധിക്കുന്ന വിധത്തിൽ ഈ താൾ സംരക്ഷിക്കപ്പെട്ടിരിക്കുന്നു. അവലംബമായി രേഖകളിലെ ഏറ്റവും പുതിയ വിവരം താഴെ കൊടുത്തിരിക്കുന്നു:",
+       "semiprotectedpagewarning": "<strong>ശ്രദ്ധിക്കുക:</strong> സ്വയംസ്ഥിരീകൃത ഉപയോക്താക്കൾക് മാത്രം തിരുത്താൻ സാധിക്കുന്ന വിധത്തിൽ ഈ താൾ സംരക്ഷിക്കപ്പെട്ടിരിക്കുന്നു. അവലംബമായി രേഖകളിലെ ഏറ്റവും പുതിയ വിവരം താഴെ കൊടുത്തിരിക്കുന്നു:",
        "cascadeprotectedwarning": "<strong>മുന്നറിയിപ്പ്:</strong> ഈ താൾ [[Special:ListGroupRights|പ്രത്യേക അവകാശമുള്ളവർക്കു]] മാത്രം തിരുത്തുവാൻ സാധിക്കുന്ന വിധത്തിൽ സം‌രക്ഷിക്കപ്പെട്ടിട്ടുള്ളതാണ്‌. ഇനിക്കൊടുക്കുന്ന {{PLURAL:$1|താൾ|താളുകൾ}} നിർഝരിത(cascade) സം‌രക്ഷണം ചെയ്തപ്പോൾ അതിന്റെ ഭാഗമായി സംരക്ഷിക്കപ്പെട്ടിട്ടുള്ളതാണ്‌ ഈ താൾ:",
        "titleprotectedwarning": "'''മുന്നറിയിപ്പ്: [[Special:ListGroupRights|പ്രത്യേക അവകാശമുള്ള]] ഉപയോക്താക്കൾക്ക് മാത്രം സൃഷ്ടിക്കാൻ സാധിക്കുന്ന വിധത്തിൽ ഈ താൾ സംരക്ഷിക്കപ്പെട്ടിരിക്കുന്നു.''' അവലംബമായി രേഖകളിൽ ലഭ്യമായ ഏറ്റവും പുതിയ വിവരം താഴെ നൽകിയിരിക്കുന്നു:",
        "templatesused": "ഈ താളിൽ ഉപയോഗിച്ചിരിക്കുന്ന {{PLURAL:$1|ഫലകം|ഫലകങ്ങൾ}}:",
        "rcfilters-filter-humans-label": "മനുഷ്യൻ (ബോട്ട് അല്ല)",
        "rcfilters-filter-humans-description": "മനുഷ്യലേഖകർ ചെയ്ത തിരുത്തുകൾ",
        "rcfilters-filtergroup-reviewstatus": "സംശോധന സ്ഥിതി",
-       "rcfilters-filter-patrolled-label": "റോന്ത് ചുറ്റപ്പെട്ടത്",
-       "rcfilters-filter-patrolled-description": "റോന്ത് ചുറ്റപ്പെട്ടത് എന്നടയാളപ്പെടുത്തിയ മാറ്റങ്ങൾ",
-       "rcfilters-filter-unpatrolled-label": "റോന്ത് ചുറ്റപ്പെടാത്തവ",
-       "rcfilters-filter-unpatrolled-description": "റോന്ത് ചുറ്റപ്പെട്ടത് എന്നടയാളപ്പെടുത്താത്ത മാറ്റങ്ങൾ",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "റോന്ത് ചുറ്റപ്പെടാത്തവ",
        "rcfilters-filtergroup-significance": "പ്രാധാന്യം",
        "rcfilters-filter-minor-label": "ചെറുതിരുത്തുകൾ",
        "rcfilters-filter-minor-description": "ലേഖകൻ ചെറുതെന്ന് അടയാളപ്പെടുത്തിയ തിരുത്തുകൾ.",
        "rcfilters-preference-help": "സമ്പർക്കമുഖത്തിൽ 2017-ൽ വരുത്തിയ രൂപകല്പനാമാറ്റങ്ങളും, അതോടൊപ്പവും പിന്നീടും ചേർത്ത എല്ലാ ഉപകരണങ്ങളും ഒഴിവാക്കുക.",
        "rcfilters-filter-showlinkedfrom-label": "കണ്ണി ചേർക്കപ്പെട്ട താളുകളിലെ മാറ്റങ്ങൾ കാണിക്കുക",
        "rcfilters-filter-showlinkedfrom-option-label": "തിരഞ്ഞെടുത്ത താളിൽ <strong>കണ്ണി ചേർക്കപ്പെട്ട താളുകൾ</strong>",
+       "rcfilters-target-page-placeholder": "താളിന്റെ (അല്ലെങ്കിൽ വർഗ്ഗത്തിന്റെ) പേര് നൽകുക",
        "rcnotefrom": "<strong>$3, $4</strong> മുതലുള്ള {{PLURAL:$5|മാറ്റം|മാറ്റങ്ങൾ}} ആണ് താഴെയുള്ളത്  (<strong>$1</strong> എണ്ണം വരെ കൊടുക്കുന്നതാണ്).",
        "rclistfromreset": "തീയതി എടുത്തത് പുനഃസജ്ജീകരിക്കുക",
        "rclistfrom": "$3 $2 മുതലുള്ള മാറ്റങ്ങൾ പ്രദർശിപ്പിക്കുക",
        "uploadbtn": "പ്രമാണം അപ്‌ലോഡ് ചെയ്യുക",
        "reuploaddesc": "വീണ്ടും അപ്‌ലോഡ് ചെയ്ത് നോക്കാനായി തിരിച്ചു പോവുക.",
        "upload-tryagain": "പുതുക്കിയ പ്രമാണ വിവരണങ്ങൾ സമർപ്പിക്കുക",
+       "upload-tryagain-nostash": "പുനർ അപ്‌ലോഡ് ചെയ്യുന്ന പ്രമാണവും പുതുക്കിയ വിവരണവും സമർപ്പിക്കുക",
        "uploadnologin": "ലോഗിൻ ചെയ്തിട്ടില്ല",
        "uploadnologintext": "പ്രമാണങ്ങൾ അപ്‌ലോഡ് ചെയ്യുന്നതിനു മുമ്പ്, താങ്കൾ $1.",
        "upload_directory_missing": "അപ്‌‌ലോഡ് ഡയറക്ടറി ($1) ലഭ്യമല്ല, അത് സൃഷ്ടിക്കാൻ വെബ്‌‌സെർവറിനു സാധിക്കില്ല.",
        "file-thumbnail-no": "പ്രമാണത്തിന്റെ പേര്‌  <strong>$1</strong> എന്നാണ്‌ തുടങ്ങുന്നത്.\nഇതു വലിപ്പം കുറച്ച ഒരു ചിത്രം ''(ലഘുചിത്രം)'' ആണെന്നു കാണുന്നു.\nപൂർണ്ണ റെസലൂഷൻ ഉള്ള ചിത്രം ഉണ്ടെങ്കിൽ അതു അപ്‌ലോഡ് ചെയ്യുവാൻ താല്പര്യപ്പെടുന്നു, അല്ലെങ്കിൽ പ്രമാണത്തിന്റെ പേരു മാറ്റുവാൻ അഭ്യർത്ഥിക്കുന്നു.",
        "fileexists-forbidden": "ഈ പേരിൽ ഒരു പ്രമാണം നിലവിലുണ്ട്, അതു മാറ്റി സൃഷ്ടിക്കുക സാദ്ധ്യമല്ല.\nതാങ്കൾക്ക് ഈ ചിത്രം അപ്‌ലോഡ് ചെയ്തേ മതിയാവുയെങ്കിൽ, ദയവു ചെയ്തു വേറൊരു പേരിൽ ഈ പ്രമാണം അപ്‌ലോഡ് ചെയ്യുക. [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "ഈ പേരിൽ ഒരു പ്രമാണം പങ്ക് വെയ്ക്കപ്പെട്ടുപയോഗിക്കുന്ന ശേഖരത്തിലുണ്ട്. താങ്കൾക്ക് ഈ പ്രമാണം അപ്‌ലോഡ് ചെയ്തേ മതിയാവുയെങ്കിൽ, ദയവായി തിരിച്ചു പോയി പുതിയ ഒരു പേരിൽ ഈ പ്രമാണം അപ്‌ലോഡ് ചെയ്യുക.[[File:$1|thumb|center|$1]]",
+       "fileexists-no-change": "അപ്‌ലോഡ് നിലവിലുള്ള <strong>[[:$1]]</strong> പതിപ്പിന്റെ തനിപ്പകർപ്പാണ്.",
+       "fileexists-duplicate-version": "അപ്‌ലോഡ് പഴയ <strong>[[:$1]]</strong> പ്രമാണത്തിന്റെ {{PLURAL:$2|ഒരു പതിപ്പിന്റെ|പഴയ പതിപ്പുകളുടെ}} തനിപ്പകർപ്പാണ്.",
        "file-exists-duplicate": "ഈ പ്രമാണം ഇനി പറയുന്ന {{PLURAL:$1|പ്രമാണത്തിന്റെ|പ്രമാണങ്ങളുടെ}} പകർപ്പാണ്‌:",
        "file-deleted-duplicate": "ഈ പ്രമാണത്തിനു സദൃശമായ പ്രമാണം ([[:$1]]) മുമ്പ് മായ്ക്കപ്പെട്ടിട്ടുണ്ട്.\nആ പ്രമാണത്തിന്റെ മായ്ക്കൽ ചരിത്രം എടുത്തു പരിശോധിച്ച ശേഷം മാത്രം വീണ്ടും അപ്‌‌ലോഡ് ചെയ്യുക.",
        "file-deleted-duplicate-notitle": "ഈ പ്രമാണത്തിന് സദൃശമായ ഒന്ന് മുമ്പ് മായ്ക്കപ്പെട്ടിട്ടുണ്ട്, ആ തലക്കെട്ടിന്റെ ഉപയോഗം ഒതുക്കിയിരിക്കുന്നു.\nപുനർ-അപ്‌ലോഡിങ് ചെയ്യുന്നതിനു മുമ്പ് ഒതുക്കപ്പെട്ട പ്രമാണവിവരങ്ങൾ സംശോധനം ചെയ്ത് സാഹചര്യം വിശകലനം ചെയ്യാൻ അനുമതിയുള്ള ആരെയെങ്കിലും സമീപിച്ച് പ്രവൃത്തി ഉറപ്പാക്കുക.",
        "emailccsubject": "$1 എന്ന ഉപയോക്താവിനയച്ച സന്ദേശത്തിന്റെ പകർപ്പ്: $2",
        "emailsent": "ഇമെയിൽ അയച്ചിരിക്കുന്നു",
        "emailsenttext": "താങ്കളുടെ ഇമെയിൽ അയച്ചു കഴിഞ്ഞിരിക്കുന്നു.",
-       "emailuserfooter": "ഈ ഇമെയിൽ, {{SITENAME}} സംരംഭത്തിലെ \"{{int:emailuser}}\" എന്ന സൗകര്യം ഉപയോഗിച്ച്, $1 എന്ന ഉപയോക്താവ് {{GENDER:$2|$2}} എന്ന ഉപയോക്താവിന് {{GENDER:$1|അയച്ചതാണ്}}.",
+       "emailuserfooter": "ഈ ഇമെയിൽ, {{SITENAME}} സംരംഭത്തിലെ \"{{int:emailuser}}\" എന്ന സൗകര്യം ഉപയോഗിച്ച്, $1 എന്ന ഉപയോക്താവ് {{GENDER:$2|$2}} എന്ന ഉപയോക്താവിന് {{GENDER:$1|അയച്ചതാണ്}}. {{GENDER:$2|താങ്കൾ}} ഈ ഇമെയിലിനു മറുപടി അയയ്ക്കുകയാണെങ്കിൽ, {{GENDER:$2|താങ്കളുടെ}} ഇമെയിൽ {{GENDER:$1|ആദ്യം അയച്ചയാൾക്ക്}} നേരിട്ടാവും ചെല്ലുക, {{GENDER:$2|താങ്കളുടെ}} ഇമെയിൽ വിലാസം അപ്പോൾ {{GENDER:$1|അവർക്ക്}} വെളിപ്പെടുന്നതാണ്.",
        "usermessage-summary": "വ്യവസ്ഥാസന്ദേശം ഉപേക്ഷിക്കുക.",
        "usermessage-editor": "വ്യവസ്ഥാസന്ദേശകൻ",
        "watchlist": "ശ്രദ്ധിക്കുന്നവ",
        "fix-double-redirects": "പഴയ തലക്കെട്ടിലേക്കുള്ള തിരിച്ചുവിടൽ താളുകളും ഇതോടൊപ്പം പുതുക്കുക",
        "move-leave-redirect": "പിന്നിൽ ഒരു തിരിച്ചുവിടൽ നിലനിർത്തുക",
        "protectedpagemovewarning": "'''മുന്നറിയിപ്പ്:'''  കാര്യനിർവാഹക പദവിയുള്ളവർക്കു മാത്രം മാറ്റാൻ കഴിയുന്ന വിധത്തിൽ ഈ താൾ സംരക്ഷിക്കപ്പെട്ടിരിക്കുന്നു. അവലംബമായി രേഖകളിലെ ഏറ്റവും പുതിയ വിവരം താഴെ നൽകിയിരിക്കുന്നു:",
-       "semiprotectedpagemovewarning": "'''കുറിപ്പ്:''' അംഗത്വമെടുത്ത ഉപയോക്താക്കൾക്കു മാത്രം മാറ്റാൻ കഴിയുന്ന വിധത്തിൽ ഈ താൾ സംരക്ഷിക്കപ്പെട്ടിരിക്കുന്നു. അവലംബമായി രേഖകളിലെ ഏറ്റവും പുതിയ വിവരം താഴെ കൊടുത്തിരിക്കുന്നു:",
+       "semiprotectedpagemovewarning": "<strong>ശ്രദ്ധിക്കുക:</strong> സ്വയംസ്ഥിരീകൃത ഉപയോക്താക്കൾക് മാത്രം മാറ്റാൻ സാധിക്കുന്ന വിധത്തിൽ ഈ താൾ സംരക്ഷിക്കപ്പെട്ടിരിക്കുന്നു.\nഅവലംബമായി രേഖകളിലെ ഏറ്റവും പുതിയ വിവരം താഴെ കൊടുത്തിരിക്കുന്നു:",
        "move-over-sharedrepo": "പങ്ക് ‌‌വെച്ചുപയോഗിക്കുന്ന ശേഖരണിയൊന്നിൽ [[:$1]] നിലനിൽക്കുന്നു. ഈ തലക്കെട്ടിലേയ്ക്ക് ഒരു പ്രമാണത്തെ മാറ്റുന്നത് പങ്ക് വെച്ചുപയോഗിക്കുന്ന പ്രമാണത്തെ അതിലംഘിക്കുന്നതാണ്.",
        "file-exists-sharedrepo": "താങ്കൾ തിരഞ്ഞെടുത്ത പ്രമാണ നാമം പങ്ക് വെയ്ക്കപ്പെട്ടുപയോഗിക്കുന്ന റെപ്പോസിറ്ററിയിൽ ഉപയോഗിക്കുന്നു.\nദയവായി മറ്റൊരു നാമം സ്വീകരിക്കുക.",
        "export": "താളുകൾ കയറ്റുമതി ചെയ്യുക",
        "specialpage-securitylevel-not-allowed-title": "അനുവദിച്ചിട്ടില്ല",
        "cannotauth-not-allowed-title": "അനുമതി നിഷേധിച്ചിരിക്കുന്നു",
        "cannotauth-not-allowed": "ഈ താൾ ഉപയോഗിക്കാൻ താങ്കൾക്ക് അനുവാദമില്ല",
+       "credentialsform-account": "അംഗത്വ നാമം:",
+       "restrictionsfield-badip": "അസാധുവായ ഐ.പി. വിലാസം അല്ലെങ്കിൽ പരിധി:$1",
+       "restrictionsfield-label": "അനുവദിച്ചിട്ടുള്ള ഐ.പി. പരിധികൾ:",
        "edit-error-short": "പിഴവ്: $1",
        "edit-error-long": "പിഴവുകൾ:\n\n$1",
        "revid": "നാൾപ്പതിപ്പ് $1",
        "rawhtml-notallowed": "&lt;html&gt; ടാഗുകൾ സാധാരണ താളുകൾക്ക്പുറത്ത് ഉപയോഗിക്കാനാകില്ല.",
        "gotointerwiki": "{{SITENAME}} സംരംഭത്തിൽ നിന്നും പോകുകയാണ്",
        "gotointerwiki-invalid": "നൽകിയിരിക്കുന്ന തലക്കെട്ട് അസാധുവാണ്.",
+       "gotointerwiki-external": "വേറൊരു വെബ്‌സൈറ്റ് ആയ [[$2]] സന്ദർശിക്കാനായി താങ്കൾ {{SITENAME}} സംരംഭത്തിൽ നിന്നും പുറത്ത് പോവുകയാണ്.\n\n'''[$1 $1 സൈറ്റിലേക്ക് പോവുക]'''",
+       "undelete-cantedit": "താങ്കൾക്ക് ഈ താൾ തിരുത്താൻ അനുമതി ഇല്ലാത്തതിനാൽ ഈ താൾ താങ്കൾക്ക് പുനഃസ്ഥാപിക്കാനാവില്ല.",
        "pagedata-title": "താൾ വിവരങ്ങൾ",
+       "pagedata-not-acceptable": "ഒത്തുപോവുന്ന ഫോർമാറ്റ് കണ്ടെത്താനായില്ല. പിന്തുണയുള്ള മൈം തരങ്ങൾ: $1",
        "pagedata-bad-title": "അസാധുവായ തലക്കെട്ട്: $1."
 }
index ad211e7..c4d5868 100644 (file)
        "rcfilters-filter-humans-label": "मानव (सांगकाम्या नाही)",
        "rcfilters-filter-humans-description": "मानवी संपादकांनी केलेली संपादने.",
        "rcfilters-filtergroup-reviewstatus": "पुनरावलोकन स्थिती",
-       "rcfilters-filter-patrolled-label": "पहारा दिला",
-       "rcfilters-filter-patrolled-description": "पहारा दिला म्हणून खूण केलेली संपादने,",
-       "rcfilters-filter-unpatrolled-label": "पहारा दिला नाही",
-       "rcfilters-filter-unpatrolled-description": "पहारा दिला म्हणून खूण न-केलेली संपादने",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "पहारा दिला नाही",
        "rcfilters-filtergroup-significance": "लक्षणीयता",
        "rcfilters-filter-minor-label": "किरकोळ संपादने",
        "rcfilters-filter-minor-description": "लेखकाने 'किरकोळ' अशी खूण केलेली संपादने",
index 5f3334a..ef045b2 100644 (file)
        "datedefault": "မရွေးချယ်",
        "prefs-user-pages": "အသုံးပြုသူ စာမျက်နှာများ",
        "prefs-personal": "အသုံးပြုသူ ပရိုဖိုင်",
-       "prefs-rc": "လတ်​တ​လောအ​ပြောင်း​အ​လဲ​",
+       "prefs-rc": "လတ်​တ​လော အ​ပြောင်း​အ​လဲ​များ",
        "prefs-watchlist": "စောင့်ကြည့်စာရင်း",
        "prefs-editwatchlist": "စောင့်ကြည့်စာရင်းကို တည်းဖြတ်ရန်",
        "prefs-editwatchlist-edit": "သင့်စောင့်ကြည့်စာရင်းရှိ ခေါင်းစဉ်များအား ကြည့်ရှုပြီး ဖယ်ရှားရန်",
        "rcfilters-filter-humans-label": "လူ (ဘော့မဟုတ်)",
        "rcfilters-filter-humans-description": "လူတည်းဖြတ်သူများ၏ တည်းဖြတ်မှုများ။",
        "rcfilters-filtergroup-reviewstatus": "အခြေအနေ သုံးသပ်ရန်",
-       "rcfilters-filter-patrolled-label": "စောင့်ကြပ်စစ်ဆေးပြီး",
-       "rcfilters-filter-patrolled-description": "စောင့်ကြပ်စစ်ဆေးပြီးကြောင်း မှတ်သားထားသည့် တည်းဖြတ်မှုများ။",
-       "rcfilters-filter-unpatrolled-label": "မစောင့်ကြည့်မစစ်ဆေးရသေး",
-       "rcfilters-filter-unpatrolled-description": "စောင့်ကြည့်စစ်ဆေးပြီးကြောင်း မမှတ်သားရသေးသည့် တည်းဖြတ်မှုများ။",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "မစောင့်ကြည့်မစစ်ဆေးရသေး",
        "rcfilters-filter-minor-label": "အရေးမကြီးသည့် တည်းဖြတ်မှုများ",
        "rcfilters-filter-minor-description": "အရေးမကြီးဟု မှတ်သားလိုက်သော တည်းဖြတ်မှုများ။",
        "rcfilters-filter-major-label": "အရေးမကြီး မဟုတ်သော တည်းဖြတ်မှုများ",
index a4cb141..f7b7750 100644 (file)
        "rcfilters-filter-humans-label": "Menneske (ikke bot)",
        "rcfilters-filter-humans-description": "Redigeringer gjort av menneskelige brukere.",
        "rcfilters-filtergroup-reviewstatus": "Gjennomgangsstatus",
-       "rcfilters-filter-patrolled-label": "Patruljert",
-       "rcfilters-filter-patrolled-description": "Redigeringer merket som patruljert.",
-       "rcfilters-filter-unpatrolled-label": "Upatruljert",
-       "rcfilters-filter-unpatrolled-description": "Redigeringer som ikke er merket som patruljert.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Upatruljert",
        "rcfilters-filtergroup-significance": "Betydning",
        "rcfilters-filter-minor-label": "Mindre endringer",
        "rcfilters-filter-minor-description": "Redigeringer merket som mindre av brukeren.",
index 4aa51ac..d219080 100644 (file)
        "rcfilters-filter-humans-label": "Meanskelik (gyn bot)",
        "rcfilters-filter-humans-description": "Bewarkingen döär meanskelike bewarkers.",
        "rcfilters-filtergroup-reviewstatus": "Beoordelingsstaotus",
-       "rcfilters-filter-patrolled-label": "Nao-ekeken",
-       "rcfilters-filter-unpatrolled-label": "Niet nao-ekeken",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Niet nao-ekeken",
        "rcfilters-filtergroup-significance": "Petansie",
        "rcfilters-filter-minor-label": "Kleyne bewarkingen",
        "rcfilters-filter-major-label": "Gyn kleyne bewarking",
index 36fdc54..321a9be 100644 (file)
        "rcfilters-filter-humans-label": "Menselijk (geen bot)",
        "rcfilters-filter-humans-description": "Bewerkingen door menselijke bewerkers.",
        "rcfilters-filtergroup-reviewstatus": "Beoordelingsstatus",
-       "rcfilters-filter-patrolled-label": "Gecontroleerd",
-       "rcfilters-filter-patrolled-description": "Bewerkingen gemarkeerd als gecontroleerd.",
-       "rcfilters-filter-unpatrolled-label": "Niet gecontroleerd",
-       "rcfilters-filter-unpatrolled-description": "Bewerkingen die niet zijn gemarkeerd als gecontroleerd.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Niet gecontroleerd",
        "rcfilters-filtergroup-significance": "Belangrijkheid",
        "rcfilters-filter-minor-label": "Kleine bewerkingen",
        "rcfilters-filter-minor-description": "Bewerkingen die door de bewerker zijn gelabeld als klein.",
        "tags-create-invalid-chars": "Labelnamen mogen geen komma's (<code>,</code>), sluistekens (<code>|</code>), of slashes (<code>/</code>) bevatten.",
        "tags-create-invalid-title-chars": "Labelnamen mogen geen tekens bevatten die niet gebruikt kunnen worden in paginanamen.",
        "tags-create-already-exists": "Het label \"$1\" bestaat al.",
-       "tags-create-warnings-above": "De volgende {{PLURAL:$2|waarschuwing is|waarschuwningen zijn}} opgetreden tijdens het aanmaken van het label \"$1\":",
+       "tags-create-warnings-above": "De volgende {{PLURAL:$2|waarschuwing is|waarschuwingen zijn}} opgetreden tijdens het aanmaken van het label \"$1\":",
        "tags-create-warnings-below": "Wilt u doorgaan met het aanmaken van het label?",
        "tags-delete-title": "Label verwijderen",
        "tags-delete-explanation-initial": "U bent het label \"$1\" aan het verwijderen uit de database.",
index 48a9efc..e0475b8 100644 (file)
        "rcfilters-filter-bots-description": "Endringar gjorde med automatiske verktøy.",
        "rcfilters-filter-humans-label": "Menneske (ikkje robot)",
        "rcfilters-filter-humans-description": "Endringar gjorde av menneske.",
-       "rcfilters-filter-patrolled-description": "Endringar merkte som patruljerte.",
-       "rcfilters-filter-unpatrolled-description": "Endringar ikkje merkte som patruljerte.",
        "rcfilters-filtergroup-significance": "Vekt",
        "rcfilters-filter-minor-label": "Småplukk",
        "rcfilters-filter-minor-description": "Endringar merkte som småplukk av forfattaren.",
index 60d85dc..344f53e 100644 (file)
        "rcfilters-filter-bots-label": "Robòt",
        "rcfilters-filter-humans-label": "Èsser uman (pas robòt)",
        "rcfilters-filter-humans-description": "Modificacions faitas per d'editors umans.",
-       "rcfilters-filter-patrolled-label": "Patrolhat",
-       "rcfilters-filter-unpatrolled-label": "Pas patrolhat",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Pas patrolhat",
        "rcfilters-filtergroup-significance": "Significacion",
        "rcfilters-filter-minor-label": "Cambiaments menors",
        "rcfilters-filter-minor-description": "Modificacions que l'autor a marcadas coma menoras.",
index ac44326..4eee09a 100644 (file)
        "rcfilters-filter-humans-label": "Człowiek (nie bot)",
        "rcfilters-filter-humans-description": "Zmiany wprowadzone przez ludzi.",
        "rcfilters-filtergroup-reviewstatus": "Status przejrzenia",
-       "rcfilters-filter-patrolled-label": "Sprawdzone",
-       "rcfilters-filter-patrolled-description": "Edycje oznaczone jako sprawdzone.",
-       "rcfilters-filter-unpatrolled-label": "Niesprawdzone",
-       "rcfilters-filter-unpatrolled-description": "Edycje nie oznaczone jako sprawdzone.",
+       "rcfilters-filter-reviewstatus-unpatrolled-description": "Edycje, które nie zostały oznaczone jako „sprawdzone” automatycznie lub ręcznie.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Niesprawdzone",
+       "rcfilters-filter-reviewstatus-manual-description": "Edycje ręcznie oznaczone jako „sprawdzone”.",
+       "rcfilters-filter-reviewstatus-manual-label": "Ręcznie oznaczone jako „sprawdzone”",
+       "rcfilters-filter-reviewstatus-auto-description": "Edycje wykonane przez zaawansowanych użytkowników, których edycje automatycznie oznaczane są jako „sprawdzone”.",
+       "rcfilters-filter-reviewstatus-auto-label": "Automatycznie oznaczone jako „sprawdzone”",
        "rcfilters-filtergroup-significance": "Znaczenie",
        "rcfilters-filter-minor-label": "Drobne zmiany",
        "rcfilters-filter-minor-description": "Zmiany, które autor oznaczył jako drobne.",
        "version-specialpages": "Strony specjalne",
        "version-parserhooks": "Haki analizatora składni (ang. parser hooks)",
        "version-variables": "Zmienne",
+       "version-editors": "Edytorzy",
        "version-antispam": "Ochrona przed spamem",
        "version-other": "Pozostałe",
        "version-mediahandlers": "Wtyczki obsługi mediów",
index e31095a..eac5ab0 100644 (file)
        "rcfilters-filter-humans-label": "انسان (نه بوټ)",
        "rcfilters-filter-humans-description": "سمونې چي د انساني سمونوالو لخوا جوړې شوي دي.",
        "rcfilters-filtergroup-reviewstatus": "د بیاکتنې حالت",
-       "rcfilters-filter-patrolled-label": "ګزمې شوی",
-       "rcfilters-filter-patrolled-description": "سمونې چي د ګزمې په توګه په نښه شوي دي.",
-       "rcfilters-filter-unpatrolled-label": "بي ګزمې شوي",
-       "rcfilters-filter-unpatrolled-description": "سمونې چي د ګزمې په توګه نه دي په نښه شوي.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "بي ګزمې شوي",
        "rcfilters-filtergroup-significance": "ارزښت",
        "rcfilters-filter-minor-label": "وړوکي سمونونه",
        "rcfilters-filtergroup-watchlist": "د کتنلړ مخونه",
index 0a53775..b47d245 100644 (file)
        "tog-watchlisthideminor": "Ocultar edições menores da lista de páginas vigiadas",
        "tog-watchlisthideliu": "Ocultar edições de usuários autenticados da lista de páginas vigiadas",
        "tog-watchlistreloadautomatically": "Recarregar a lista de páginas vigiadas automaticamente sempre que um filtro for alterado (requer JavaScript)",
-       "tog-watchlistunwatchlinks": "Adicionar hiperligações diretas para vigiar ou deixar de vigiar as entradas na lista de páginas vigiadas (é necessário o JavaScript para alternar entre ambas)",
+       "tog-watchlistunwatchlinks": "Adicionar marcadores ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) para deixar de vigiar ou voltar a vigiar as páginas vigiadas que foram modificadas (é necessário o JavaScript para alternar entre ambas)",
        "tog-watchlisthideanons": "Ocultar edições de usuários anônimos da lista de páginas vigiadas",
        "tog-watchlisthidepatrolled": "Ocultar edições patrulhadas da lista de páginas vigiadas",
        "tog-watchlisthidecategorization": "Ocultar a categorização das páginas",
        "password-login-forbidden": "O uso deste nome de usuário e senha foi desautorizado.",
        "mailmypassword": "Redefinir senha",
        "passwordremindertitle": "Nova senha temporária em {{SITENAME}}",
-       "passwordremindertext": "Alguém (provavelmente você, a partir do endereço de IP $1) solicitou uma nova senha para {{SITENAME}} ($4). Foi criada uma senha temporária para o usuário \"$2\", sendo ela \"$3\". Se esta era sua intenção, você precisará se autenticar e escolher uma nova senha agora.\nA sua senha temporária expirará em {{PLURAL:$5|um dia|$5 dias}}.\n\nSe foi outra pessoa quem fez este pedido, ou se você já lembrou a sua senha, e não quer mais alterá-la, você pode ignorar esta mensagem e continuar utilizando sua senha antiga.",
+       "passwordremindertext": "Alguém (a partir do endereço IP $1) solicitou uma senha nova para a sua conta na wiki {{SITENAME}} ($4).\nFoi criada a senha temporária \"$3\" para o usuário \"$2\".\nSe o pedido foi feito por si, entre agora na sua conta e escolha uma palavra-passe nova.\nA palavra-passe temporária expira após {{PLURAL:$5|um dia|$5 dias}}.\n\nCaso outra pessoa tenha feito o pedido, ou se entretanto se recordou da sua senha e já não deseja alterá-la, ignore esta mensagem e continue a utilizar a senha antiga.",
        "noemail": "Não há um endereço de e-mail associado ao usuário \"$1\".",
        "noemailcreate": "Você precisa fornecer um endereço de e-mail válido",
        "passwordsent": "Uma nova senha está sendo enviada para o endereço de e-mail registrado para \"$1\".\nPor favor, reconecte-se ao recebê-lo.",
        "longpageerror": "'''Erro: O texto que submeteu ocupa {{PLURAL:$1|um kilobyte|$1 kilobytes}}, que excede o máximo de {{PLURAL:$2|um kilobyte|$2 kilobytes}}.'''\nA página não pode ser salva.",
        "readonlywarning": "'''Aviso: O banco de dados foi bloqueado para manutenção, por isso você não poderá salvar a sua edição neste momento.'''\nTalvez você queira copiar o seu texto num editor externo e guardá-lo, para posterior envio.\n\nQuem bloqueou o banco de dados forneceu a seguinte explicação: $1",
        "protectedpagewarning": "'''Atenção: Esta página foi protegida para que apenas usuários com privilégios de administrador possam editá-la.'''\nA última entrada no histórico é fornecida abaixo como referência:",
-       "semiprotectedpagewarning": "'''Nota:''' Esta página foi protegida, sendo que apenas usuários registrados poderão editá-la.\nA última entrada no histórico é fornecida abaixo para referência:",
+       "semiprotectedpagewarning": "<strong>Nota:</strong> Esta página foi protegida de modo a que só usuários autoconfirmados a possam editar.\nPara referência, é apresentada abaixo a última entrada do registo:",
        "cascadeprotectedwarning": "<strong>Aviso:</strong> Esta página foi protegida para que somente usuários com [[Special:ListGroupRights|grupos com direitos específicos]] possam editá-la porque ela é transcluída {{PLURAL:$1|na seguinte página protegida|nas seguintes páginas protegidas}} por cascata:",
        "titleprotectedwarning": "'''Atenção: esta página foi protegida; [[Special:ListGroupRights|privilégios específicos]] são necessários para criá-la.'''\nA última entrada no histórico é fornecida abaixo como referência:",
        "templatesused": "{{PLURAL:$1|Predefinição usada|Predefinições usadas}} nesta página:",
        "rcfilters-filter-humans-label": "Humano (não robô)",
        "rcfilters-filter-humans-description": "Edições feitas por editores humanos.",
        "rcfilters-filtergroup-reviewstatus": "Estado da revisão",
-       "rcfilters-filter-patrolled-label": "Patrulhado",
-       "rcfilters-filter-patrolled-description": "Edições marcadas como patrulhadas.",
-       "rcfilters-filter-unpatrolled-label": "Não patrulhadas",
-       "rcfilters-filter-unpatrolled-description": "Edições não marcadas como patrulhadas.",
+       "rcfilters-filter-reviewstatus-unpatrolled-description": "Edições que não foram manualmente nem automaticamente marcadas como patrulhadas.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Não patrulhadas",
+       "rcfilters-filter-reviewstatus-manual-description": "Edições manualmente marcadas como patrulhadas.",
+       "rcfilters-filter-reviewstatus-manual-label": "Patrulhadas manualmente",
+       "rcfilters-filter-reviewstatus-auto-description": "Edições de usuários avançados cujas edições são automaticamente marcadas como patrulhadas.",
+       "rcfilters-filter-reviewstatus-auto-label": "Patrulhadas automaticamente",
        "rcfilters-filtergroup-significance": "Significado",
        "rcfilters-filter-minor-label": "Edições menores",
        "rcfilters-filter-minor-description": "Edita o autor rotulado como menor.",
        "fix-double-redirects": "Atualizar todos os redirecionamentos que apontem para o título original",
        "move-leave-redirect": "Criar um redirecionamento",
        "protectedpagemovewarning": "'''Atenção:''' Esta página foi protegida de modo que apenas usuários com privilégio de administrador possam movê-la.\nA última entrada no histórico é fornecida abaixo para referência:",
-       "semiprotectedpagemovewarning": "''Nota:''' Esta página foi protegida de modo que apenas usuários registrados possam movê-la.\nA última entrada no histórico é fornecida abaixo para referência:",
+       "semiprotectedpagemovewarning": "<strong>Note:</strong> Esta página foi protegida de modo que só usuários autoconfirmados a possam mover.\nPara referência, é apresentada abaixo a última entrada do registo:",
        "move-over-sharedrepo": "[[:$1]] existe em um repositório compartilhado. Mover um arquivo para este título irá sobrescrever o arquivo compartilhado.",
        "file-exists-sharedrepo": "O nome de arquivo escolhido já está em uso em um repositório compartilhado.\nPor favor, escolha outro nome.",
        "export": "Exportar páginas",
        "version-specialpages": "Páginas especiais",
        "version-parserhooks": "Hooks do analisador (parser)",
        "version-variables": "Variáveis",
+       "version-editors": "Editores",
        "version-antispam": "Prevenção contra spam",
        "version-other": "Diversos",
        "version-mediahandlers": "Executores de mídia",
index 7c3ded7..789eaeb 100644 (file)
        "tog-watchlisthideminor": "Esconder edições menores ao listar mudanças às páginas vigiadas",
        "tog-watchlisthideliu": "Esconder edições de utilizadores autenticados ao listar mudanças às páginas vigiadas",
        "tog-watchlistreloadautomatically": "Recarregar a lista de páginas vigiadas automaticamente sempre que um filtro é alterado (requer JavaScript)",
-       "tog-watchlistunwatchlinks": "Adicionar hiperligações diretas para vigiar ou deixar de vigiar as entradas na lista de páginas vigiadas (é necessário o JavaScript para alternar entre ambas)",
+       "tog-watchlistunwatchlinks": "Adicionar marcadores ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) para deixar de vigiar ou voltar a vigiar as páginas vigiadas que foram modificadas (é necessário o JavaScript para alternar entre ambas)",
        "tog-watchlisthideanons": "Esconder edições de utilizadores anónimos ao listar mudanças às páginas vigiadas",
        "tog-watchlisthidepatrolled": "Esconder edições patrulhadas ao listar mudanças às páginas vigiadas",
        "tog-watchlisthidecategorization": "Ocultar categorização de páginas",
        "rcfilters-filter-humans-label": "Ser humano (não robô)",
        "rcfilters-filter-humans-description": "Edições efetuadas por pessoas.",
        "rcfilters-filtergroup-reviewstatus": "Estado da revisão",
-       "rcfilters-filter-patrolled-label": "Patrulhadas",
-       "rcfilters-filter-patrolled-description": "Edições marcadas como patrulhadas.",
-       "rcfilters-filter-unpatrolled-label": "Não patrulhadas",
-       "rcfilters-filter-unpatrolled-description": "Edições não marcadas como patrulhadas.",
+       "rcfilters-filter-reviewstatus-unpatrolled-description": "Edições que não foram manualmente nem automaticamente marcadas como patrulhadas.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Não patrulhadas",
+       "rcfilters-filter-reviewstatus-manual-description": "Edições manualmente marcadas como patrulhadas.",
+       "rcfilters-filter-reviewstatus-manual-label": "Patrulhadas manualmente",
+       "rcfilters-filter-reviewstatus-auto-description": "Edições de utilizadores avançados cujas edições são automaticamente marcadas como patrulhadas.",
+       "rcfilters-filter-reviewstatus-auto-label": "Patrulhadas automaticamente",
        "rcfilters-filtergroup-significance": "Significado",
        "rcfilters-filter-minor-label": "Edições menores",
        "rcfilters-filter-minor-description": "Edições marcadas pelo autor como menores.",
        "svg-long-desc-animated": "ficheiro SVG animado, de $1 × $2 píxeis, tamanho: $3",
        "svg-long-error": "Ficheiro SVG inválido: $1",
        "show-big-image": "Ficheiro original",
-       "show-big-image-preview": "Tamanho desta antevisão: $1.",
-       "show-big-image-preview-differ": "Tamanho desta antevisão em $3 do ficheiro $2: $1",
+       "show-big-image-preview": "Dimensões desta antevisão: $1.",
+       "show-big-image-preview-differ": "Dimensões desta antevisão em $3 do ficheiro $2: $1",
        "show-big-image-other": "{{PLURAL:$2|Outra resolução|Outras resoluções}}: $1.",
        "show-big-image-size": "$1 × $2 píxeis",
        "file-info-gif-looped": "cíclico",
        "version-specialpages": "Páginas especiais",
        "version-parserhooks": "''Hooks'' do analisador sintático",
        "version-variables": "Variáveis",
+       "version-editors": "Editores",
        "version-antispam": "Prevenção contra spam",
        "version-other": "Diversos",
        "version-mediahandlers": "Leitura e tratamento de multimédia",
index 6e54765..e7da4c6 100644 (file)
        "userrights-groupsmember": "Used when editing user groups in [[Special:Userrights]].\n\nThe message is followed by a list of group names.\n\nParameters:\n* $1 - (Optional) the number of items in the list following the message, for PLURAL\n* $2 - (Optional) the user name, for GENDER",
        "userrights-groupsmember-auto": "Used when editing user groups in [[Special:Userrights]]. The message is followed by a list of group names.\n\n\"Implicit\" is for groups that the user was automatically added to (such as \"autoconfirmed\"); cf. {{msg-mw|userrights-groupsmember}}\n\nParameters:\n* $1 - (Optional) the number of items in the list following the message, for PLURAL\n* $2 - (Optional) the user name, for GENDER",
        "userrights-groupsmember-type": "{{optional}}\nParameters:\n* $1 - list of group names\n* $2 - list of group member names. Used with labels {{msg-mw|Userrights-groupsmember}} and {{msg-mw|Userrights-groupsmember-auto}}",
-       "userrights-groups-help": "Instructions displayed on [[Special:UserRights]].  \"Bring forward\" is a phrasal verb meaning \"move to an earlier time\". \"Put back\" means the opposite. Parameters:\n* $1 - (Optional) a username, can be used for GENDER",
+       "userrights-groups-help": "Instructions displayed on [[Special:UserRights]]. Parameters:\n* $1 - (Optional) a username, can be used for GENDER\n\nNote for section marked #:\n* \"Put back\" is a phrasal verb meaning \"to change the date of an event so that it happens _later_ than planned\".\n* \"Bring forward\" is a phrasal verb meaning \"to change the date of an event so that it happens _earlier_\".",
        "userrights-reason": "Text beside log field when editing user groups\n\n{{Identical|Reason}}",
        "userrights-no-interwiki": "Error message when editing user groups",
        "userrights-nodatabase": "Error message when editing user groups.\n\n\"Local\" means databases/wikis of the same farm/cluster; that is, meta, enwiki, dewiki, commons, etc are all local databases of the Wikimedia Foundation.\n\nSee [{{canonicalurl:meta:Special:Log|type=rights}} meta:Special:Log?type=rights] for a usage of local databases: username@barwiki\n\nParameters:\n* $1 - database name",
        "rcfilters-filter-humans-label": "Label for the filter for showing edits made by human editors.",
        "rcfilters-filter-humans-description": "Description for the filter for showing edits made by human editors.",
        "rcfilters-filtergroup-reviewstatus": "Title for the filter group about review status (in core this is whether it's been patrolled)",
-       "rcfilters-filter-patrolled-label": "Label for the filter for showing patrolled edits",
-       "rcfilters-filter-patrolled-description": "Label for the filter showing patrolled edits",
-       "rcfilters-filter-unpatrolled-label": "Label for the filter for showing unpatrolled edits",
-       "rcfilters-filter-unpatrolled-description": "Description for the filter for showing unpatrolled edits",
+       "rcfilters-filter-reviewstatus-unpatrolled-description": "Description for the filter for showing unpatrolled edits",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Label for the filter for showing unpatrolled edits",
+       "rcfilters-filter-reviewstatus-manual-description": "Description for the filter showing manually patrolled edits",
+       "rcfilters-filter-reviewstatus-manual-label": "Label for the filter showing manually patrolled edits",
+       "rcfilters-filter-reviewstatus-auto-description": "Description for the filter showing automatically patrolled edits",
+       "rcfilters-filter-reviewstatus-auto-label": "Label for the filter showing automatically patrolled edits",
        "rcfilters-filtergroup-significance": "Title for the filter group for edit significance.\n{{Identical|Significance}}",
        "rcfilters-filter-minor-label": "Label for the filter for showing edits marked as minor.",
        "rcfilters-filter-minor-description": "Description for the filter for showing edits marked as minor.",
        "rcfilters-tag-prefix-tags": "Prefix for the edit tags in [[Special:RecentChanges]]. Edit tags use a hash (#) as prefix. Please keep this format.\n\nParameters:\n* $1 - Tag display name.",
        "rcfilters-exclude-button-off": "Title for the button that excludes selected namespaces, when it is not yet active.",
        "rcfilters-exclude-button-on": "Title for the button that excludes selected namespaces, when it is active.",
-       "rcfilters-view-tags": "Title for the tags view in [[Special:RecentChanges]]\n{{Identical|Tag}}",
+       "rcfilters-view-tags": "Title for the tags view in [[Special:RecentChanges]].",
        "rcfilters-view-namespaces-tooltip": "Tooltip for the button that loads the namespace view in [[Special:RecentChanges]]",
        "rcfilters-view-tags-tooltip": "Tooltip for the button that loads the tags view in [[Special:RecentChanges]]",
        "rcfilters-view-return-to-default-tooltip": "Tooltip for the button that returns to the default filter view in [[Special:RecentChanges]]",
        "version-specialpages": "Part of [[Special:Version]].\n{{Identical|Special page}}",
        "version-parserhooks": "This message is a heading at [[Special:Version]] for extensions that modifies the parser of wikitext.",
        "version-variables": "{{Identical|Variable}}",
+       "version-editors": "Part of [[Special:Version]].\nThis message is followed by the list of installed extensions that provide an editor or enhance editing functionality.\n{{Identical|Editor}}",
        "version-antispam": "Part of [[Special:Version]].\nThis message is followed by the list of SPAM prevention extensions.",
        "version-api": "{{optional}}",
        "version-other": "{{Identical|Other}}",
index 6abade2..e0af22b 100644 (file)
        "rcfilters-filter-humans-label": "Om (nu robot)",
        "rcfilters-filter-humans-description": "Modificări făcute de oameni.",
        "rcfilters-filtergroup-reviewstatus": "Revizuiți starea",
-       "rcfilters-filter-patrolled-label": "Patrulate",
-       "rcfilters-filter-patrolled-description": "Editări marcate ca patrulate.",
-       "rcfilters-filter-unpatrolled-label": "Nepatrulate",
-       "rcfilters-filter-unpatrolled-description": "Modificări marcate ca nepatrulate.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Nepatrulate",
        "rcfilters-filtergroup-significance": "Semnificație",
        "rcfilters-filter-minor-label": "Modificări minore",
        "rcfilters-filter-minor-description": "Modificări pe care autorul le-a marcat ca fiind minore.",
index ed9b33c..4c4199c 100644 (file)
        "rcfilters-filter-humans-label": "Umane (none bot)",
        "rcfilters-filter-humans-description": "Cangiaminde fatte da condrebbuture umane.",
        "rcfilters-filtergroup-reviewstatus": "State d'a revisione",
-       "rcfilters-filter-patrolled-label": "Condrollate",
-       "rcfilters-filter-patrolled-description": "Cangiaminde signate cumme condrollate.",
-       "rcfilters-filter-unpatrolled-label": "Non condrollate",
-       "rcfilters-filter-unpatrolled-description": "Cangiaminde non signate cumme condrollate.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Non condrollate",
        "rcfilters-filtergroup-significance": "Significate",
        "rcfilters-filter-minor-label": "Cangiaminde stuèdeche",
        "rcfilters-filter-watchlist-watched-label": "Jndr'à le pàggene condrollate",
index 6a79834..6cf9495 100644 (file)
        "rcfilters-filter-humans-label": "Человек (не бот)",
        "rcfilters-filter-humans-description": "Правки, внесённые редакторами.",
        "rcfilters-filtergroup-reviewstatus": "Статус проверки",
-       "rcfilters-filter-patrolled-label": "Отпатрулировано",
-       "rcfilters-filter-patrolled-description": "Правки, помеченные как отпатрулированные.",
-       "rcfilters-filter-unpatrolled-label": "Непатрулированные",
-       "rcfilters-filter-unpatrolled-description": "Правки, не помеченные как отпатрулированные.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Непатрулированные",
        "rcfilters-filtergroup-significance": "Значение",
        "rcfilters-filter-minor-label": "Малые правки",
        "rcfilters-filter-minor-description": "Правки, которые автор пометил как малые.",
        "notvisiblerev": "Версия была удалена",
        "watchlist-details": "В вашем списке наблюдения $1 {{PLURAL:$1|страница|страницы|страниц}} (а также страницы обсуждений).",
        "wlheader-enotif": "Уведомления по эл. почте включены.",
-       "wlheader-showupdated": "Страницы, изменившиеся с вашего последнего их посещения, выделены '''полужирным''' шрифтом.",
+       "wlheader-showupdated": "Страницы, изменившиеся с вашего последнего их посещения, выделены <strong>полужирным</strong> шрифтом.",
        "wlnote": "Ниже {{PLURAL:$1|показано последнее изменение|показаны <strong>$1</strong> последние изменения|показаны <strong>$1</strong> последних изменений}} за {{PLURAL:$2|последний час|последние <strong>$2</strong> часа|последние <strong>$2</strong> часов}}, по состоянию на $3 $4.",
        "wlshowlast": "Показать за последние $1 часов $2 дней",
        "watchlist-hide": "Скрыть",
index 0189324..30f341c 100644 (file)
        "redirectedfrom": "($1 इत्यस्मात् पुनर्निर्दिष्टम्)",
        "redirectpagesub": "पृष्ठम् अनुप्रेष्यताम्",
        "redirectto": "इत्यत्र पुनर्निदिष्यताम्",
-       "lastmodifiedat": "$1 (तमà¥\87) à¤¦à¤¿à¤¨à¤¾à¤\99à¥\8dà¤\95à¥\87 à¤\85नà¥\8dतिमसमà¥\8dपादनं $2 समये अभवत्",
+       "lastmodifiedat": "$1 (तमà¥\87) à¤¦à¤¿à¤¨à¤¾à¤\99à¥\8dà¤\95à¥\87 à¤\85नà¥\8dतिमपरिवरà¥\8dतनं $2 समये अभवत्",
        "viewcount": "एतत्पृष्ठं {{PLURAL:$1|एक वारं|$1 वारं}} दृष्टम् अस्ति",
        "protectedpage": "संरक्षितपृष्ठम्",
        "jumpto": "अत्र गम्यताम् :",
        "feedback-thanks": "कृतज्ञता ! भवतः प्रतिस्पन्दः \"[ $2  $1 ]\" पृष्ठाय प्रेषितः अस्ति ।",
        "feedback-thanks-title": "कृतज्ञतां निवेदयामि !",
        "feedback-useragent": "योजकानुयोज्यः :",
-       "searchsuggest-search": "अन्वेषणम्",
+       "searchsuggest-search": "{{SITENAME}} अन्विष्यताम्",
        "searchsuggest-containing": "विद्यन्ते......",
        "api-error-badtoken": "आन्तरिकदोषः : दुष्टप्रतीकः ।",
        "api-error-emptypage": "नूतनस्य रिक्तस्य पृष्ठस्य सर्जनं निषिद्धम् ।",
index d94dbef..31c4d98 100644 (file)
        "rcfilters-filter-humans-label": "Киһи (оруобат буолбатах)",
        "rcfilters-filter-humans-description": "Кыттааччылар оҥорбут уларытыылара.",
        "rcfilters-filtergroup-reviewstatus": "Тургутуу туруга",
-       "rcfilters-filter-patrolled-label": "Ботуруулламмыт",
-       "rcfilters-filter-patrolled-description": "Ботуруулламмыт курдук бэлиэтэммит уларытыылар.",
-       "rcfilters-filter-unpatrolled-label": "Ботуруулламматах",
-       "rcfilters-filter-unpatrolled-description": "Ботуруулламмыт курдук бэлиэтэммэтэх уларытыылар.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Ботуруулламматах",
        "rcfilters-filtergroup-significance": "Суолтата",
        "rcfilters-filter-minor-label": "Кыра уларытыы",
        "rcfilters-filter-minor-description": "Ааптар суолтата суох курдук бэлиэтээбит уларытыылара.",
index ed8e391..c6b9521 100644 (file)
@@ -15,7 +15,8 @@
                        "Shirayuki",
                        "MtDu",
                        "Manik Soren",
-                       "Ramjit Tudu"
+                       "Ramjit Tudu",
+                       "R Ashwani Banjan Murmu"
                ]
        },
        "tog-underline": "ᱡᱚᱱᱚᱲ ᱞᱟᱛᱟᱨᱨᱮ ᱫᱟᱜᱽ ᱩᱫᱩᱜᱽᱢᱮ:",
        "listusers-blocked": "(ᱮᱥᱮᱫ ᱜᱮᱭᱟ)",
        "listgrouprights-group": "ᱜᱟᱶᱛᱟ",
        "listgrouprights-rights": "ᱟᱹᱭᱫᱟᱹᱨᱤᱠᱚ",
-       "listgrouprights-helppage": "á±\9cá±\9aᱸᱲá±\9aᱸ:á±\9cá±\9fᱶá±\9bá±\9f á±\9fᱹᱭᱫá±\9fᱹᱨᱤ á± á±©",
+       "listgrouprights-helppage": "á±\9cá±\9aá±²á±\9aᱸ:á±\9cá±\9fᱫᱮá±\9e á±\9fᱹᱭᱫá±\9fᱹᱨ",
        "listgrouprights-members": "(ᱥᱚᱦᱮᱫᱠᱩᱣᱟᱜ ᱛᱟᱹᱞᱠᱟᱹ)",
        "listgrouprights-addgroup-all": "ᱡᱚᱛᱚ ᱜᱟᱶᱛᱟᱠᱩ ᱥᱮᱞᱮᱫ ᱠᱩ ᱢᱮ",
        "listgrouprights-removegroup-all": "ᱡᱚᱛᱚ ᱜᱟᱶᱛᱟᱠᱩ ᱚᱪᱚᱜ ᱠᱩ ᱢᱮ",
index 9c67d24..22c92ce 100644 (file)
        "rcfilters-filter-humans-label": "Human (nae bot)",
        "rcfilters-filter-humans-description": "Eedits made bi human eeditors.",
        "rcfilters-filtergroup-reviewstatus": "Review status",
-       "rcfilters-filter-patrolled-label": "Patrolled",
-       "rcfilters-filter-patrolled-description": "Eedits merked as patrolled.",
-       "rcfilters-filter-unpatrolled-label": "Unpatrolled",
-       "rcfilters-filter-unpatrolled-description": "Eedits nae merked as patrolled.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Unpatrolled",
        "rcfilters-filtergroup-significance": "Signeeficance",
        "rcfilters-filter-minor-label": "Minor eedits",
        "rcfilters-filter-minor-description": "Eedits the author labeled as minor.",
index a8c01a6..507ebc8 100644 (file)
        "rcfilters-filter-bots-description": "خودڪار اوزارن پاران ڪيل ترميمون.",
        "rcfilters-filter-humans-label": "انسان (بوٽ نہ)",
        "rcfilters-filter-humans-description": "انساني ايڊيٽرن پاران ڪيل ترميمون.",
-       "rcfilters-filter-patrolled-label": "گشت-ڪيل",
-       "rcfilters-filter-patrolled-description": "گشت-ڪيل طور نشان-لڳل ترميمون.",
-       "rcfilters-filter-unpatrolled-description": "گشت-ڪيل طور نشان نہ لڳل ترميمون.",
        "rcfilters-filter-minor-label": "معمولي ترميمون",
        "rcfilters-filter-major-label": "غير معمولي ترميمون",
        "rcfilters-filter-major-description": "معمولي طور نشان نہ لڳل ترميمون.",
index 7d4b500..1165534 100644 (file)
        "rcfilters-filter-humans-label": "Človek (nie bot)",
        "rcfilters-filter-humans-description": "Úpravy vykonané ľuďmi.",
        "rcfilters-filtergroup-reviewstatus": "Stav preverenia",
-       "rcfilters-filter-patrolled-label": "Preverené",
-       "rcfilters-filter-patrolled-description": "Úpravy označené ako preverené.",
-       "rcfilters-filter-unpatrolled-label": "Nepreverené",
-       "rcfilters-filter-unpatrolled-description": "Úpravy neoznačené ako preverené.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Nepreverené",
        "rcfilters-filtergroup-significance": "Dôležitosť",
        "rcfilters-filter-minor-label": "Drobné úpravy",
        "rcfilters-filter-minor-description": "Úpravy, ktoré autor označil ako drobné.",
index 3218a1e..c7ee1f6 100644 (file)
        "watchlisttools-edit": "زیرنظر فہرست  کوں ݙیکھو تے تبدیلی کرو",
        "watchlisttools-raw": "کچی زیرِنظرفہرست وچ تبدیلی کرو",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|تبادلۂ خیال]])",
+       "version-editors": "ایڈیٹ کرݨ آلے",
        "redirect": "فائل، صارف، ورقہ،دہرائی یا آئی ڈی لاگ دے ذریعے ولدا واپس",
        "redirect-submit": "ڄلو",
        "redirect-lookup": "تلاش:",
index 79c53cb..eb8680d 100644 (file)
        "rcfilters-filter-humans-label": "Človek (ne bot)",
        "rcfilters-filter-humans-description": "Urejanja, ki so jih izvedli ljudje.",
        "rcfilters-filtergroup-reviewstatus": "Stanje pregleda",
-       "rcfilters-filter-patrolled-label": "Nadzorovano",
-       "rcfilters-filter-patrolled-description": "Urejanja, ki so označena kot nadzorovana.",
-       "rcfilters-filter-unpatrolled-label": "Nenadzorovano",
-       "rcfilters-filter-unpatrolled-description": "Urejanja, ki niso označena kot nadzorovana.",
+       "rcfilters-filter-reviewstatus-unpatrolled-description": "Urejanja, ki niso ročno ali samodejno označena kot nadzorovana.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Nenadzorovano",
+       "rcfilters-filter-reviewstatus-manual-description": "Urejanja, ki so ročno označena kot nadzorovana.",
+       "rcfilters-filter-reviewstatus-manual-label": "Ročno nadzorovano",
+       "rcfilters-filter-reviewstatus-auto-description": "Urejanja naprednih uporabnikov, katerih delo je samodejno označeno kot nadzorovano.",
+       "rcfilters-filter-reviewstatus-auto-label": "Samodejno nadzorovano",
        "rcfilters-filtergroup-significance": "Pomembnost",
        "rcfilters-filter-minor-label": "Manjša urejanja",
        "rcfilters-filter-minor-description": "Urejanja, ki jih je avtor označil kot manjša.",
        "version-specialpages": "Posebne strani",
        "version-parserhooks": "Razširitve razčlenjevalnika",
        "version-variables": "Spremenljivke",
+       "version-editors": "Uredniki",
        "version-antispam": "Preprečevanje smetja",
        "version-other": "Ostalo",
        "version-mediahandlers": "Upravljavci predstavnostnih vsebin",
index 0d5735c..10d404a 100644 (file)
        "rcfilters-filter-humans-label": "Njeri (jo bot)",
        "rcfilters-filter-humans-description": "Redaktimet e bëra nga redaktorët njerëz.",
        "rcfilters-filtergroup-reviewstatus": "Statusi i rishikimit",
-       "rcfilters-filter-patrolled-label": "Patrolluar",
-       "rcfilters-filter-patrolled-description": "Redaktimet të markuara si të patrolluara",
-       "rcfilters-filter-unpatrolled-label": "E papatrolluar",
-       "rcfilters-filter-unpatrolled-description": "Redaktimet e pashënuara si të patrolluara.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "E papatrolluar",
        "rcfilters-filtergroup-significance": "Rëndësia",
        "rcfilters-filter-minor-label": "Redaktime të vogëla",
        "rcfilters-filter-minor-description": "Redaktimet që autori i ka shënuar si të vogla",
index 60cf030..e4b1807 100644 (file)
        "expansion-depth-exceeded-category-desc": "Страница је прекорачила највећу дубину проширења.",
        "expansion-depth-exceeded-warning": "Страница у којој је прекорачена дубина проширења",
        "parser-unstrip-loop-warning": "Утврђена је петља",
-       "unstrip-depth-warning": "Прекорачено је ограничење рекурзије ($1)",
+       "unstrip-depth-warning": "Прекорачен лимит Unstrip рекурзије ($1)",
        "converter-manual-rule-error": "Пронађена је грешка у правилу за ручно претварање језика",
        "undo-success": "Измена се може поништити.\nПроверите разлике испод, па сачувајте измене.",
        "undo-failure": "Ова измена се не може поништити због сукоба измена.",
        "rcfilters-savedqueries-cancel-label": "Откажи",
        "rcfilters-savedqueries-add-new-title": "Сачувајте тренутна подешавања филтера",
        "rcfilters-savedqueries-already-saved": "Ови филтери су већ сачувани. Измените Ваша подешавања како бисте направили нове сачуване филтере.",
-       "rcfilters-restore-default-filters": "Ð\92Ñ\80аÑ\9bаÑ\9aе Ð¿Ð¾Ð´Ñ\80азÑ\83меваниÑ\85 Ñ\84илÑ\82еÑ\80а",
+       "rcfilters-restore-default-filters": "Ð\92Ñ\80аÑ\82и Ð¿Ð¾Ð´Ñ\80азÑ\83меване Ñ\84илÑ\82еÑ\80е",
        "rcfilters-clear-all-filters": "Уклоните све филтере",
        "rcfilters-show-new-changes": "Погледај најновије измене",
        "rcfilters-search-placeholder": "Филтрирајте измене (користите мени или претрагу за име филтера)",
        "rcfilters-filter-humans-label": "Човек (није бот)",
        "rcfilters-filter-humans-description": "Измене које су направили људи-уредници.",
        "rcfilters-filtergroup-reviewstatus": "Патролираност",
-       "rcfilters-filter-patrolled-label": "Патролирано",
-       "rcfilters-filter-patrolled-description": "Измене означене као патролиране.",
-       "rcfilters-filter-unpatrolled-label": "Непатролирано",
-       "rcfilters-filter-unpatrolled-description": "Измене које нису означене као патролиране.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Непатролирано",
        "rcfilters-filtergroup-significance": "Значај",
        "rcfilters-filter-minor-label": "Мање измене",
        "rcfilters-filter-minor-description": "Измене које је аутор означио као мање.",
        "rcfilters-view-tags-help-icon-tooltip": "Сазнајте више о означеним изменама",
        "rcfilters-liveupdates-button": "Ажурирај уживо",
        "rcfilters-liveupdates-button-title-on": "Искључите ажурирања уживо",
-       "rcfilters-liveupdates-button-title-off": "Ð\9fÑ\80икажи Ð½Ð¾Ð²Ðµ Ð¸Ð·Ð¼ÐµÐ½Ðµ уживо",
+       "rcfilters-liveupdates-button-title-off": "Ð\9fÑ\80иказ Ð½Ð¾Ð²Ð¸Ñ\85 Ð¸Ð·Ð¼ÐµÐ½Ð° уживо",
        "rcfilters-watchlist-markseen-button": "Означи све измене као погледане",
        "rcfilters-watchlist-edit-watchlist-button": "Промени списак надгледаних страница",
        "rcfilters-watchlist-showupdated": "Измене на страницама које нисте посетили од када је измена извршена су <strong>подебљане</strong>, са испуњеним ознакама.",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|бајт|бајта|бајтова}}",
        "limitreport-expansiondepth": "Највећа дубина проширења",
        "limitreport-expensivefunctioncount": "Број „скупих” функција анализатора",
+       "limitreport-unstrip-depth": "Unstrip дубина рекурзије",
+       "limitreport-unstrip-size": "Unstrip величина након проширења",
        "limitreport-unstrip-size-value": "$1/$2 {{PLURAL:$2|бајт|бајта|бајтова}}",
        "expandtemplates": "Замена шаблона",
        "expand_templates_intro": "Ова посебна страница узима викитекст и мења све шаблоне у њему рекурзивно.\nТакође мења функције парсера као што је <code><nowiki>{{</nowiki>#language:…}}</code> и променљиве као што је <code><nowiki>{{</nowiki>CURRENTDAY}}</code>. \nЗаправо практично све што се налази између витичастих заграда.",
index 1f46d6c..6522fb0 100644 (file)
        "expansion-depth-exceeded-category": "Stranice u kojima je prekoračena dubina proširenja",
        "expansion-depth-exceeded-warning": "Stranica u kojoj je prekoračena dubina proširenja",
        "parser-unstrip-loop-warning": "Utvrđena je petlja",
-       "unstrip-depth-warning": "Prekoračeno je ograničenje rekurzije ($1)",
+       "unstrip-depth-warning": "Prekoračen limit Unstrip rekurzije ($1)",
        "converter-manual-rule-error": "Pronađena je greška u pravilu za ručno pretvaranje jezika",
        "undo-success": "Izmena se može poništiti.\nProverite razlike ispod, pa sačuvajte izmene.",
        "undo-failure": "Ova izmena se ne može poništiti zbog sukoba izmena.",
        "rcfilters-filter-bots-description": "Izmene napravljene automatizovanim alatima.",
        "rcfilters-filter-humans-label": "Čovek (nije bot)",
        "rcfilters-filter-humans-description": "Izmene koje su napravili ljudi-urednici.",
-       "rcfilters-filter-patrolled-label": "Patrolirano",
-       "rcfilters-filter-patrolled-description": "Izmene označene kao patrolirane.",
-       "rcfilters-filter-unpatrolled-label": "Nepatrolirano",
-       "rcfilters-filter-unpatrolled-description": "Izmene koje nisu označene kao patrolirane.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Nepatrolirano",
        "rcfilters-filter-minor-label": "Manje izmene",
        "rcfilters-filter-minor-description": "Izmene koje je autor označio kao manje.",
        "rcfilters-filter-major-label": "Ne-manje izmene",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|bajt|bajta|bajtova}}",
        "limitreport-expansiondepth": "Najveća dubina proširenja",
        "limitreport-expensivefunctioncount": "Broj „skupih” funkcija analizatora",
+       "limitreport-unstrip-depth": "Unstrip dubina rekurzije",
+       "limitreport-unstrip-size": "Unstrip veličina nakon proširenja",
        "expandtemplates": "Zamena šablona",
        "expand_templates_intro": "Ova posebna stranica uzima tekst i menja sve šablone u njemu rekurzivno.\nTakođe menja funkcije parsera kao što je <code><nowiki>{{</nowiki>#language:…}}</code> i promenljive kao što je <code><nowiki>{{</nowiki>CURRENTDAY}}</code>.\nZapravo praktično sve što se nalazi između vitičastih zagrada.",
        "expand_templates_title": "Naziv konteksta; za {{STRANICA}} itd.:",
index 1c0efdd..d500e81 100644 (file)
        "rcfilters-filter-humans-label": "Jalma (lain bot)",
        "rcfilters-filter-humans-description": "Éditan dipigawé ku éditor jalma.",
        "rcfilters-filtergroup-reviewstatus": "Status ulasan",
-       "rcfilters-filter-patrolled-label": "Diaawas",
-       "rcfilters-filter-patrolled-description": "Éditan ditandaan geus diaawas.",
-       "rcfilters-filter-unpatrolled-label": "Teu kaawaskeun",
-       "rcfilters-filter-unpatrolled-description": "Éditan teu ditandaan geus diaawas.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Teu kaawaskeun",
        "rcfilters-filtergroup-significance": "Kapentingan",
        "rcfilters-filter-minor-label": "Éditan minor",
        "rcfilters-filter-minor-description": "Éditan nu ditandaan éditor minangka éditan minor.",
index 951c158..7f8f65d 100644 (file)
        "rcfilters-filter-humans-label": "Mänskliga (inte bot)",
        "rcfilters-filter-humans-description": "Redigeringar gjorda av mänskliga redigerare.",
        "rcfilters-filtergroup-reviewstatus": "Granskningsstatus",
-       "rcfilters-filter-patrolled-label": "Patrullerade",
-       "rcfilters-filter-patrolled-description": "Redigeringar markerade som patrullerade.",
-       "rcfilters-filter-unpatrolled-label": "Inte patrullerade",
-       "rcfilters-filter-unpatrolled-description": "Redigeringar som inte är markerade som patrullerade.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Inte patrullerade",
+       "rcfilters-filter-reviewstatus-auto-label": "Autopatrullerad",
        "rcfilters-filtergroup-significance": "Betydelse",
        "rcfilters-filter-minor-label": "Mindre redigeringar",
        "rcfilters-filter-minor-description": "Redigeringar som är märkta som mindre.",
        "version-specialpages": "Specialsidor",
        "version-parserhooks": "Parsertillägg",
        "version-variables": "Variabler",
+       "version-editors": "Redigerare",
        "version-antispam": "Förhindrar spam",
        "version-other": "Annat",
        "version-mediahandlers": "Mediahanterare",
index ca2bec2..a3df855 100644 (file)
        "rcfilters-filtergroup-automated": "Mutuw niya’ sr’tun miru’ nanak",
        "rcfilters-filter-bots-label": "squliq na kikay",
        "rcfilters-filtergroup-reviewstatus": "’nblaq mita’ inrkyasan niya’ sa misuw qaniy",
-       "rcfilters-filter-patrolled-label": "Wayal gawzyagan mita’",
-       "rcfilters-filter-unpatrolled-label": "Iyat gnawzyagan mita’ na’",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Iyat gnawzyagan mita’ na’",
        "rcfilters-filtergroup-significance": "Spzyang krhun na zyuwaw",
        "rcfilters-filter-minor-label": "Msnzik sa spzyang balay sinr’zyut miru’",
        "rcfilters-filter-major-label": "Iyat mszik sa spzyang sr’tun miru’",
index 1eeecb7..7c7b7ff 100644 (file)
        "resetpass-validity-soft": "మీ సంకేతపదానికి కాలం చెల్లింది:$1\nకొత్తది ఇప్పుడే ఎంచుకోండి, లేదా \"{{int:authprovider-resetpass-skip-label}}\" నొక్కి, తరువాత మార్చుకోండి.",
        "passwordreset": "సంకేతపదాన్ని మార్చుకోండి",
        "passwordreset-text-one": "ఈమెయిలు ద్వారా తాత్కాలిక సంకేతపదాన్ని పొందేందుకు ఈ ఫారమును నింపండి.",
-       "passwordreset-text-many": "{{PLURAL:$1|ఈమెయిలు ద్వారా తాత్కాలిక సంకేతపదాన్ని పొందేందుకు ఏదో ఒక ఫీల్డును నింపండి.Fill in one of the fields to receive a temporary password via email.}}",
+       "passwordreset-text-many": "{{PLURAL:$1|ఈమెయిలు ద్వారా తాత్కాలిక సంకేతపదాన్ని పొందేందుకు ఏదో ఒక ఫీల్డును నింపండి.}}",
        "passwordreset-disabled": "ఈ వికీలో సంకేతపదాల మార్పును అచేతనం చేసాం.",
        "passwordreset-emaildisabled": "ఈ వికీలో ఈమెయిలు విశేషాలను అశక్తం చేసాం.",
        "passwordreset-username": "వాడుకరి పేరు:",
        "rcfilters-filter-humans-label": "మనిషి (బాట్ కాదు)",
        "rcfilters-filter-humans-description": "మనుష్యులు చేసిన మార్పులు.",
        "rcfilters-filtergroup-reviewstatus": "సమీక్ష స్థాయి",
-       "rcfilters-filter-patrolled-label": "నిఘాలో ఉన్నవి",
-       "rcfilters-filter-patrolled-description": "నిఘాలో ఉన్నట్లు గుర్తించిన మార్పులు",
-       "rcfilters-filter-unpatrolled-label": "నిఘాలో లేనివి",
-       "rcfilters-filter-unpatrolled-description": "నిఘాలో ఉన్నట్లు గుర్తించని మార్పులు",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "నిఘాలో లేనివి",
        "rcfilters-filtergroup-significance": "ప్రాముఖ్యం",
        "rcfilters-filter-minor-label": "చిన్న మార్పులు",
        "rcfilters-filter-minor-description": "రచయిత చిన్నవిగా గుర్తు పెట్టిన దిద్దుబాట్లు.",
        "specialpages-note-top": "సూచిక",
        "specialpages-group-maintenance": "నిర్వహణా నివేదికలు",
        "specialpages-group-other": "ఇతర ప్రత్యేక పేజీలు",
-       "specialpages-group-login": "à°ªà±\8dà°°à°µà±\87శిà°\82à°\9aà°\82à°¡à°¿ / à°\96ాతానà±\81 సృష్టించుకోండి",
+       "specialpages-group-login": "లాà°\97ినవà°\82à°¡à°¿ / à°\96ాతా సృష్టించుకోండి",
        "specialpages-group-changes": "ఇటీవలి మార్పులు మరియు దినచర్యలు",
        "specialpages-group-media": "మాధ్యమ నివేదికలు మరియు ఎగుమతులు",
        "specialpages-group-users": "వాడుకరులు, హక్కులు",
        "specialpages-group-highuse": "అధిక వాడుక పేజీలు",
-       "specialpages-group-pages": "à°ªà±\87à°\9cà±\80à°² à°¯à±\8aà°\95à±\8dà°\95 à°\9cాబితాలà±\81",
+       "specialpages-group-pages": "పేజీల జాబితాలు",
        "specialpages-group-pagetools": "పేజీ పనిముట్లు",
        "specialpages-group-wiki": "డాటా మరియు పనిముట్లు",
        "specialpages-group-redirects": "ప్రత్యేక పేజీల దారిమార్పులు",
        "tag-filter": "[[Special:Tags|ట్యాగుల]] వడపోత:",
        "tag-filter-submit": "వడపోయి",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|ట్యాగు|ట్యాగులు}}]]: $2)",
+       "tag-mw-blank": "తుడిచివేత",
+       "tag-mw-blank-description": "పేజీని తుడిచివేసే దిద్దుబాట్లు",
        "tags-title": "టాగులు",
        "tags-intro": "ఈ పేజీ మృదూపకరణం మార్పులకు ఇచ్చే ట్యాగులను, మరియు వాటి అర్ధాలను చూపిస్తుంది.",
        "tags-tag": "ట్యాగు పేరు",
index 3ad480c..ea6a295 100644 (file)
        "rcfilters-filter-user-experience-level-newcomer-description": "ผู้ใช้ลงทะเบียนที่แก้ไขน้อยกว่า 10 ครั้งหรืออายุน้อยกว่า 4 วัน",
        "rcfilters-filter-user-experience-level-learner-label": "ผู้เรียนรู้",
        "rcfilters-filter-user-experience-level-learner-description": "ผู้ใช้ลงทะเบียนที่มีประสบการณ์อยู่ระหว่าง \"ผู้มาใหม่\" กับ \"ผู้ใช้มีประสบการณ์\"",
-       "rcfilters-filter-user-experience-level-experienced-label": "à¸\9cูà¹\89à¹\83à¸\8aà¹\89à¸\97ีà¹\88มีà¸\84วามà¹\80à¸\8aีà¹\88ยวà¸\8aาà¸\8d",
+       "rcfilters-filter-user-experience-level-experienced-label": "à¸\9cูà¹\89à¹\83à¸\8aà¹\89มีà¸\9bระสà¸\9aà¸\81ารà¸\93à¹\8c",
        "rcfilters-filter-user-experience-level-experienced-description": "ผู้ใช้ลงทะเบียนที่มีการแก้ไขมากกว่า 500 ครั้งและอายุมากกว่า 30 วัน",
        "rcfilters-filtergroup-automated": "การเข้ามีส่วนร่วมอัตโนมัติ",
        "rcfilters-filter-bots-label": "บอต",
        "rcfilters-filter-humans-label": "มนุษย์ (ไม่ใช่บอต)",
        "rcfilters-filter-humans-description": "การแก้ไขของผู้เขียนที่เป็นมนุษย์",
        "rcfilters-filtergroup-reviewstatus": "สถานภาพการทบทวน",
-       "rcfilters-filter-patrolled-label": "ตรวจสอบแล้ว",
-       "rcfilters-filter-patrolled-description": "การแก้ไขที่มีเครื่องหมายว่าตรวจสอบแล้ว",
-       "rcfilters-filter-unpatrolled-label": "ยังไม่ตรวจสอบ",
-       "rcfilters-filter-unpatrolled-description": "การแก้ไขที่ไม่มีเครื่องหมายว่าตรวจสอบแล้ว",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "ยังไม่ตรวจสอบ",
        "rcfilters-filtergroup-significance": "ความสำคัญ",
        "rcfilters-filter-minor-label": "การแก้ไขเล็กน้อย",
        "rcfilters-filter-minor-description": "การแก้ไขที่ผู้เขียนระบุว่าเล็กน้อย",
index 8f4008d..0563534 100644 (file)
        "rcfilters-filter-humans-label": "İnsan (bot değil)",
        "rcfilters-filter-humans-description": "İnsan editörler tarafından yapılan düzenlemeler.",
        "rcfilters-filtergroup-reviewstatus": "İnceleme durumu",
-       "rcfilters-filter-patrolled-label": "Devriye onayından geçmiş",
-       "rcfilters-filter-patrolled-description": "Devriye onayından geçmiş olarak işaretlenen düzenlemeler.",
-       "rcfilters-filter-unpatrolled-label": "Devriye onayından geçmemiş",
-       "rcfilters-filter-unpatrolled-description": "Devriye onayından geçmiş olarak işaretlenmeyen düzenlemeler.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Devriye onayından geçmemiş",
        "rcfilters-filtergroup-significance": "Önem",
        "rcfilters-filter-minor-label": "Küçük düzenlemeler",
        "rcfilters-filter-minor-description": "Yazarın küçük olarak etiketlediği düzenlemeler.",
        "logentry-delete-delete": "$1 $3 sayfasını {{GENDER:$2|sildi}}",
        "logentry-delete-delete_redir": "$1, $3 yönlendirmesini üzerine yazılması için {{GENDER:$2|sildi}}",
        "logentry-delete-restore": "$1 $3 ($4) sayfasını {{GENDER:$2|geri getirdi}}",
+       "restore-count-revisions": "{{PLURAL:$1|1 revizyon|$1 revizyon}}",
        "logentry-delete-event": "$1, $3 sayfasında {{PLURAL:$5|bir günlük girdisinin |$5 günlük girdisinin}} görünürlüğünü {{GENDER:$2|değiştirdi}}: $4",
        "logentry-delete-revision": "$1, $3 sayfasında {{PLURAL:$5|bir sürümün|$5 sürümün}} görünürlüğünü {{GENDER:$2|değiştirdi}}: $4",
        "logentry-delete-event-legacy": "$1, $3 sayfasında günlük girdilerinin görünürlüğünü  {{GENDER:$2|değiştirdi}}",
index 2878d7e..0492d88 100644 (file)
        "rcfilters-filter-user-experience-level-learner-label": "يېڭى ئۆگەنچى",
        "rcfilters-filter-bots-label": "ماشىنا ئادەم",
        "rcfilters-filtergroup-reviewstatus": "رازۋىتكا ھالىتى",
-       "rcfilters-filter-patrolled-label": "چارلاندى",
        "rcfilters-filter-minor-label": "كىچىك تەھرىرلەش",
        "rcfilters-filter-major-label": "كىچىك تەھرىرلەش ئەمەس",
        "rcfilters-filter-watchlist-watched-label": "كۆزىتىش تىزىملىكىدە",
index 7dd1eeb..c31c4b3 100644 (file)
        "rcfilters-filter-humans-label": "Людина (не бот)",
        "rcfilters-filter-humans-description": "Редагування, зроблені людиною.",
        "rcfilters-filtergroup-reviewstatus": "Статус перевірки",
-       "rcfilters-filter-patrolled-label": "Перевірені",
-       "rcfilters-filter-patrolled-description": "Редагування, позначені як перевірені",
-       "rcfilters-filter-unpatrolled-label": "Неперевірені",
-       "rcfilters-filter-unpatrolled-description": "Редагування, не позначені як перевірені",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Неперевірені",
        "rcfilters-filtergroup-significance": "Важливість",
        "rcfilters-filter-minor-label": "Незначні редагування",
        "rcfilters-filter-minor-description": "Редагування, позначені авторами як незначні.",
index 8471b1b..874fcd4 100644 (file)
        "rcfilters-filter-humans-label": "دستی (غیر روبہ جاتی)",
        "rcfilters-filter-humans-description": "ترامیم بدست انسانی",
        "rcfilters-filtergroup-reviewstatus": "نظر ثانی کی صورت حال",
-       "rcfilters-filter-patrolled-label": "مراجعت شدہ",
-       "rcfilters-filter-patrolled-description": "بطور مراجعت شدہ نشان زد ترامیم",
-       "rcfilters-filter-unpatrolled-label": "غیر مراجعت شدہ",
-       "rcfilters-filter-unpatrolled-description": "غیر مراجعت شدہ نشان زد ترامیم",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "غیر مراجعت شدہ",
        "rcfilters-filtergroup-significance": "اہمیت",
        "rcfilters-filter-minor-label": "معمولی ترامیم",
        "rcfilters-filter-minor-description": "ترامیم جنہیں صارفین نے معمولی قرار دیا",
index cb1e8e1..a1ff961 100644 (file)
        "rcfilters-filter-humans-label": "Con người (không phải bot)",
        "rcfilters-filter-humans-description": "Các sửa đổi của người thật.",
        "rcfilters-filtergroup-reviewstatus": "Tình trạng tuần tra",
-       "rcfilters-filter-patrolled-label": "Đã được tuần tra",
-       "rcfilters-filter-patrolled-description": "Các sửa đổi đã được đánh dấu tuần tra.",
-       "rcfilters-filter-unpatrolled-label": "Chưa được tuần tra",
-       "rcfilters-filter-unpatrolled-description": "Các sửa đổi chưa được đánh dấu tuần tra.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Chưa được tuần tra",
        "rcfilters-filtergroup-significance": "Sự quan trọng",
        "rcfilters-filter-minor-label": "Sửa đổi nhỏ",
        "rcfilters-filter-minor-description": "Các sửa đổi được tác giả đánh dấu là nhỏ.",
index 203e873..d47b280 100644 (file)
        "rcfilters-filter-humans-label": "מענטש (נישט קיין באט)",
        "rcfilters-filter-humans-description": "רעדאקטירונגען געמאכט פון מענטשן רעדאקטארן.",
        "rcfilters-filtergroup-reviewstatus": "רעצענזירונג־סטאטוס",
-       "rcfilters-filter-patrolled-label": "פאטראלירט",
-       "rcfilters-filter-unpatrolled-label": "אומפאטראלירט",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "אומפאטראלירט",
        "rcfilters-filtergroup-significance": "באדייטונג",
        "rcfilters-filter-minor-label": "מינערדיקע רעדאַקטירונגען",
        "rcfilters-filter-watchlist-watched-label": "אויף דער אויפֿפאַסונג ליסטע",
        "movepagetext-noredirectfixer": "זיך באניצן מיט דעם פֿארעם אונטן וועט פֿארענדערן דעם נאמען פֿון דעם בלאט, און וועט אריבערפֿירן זיין געשיכטע צום נייעם נאמען.\n\nדאס אלטע קעפל וועט ווערן א ווייטערפֿירן בלאט צום נײַעם נאמען.\n\nטוט פֿארזיכערן אז עס בלײַבן נישט קיין [[Special:DoubleRedirects|געטאפלטע]] אדער [[Special:BrokenRedirects|צעבראכענע]] ווייטערפֿירונגען.\n\nאיר זענט פֿאראנטווארטלעך זיכער מאכן אז אלע פֿארבינדונגען ווערן געריכטעט צו דער געהעריגער ריכטונג.\n\nאַכטונג: דער בלאַט וועט <strong>נישט</strong> ווערן אַריבערגעפֿירט אויב עס איז שוין דאָ א בלאט אונטער דעם נײַעם נאמען, אחוץ ווען ער איז א ווײַטערפֿירונג בלאט, און ער האט נישט קיין געשיכטע פון ענדערונגען.\nפשט דערפֿון, אז איר קענט איבערקערן א ווייטערפֿירונג וואס איר האט אט געמאכט בטעות, און איר קענט נישט אריבערשרײַבן אַן עקסיסטירנדן בלאט.\n\n<strong>הערה:</strong> אזא ענדערונג קען זיין דראַסטיש און נישט געוואונטשן פֿאַר א פאפולערן בלאַט; ביטע פֿאַרזיכערט אז איר פֿאַרשטייט די ווײַטגרייכנדע קאנסעקווענסן צו דער אַקציע בעפֿאַר איר גייט ווײַטער.",
        "movepagetalktext": "טאמער צייכנס איר דאס קעסטל, וועט דער אסאסיציאירטער רעדן בלאט ווערן באַוועגט אויטאמאֵטיש צום נײַעם קעפל, אחוץ ווען ס'איז שוין דא א נישט-ליידיגער רעדן־בלאט.\n\nאין דעם פֿאל, וועט איר דארפֿן באַוועגן אדער צונויפֿגיסן דעם בלאט האַנטלעך, ווען איר ווילט.",
        "moveuserpage-warning": "'''ווארענונג:''' איר האלט ביי באוועגן א באניצער בלאט. ביטע באמערקט אז נאר דער בלאט ווערט באוועגט אבער דער באניצער נאמען ווערט ''נישט'' געענדערט.",
-       "movecategorypage-warning": "<strong>ווארענונג:</strong> איר האלט ביי באוועגן א קאטעגאריע בלאט. גיט אכט אז נאר דער בלאט וועט ווערן באוועגט, אבער די בלעטער אין דער אלטער קאטעגאריע וועט מען <em>נישט</em> be ארײַנשטעלן אין דער נייער קאטעגאריע.",
+       "movecategorypage-warning": "<strong>ווארענונג:</strong> איר האלט ביי באוועגן א קאטעגאריע בלאט. גיט אכט אז נאר דער בלאט וועט ווערן באוועגט, אבער די בלעטער אין דער אלטער קאטעגאריע וועט מען <em>נישט</em> ארײַנשטעלן אין דער נייער קאטעגאריע.",
        "movenologintext": "איר דארפֿט זיך אײַנשרײַבן און זײַן  [[Special:UserLogin|אַרײַנלאגירט]] צו באַוועגן א בלאַט.",
        "movenotallowed": "איר זענט נישט דערלויבט צו באוועגן בלעטער.",
        "movenotallowedfile": "איר האט נישט קיין רשות צו באוועגן טעקעס.",
        "version-specialpages": "ספעציעלע בלעטער",
        "version-parserhooks": "פארזער פארברייטונגען",
        "version-variables": "וואַריאַבלען",
+       "version-editors": "רעדאַקטאָרן",
        "version-antispam": "ספאם פארמיידן",
        "version-other": "אנדער",
        "version-hooks": "Hook סטרוקטורן",
index 6d30712..81c092a 100644 (file)
        "wrongpasswordempty": "你都未入密碼,唔該再試多次啦。",
        "passwordtooshort": "你嘅密碼最少要有$1個半形字元。",
        "passwordtoolong": "密碼唔可以長過{{PLURAL:$1|1個字元|$1個字元}}。",
-       "passwordtoopopular": "呢個密碼太常見,唔俾用。唔該揀個獨特啲嘅密碼。",
+       "passwordtoopopular": "呢個密碼太常見,唔俾用。唔該揀個難估啲嘅密碼。",
        "password-name-match": "你嘅密碼一定要同你嘅用戶名唔一樣。",
        "password-login-forbidden": "呢個用戶名同密碼嘅利用係被禁止嘅。",
        "mailmypassword": "重設密碼",
        "passwordremindertitle": "{{SITENAME}}嘅新臨時密碼",
-       "passwordremindertext": "有人(可能係你,IP 位置 $1)\n請求 {{SITENAME}} 嘅新密碼 ($4)。\n而家用戶 \"$2\" 嘅新臨時密碼設定咗做 \"$3\"。\n如果呢個係你所要求嘅,你就需要即刻登入,揀一個新嘅密碼。\n你個臨時密碼會響{{PLURAL:$5|一|$5}}日內過期。\n\n如果係其他人作出呢個請求,\n又或者你記得返你嘅密碼而又唔想再轉,\n你可以唔使理呢個信息,繼續用舊密碼。",
+       "passwordremindertext": "有人(IP 位置 $1)\n請求 {{SITENAME}} 嘅新密碼 ($4)。\n而家用戶 \"$2\" 嘅新臨時密碼設定咗做 \"$3\"。\n如果呢個係你所要求嘅,你就需要即刻登入,揀一個新嘅密碼。\n你個臨時密碼會響{{PLURAL:$5|一|$5}}日內過期。\n\n如果係其他人作出呢個請求,\n又或者你記得返你嘅密碼而又唔想再轉,\n你可以唔使理呢個信息,繼續用舊密碼。",
        "noemail": "呢度冇用戶 \"$1\" 嘅電郵地址。",
        "noemailcreate": "你需要提供一個有效嘅電郵地址",
        "passwordsent": "新嘅密碼已經寄咗畀呢位用戶 \"$1\" 嘅電郵地址。收到之後請重新登入。",
        "savechanges": "記好",
        "publishpage": "發佈呢頁",
        "publishchanges": "發佈修改",
+       "savearticle-start": "儲存呢頁...",
+       "savechanges-start": "儲存修改...",
+       "publishpage-start": "發佈呢頁...",
+       "publishchanges-start": "發佈修改...",
        "preview": "預覽",
        "showpreview": "顯示預覽",
        "showdiff": "顯示差異",
        "blockedtitle": "用戶已經封鎖",
        "blockedtext": "你嘅用戶名或者 IP 位址已經被 $1 封咗。\n\n呢次封鎖係由$1所封嘅。當中嘅原因係''$2''。\n\n* 呢次封鎖嘅開始時間係:$8\n* 呢次封鎖嘅到期時間係:$6\n* 對於被封鎖者:$7\n\n你可以聯絡 $1 或者其他嘅[[{{MediaWiki:Grouppage-sysop}}|管理員]],討論呢次封鎖。\n除非你已經響你嘅[[Special:Preferences|戶口喜好設定]]入面設定咗有效嘅電郵地址,否則你係唔可以用「電郵呢個用戶」嘅功能。當設定咗一個有效嘅電郵地址之後,呢個功能係唔會封鎖嘅。\n\n你現時嘅 IP 位址係 $3 ,而個封鎖 ID 係 #$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,個封鎖 ID 係 #$5。 請喺你嘅查詢都註明呢個封鎖上面嘅資料。",
+       "systemblockedtext": "你嘅用戶名或者IP地址已經俾MediaWiki自動封鎖。\n封鎖原因係:\n\n:<em>$2</em>\n\n* 開始時間:$8\n* 到期時間:$6\n* 目標用戶:$7\n\n你而家嘅IP地址係$3。\n當你作出任何查詢嘅時候,請包含以上所有資料。",
        "blockednoreason": "無原因畀低",
        "whitelistedittext": "你需要$1去編輯呢頁。",
        "confirmedittext": "你個電郵地址要確定咗先可以編輯。唔該先去[[Special:Preferences|喜好設定]]填咗電郵地址,並做埋確認手續。",
        "blocked-notice-logextract": "呢位用戶而家被封鎖緊。\n下面有最近嘅封鎖紀錄以供參考:",
        "clearyourcache": "<strong>注意</strong>:喺儲存之後,你可能要先略過你嘅瀏覽器快取去睇到更改。\n* <strong>Firefox / Safari:</strong> 㩒住<em>Shift</em>掣再撳<em>重新載入</em>,又或者㩒<em>Ctrl-F5</em>或者<em>Ctrl-R</em>(喺Mac㩒<em>Command-R</em>掣);\n* <strong>Google Chrome:</strong> 㩒<em>Ctrl-Shift-R</em>(喺Mac㩒<em>Command-R</em>掣);\n* <strong>Internet Explorer:</strong> 㩒住<em>Ctrl</em>掣再撳<em>重新整理</em>,又或者㩒<em>Ctrl-F5</em>掣;\n* <strong>Opera:</strong> 去 <em>選單 → 設定</em> (喺 Mac 係 <em>Opera → 偏好設定</em>) 跟住再到 <em>隱私 & 安全性 → 清除瀏覽資料 → 已快取的圖片與檔案</em>。",
        "usercssyoucanpreview": "'''提示:'''響儲存前,用「{{int:showpreview}}」個掣嚟測試你嘅新CSS。",
+       "userjsonyoucanpreview": "'''提示:'''響儲存前,用「{{int:showpreview}}」個掣嚟測試你嘅新JSON。",
        "userjsyoucanpreview": "'''提示:'''響儲存前,用「{{int:showpreview}}」個掣嚟測試你嘅新JavaScript。",
        "usercsspreview": "'''記住你而家只係預覽緊你嘅用戶CSS樣式表。'''\n'''佢嘅內容重未儲存!'''",
+       "userjsonpreview": "<strong>記住你而家只係測試/預覽緊你定義嘅JSON。\n佢嘅內容重未儲存!</strong>",
        "userjspreview": "'''記住你而家只係測試/預覽緊你定義嘅JavaScript。'''\n'''佢嘅內容重未儲存!'''",
        "sitecsspreview": "'''記住你而家只係預覽呢段 CSS。'''\n'''佢嘅內容重未儲存!'''",
+       "sitejsonpreview": "<strong>記住你而家只係預覽緊你定義嘅JSON。\n佢嘅內容重未儲存!</strong>",
        "sitejspreview": "'''記住你而家只係預覽呢段 JavaScript 代碼。'''\n'''佢嘅內容重未儲存!'''",
-       "userinvalidconfigtitle": "'''警告:''' 無叫做 \"$1\" 嘅畫面。請記住自訂介面的 .css 和 .js 頁面時應使用細楷,例如:{{ns:user}}:Foo/vector.css 而唔係 {{ns:user}}:Foo/Vector.css 。",
+       "userinvalidconfigtitle": "<strong>警告:</strong> 無叫做「$1」嘅畫面。請記住自訂介面嘅.css, .json同.js頁面時應該用細楷,例如:{{ns:user}}:Foo/vector.css 而唔係 {{ns:user}}:Foo/Vector.css 。",
        "updated": "(己更新)",
        "note": "'''留意:'''",
        "previewnote": "'''請記住呢個只係預覽。'''\n更改嘅内容重未儲存!",
        "longpageerror": "<strong>出錯:你所遞交嘅文字係有 {{PLURAL:$1|1 KB|$1 KB}} 咁長,長過最大嘅 {{PLURAL:$2|1 KB|$2 KB}}。</strong>\n儲唔到你遞交嘅文字。",
        "readonlywarning": "<strong>警告:資料庫已經鎖住咗去做定期保養。而家你唔可以儲起你嘅編輯。</strong>\n你可以儲啲文字落一份文字檔先。\n\n鎖資料庫嘅系統管理員畀嘅解釋: $1",
        "protectedpagewarning": "'''警告:呢版已經受到保護,只有管理員權限嘅用戶先至可以改。'''\n最近嘅日誌響下面提供以便參考:",
-       "semiprotectedpagewarning": "'''注意:'''呢一頁已經保護咗,只有已經註冊嘅用戶先至可以改。\n最近嘅日誌響下面提供以便參考:",
+       "semiprotectedpagewarning": "<strong>注意:</strong>呢一頁已經保護咗,只有自動確認咗嘅用戶先至可以改。\n最近嘅日誌喺下面提供以便參考:",
        "cascadeprotectedwarning": "<strong>警告:</strong>呢一頁已經保護咗,凈得[[Special:ListGroupRights|有指定權限]]嘅用戶先至可以改,因為佢係響以下連串保護嘅{{PLURAL:$1|一|幾}}頁度包含咗:",
        "titleprotectedwarning": "'''警告:呢一版已經保護咗,需要一啲[[Special:ListGroupRights|指定權限]]先至可以開到。'''\n最近嘅日誌響下面提供以便參考:",
        "templatesused": "呢版用嘅{{PLURAL:$1|模}}:",
        "content-model-css": "層疊樣式表",
        "content-json-empty-object": "吉嘅嘢",
        "content-json-empty-array": "吉嘅陣列",
+       "deprecated-self-close-category": "用無效自己閂嘅HTML標籤嘅頁面",
        "duplicate-args-warning": "<strong>警告:</strong> [[:$1]]調用咗[[:$2]]並且指定咗多過一個值畀「$3」呢個參數,祇有最後一次指定嘅值會用到。",
        "duplicate-args-category": "模用重複參數嘅版面",
        "duplicate-args-category-desc": "呢版調用模嗰陣用咗重複嘅參數,好似<code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code>或者<code><nowiki>{{foo|bar|1=baz}}</nowiki></code>噉。",
        "prefs-files": "檔案",
        "prefs-custom-css": "自定 CSS",
        "prefs-custom-js": "自定 JavaScript",
-       "prefs-common-config": "共有嘅CSS同埋JavaScript畀所有畫面用:",
+       "prefs-common-config": "共有嘅CSS、JSON同埋JavaScript畀所有畫面用:",
        "prefs-reset-intro": "你可以用呢版去重設你嘅喜好設定到網站預設值。呢個動作無得番轉頭。",
        "prefs-emailconfirm-label": "電郵確認:",
        "youremail": "電郵:",
        "grant-createaccount": "開戶口",
        "grant-createeditmovepage": "開版、改版同搬版",
        "grant-delete": "刪版、修訂同日誌紀錄",
-       "grant-editinterface": "改 MediaWiki 名空間同用戶 CSS/JavaScript",
-       "grant-editmycssjs": "改你嘅用戶 CSS/JavaScript",
+       "grant-editinterface": "改 MediaWiki 空間名同用戶 CSS/JSON/JavaScript",
+       "grant-editmycssjs": "改你嘅用戶CSS/JSON/JavaScript",
        "grant-editmyoptions": "改你嘅用戶設定",
        "grant-editmywatchlist": "改你嘅監視清單",
        "grant-editpage": "改已經有嘅版",
        "rcfilters-filter-humans-label": "人類(唔係機械人)",
        "rcfilters-filter-humans-description": "真人做嘅編輯",
        "rcfilters-filtergroup-reviewstatus": "巡查狀態",
-       "rcfilters-filter-patrolled-label": "巡查咗",
-       "rcfilters-filter-patrolled-description": "標識咗巡查過嘅改動。",
-       "rcfilters-filter-unpatrolled-label": "未巡查",
-       "rcfilters-filter-unpatrolled-description": "未標識巡查過嘅改動。",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "未巡查",
        "rcfilters-filtergroup-significance": "顯著度",
        "rcfilters-filter-minor-label": "細編輯",
        "rcfilters-filter-minor-description": "作者話程度細嘅修改。",
        "unblockip": "解封用戶",
        "unblockiptext": "使用以下表格恢復之前阻止嘅某個IP地址或者某個用戶名嘅寫權限。",
        "ipusubmit": "拎走呢個封鎖",
-       "unblocked": "\"[[User:$1|$1]]\"已經解封",
+       "unblocked": "\"[[User:$1|$1]]\"已經解封",
        "unblocked-range": "$1 已經解鎖咗。",
        "unblocked-id": "$1嘅封鎖已經拎走咗",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] 已經解鎖咗。",
        "expandtemplates": "展開模",
        "expand_templates_intro": "呢個特別頁係用於將一啲文字中嘅模展開,包括響個模度引用嘅模。\n同時亦都展開解譯器函數好似\n<code><nowiki>{{</nowiki>#language:...}}</code>,同埋一啲變數好似\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>。\n實際上,幾乎所有響雙括弧中嘅內容都會被展開。",
        "expand_templates_title": "內容標題,用於 {{FULLPAGENAME}} 等頁面:",
-       "expand_templates_input": "輸入文字:",
+       "expand_templates_input": "輸入wiki文字:",
        "expand_templates_output": "結果:",
        "expand_templates_xml_output": "XML輸出",
        "expand_templates_html_output": "原始HTML輸出",
index 7f1d07d..00f4e0f 100644 (file)
@@ -10,7 +10,9 @@
                        "Brahim-essaidi"
                ]
        },
+       "tog-underline": "ⵉⵣⵔⵉⵔⴳ ⴷⴷⵓ ⵓⵙⵖⵏ",
        "tog-hideminor": "ⵙⵙⵏⵜⵍ ⵜⵉⵙⵏⴼⵉⵍⵉⵏ ⵜⵉⵎⵥⵥⴰⵏⵉⵏ ⵙⴳ ⵉⵙⵏⴼⵍⵏ ⵉⵏⴳⴳⵓⵔⴰ",
+       "tog-hidecategorization": "ⵙⵙⵏⵜⵍ ⴰⵙⵎⵉⵍ ⵏ ⵜⴰⵙⵏⵉⵡⵉⵏ",
        "tog-minordefault": "ⵕⵛⵎ ⵎⴰⵕⵕⴰ ⵉⵙⵏⴼⵍⵏ ⵎⵥⵥⵉⵢⵏⵉⵏ ⵙ ⵓⵡⵏⵓⵍ",
        "tog-ccmeonemails": "ⴰⵣⵏ ⵉⵢⵉ ⴷ ⵜⵓⵏⵖⵉⵍⵉⵏ ⵏ ⵉⵎⴰⵢⵍⵏ ⵏⵏⴰ ⵓⵣⵏⵖ ⵉ ⵉⵎⵙⵙⵎⵔⵙⵏ ⵢⴰⴹⵏ",
        "tog-diffonly": "ⴰⴷ ⵓⵔ ⵜⵙⵙⴽⴷ ⵜⵓⵎⴰⵢⵜ ⵏ ⵜⴰⵙⵏⴰ ⴷⴷⵓ ⵉⵎⵣⴰⵔⴰⵢⵏ",
@@ -89,6 +91,7 @@
        "category-subcat-count": "{{PLURAL:$2|ⴰⵙⵎⵉⵍ ⴰⴷ ⴷⵉⴳⵙ ⵖⴰⵙ ⵉⴷⵓⵙⵎⵉⵍⵏ ⴰⴷ.|ⴰⵙⵎⵉⵍ ⴰⴷ ⴷⵉⴳⵙ {{PLURAL:$1|ⴰⴷⵓⵙⵎⵉⵍ ⴰⴷ |$1 ⵉⴷⵓⵙⵎⵉⵍⵏ ⴰⴷ}}, ⵙⴳ $2 ⴳ ⵓⵖⵔⵓⴷ.}}",
        "category-article-count": "{{PLURAL:$2|ⴰⵙⵎⵉⵍ ⴰⴷ ⵢⵓⵎⴰ ⵖⴰⵙ ⵜⴰⵙⵏⴰ ⴰⴷ {{PLURAL:$1|ⵜⴰⵙⵏⴰ ⴰⴷ ⵜⵍⵍⴰ|$1 ⵜⴰⵙⵏⵉⵡⵉⵏ ⴰⴷ ⵍⵍⴰⵏⵜ}} ⴳ ⵓⵙⵎⵉⵍ ⴰⴷ, ⵙⴳ $2 ⴳ ⵓⵖⵔⵓⴷ.}}",
        "listingcontinuesabbrev": "ⴹⴼⵓⵔ",
+       "broken-file-category": "ⵜⴰⵙⵏⵉⵡⵉⵏ ⴳ ⵍⵍⴰⵏ ⵉⵙⵖⵏⴻⵏ ⵏ ⵉⴼⵓⵢⵍⴰ ⵕⵥⴰⵏⵉⵏ",
        "about": "ⵅⴼ",
        "article": "ⵜⴰⵙⵏⴰ ⵏ ⵜⵓⵎⴰⵢⵜ",
        "newwindow": "(ⴰⴷ ⵉⵏⵏⵓⵔⵥⵎ ⴳ ⵓⵙⴽⵙⵍ ⴰⵎⴰⵢⵏⵓ)",
        "redirectedfrom": "(ⵓⵖⵓⵍ ⵙⴳ $1)",
        "redirectto": "ⵙⵏⵉⵍ ⵖⵔ:",
        "lastmodifiedat": "ⵜⵏⵏⴼⵍ ⵜⴰⵙⵏⴰ ⴰ ⵉ ⵜⵉⴽⴽⵍⵜ ⵜⴰⵎⴳⴳⴰⵔⵓⵜ ⴳ $1, ⴳ $2.",
+       "protectedpage": "ⵜⴰⵙⵏⴰ ⵉⵜⵜⵓⴼⵔⴰⴳⵏ",
        "jumpto": "ⵏⴹⵓ ⵖⵔ:",
        "jumptonavigation": "ⴰⵙⵜⴰⵔⴰ",
        "jumptosearch": "ⵔⵣⵓ",
        "newarticle": "(ⴰⵎⴰⵢⵏⵓ)",
        "newarticletext": "ⵜⴹⴼⴰⵔⴷ ⵢⴰⵏ ⵓⵙⵖⵏ ⵖⵔ ⵢⴰⵜ ⵜⴰⵙⵏⴰ ⵏⵏⴰ ⵓⵔ ⵜⴰ ⵉⵍⵍⵉⵏ. \nⴰⴼⴰⴷ ⴰⴷ ⵜⵙⵏⵓⵍⴼⵓⴷ ⵜⴰⵙⵏⴰ, ⵙⵙⵏⵜⵉ ⵜⵉⵔⵔⴰ ⴳ ⵓⴼⵏⵉⵇ ⴳ ⵉⵣⴷⴷⴰⵔ (ⵥⵔ [$1 ⵜⴰⵙⵏⴰ ⵏ ⵜⵡⵉⵙⵉ] ⵉ ⵡⵓⴳⴳⴰⵔ ⵏ ⵉⵏⵖⵎⵉⵙⵏ). \nⵎⴽ ⵜⵍⵍⵉⴷ ⴷⴰ ⵙ ⵓⵣⴳⴰⵍ, ⴰⴽⵍ ⵖⴼ <strong>ⴰⵖⵓⵍ</strong> ⴳ ⵓⵙⴰⵔⴰ ⵏⵏⴽ.",
        "noarticletext": "ⵓⵔ ⵉⵍⵍⵉ ⴽⵔⴰ ⵏ ⵓⴹⵔⵉⵙ ⴳ ⵜⴰⵙⵏⴰ ⴰⴷ ⵖⵉⵍⴰ. \nⵜⵣⵎⵔⴷ ⴰⴷ [[Special:Search/{{PAGENAME}}|ⵜⵔⵣⵓⴷ ⵖⴼ ⵓⵣⵡⵍ ⵏⵏⵙ]] ⴳ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵢⴰⴹⵏ, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ⵔⵣⵓ ⵖⴼ logs ⵖⵔⵙ ⵉⵇⵇⵏⴻⵏ],\nⵏⵖ [{{fullurl:{{FULLPAGENAME}}|action=edit}} ⵙⵏⵓⵍⴼⵓ ⵜⴰⵙⵏⴰ]</span>.",
+       "noarticletext-nopermission": "ⴷⵖⵉ ⵓⵔ ⵉⵍⵍⵉ ⴰⵡⴷ ⴽⵔⴰ ⵏ ⵓⴹⵔⵉⵚ ⴳ ⵜⴰⵙⵏⴰ ⴰ.\nⵜⵣⵎⵔⴷ ⴰⴷ [[Special:Search/{{PAGENAME}}|ⵜⵔⵣⵓⴷ ⵖⴼ ⵓⵣⵡⵍ ⵏⵏⵙ]] ⴳ ⵜⴰⵙⵏⵉⵡⵉⵏ ⵢⴰⴹⵏⵉⵏ, ⵏⵖ <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ⵔⵣⵓ ⵖⴼ ⵉⵣⵎⵎⴻⵎⵏ ⵉⵣⴷⵉⵏ]</span>, ⵎⴰⵛⴰ ⵓⵔ ⴷⴰⵔⴽ ⵜⵓⵔⴰⴳⵜ ⴰⴷ ⵜⵙⵏⵓⵍⴼⵓⴷ ⵜⴰⵙⵏⴰ ⴰ.",
        "userpage-userdoesnotexist-view": "ⴰⵎⵉⴹⴰⵏ ⵏ ⵓⵎⵙⵙⵎⵔⵙ $1 ⵓⵔ ⵉⵜⵜⵓⵣⵎⵎⴻⵎ.",
        "continue-editing": "ⴷⴷⵓ ⵙ ⴰⵏⵙⴰ ⵏ ⵓⵙⵏⴼⵍ",
        "editing": "ⴰⵙⵏⴼⵍ ⵏ $1",
        "template-protected": "(ⵉⵜⵜⵢⴰⵔⴰⵢ)",
        "template-semiprotected": "(ⵜⵎⵃⴹⴰ ⵙ ⵓⴳⵣⵎⴰⵏ)",
        "hiddencategories": "ⵜⴰⵙⵏⴰ ⴰ ⴷ ⴰⴳⵎⴰⵎ ⵏ {{PLURAL:$1|1 ⵏⵜⵍ ⴰⵙⵎⵉⵍ|$1 ⵏⵜⵍ ⵉⵙⵎⵉⵍⵏ}}:",
+       "permissionserrorstext-withaction": "ⵓⵔ ⴷⴰⵔⴽ ⵜⵓⵔⴰⴳⵜ ⴰⴼⴰⴷ ⴰⴷ $2, ⵙ {{PLURAL:$1|reason|reasons}}:",
        "content-model-wikitext": "wikitext",
        "currentrev-asof": "ⴰⵣⵣⵔⴰⵢ ⴰⵎⴳⴳⴰⵔⵓ ⴳ $1",
        "revisionasof": "ⵜⵓⵏⵖⵉⵍⵜ ⵏ $1",
        "searchresults-title": "ⵜⵉⵢⴰⴼⵓⵜⵉⵏ ⵏ ⵓⵔⵣⵣⵓ ⵖⴼ \"$1\"",
        "prevn": "{{PLURAL:$1|$1}} ⵉⵎⵣⵡⵓⵔⴰ",
        "nextn": "{{PLURAL:$1|$1}} ⴰⵎⴹⴼⵉⵔ",
+       "nextn-title": "$1 ⵏ {{PLURAL:$1|ⵜⴰⵢⴼⵓⵜ|ⵜⵉⵢⴰⴼⵓⵜⵉⵏ}} ⵢⴰⴹⵏ",
        "shown-title": "ⵙⵎⴰⵍ $1 {{PLURAL:$1|ⵜⵢⴰⴼⵓⵜ|ⵜⵢⴰⴼⵓⵜⵉⵏ}} ⵉ ⵜⴰⵙⵏⴰ",
        "viewprevnext": "ⵥⵕ ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchmenu-new": "<strong>ⵙⵏⵓⵍⴼⵓ ⵜⴰⵙⵏⴰ \"[[:$1]]\" ⴳ ⵓⵡⵉⴽⵉ ⴰⴷ!</strong> {{PLURAL:$2|0=|ⵥⵔ ⴰⵍⵜⵓ ⵜⴰⵙⵏⴰ ⵏⵏⴰ ⵢⵓⴼⴰ ⵓⵔⵣⵣⵓ ⵏⵏⴽ.|ⵥⵔ ⴰⵍⵜⵓ ⵜⵉⵢⴰⴼⵓⵜⵉⵏ ⵏ ⵓⵔⵣⵣⵓ.}}",
        "searchprofile-articles": "ⵜⴰⵙⵏⵉⵡⵉⵏ ⵏ ⵜⵓⵎⴰⵢⵜ",
        "searchprofile-images": "ⵎⵓⵍⵜⵉⵎⵉⴷⵢⴰ",
        "searchprofile-everything": "ⴽⵓ ⵜⴰⵖⴰⵡⵙⴰ",
        "exif-xresolution": "ⵜⵉⵙⴷⴷⵉ ⵜⴰⵛⴰⵛⴼⴰⵍⵜ",
        "exif-yresolution": "ⵜⵉⵙⴷⴷⵉ ⵜⴰⴱⴷⴷⴰⵢⵜ",
        "exif-datetime": "ⴰⵙⴰⴽⵓⴷ ⴷ ⵡⴰⴽⵓⴷ ⵏ ⵓⵙⵏⴼⵍ ⵏ ⵓⴼⴰⵢⵍⵓ",
+       "exif-model": "ⴰⵏⴰⵡ ⵏ ⵜⵙⵡⵍⴰⴼⵜ",
        "exif-colorspace": "ⵜⵉⵔⵉⵡⵜ ⵏ ⵓⴽⵍⵓ",
        "exif-languagecode": "ⵜⵓⵜⵍⴰⵢⵜ",
+       "exif-orientation-1": "ⴰⵎⴳⵏⵓ",
        "exif-dc-contributor": "ⵉⵏⴰⵎⵓⵜⵏ",
        "exif-iimcategory-edu": "ⴰⵙⴳⵎⵉ",
        "exif-iimcategory-hth": "ⵜⴰⴷⵓⵙⵉ",
index ea8c367..f1ed0f4 100644 (file)
        "rcfilters-filter-humans-label": "人工(非机器人)",
        "rcfilters-filter-humans-description": "由人类编辑者做出的编辑。",
        "rcfilters-filtergroup-reviewstatus": "巡查状态",
-       "rcfilters-filter-patrolled-label": "已巡查",
-       "rcfilters-filter-patrolled-description": "已将编辑标记为已巡查。",
-       "rcfilters-filter-unpatrolled-label": "未巡查",
-       "rcfilters-filter-unpatrolled-description": "编辑未标记为已巡查。",
+       "rcfilters-filter-reviewstatus-unpatrolled-description": "并未手动或自动标记为巡查的编辑。",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "未巡查",
+       "rcfilters-filter-reviewstatus-manual-description": "手动标记为巡查的编辑。",
+       "rcfilters-filter-reviewstatus-manual-label": "手动巡查",
+       "rcfilters-filter-reviewstatus-auto-description": "由高级用户做出的编辑,他们的编辑可以自动标记为巡查。",
+       "rcfilters-filter-reviewstatus-auto-label": "自动巡查",
        "rcfilters-filtergroup-significance": "意义",
        "rcfilters-filter-minor-label": "小编辑",
        "rcfilters-filter-minor-description": "作者已标记为小编辑的编辑。",
        "version-specialpages": "特殊页面",
        "version-parserhooks": "解析器钩",
        "version-variables": "变量",
+       "version-editors": "编辑者",
        "version-antispam": "垃圾阻止",
        "version-other": "其他",
        "version-mediahandlers": "媒体文件处理器",
index 96b2b2c..25e9de8 100644 (file)
        "rcfilters-filter-humans-label": "人工 (非機器人)",
        "rcfilters-filter-humans-description": "由人類編輯者做出的編輯",
        "rcfilters-filtergroup-reviewstatus": "審查狀態",
-       "rcfilters-filter-patrolled-label": "已巡查",
-       "rcfilters-filter-patrolled-description": "標記為己巡查的編輯。",
-       "rcfilters-filter-unpatrolled-label": "未巡查",
-       "rcfilters-filter-unpatrolled-description": "未被標示為已巡查的編輯。",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "未巡查",
        "rcfilters-filtergroup-significance": "重要性",
        "rcfilters-filter-minor-label": "次要編輯",
        "rcfilters-filter-minor-description": "作者已標示為次要的編輯。",
index 9685177..13fee9c 100644 (file)
@@ -35,6 +35,10 @@ use Wikimedia\Rdbms\DBReplicationWaitError;
 
 // Define this so scripts can easily find doMaintenance.php
 define( 'RUN_MAINTENANCE_IF_MAIN', __DIR__ . '/doMaintenance.php' );
+
+/**
+ * @deprecated since 1.31
+ */
 define( 'DO_MAINTENANCE', RUN_MAINTENANCE_IF_MAIN ); // original name, harmless
 
 $maintClass = false;
@@ -1211,6 +1215,12 @@ abstract class Maintenance {
                        }
                        define( 'MW_DB', $bits[0] );
                        define( 'MW_PREFIX', $bits[1] );
+               } elseif ( isset( $this->mOptions['server'] ) ) {
+                       // Provide the option for site admins to detect and configure
+                       // multiple wikis based on server names. This offers --server
+                       // as alternative to --wiki.
+                       // See https://www.mediawiki.org/wiki/Manual:Wiki_family
+                       $_SERVER['SERVER_NAME'] = $this->mOptions['server'];
                }
 
                if ( !is_readable( $settingsFile ) ) {
@@ -1218,9 +1228,6 @@ abstract class Maintenance {
                                "must exist and be readable in the source directory.\n" .
                                "Use --conf to specify it." );
                }
-               if ( isset( $this->mOptions['server'] ) ) {
-                       $_SERVER['SERVER_NAME'] = $this->mOptions['server'];
-               }
                $wgCommandLineMode = true;
 
                return $settingsFile;
index ea5835d..2468c71 100644 (file)
        min-width: 20em;
 }
 
+/* Hide empty live-log textarea */
+#config-live-log textarea:empty {
+       display: none;
+}
+
 /* tooltip styles */
 .config-help-field-hint {
        display: none;
index c33fb74..a282d69 100644 (file)
@@ -5,7 +5,7 @@
     "qunit": "grunt qunit",
     "doc": "jsduck",
     "postdoc": "grunt copy:jsduck",
-    "selenium": "killall -0 chromedriver 2>/dev/null || chromedriver --url-base=/wd/hub --port=4444 & grunt webdriver:test; killall chromedriver"
+    "selenium": "./tests/selenium/selenium.sh"
   },
   "devDependencies": {
     "bluebird": "3.5.1",
index ff8064a..1f9f8d6 100644 (file)
   font-weight: bold;
 }
 .oo-ui-pendingElement-pending {
-  background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
+  background-image: /* @embed */ url(themes/wikimediaui/images/textures/pending.gif);
 }
 .oo-ui-fieldLayout {
   display: block;
index 551e840..9dd3521 100644 (file)
@@ -9,7 +9,7 @@
  * Date: 2018-04-10T22:15:43Z
  */
 .oo-ui-actionWidget.oo-ui-pendingElement-pending {
-  background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
+  background-image: /* @embed */ url(themes/wikimediaui/images/textures/pending.gif);
 }
 .oo-ui-window {
   background-color: transparent;
index 2e5efba..693cd7f 100644 (file)
@@ -6,6 +6,12 @@
        -ms-user-select: none;
        user-select: none;
 }
+.mw-collapsible-toggle:before {
+       content: '[';
+}
+.mw-collapsible-toggle:after {
+       content: ']';
+}
 /* Align the toggle based on the direction of the content language */
 /* @noflip */
 .mw-content-ltr .mw-collapsible-toggle,
index aa76d6d..7826bab 100644 (file)
@@ -8,7 +8,6 @@
  * @class jQuery.plugin.makeCollapsible
  */
 ( function ( $, mw ) {
-
        /**
         * Handler for a click on a collapsible toggler.
         *
                                                role: 'button',
                                                tabindex: 0
                                        } )
-                                       .prepend( '<span>[</span>' )
-                                       .append( '<span>]</span>' )
                                        .on( 'click.mw-collapsible keypress.mw-collapsible', actionHandler );
                        };
 
index 7d49a09..76d4bfb 100644 (file)
@@ -51,6 +51,9 @@
                // Parent constructor
                mw.widgets.TitleOptionWidget.parent.call( this, config );
 
+               // Remove check icon
+               this.checkIcon.$element.remove();
+
                // Initialization
                this.$label.attr( 'href', config.url );
                this.$element.addClass( 'mw-widget-titleOptionWidget' );
index 56ee2df..10e853b 100644 (file)
@@ -64,6 +64,7 @@ $wgAutoloadClasses += [
        'LessFileCompilationTest' => "$testDir/phpunit/LessFileCompilationTest.php",
        'MediaWikiCoversValidator' => "$testDir/phpunit/MediaWikiCoversValidator.php",
        'PHPUnit4And6Compat' => "$testDir/phpunit/PHPUnit4And6Compat.php",
+       'HamcrestPHPUnitIntegration' => "$testDir/phpunit/HamcrestPHPUnitIntegration.php",
 
        # tests/phpunit/includes
        'RevisionDbTestBase' => "$testDir/phpunit/includes/RevisionDbTestBase.php",
index 28335ec..844a43f 100644 (file)
@@ -615,9 +615,13 @@ class ParserTestRunner {
                        return false;
                } );// hooks::register
 
+               // Reset the service in case any other tests already cached some prefixes.
+               MediaWikiServices::getInstance()->resetServiceForTesting( 'InterwikiLookup' );
+
                return function () {
                        // Tear down
                        Hooks::clear( 'InterwikiLoadPrefix' );
+                       MediaWikiServices::getInstance()->resetServiceForTesting( 'InterwikiLookup' );
                };
        }
 
index 84132b9..71ebd6f 100644 (file)
@@ -38,6 +38,10 @@ return [
                function_exists( 'tideways_enable' ) ? [] : [ 'tests/phan/stubs/tideways.php' ],
                class_exists( PEAR::class ) ? [] : [ 'tests/phan/stubs/mail.php' ],
                class_exists( Memcached::class ) ? [] : [ 'tests/phan/stubs/memcached.php' ],
+               // Per composer.json, PHPUnit 6 is used for PHP 7.0+, PHPUnit 4 otherwise.
+               // Load the interface for the version of PHPUnit that isn't installed.
+               // Phan only supports PHP 7.0+ (and not HHVM), so we only need to stub PHPUnit 4.
+               class_exists( PHPUnit_TextUI_Command::class ) ? [] : [ 'tests/phan/stubs/phpunit4.php' ],
                [
                        'maintenance/7zip.inc',
                        'maintenance/backup.inc',
diff --git a/tests/phan/stubs/phpunit4.php b/tests/phan/stubs/phpunit4.php
new file mode 100644 (file)
index 0000000..e5e88e6
--- /dev/null
@@ -0,0 +1,11 @@
+<?php
+
+/**
+ * Some old classes from PHPUnit 4 that MediaWiki (conditionally) references.
+ *
+ * phpcs:ignoreFile
+ */
+
+class PHPUnit_TextUI_Command {
+
+}
index bd4ed63..02bcd1f 100644 (file)
  */
 function wikidiff2_do_diff( $text1, $text2, $numContextLines, $movedParagraphDetectionCutoff = 0 ) {
 }
+
+/**
+ * @param string $text1
+ * @param string $text2
+ * @param int $numContextLines
+ * @param int $maxMovedLines
+ * @return string
+ */
+function wikidiff2_inline_diff( $text1, $text2, $numContextLines, $maxMovedLines = 25 ) {
+}
diff --git a/tests/phpunit/HamcrestPHPUnitIntegration.php b/tests/phpunit/HamcrestPHPUnitIntegration.php
new file mode 100644 (file)
index 0000000..def08ff
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+/**
+ * Copyright (C) 2018 Kunal Mehta <legoktm@member.fsf.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+/**
+ * @since 1.31
+ */
+trait HamcrestPHPUnitIntegration {
+
+       /**
+        * Wrapper around Hamcrest's assertThat, which marks the assertion
+        * for PHPUnit so the test is not marked as risky
+        */
+       public function assertThatHamcrest( /* ... */ ) {
+               call_user_func_array( 'assertThat', func_get_args() );
+               $this->addToAssertionCount( 1 );
+       }
+}
index 8b2d099..87ca918 100644 (file)
@@ -1570,7 +1570,7 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase {
                                        $db->delete( $tbl, '*', __METHOD__ );
                                }
 
-                               if ( $db->getType() === 'postgres' ) {
+                               if ( in_array( $db->getType(), [ 'postgres', 'sqlite' ], true ) ) {
                                        // Reset the table's sequence too.
                                        $db->resetSequenceForTable( $tbl, __METHOD__ );
                                }
index ac2c4f5..672ab4a 100644 (file)
@@ -30,7 +30,9 @@ trait PHPUnit4And6Compat {
         */
        public function setExpectedException( $name, $message = '', $code = null ) {
                if ( is_callable( [ $this, 'expectException' ] ) ) {
-                       $this->expectException( $name );
+                       if ( $name !== null ) {
+                               $this->expectException( $name );
+                       }
                        if ( $message !== '' ) {
                                $this->expectExceptionMessage( $message );
                        }
index 2e93f36..03588ae 100644 (file)
@@ -178,6 +178,9 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
 
                MediaWikiServices::forceGlobalInstance( $oldServices );
                $newServices->destroy();
+
+               // No exception was thrown, avoid being risky
+               $this->assertTrue( true );
        }
 
        public function testResetChildProcessServices() {
index 5276a14..0cd164b 100644 (file)
@@ -257,7 +257,7 @@ class NameTableStoreTest extends MediaWikiTestCase {
                $store->getMap();
                $table = $store->getMap();
 
-               $expected = [ 2 => 'bar', 1 => 'foo' ];
+               $expected = [ 1 => 'foo', 2 => 'bar' ];
                $this->assertSame( $expected, $table );
                // Make sure the table returned is the same as the cached table
                $this->assertSame( $expected, TestingAccessWrapper::newFromObject( $store )->tableCache );
index 4818b49..0c178ca 100644 (file)
@@ -107,4 +107,19 @@ class TestUserRegistry {
        public static function clear() {
                self::$testUsers = [];
        }
+
+       /**
+        * @todo It would be nice if this were a non-static method of TestUser
+        * instead, but that doesn't seem possible without friends?
+        *
+        * @return bool True if it's safe to modify the user
+        */
+       public static function isMutable( User $user ) {
+               foreach ( self::$testUsers as $key => $testUser ) {
+                       if ( $user === $testUser->getUser() ) {
+                               return false;
+                       }
+               }
+               return true;
+       }
 }
index 8ffe4fc..d17334b 100644 (file)
@@ -46,7 +46,7 @@ class ApiMainTest extends ApiTestCase {
         */
        private function getNonInternalApiMain( array $requestData, array $headers = [] ) {
                $req = $this->getMockBuilder( WebRequest::class )
-                       ->setMethods( [ 'response', 'getIP' ] )
+                       ->setMethods( [ 'response', 'getRawIP' ] )
                        ->getMock();
                $response = new FauxResponse();
                $req->method( 'response' )->willReturn( $response );
index e236437..a04271f 100644 (file)
@@ -13,48 +13,136 @@ class ApiParseTest extends ApiTestCase {
        protected static $revIds = [];
 
        public function addDBDataOnce() {
-               $user = static::getTestSysop()->getUser();
                $title = Title::newFromText( __CLASS__ );
-               $page = WikiPage::factory( $title );
 
-               $status = $page->doEditContent(
-                       ContentHandler::makeContent( 'Test for revdel', $title, CONTENT_MODEL_WIKITEXT ),
-                       __METHOD__ . ' Test for revdel', 0, false, $user
-               );
-               if ( !$status->isOK() ) {
-                       $this->fail( "Failed to create $title: " . $status->getWikiText( false, false, 'en' ) );
-               }
+               $status = $this->editPage( __CLASS__, 'Test for revdel' );
                self::$pageId = $status->value['revision']->getPage();
                self::$revIds['revdel'] = $status->value['revision']->getId();
 
-               $status = $page->doEditContent(
-                       ContentHandler::makeContent( 'Test for oldid', $title, CONTENT_MODEL_WIKITEXT ),
-                       __METHOD__ . ' Test for oldid', 0, false, $user
-               );
-               if ( !$status->isOK() ) {
-                       $this->fail( "Failed to edit $title: " . $status->getWikiText( false, false, 'en' ) );
-               }
+               $status = $this->editPage( __CLASS__, 'Test for suppressed' );
+               self::$revIds['suppressed'] = $status->value['revision']->getId();
+
+               $status = $this->editPage( __CLASS__, 'Test for oldid' );
                self::$revIds['oldid'] = $status->value['revision']->getId();
 
-               $status = $page->doEditContent(
-                       ContentHandler::makeContent( 'Test for latest', $title, CONTENT_MODEL_WIKITEXT ),
-                       __METHOD__ . ' Test for latest', 0, false, $user
+               $status = $this->editPage( __CLASS__, 'Test for latest' );
+               self::$revIds['latest'] = $status->value['revision']->getId();
+
+               $this->revisionDelete( self::$revIds['revdel'] );
+               $this->revisionDelete(
+                       self::$revIds['suppressed'],
+                       [ Revision::DELETED_TEXT => 1, Revision::DELETED_RESTRICTED => 1 ]
                );
-               if ( !$status->isOK() ) {
-                       $this->fail( "Failed to edit $title: " . $status->getWikiText( false, false, 'en' ) );
+
+               Title::clearCaches(); // Otherwise it has the wrong latest revision for some reason
+       }
+
+       /**
+        * Assert that the given result of calling $this->doApiRequest() with
+        * action=parse resulted in $html, accounting for the boilerplate that the
+        * parser adds around the parsed page.  Also asserts that warnings match
+        * the provided $warning.
+        *
+        * @param string $html Expected HTML
+        * @param array $res Returned from doApiRequest()
+        * @param string|null $warnings Exact value of expected warnings, null for
+        *   no warnings
+        */
+       protected function assertParsedTo( $expected, array $res, $warnings = null ) {
+               $this->doAssertParsedTo( $expected, $res, $warnings, [ $this, 'assertSame' ] );
+       }
+
+       /**
+        * Same as above, but asserts that the HTML matches a regexp instead of a
+        * literal string match.
+        *
+        * @param string $html Expected HTML
+        * @param array $res Returned from doApiRequest()
+        * @param string|null $warnings Exact value of expected warnings, null for
+        *   no warnings
+        */
+       protected function assertParsedToRegExp( $expected, array $res, $warnings = null ) {
+               $this->doAssertParsedTo( $expected, $res, $warnings, [ $this, 'assertRegExp' ] );
+       }
+
+       private function doAssertParsedTo( $expected, array $res, $warnings, callable $callback ) {
+               $html = $res[0]['parse']['text'];
+
+               $expectedStart = '<div class="mw-parser-output">';
+               $this->assertSame( $expectedStart, substr( $html, 0, strlen( $expectedStart ) ) );
+
+               $html = substr( $html, strlen( $expectedStart ) );
+
+               if ( $res[1]->getBool( 'disablelimitreport' ) ) {
+                       $expectedEnd = "</div>";
+                       $this->assertSame( $expectedEnd, substr( $html, -strlen( $expectedEnd ) ) );
+
+                       $html = substr( $html, 0, strlen( $html ) - strlen( $expectedEnd ) );
+               } else {
+                       $expectedEnd = '#\n<!-- \nNewPP limit report\n(?>.+?\n-->)\n' .
+                               '<!--\nTransclusion expansion time report \(%,ms,calls,template\)\n(?>.*?\n-->)\n' .
+                               '</div>(\n<!-- Saved in parser cache (?>.*?\n -->)\n)?$#s';
+                       $this->assertRegExp( $expectedEnd, $html );
+
+                       $html = preg_replace( $expectedEnd, '', $html );
                }
-               self::$revIds['latest'] = $status->value['revision']->getId();
 
-               RevisionDeleter::createList(
-                       'revision', RequestContext::getMain(), $title, [ self::$revIds['revdel'] ]
-               )->setVisibility( [
-                       'value' => [
-                               Revision::DELETED_TEXT => 1,
+               call_user_func( $callback, $expected, $html );
+
+               if ( $warnings === null ) {
+                       $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'] );
+               }
+       }
+
+       /**
+        * Set up an interwiki entry for testing.
+        */
+       protected function setupInterwiki() {
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->insert(
+                       'interwiki',
+                       [
+                               'iw_prefix' => 'madeuplanguage',
+                               'iw_url' => "https://example.com/wiki/$1",
+                               'iw_api' => '',
+                               'iw_wikiid' => '',
+                               'iw_local' => false,
                        ],
-                       'comment' => 'Test for revdel',
-               ] );
+                       __METHOD__,
+                       'IGNORE'
+               );
 
-               Title::clearCaches(); // Otherwise it has the wrong latest revision for some reason
+               $this->setMwGlobals( 'wgExtraInterlanguageLinkPrefixes', [ 'madeuplanguage' ] );
+               $this->tablesUsed[] = 'interwiki';
+       }
+
+       /**
+        * Set up a skin for testing.
+        *
+        * @todo Should this code be in MediaWikiTestCase or something?
+        */
+       protected function setupSkin() {
+               $factory = new SkinFactory();
+               $factory->register( 'testing', 'Testing', function () {
+                       $skin = $this->getMockBuilder( SkinFallback::class )
+                               ->setMethods( [ 'getDefaultModules', 'setupSkinUserCss' ] )
+                               ->getMock();
+                       $skin->expects( $this->once() )->method( 'getDefaultModules' )
+                               ->willReturn( [
+                                       'core' => [ 'foo', 'bar' ],
+                                       'content' => [ 'baz' ]
+                               ] );
+                       $skin->expects( $this->once() )->method( 'setupSkinUserCss' )
+                               ->will( $this->returnCallback( function ( OutputPage $out ) {
+                                       $out->addModuleStyles( 'foo.styles' );
+                               } ) );
+                       return $skin;
+               } );
+               $this->setService( 'SkinFactory', $factory );
        }
 
        public function testParseByName() {
@@ -62,14 +150,14 @@ class ApiParseTest extends ApiTestCase {
                        'action' => 'parse',
                        'page' => __CLASS__,
                ] );
-               $this->assertContains( 'Test for latest', $res[0]['parse']['text'] );
+               $this->assertParsedTo( "<p>Test for latest\n</p>", $res );
 
                $res = $this->doApiRequest( [
                        'action' => 'parse',
                        'page' => __CLASS__,
                        'disablelimitreport' => 1,
                ] );
-               $this->assertContains( 'Test for latest', $res[0]['parse']['text'] );
+               $this->assertParsedTo( "<p>Test for latest\n</p>", $res );
        }
 
        public function testParseById() {
@@ -77,7 +165,7 @@ class ApiParseTest extends ApiTestCase {
                        'action' => 'parse',
                        'pageid' => self::$pageId,
                ] );
-               $this->assertContains( 'Test for latest', $res[0]['parse']['text'] );
+               $this->assertParsedTo( "<p>Test for latest\n</p>", $res );
        }
 
        public function testParseByOldId() {
@@ -85,36 +173,46 @@ class ApiParseTest extends ApiTestCase {
                        'action' => 'parse',
                        'oldid' => self::$revIds['oldid'],
                ] );
-               $this->assertContains( 'Test for oldid', $res[0]['parse']['text'] );
+               $this->assertParsedTo( "<p>Test for oldid\n</p>", $res );
                $this->assertArrayNotHasKey( 'textdeleted', $res[0]['parse'] );
                $this->assertArrayNotHasKey( 'textsuppressed', $res[0]['parse'] );
        }
 
-       public function testParseRevDel() {
-               $user = static::getTestUser()->getUser();
-               $sysop = static::getTestSysop()->getUser();
-
-               try {
-                       $this->doApiRequest( [
-                               'action' => 'parse',
-                               'oldid' => self::$revIds['revdel'],
-                       ], null, null, $user );
-                       $this->fail( "API did not return an error as expected" );
-               } catch ( ApiUsageException $ex ) {
-                       $this->assertTrue( ApiTestCase::apiExceptionHasCode( $ex, 'permissiondenied' ),
-                               "API failed with error 'permissiondenied'" );
-               }
-
+       public function testRevDel() {
                $res = $this->doApiRequest( [
                        'action' => 'parse',
                        'oldid' => self::$revIds['revdel'],
-               ], null, null, $sysop );
-               $this->assertContains( 'Test for revdel', $res[0]['parse']['text'] );
+               ] );
+
+               $this->assertParsedTo( "<p>Test for revdel\n</p>", $res );
                $this->assertArrayHasKey( 'textdeleted', $res[0]['parse'] );
                $this->assertArrayNotHasKey( 'textsuppressed', $res[0]['parse'] );
        }
 
-       public function testParseNonexistentPage() {
+       public function testRevDelNoPermission() {
+               $this->setExpectedException( ApiUsageException::class,
+                       "You don't have permission to view deleted revision text." );
+
+               $this->doApiRequest( [
+                       'action' => 'parse',
+                       'oldid' => self::$revIds['revdel'],
+               ], null, null, static::getTestUser()->getUser() );
+       }
+
+       public function testSuppressed() {
+               $this->setGroupPermissions( 'sysop', 'viewsuppressed', true );
+
+               $res = $this->doApiRequest( [
+                       'action' => 'parse',
+                       'oldid' => self::$revIds['suppressed']
+               ] );
+
+               $this->assertParsedTo( "<p>Test for suppressed\n</p>", $res );
+               $this->assertArrayHasKey( 'textsuppressed', $res[0]['parse'] );
+               $this->assertArrayHasKey( 'textdeleted', $res[0]['parse'] );
+       }
+
+       public function testNonexistentPage() {
                try {
                        $this->doApiRequest( [
                                'action' => 'parse',
@@ -130,24 +228,446 @@ class ApiParseTest extends ApiTestCase {
                }
        }
 
-       public function testSkinModules() {
-               $factory = new SkinFactory();
-               $factory->register( 'testing', 'Testing', function () {
-                       $skin = $this->getMockBuilder( SkinFallback::class )
-                               ->setMethods( [ 'getDefaultModules', 'setupSkinUserCss' ] )
-                               ->getMock();
-                       $skin->expects( $this->once() )->method( 'getDefaultModules' )
-                               ->willReturn( [
-                                       'core' => [ 'foo', 'bar' ],
-                                       'content' => [ 'baz' ]
-                               ] );
-                       $skin->expects( $this->once() )->method( 'setupSkinUserCss' )
-                               ->will( $this->returnCallback( function ( OutputPage $out ) {
-                                       $out->addModuleStyles( 'foo.styles' );
-                               } ) );
-                       return $skin;
-               } );
-               $this->setService( 'SkinFactory', $factory );
+       public function testTitleProvided() {
+               $res = $this->doApiRequest( [
+                       'action' => 'parse',
+                       'title' => 'Some interesting page',
+                       'text' => '{{PAGENAME}} has attracted my attention',
+               ] );
+
+               $this->assertParsedTo( "<p>Some interesting page has attracted my attention\n</p>", $res );
+       }
+
+       public function testSection() {
+               $name = ucfirst( __FUNCTION__ );
+
+               $this->editPage( $name,
+                       "Intro\n\n== Section 1 ==\n\nContent 1\n\n== Section 2 ==\n\nContent 2" );
+
+               $res = $this->doApiRequest( [
+                       'action' => 'parse',
+                       'page' => $name,
+                       'section' => 1,
+               ] );
+
+               $this->assertParsedToRegExp( '!<h2>.*Section 1.*</h2>\n<p>Content 1\n</p>!', $res );
+       }
+
+       public function testInvalidSection() {
+               $this->setExpectedException( ApiUsageException::class,
+                       'The "section" parameter must be a valid section ID or "new".' );
+
+               $this->doApiRequest( [
+                       'action' => 'parse',
+                       'section' => 'T-new',
+               ] );
+       }
+
+       public function testSectionNoContent() {
+               $name = ucfirst( __FUNCTION__ );
+
+               $status = $this->editPage( $name,
+                       "Intro\n\n== Section 1 ==\n\nContent 1\n\n== Section 2 ==\n\nContent 2" );
+
+               $this->setExpectedException( ApiUsageException::class,
+                       "Missing content for page ID {$status->value['revision']->getPage()}." );
+
+               $this->db->delete( 'revision', [ 'rev_id' => $status->value['revision']->getId() ] );
+
+               // Suppress warning in WikiPage::getContentModel
+               Wikimedia\suppressWarnings();
+               try {
+                       $this->doApiRequest( [
+                               'action' => 'parse',
+                               'page' => $name,
+                               'section' => 1,
+                       ] );
+               } finally {
+                       Wikimedia\restoreWarnings();
+               }
+       }
+
+       public function testNewSectionWithPage() {
+               $this->setExpectedException( ApiUsageException::class,
+                       '"section=new" cannot be combined with the "oldid", "pageid" or "page" ' .
+                       'parameters. Please use "title" and "text".' );
+
+               $this->doApiRequest( [
+                       'action' => 'parse',
+                       'page' => __CLASS__,
+                       'section' => 'new',
+               ] );
+       }
+
+       public function testNonexistentOldId() {
+               $this->setExpectedException( ApiUsageException::class,
+                       'There is no revision with ID 2147483647.' );
+
+               $this->doApiRequest( [
+                       'action' => 'parse',
+                       'oldid' => pow( 2, 31 ) - 1,
+               ] );
+       }
+
+       public function testUnfollowedRedirect() {
+               $name = ucfirst( __FUNCTION__ );
+
+               $this->editPage( $name, "#REDIRECT [[$name 2]]" );
+               $this->editPage( "$name 2", "Some ''text''" );
+
+               $res = $this->doApiRequest( [
+                       'action' => 'parse',
+                       'page' => $name,
+               ] );
+
+               // Can't use assertParsedTo because the parser output is different for
+               // redirects
+               $this->assertRegExp( "/Redirect to:.*$name 2/", $res[0]['parse']['text'] );
+               $this->assertArrayNotHasKey( 'warnings', $res[0] );
+       }
+
+       public function testFollowedRedirect() {
+               $name = ucfirst( __FUNCTION__ );
+
+               $this->editPage( $name, "#REDIRECT [[$name 2]]" );
+               $this->editPage( "$name 2", "Some ''text''" );
+
+               $res = $this->doApiRequest( [
+                       'action' => 'parse',
+                       'page' => $name,
+                       'redirects' => true,
+               ] );
+
+               $this->assertParsedTo( "<p>Some <i>text</i>\n</p>", $res );
+       }
+
+       public function testFollowedRedirectById() {
+               $name = ucfirst( __FUNCTION__ );
+
+               $id = $this->editPage( $name, "#REDIRECT [[$name 2]]" )->value['revision']->getPage();
+               $this->editPage( "$name 2", "Some ''text''" );
+
+               $res = $this->doApiRequest( [
+                       'action' => 'parse',
+                       'pageid' => $id,
+                       'redirects' => true,
+               ] );
+
+               $this->assertParsedTo( "<p>Some <i>text</i>\n</p>", $res );
+       }
+
+       public function testInvalidTitle() {
+               $this->setExpectedException( ApiUsageException::class, 'Bad title "|".' );
+
+               $this->doApiRequest( [
+                       'action' => 'parse',
+                       'title' => '|',
+               ] );
+       }
+
+       public function testTitleWithNonexistentRevId() {
+               $this->setExpectedException( ApiUsageException::class,
+                       'There is no revision with ID 2147483647.' );
+
+               $this->doApiRequest( [
+                       'action' => 'parse',
+                       'title' => __CLASS__,
+                       'revid' => pow( 2, 31 ) - 1,
+               ] );
+       }
+
+       public function testTitleWithNonMatchingRevId() {
+               $name = ucfirst( __FUNCTION__ );
+
+               $res = $this->doApiRequest( [
+                       'action' => 'parse',
+                       'title' => $name,
+                       'revid' => self::$revIds['latest'],
+                       'text' => 'Some text',
+               ] );
+
+               $this->assertParsedTo( "<p>Some text\n</p>", $res,
+                       'r' . self::$revIds['latest'] . " is not a revision of $name." );
+       }
+
+       public function testRevId() {
+               $res = $this->doApiRequest( [
+                       'action' => 'parse',
+                       'revid' => self::$revIds['latest'],
+                       'text' => 'My revid is {{REVISIONID}}!',
+               ] );
+
+               $this->assertParsedTo( "<p>My revid is " . self::$revIds['latest'] . "!\n</p>", $res );
+       }
+
+       public function testTitleNoText() {
+               $res = $this->doApiRequest( [
+                       'action' => 'parse',
+                       'title' => 'Special:AllPages',
+               ] );
+
+               $this->assertParsedTo( '', $res,
+                       '"title" used without "text", and parsed page properties were requested. ' .
+                               'Did you mean to use "page" instead of "title"?' );
+       }
+
+       public function testRevidNoText() {
+               $res = $this->doApiRequest( [
+                       'action' => 'parse',
+                       'revid' => self::$revIds['latest'],
+               ] );
+
+               $this->assertParsedTo( '', $res,
+                       '"revid" used without "text", and parsed page properties were requested. ' .
+                               'Did you mean to use "oldid" instead of "revid"?' );
+       }
+
+       public function testTextNoContentModel() {
+               $res = $this->doApiRequest( [
+                       'action' => 'parse',
+                       'text' => "Some ''text''",
+               ] );
+
+               $this->assertParsedTo( "<p>Some <i>text</i>\n</p>", $res,
+                       'No "title" or "contentmodel" was given, assuming wikitext.' );
+       }
+
+       public function testSerializationError() {
+               $this->setExpectedException( APIUsageException::class,
+                       'Content serialization failed: Could not unserialize content' );
+
+               $this->mergeMwGlobalArrayValue( 'wgContentHandlers',
+                       [ 'testing-serialize-error' => 'DummySerializeErrorContentHandler' ] );
+
+               $this->doApiRequest( [
+                       'action' => 'parse',
+                       'text' => "Some ''text''",
+                       'contentmodel' => 'testing-serialize-error',
+               ] );
+       }
+
+       public function testNewSection() {
+               $res = $this->doApiRequest( [
+                       'action' => 'parse',
+                       'title' => __CLASS__,
+                       'section' => 'new',
+                       'sectiontitle' => 'Title',
+                       'text' => 'Content',
+               ] );
+
+               $this->assertParsedToRegExp( '!<h2>.*Title.*</h2>\n<p>Content\n</p>!', $res );
+       }
+
+       public function testExistingSection() {
+               $res = $this->doApiRequest( [
+                       'action' => 'parse',
+                       'title' => __CLASS__,
+                       'section' => 1,
+                       'text' => "Intro\n\n== Section 1 ==\n\nContent\n\n== Section 2 ==\n\nMore content",
+               ] );
+
+               $this->assertParsedToRegExp( '!<h2>.*Section 1.*</h2>\n<p>Content\n</p>!', $res );
+       }
+
+       public function testNoPst() {
+               $name = ucfirst( __FUNCTION__ );
+
+               $this->editPage( "Template:$name", "Template ''text''" );
+
+               $res = $this->doApiRequest( [
+                       'action' => 'parse',
+                       'text' => "{{subst:$name}}",
+                       'contentmodel' => 'wikitext',
+               ] );
+
+               $this->assertParsedTo( "<p>{{subst:$name}}\n</p>", $res );
+       }
+
+       public function testPst() {
+               $name = ucfirst( __FUNCTION__ );
+
+               $this->editPage( "Template:$name", "Template ''text''" );
+
+               $res = $this->doApiRequest( [
+                       'action' => 'parse',
+                       'pst' => '',
+                       'text' => "{{subst:$name}}",
+                       'contentmodel' => 'wikitext',
+                       'prop' => 'text|wikitext',
+               ] );
+
+               $this->assertParsedTo( "<p>Template <i>text</i>\n</p>", $res );
+               $this->assertSame( "{{subst:$name}}", $res[0]['parse']['wikitext'] );
+       }
+
+       public function testOnlyPst() {
+               $name = ucfirst( __FUNCTION__ );
+
+               $this->editPage( "Template:$name", "Template ''text''" );
+
+               $res = $this->doApiRequest( [
+                       'action' => 'parse',
+                       'onlypst' => '',
+                       'text' => "{{subst:$name}}",
+                       'contentmodel' => 'wikitext',
+                       'prop' => 'text|wikitext',
+                       'summary' => 'Summary',
+               ] );
+
+               $this->assertSame(
+                       [ 'parse' => [
+                               'text' => "Template ''text''",
+                               'wikitext' => "{{subst:$name}}",
+                               'parsedsummary' => 'Summary',
+                       ] ],
+                       $res[0]
+               );
+       }
+
+       public function testHeadHtml() {
+               $res = $this->doApiRequest( [
+                       'action' => 'parse',
+                       'page' => __CLASS__,
+                       'prop' => 'headhtml',
+               ] );
+
+               // Just do a rough sanity check
+               $this->assertRegExp( '#<!DOCTYPE.*<html.*<head.*</head>.*<body#s',
+                       $res[0]['parse']['headhtml'] );
+               $this->assertArrayNotHasKey( 'warnings', $res[0] );
+       }
+
+       public function testCategoriesHtml() {
+               $name = ucfirst( __FUNCTION__ );
+
+               $this->editPage( $name, "[[Category:$name]]" );
+
+               $res = $this->doApiRequest( [
+                       'action' => 'parse',
+                       'page' => $name,
+                       'prop' => 'categorieshtml',
+               ] );
+
+               $this->assertRegExp( "#Category.*Category:$name.*$name#",
+                       $res[0]['parse']['categorieshtml'] );
+               $this->assertArrayNotHasKey( 'warnings', $res[0] );
+       }
+
+       public function testEffectiveLangLinks() {
+               $hookRan = false;
+               $this->setTemporaryHook( 'LanguageLinks',
+                       function () use ( &$hookRan ) {
+                               $hookRan = true;
+                       }
+               );
+
+               $res = $this->doApiRequest( [
+                       'action' => 'parse',
+                       'title' => __CLASS__,
+                       'text' => '[[zh:' . __CLASS__ . ']]',
+                       'effectivelanglinks' => '',
+               ] );
+
+               $this->assertTrue( $hookRan );
+               $this->assertSame( 'The parameter "effectivelanglinks" has been deprecated.',
+                       $res[0]['warnings']['parse']['warnings'] );
+       }
+
+       /**
+        * @param array $arr Extra params to add to API request
+        */
+       private function doTestLangLinks( array $arr = [] ) {
+               $this->setupInterwiki();
+
+               $res = $this->doApiRequest( array_merge( [
+                       'action' => 'parse',
+                       'title' => 'Omelette',
+                       'text' => '[[madeuplanguage:Omelette]]',
+                       'prop' => 'langlinks',
+               ], $arr ) );
+
+               $langLinks = $res[0]['parse']['langlinks'];
+
+               $this->assertCount( 1, $langLinks );
+               $this->assertSame( 'madeuplanguage', $langLinks[0]['lang'] );
+               $this->assertSame( 'Omelette', $langLinks[0]['title'] );
+               $this->assertSame( 'https://example.com/wiki/Omelette', $langLinks[0]['url'] );
+               $this->assertArrayNotHasKey( 'warnings', $res[0] );
+       }
+
+       public function testLangLinks() {
+               $this->doTestLangLinks();
+       }
+
+       public function testLangLinksWithSkin() {
+               $this->setupSkin();
+               $this->doTestLangLinks( [ 'useskin' => 'testing' ] );
+       }
+
+       public function testHeadItems() {
+               $res = $this->doApiRequest( [
+                       'action' => 'parse',
+                       'title' => __CLASS__,
+                       'text' => '',
+                       'prop' => 'headitems',
+               ] );
+
+               $this->assertSame( [], $res[0]['parse']['headitems'] );
+               $this->assertSame(
+                       '"prop=headitems" is deprecated since MediaWiki 1.28. ' .
+                               'Use "prop=headhtml" when creating new HTML documents, ' .
+                               'or "prop=modules|jsconfigvars" when updating a document client-side.',
+                       $res[0]['warnings']['parse']['warnings']
+               );
+       }
+
+       public function testHeadItemsWithSkin() {
+               $this->setupSkin();
+
+               $res = $this->doApiRequest( [
+                       'action' => 'parse',
+                       'title' => __CLASS__,
+                       'text' => '',
+                       'prop' => 'headitems',
+                       'useskin' => 'testing',
+               ] );
+
+               $this->assertSame( [], $res[0]['parse']['headitems'] );
+               $this->assertSame(
+                       '"prop=headitems" is deprecated since MediaWiki 1.28. ' .
+                               'Use "prop=headhtml" when creating new HTML documents, ' .
+                               'or "prop=modules|jsconfigvars" when updating a document client-side.',
+                       $res[0]['warnings']['parse']['warnings']
+               );
+       }
+
+       public function testModules() {
+               $this->setTemporaryHook( 'ParserAfterParse',
+                       function ( $parser ) {
+                               $output = $parser->getOutput();
+                               $output->addModules( [ 'foo', 'bar' ] );
+                               $output->addModuleScripts( [ 'baz', 'quuz' ] );
+                               $output->addModuleStyles( [ 'aaa', 'zzz' ] );
+                               $output->addJsConfigVars( [ 'x' => 'y', 'z' => -3 ] );
+                       }
+               );
+               $res = $this->doApiRequest( [
+                       'action' => 'parse',
+                       'title' => __CLASS__,
+                       'text' => 'Content',
+                       'prop' => 'modules|jsconfigvars|encodedjsconfigvars',
+               ] );
+
+               $this->assertSame( [ 'foo', 'bar' ], $res[0]['parse']['modules'] );
+               $this->assertSame( [ 'baz', 'quuz' ], $res[0]['parse']['modulescripts'] );
+               $this->assertSame( [ 'aaa', 'zzz' ], $res[0]['parse']['modulestyles'] );
+               $this->assertSame( [ 'x' => 'y', 'z' => -3 ], $res[0]['parse']['jsconfigvars'] );
+               $this->assertSame( '{"x":"y","z":-3}', $res[0]['parse']['encodedjsconfigvars'] );
+               $this->assertArrayNotHasKey( 'warnings', $res[0] );
+       }
+
+       public function testModulesWithSkin() {
+               $this->setupSkin();
 
                $res = $this->doApiRequest( [
                        'action' => 'parse',
@@ -170,5 +690,160 @@ class ApiParseTest extends ApiTestCase {
                        $res[0]['parse']['modulestyles'],
                        'resp.parse.modulestyles'
                );
+               $this->assertSame(
+                       [ 'parse' =>
+                               [ 'warnings' =>
+                                       'Property "modules" was set but not "jsconfigvars" or ' .
+                                       '"encodedjsconfigvars". Configuration variables are necessary for ' .
+                                       'proper module usage.'
+                               ]
+                       ],
+                       $res[0]['warnings']
+               );
+       }
+
+       public function testIndicators() {
+               $res = $this->doApiRequest( [
+                       'action' => 'parse',
+                       'title' => __CLASS__,
+                       'text' =>
+                               '<indicator name="b">BBB!</indicator>Some text<indicator name="a">aaa</indicator>',
+                       'prop' => 'indicators',
+               ] );
+
+               $this->assertSame(
+                       // It seems we return in markup order and not display order
+                       [ 'b' => 'BBB!', 'a' => 'aaa' ],
+                       $res[0]['parse']['indicators']
+               );
+               $this->assertArrayNotHasKey( 'warnings', $res[0] );
+       }
+
+       public function testIndicatorsWithSkin() {
+               $this->setupSkin();
+
+               $res = $this->doApiRequest( [
+                       'action' => 'parse',
+                       'title' => __CLASS__,
+                       'text' =>
+                               '<indicator name="b">BBB!</indicator>Some text<indicator name="a">aaa</indicator>',
+                       'prop' => 'indicators',
+                       'useskin' => 'testing',
+               ] );
+
+               $this->assertSame(
+                       // Now we return in display order rather than markup order
+                       [ 'a' => 'aaa', 'b' => 'BBB!' ],
+                       $res[0]['parse']['indicators']
+               );
+               $this->assertArrayNotHasKey( 'warnings', $res[0] );
+       }
+
+       public function testIwlinks() {
+               $this->setupInterwiki();
+
+               $res = $this->doApiRequest( [
+                       'action' => 'parse',
+                       'title' => 'Omelette',
+                       'text' => '[[:madeuplanguage:Omelette]][[madeuplanguage:Spaghetti]]',
+                       'prop' => 'iwlinks',
+               ] );
+
+               $iwlinks = $res[0]['parse']['iwlinks'];
+
+               $this->assertCount( 1, $iwlinks );
+               $this->assertSame( 'madeuplanguage', $iwlinks[0]['prefix'] );
+               $this->assertSame( 'https://example.com/wiki/Omelette', $iwlinks[0]['url'] );
+               $this->assertSame( 'madeuplanguage:Omelette', $iwlinks[0]['title'] );
+               $this->assertArrayNotHasKey( 'warnings', $res[0] );
+       }
+
+       public function testLimitReports() {
+               $res = $this->doApiRequest( [
+                       'action' => 'parse',
+                       'pageid' => self::$pageId,
+                       'prop' => 'limitreportdata|limitreporthtml',
+               ] );
+
+               // We don't bother testing the actual values here
+               $this->assertInternalType( 'array', $res[0]['parse']['limitreportdata'] );
+               $this->assertInternalType( 'string', $res[0]['parse']['limitreporthtml'] );
+               $this->assertArrayNotHasKey( 'warnings', $res[0] );
+       }
+
+       public function testParseTreeNonWikitext() {
+               $this->setExpectedException( ApiUsageException::class,
+                       '"prop=parsetree" is only supported for wikitext content.' );
+
+               $this->doApiRequest( [
+                       'action' => 'parse',
+                       'text' => '',
+                       'contentmodel' => 'json',
+                       'prop' => 'parsetree',
+               ] );
+       }
+
+       public function testParseTree() {
+               $res = $this->doApiRequest( [
+                       'action' => 'parse',
+                       'text' => "Some ''text'' is {{nice|to have|i=think}}",
+                       'contentmodel' => 'wikitext',
+                       'prop' => 'parsetree',
+               ] );
+
+               // Preprocessor_DOM and Preprocessor_Hash give different results here,
+               // so we'll accept either
+               $this->assertRegExp(
+                       '#^<root>Some \'\'text\'\' is <template><title>nice</title>' .
+                               '<part><name index="1"/><value>to have</value></part>' .
+                               '<part><name>i</name>(?:<equals>)?=(?:</equals>)?<value>think</value></part>' .
+                               '</template></root>$#',
+                       $res[0]['parse']['parsetree']
+               );
+               $this->assertArrayNotHasKey( 'warnings', $res[0] );
+       }
+
+       public function testDisableTidy() {
+               $this->setMwGlobals( 'wgTidyConfig', [ 'driver' => 'RemexHtml' ] );
+
+               // Check that disabletidy doesn't have an effect just because tidying
+               // doesn't work for some other reason
+               $res1 = $this->doApiRequest( [
+                       'action' => 'parse',
+                       'text' => "<b>Mixed <i>up</b></i>",
+                       'contentmodel' => 'wikitext',
+               ] );
+               $this->assertParsedTo( "<p><b>Mixed <i>up</i></b>\n</p>", $res1 );
+
+               $res2 = $this->doApiRequest( [
+                       'action' => 'parse',
+                       'text' => "<b>Mixed <i>up</b></i>",
+                       'contentmodel' => 'wikitext',
+                       'disabletidy' => '',
+               ] );
+
+               $this->assertParsedTo( "<p><b>Mixed <i>up</b></i>\n</p>", $res2 );
+       }
+
+       public function testFormatCategories() {
+               $name = ucfirst( __FUNCTION__ );
+
+               $this->editPage( "Category:$name", 'Content' );
+               $this->editPage( 'Category:Hidden', '__HIDDENCAT__' );
+
+               $res = $this->doApiRequest( [
+                       'action' => 'parse',
+                       'title' => __CLASS__,
+                       'text' => "[[Category:$name]][[Category:Foo|Sort me]][[Category:Hidden]]",
+                       'prop' => 'categories',
+               ] );
+
+               $this->assertSame(
+                       [ [ 'sortkey' => '', 'category' => $name ],
+                               [ 'sortkey' => 'Sort me', 'category' => 'Foo', 'missing' => true ],
+                               [ 'sortkey' => '', 'category' => 'Hidden', 'hidden' => true ] ],
+                       $res[0]['parse']['categories']
+               );
+               $this->assertArrayNotHasKey( 'warnings', $res[0] );
        }
 }
index 31c8136..a5ee7dd 100644 (file)
@@ -56,6 +56,28 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
                return $page->doEditContent( ContentHandler::makeContent( $text, $title ), $summary );
        }
 
+       /**
+        * Revision-deletes a revision.
+        *
+        * @param Revision|int $rev Revision to delete
+        * @param array $value Keys are Revision::DELETED_* flags.  Values are 1 to set the bit, 0 to
+        *   clear, -1 to leave alone.  (All other values also clear the bit.)
+        * @param string $comment Deletion comment
+        */
+       protected function revisionDelete(
+               $rev, array $value = [ Revision::DELETED_TEXT => 1 ], $comment = ''
+       ) {
+               if ( is_int( $rev ) ) {
+                       $rev = Revision::newFromId( $rev );
+               }
+               RevisionDeleter::createList(
+                       'revision', RequestContext::getMain(), $rev->getTitle(), [ $rev->getId() ]
+               )->setVisibility( [
+                       'value' => $value,
+                       'comment' => $comment,
+               ] );
+       }
+
        /**
         * Does the API request and returns the result.
         *
@@ -99,6 +121,10 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
                }
 
                if ( $tokenType !== null ) {
+                       if ( $tokenType === 'auto' ) {
+                               $tokenType = ( new ApiMain() )->getModuleManager()
+                                       ->getModule( $params['action'], 'action' )->needsToken();
+                       }
                        $params['token'] = ApiQueryTokens::getToken(
                                $wgUser, $sessionObj, ApiQueryTokens::getTokenTypeSalts()[$tokenType]
                        )->toString();
@@ -142,7 +168,7 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
         * @return array Result of the API call
         */
        protected function doApiRequestWithToken( array $params, array $session = null,
-               User $user = null, $tokenType = 'csrf'
+               User $user = null, $tokenType = 'auto'
        ) {
                return $this->doApiRequest( $params, $session, false, $user, $tokenType );
        }
diff --git a/tests/phpunit/includes/api/ApiUserrightsTest.php b/tests/phpunit/includes/api/ApiUserrightsTest.php
new file mode 100644 (file)
index 0000000..0229e76
--- /dev/null
@@ -0,0 +1,358 @@
+<?php
+
+/**
+ * @group API
+ * @group Database
+ * @group medium
+ *
+ * @covers ApiUserrights
+ */
+class ApiUserrightsTest extends ApiTestCase {
+       /**
+        * Unsets $wgGroupPermissions['bureaucrat']['userrights'], and sets
+        * $wgAddGroups['bureaucrat'] and $wgRemoveGroups['bureaucrat'] to the
+        * specified values.
+        *
+        * @param array|bool $add Groups bureaucrats should be allowed to add, true for all
+        * @param array|bool $remove Groups bureaucrats should be allowed to remove, true for all
+        */
+       protected function setPermissions( $add = [], $remove = [] ) {
+               global $wgAddGroups, $wgRemoveGroups;
+
+               $this->setGroupPermissions( 'bureaucrat', 'userrights', false );
+
+               if ( $add ) {
+                       $this->stashMwGlobals( 'wgAddGroups' );
+                       $wgAddGroups['bureaucrat'] = $add;
+               }
+               if ( $remove ) {
+                       $this->stashMwGlobals( 'wgRemoveGroups' );
+                       $wgRemoveGroups['bureaucrat'] = $remove;
+               }
+       }
+
+       /**
+        * Perform an API userrights request that's expected to be successful.
+        *
+        * @param array|string $expectedGroups Group(s) that the user is expected
+        *   to have after the API request
+        * @param array $params Array to pass to doApiRequestWithToken().  'action'
+        *   => 'userrights' is implicit.  If no 'user' or 'userid' is specified,
+        *   we add a 'user' parameter.  If no 'add' or 'remove' is specified, we
+        *   add 'add' => 'sysop'.
+        * @param User|null $user The user that we're modifying.  The user must be
+        *   mutable, because we're going to change its groups!  null means that
+        *   we'll make up our own user to modify, and doesn't make sense if 'user'
+        *   or 'userid' is specified in $params.
+        */
+       protected function doSuccessfulRightsChange(
+               $expectedGroups = 'sysop', array $params = [], User $user = null
+       ) {
+               $expectedGroups = (array)$expectedGroups;
+               $params['action'] = 'userrights';
+
+               if ( !$user ) {
+                       $user = $this->getMutableTestUser()->getUser();
+               }
+
+               $this->assertTrue( TestUserRegistry::isMutable( $user ),
+                       'Immutable user passed to doSuccessfulRightsChange!' );
+
+               if ( !isset( $params['user'] ) && !isset( $params['userid'] ) ) {
+                       $params['user'] = $user->getName();
+               }
+               if ( !isset( $params['add'] ) && !isset( $params['remove'] ) ) {
+                       $params['add'] = 'sysop';
+               }
+
+               $res = $this->doApiRequestWithToken( $params );
+
+               $user->clearInstanceCache();
+               $this->assertSame( $expectedGroups, $user->getGroups() );
+
+               $this->assertArrayNotHasKey( 'warnings', $res[0] );
+       }
+
+       /**
+        * Perform an API userrights request that's expected to fail.
+        *
+        * @param string $expectedException Expected exception text
+        * @param array $params As for doSuccessfulRightsChange()
+        * @param User|null $user As for doSuccessfulRightsChange().  If there's no
+        *   user who will possibly be affected (such as if an invalid username is
+        *   provided in $params), pass null.
+        */
+       protected function doFailedRightsChange(
+               $expectedException, array $params = [], User $user = null
+       ) {
+               $params['action'] = 'userrights';
+
+               $this->setExpectedException( ApiUsageException::class, $expectedException );
+
+               if ( !$user ) {
+                       // If 'user' or 'userid' is specified and $user was not specified,
+                       // the user we're creating now will have nothing to do with the API
+                       // request, but that's okay, since we're just testing that it has
+                       // no groups.
+                       $user = $this->getMutableTestUser()->getUser();
+               }
+
+               $this->assertTrue( TestUserRegistry::isMutable( $user ),
+                       'Immutable user passed to doFailedRightsChange!' );
+
+               if ( !isset( $params['user'] ) && !isset( $params['userid'] ) ) {
+                       $params['user'] = $user->getName();
+               }
+               if ( !isset( $params['add'] ) && !isset( $params['remove'] ) ) {
+                       $params['add'] = 'sysop';
+               }
+               $expectedGroups = $user->getGroups();
+
+               try {
+                       $this->doApiRequestWithToken( $params );
+               } finally {
+                       $user->clearInstanceCache();
+                       $this->assertSame( $expectedGroups, $user->getGroups() );
+               }
+       }
+
+       public function testAdd() {
+               $this->doSuccessfulRightsChange();
+       }
+
+       public function testBlockedWithUserrights() {
+               global $wgUser;
+
+               $block = new Block( [ 'address' => $wgUser, 'by' => $wgUser->getId(), ] );
+               $block->insert();
+
+               try {
+                       $this->doSuccessfulRightsChange();
+               } finally {
+                       $block->delete();
+                       $wgUser->clearInstanceCache();
+               }
+       }
+
+       public function testBlockedWithoutUserrights() {
+               $user = $this->getTestSysop()->getUser();
+
+               $this->setPermissions( true, true );
+
+               $block = new Block( [ 'address' => $user, 'by' => $user->getId() ] );
+               $block->insert();
+
+               try {
+                       $this->doFailedRightsChange( 'You have been blocked from editing.' );
+               } finally {
+                       $block->delete();
+                       $user->clearInstanceCache();
+               }
+       }
+
+       public function testAddMultiple() {
+               $this->doSuccessfulRightsChange(
+                       [ 'bureaucrat', 'sysop' ],
+                       [ 'add' => 'bureaucrat|sysop' ]
+               );
+       }
+
+       public function testTooFewExpiries() {
+               $this->doFailedRightsChange(
+                       '2 expiry timestamps were provided where 3 were needed.',
+                       [ 'add' => 'sysop|bureaucrat|bot', 'expiry' => 'infinity|tomorrow' ]
+               );
+       }
+
+       public function testTooManyExpiries() {
+               $this->doFailedRightsChange(
+                       '3 expiry timestamps were provided where 2 were needed.',
+                       [ 'add' => 'sysop|bureaucrat', 'expiry' => 'infinity|tomorrow|never' ]
+               );
+       }
+
+       public function testInvalidExpiry() {
+               $this->doFailedRightsChange( 'Invalid expiry time', [ 'expiry' => 'yummy lollipops!' ] );
+       }
+
+       public function testMultipleInvalidExpiries() {
+               $this->doFailedRightsChange(
+                       'Invalid expiry time "foo".',
+                       [ 'add' => 'sysop|bureaucrat', 'expiry' => 'foo|bar' ]
+               );
+       }
+
+       public function testWithTag() {
+               ChangeTags::defineTag( 'custom tag' );
+
+               $user = $this->getMutableTestUser()->getUser();
+
+               $this->doSuccessfulRightsChange( 'sysop', [ 'tags' => 'custom tag' ], $user );
+
+               $dbr = wfGetDB( DB_REPLICA );
+               $this->assertSame(
+                       'custom tag',
+                       $dbr->selectField(
+                               [ 'change_tag', 'logging' ],
+                               'ct_tag',
+                               [
+                                       'ct_log_id = log_id',
+                                       'log_namespace' => NS_USER,
+                                       'log_title' => strtr( $user->getName(), ' ', '_' )
+                               ],
+                               __METHOD__
+                       )
+               );
+       }
+
+       public function testWithoutTagPermission() {
+               global $wgGroupPermissions;
+
+               ChangeTags::defineTag( 'custom tag' );
+
+               $this->stashMwGlobals( 'wgGroupPermissions' );
+               $wgGroupPermissions['user']['applychangetags'] = false;
+
+               $this->doFailedRightsChange(
+                       'You do not have permission to apply change tags along with your changes.',
+                       [ 'tags' => 'custom tag' ]
+               );
+       }
+
+       public function testNonexistentUser() {
+               $this->doFailedRightsChange(
+                       'There is no user by the name "Nonexistent user". Check your spelling.',
+                       [ 'user' => 'Nonexistent user' ]
+               );
+       }
+
+       public function testWebToken() {
+               $sysop = $this->getTestSysop()->getUser();
+               $user = $this->getMutableTestUser()->getUser();
+
+               $token = $sysop->getEditToken( $user->getName() );
+
+               $res = $this->doApiRequest( [
+                       'action' => 'userrights',
+                       'user' => $user->getName(),
+                       'add' => 'sysop',
+                       'token' => $token,
+               ] );
+
+               $user->clearInstanceCache();
+               $this->assertSame( [ 'sysop' ], $user->getGroups() );
+
+               $this->assertArrayNotHasKey( 'warnings', $res[0] );
+       }
+
+       /**
+        * Helper for testCanProcessExpiries that returns a mock ApiUserrights that either can or cannot
+        * process expiries.  Although the regular page can process expiries, we use a mock here to
+        * ensure that it's the result of canProcessExpiries() that makes a difference, and not some
+        * error in the way we construct the mock.
+        *
+        * @param bool $canProcessExpiries
+        */
+       private function getMockForProcessingExpiries( $canProcessExpiries ) {
+               $sysop = $this->getTestSysop()->getUser();
+               $user = $this->getMutableTestUser()->getUser();
+
+               $token = $sysop->getEditToken( 'userrights' );
+
+               $main = new ApiMain( new FauxRequest( [
+                       'action' => 'userrights',
+                       'user' => $user->getName(),
+                       'add' => 'sysop',
+                       'token' => $token,
+               ] ) );
+
+               $mockUserRightsPage = $this->getMockBuilder( UserrightsPage::class )
+                       ->setMethods( [ 'canProcessExpiries' ] )
+                       ->getMock();
+               $mockUserRightsPage->method( 'canProcessExpiries' )->willReturn( $canProcessExpiries );
+
+               $mockApi = $this->getMockBuilder( ApiUserrights::class )
+                       ->setConstructorArgs( [ $main, 'userrights' ] )
+                       ->setMethods( [ 'getUserRightsPage' ] )
+                       ->getMock();
+               $mockApi->method( 'getUserRightsPage' )->willReturn( $mockUserRightsPage );
+
+               return $mockApi;
+       }
+
+       public function testCanProcessExpiries() {
+               $mock1 = $this->getMockForProcessingExpiries( true );
+               $this->assertArrayHasKey( 'expiry', $mock1->getAllowedParams() );
+
+               $mock2 = $this->getMockForProcessingExpiries( false );
+               $this->assertArrayNotHasKey( 'expiry', $mock2->getAllowedParams() );
+       }
+
+       /**
+        * Tests adding and removing various groups with various permissions.
+        *
+        * @dataProvider addAndRemoveGroupsProvider
+        * @param array|null $permissions [ [ $wgAddGroups, $wgRemoveGroups ] ] or null for 'userrights'
+        *   to be set in $wgGroupPermissions
+        * @param array $groupsToChange [ [ groups to add ], [ groups to remove ] ]
+        * @param array $expectedGroups Array of expected groups
+        */
+       public function testAddAndRemoveGroups(
+               array $permissions = null, array $groupsToChange, array $expectedGroups
+       ) {
+               if ( $permissions !== null ) {
+                       $this->setPermissions( $permissions[0], $permissions[1] );
+               }
+
+               $params = [
+                       'add' => implode( '|', $groupsToChange[0] ),
+                       'remove' => implode( '|', $groupsToChange[1] ),
+               ];
+
+               // We'll take a bot so we have a group to remove
+               $user = $this->getMutableTestUser( [ 'bot' ] )->getUser();
+
+               $this->doSuccessfulRightsChange( $expectedGroups, $params, $user );
+       }
+
+       public function addAndRemoveGroupsProvider() {
+               return [
+                       'Simple add' => [
+                               [ [ 'sysop' ], [] ],
+                               [ [ 'sysop' ], [] ],
+                               [ 'bot', 'sysop' ]
+                       ], 'Add with only remove permission' => [
+                               [ [], [ 'sysop' ] ],
+                               [ [ 'sysop' ], [] ],
+                               [ 'bot' ],
+                       ], 'Add with global remove permission' => [
+                               [ [], true ],
+                               [ [ 'sysop' ], [] ],
+                               [ 'bot' ],
+                       ], 'Simple remove' => [
+                               [ [], [ 'bot' ] ],
+                               [ [], [ 'bot' ] ],
+                               [],
+                       ], 'Remove with only add permission' => [
+                               [ [ 'bot' ], [] ],
+                               [ [], [ 'bot' ] ],
+                               [ 'bot' ],
+                       ], 'Remove with global add permission' => [
+                               [ true, [] ],
+                               [ [], [ 'bot' ] ],
+                               [ 'bot' ],
+                       ], 'Add and remove same new group' => [
+                               null,
+                               [ [ 'sysop' ], [ 'sysop' ] ],
+                               // The userrights code does removals before adds, so it doesn't remove the sysop
+                               // group here and only adds it.
+                               [ 'bot', 'sysop' ],
+                       ], 'Add and remove same existing group' => [
+                               null,
+                               [ [ 'bot' ], [ 'bot' ] ],
+                               // But here it first removes the existing group and then re-adds it.
+                               [ 'bot' ],
+                       ],
+               ];
+       }
+}
index 211eba0..cc16248 100644 (file)
@@ -879,14 +879,10 @@ class AuthManagerTest extends \MediaWikiTestCase {
                        );
                        $mocks[$key]->expects( $this->any() )->method( 'getUniqueId' )
                                ->will( $this->returnValue( $key ) );
-                       $mocks[$key . '2'] = $this->getMockForAbstractClass(
-                               "MediaWiki\\Auth\\$class", [], "Mock$class"
-                       );
+                       $mocks[$key . '2'] = $this->getMockForAbstractClass( "MediaWiki\\Auth\\$class" );
                        $mocks[$key . '2']->expects( $this->any() )->method( 'getUniqueId' )
                                ->will( $this->returnValue( $key . '2' ) );
-                       $mocks[$key . '3'] = $this->getMockForAbstractClass(
-                               "MediaWiki\\Auth\\$class", [], "Mock$class"
-                       );
+                       $mocks[$key . '3'] = $this->getMockForAbstractClass( "MediaWiki\\Auth\\$class" );
                        $mocks[$key . '3']->expects( $this->any() )->method( 'getUniqueId' )
                                ->will( $this->returnValue( $key . '3' ) );
                }
@@ -1901,9 +1897,7 @@ class AuthManagerTest extends \MediaWikiTestCase {
                                ) );
 
                        for ( $i = 2; $i <= 3; $i++ ) {
-                               $mocks[$key . $i] = $this->getMockForAbstractClass(
-                                       "MediaWiki\\Auth\\$class", [], "Mock$class"
-                               );
+                               $mocks[$key . $i] = $this->getMockForAbstractClass( "MediaWiki\\Auth\\$class" );
                                $mocks[$key . $i]->expects( $this->any() )->method( 'getUniqueId' )
                                        ->will( $this->returnValue( $key . $i ) );
                                $mocks[$key . $i]->expects( $this->any() )->method( 'testUserForCreation' )
@@ -2368,9 +2362,7 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $mocks = [];
                foreach ( [ 'pre', 'primary', 'secondary' ] as $key ) {
                        $class = ucfirst( $key ) . 'AuthenticationProvider';
-                       $mocks[$key] = $this->getMockForAbstractClass(
-                               "MediaWiki\\Auth\\$class", [], "Mock$class"
-                       );
+                       $mocks[$key] = $this->getMockForAbstractClass( "MediaWiki\\Auth\\$class" );
                        $mocks[$key]->expects( $this->any() )->method( 'getUniqueId' )
                                ->will( $this->returnValue( $key ) );
                }
@@ -2848,9 +2840,11 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $mocks = [];
                foreach ( [ 'pre', 'primary', 'secondary' ] as $key ) {
                        $class = ucfirst( $key ) . 'AuthenticationProvider';
-                       $mocks[$key] = $this->getMockForAbstractClass(
-                               "MediaWiki\\Auth\\$class", [], "Mock$class"
-                       );
+                       $mocks[$key] = $this->getMockBuilder( "MediaWiki\\Auth\\$class" )
+                               ->setMethods( [
+                                       'getUniqueId', 'getAuthenticationRequests', 'providerAllowsAuthenticationDataChange',
+                               ] )
+                               ->getMockForAbstractClass();
                        $mocks[$key]->expects( $this->any() )->method( 'getUniqueId' )
                                ->will( $this->returnValue( $key ) );
                        $mocks[$key]->expects( $this->any() )->method( 'getAuthenticationRequests' )
@@ -2868,9 +2862,12 @@ class AuthManagerTest extends \MediaWikiTestCase {
                        PrimaryAuthenticationProvider::TYPE_LINK
                ] as $type ) {
                        $class = 'PrimaryAuthenticationProvider';
-                       $mocks["primary-$type"] = $this->getMockForAbstractClass(
-                               "MediaWiki\\Auth\\$class", [], "Mock$class"
-                       );
+                       $mocks["primary-$type"] = $this->getMockBuilder( "MediaWiki\\Auth\\$class" )
+                               ->setMethods( [
+                                       'getUniqueId', 'accountCreationType', 'getAuthenticationRequests',
+                                       'providerAllowsAuthenticationDataChange',
+                               ] )
+                               ->getMockForAbstractClass();
                        $mocks["primary-$type"]->expects( $this->any() )->method( 'getUniqueId' )
                                ->will( $this->returnValue( "primary-$type" ) );
                        $mocks["primary-$type"]->expects( $this->any() )->method( 'accountCreationType' )
@@ -2885,9 +2882,12 @@ class AuthManagerTest extends \MediaWikiTestCase {
                        $this->primaryauthMocks[] = $mocks["primary-$type"];
                }
 
-               $mocks['primary2'] = $this->getMockForAbstractClass(
-                       PrimaryAuthenticationProvider::class, [], "MockPrimaryAuthenticationProvider"
-               );
+               $mocks['primary2'] = $this->getMockBuilder( PrimaryAuthenticationProvider::class )
+                       ->setMethods( [
+                               'getUniqueId', 'accountCreationType', 'getAuthenticationRequests',
+                               'providerAllowsAuthenticationDataChange',
+                       ] )
+                       ->getMockForAbstractClass();
                $mocks['primary2']->expects( $this->any() )->method( 'getUniqueId' )
                        ->will( $this->returnValue( 'primary2' ) );
                $mocks['primary2']->expects( $this->any() )->method( 'accountCreationType' )
@@ -3138,9 +3138,7 @@ class AuthManagerTest extends \MediaWikiTestCase {
                $mocks = [];
                foreach ( [ 'primary', 'secondary' ] as $key ) {
                        $class = ucfirst( $key ) . 'AuthenticationProvider';
-                       $mocks[$key] = $this->getMockForAbstractClass(
-                               "MediaWiki\\Auth\\$class", [], "Mock$class"
-                       );
+                       $mocks[$key] = $this->getMockForAbstractClass( "MediaWiki\\Auth\\$class" );
                        $mocks[$key]->expects( $this->any() )->method( 'getUniqueId' )
                                ->will( $this->returnValue( $key ) );
                        $mocks[$key]->expects( $this->any() )->method( 'providerAllowsPropertyChange' )
@@ -3224,8 +3222,7 @@ class AuthManagerTest extends \MediaWikiTestCase {
        public function testAutoCreateFailOnLogin() {
                $username = self::usernameForCreation();
 
-               $mock = $this->getMockForAbstractClass(
-                       PrimaryAuthenticationProvider::class, [], "MockPrimaryAuthenticationProvider" );
+               $mock = $this->getMockForAbstractClass( PrimaryAuthenticationProvider::class );
                $mock->expects( $this->any() )->method( 'getUniqueId' )->will( $this->returnValue( 'primary' ) );
                $mock->expects( $this->any() )->method( 'beginPrimaryAuthentication' )
                        ->will( $this->returnValue( AuthenticationResponse::newPass( $username ) ) );
index 2892283..ed4c977 100644 (file)
@@ -345,32 +345,25 @@ class LBFactoryTest extends MediaWikiTestCase {
        }
 
        public function testNiceDomains() {
-               global $wgDBname, $wgDBtype;
-
-               if ( $wgDBtype === 'sqlite' ) {
-                       $tmpDir = $this->getNewTempDirectory();
-                       $dbPath = "$tmpDir/unit_test_db.sqlite";
-                       file_put_contents( $dbPath, '' );
-                       $tempFsFile = new TempFSFile( $dbPath );
-                       $tempFsFile->autocollect();
-               } else {
-                       $dbPath = null;
+               global $wgDBname;
+
+               if ( wfGetDB( DB_MASTER )->databasesAreIndependent() ) {
+                       self::markTestSkipped( "Skipping tests about selecting DBs: not applicable" );
+                       return;
                }
 
                $factory = $this->newLBFactoryMulti(
                        [],
-                       [ 'dbFilePath' => $dbPath ]
+                       []
                );
                $lb = $factory->getMainLB();
 
-               if ( $wgDBtype !== 'sqlite' ) {
-                       $db = $lb->getConnectionRef( DB_MASTER );
-                       $this->assertEquals(
-                               wfWikiID(),
-                               $db->getDomainID()
-                       );
-                       unset( $db );
-               }
+               $db = $lb->getConnectionRef( DB_MASTER );
+               $this->assertEquals(
+                       wfWikiID(),
+                       $db->getDomainID()
+               );
+               unset( $db );
 
                /** @var Database $db */
                $db = $lb->getConnection( DB_MASTER, [], '' );
@@ -411,6 +404,7 @@ class LBFactoryTest extends MediaWikiTestCase {
                $db = $lb->getConnection( DB_MASTER ); // local domain connection
                $factory->setDomainPrefix( 'my_' );
 
+               $this->assertEquals( $wgDBname, $db->getDBname() );
                $this->assertEquals(
                        "$wgDBname-my_",
                        $db->getDomainID()
@@ -431,23 +425,17 @@ class LBFactoryTest extends MediaWikiTestCase {
        }
 
        public function testTrickyDomain() {
-               global $wgDBtype, $wgDBname;
-
-               if ( $wgDBtype === 'sqlite' ) {
-                       $tmpDir = $this->getNewTempDirectory();
-                       $dbPath = "$tmpDir/unit_test_db.sqlite";
-                       file_put_contents( $dbPath, '' );
-                       $tempFsFile = new TempFSFile( $dbPath );
-                       $tempFsFile->autocollect();
-               } else {
-                       $dbPath = null;
+               global $wgDBname;
+
+               if ( wfGetDB( DB_MASTER )->databasesAreIndependent() ) {
+                       self::markTestSkipped( "Skipping tests about selecting DBs: not applicable" );
+                       return;
                }
 
                $dbname = 'unittest-domain'; // explodes if DB is selected
                $factory = $this->newLBFactoryMulti(
                        [ 'localDomain' => ( new DatabaseDomain( $dbname, null, '' ) )->getId() ],
                        [
-                               'dbFilePath' => $dbPath,
                                'dbName' => 'do_not_select_me' // explodes if DB is selected
                        ]
                );
@@ -496,7 +484,27 @@ class LBFactoryTest extends MediaWikiTestCase {
                        "Correct full table name"
                );
 
-               if ( $db->databasesAreIndependent() ) {
+               $lb->reuseConnection( $db ); // don't care
+
+               $factory->closeAll();
+               $factory->destroy();
+       }
+
+       public function testInvalidSelectDB() {
+               $dbname = 'unittest-domain'; // explodes if DB is selected
+               $factory = $this->newLBFactoryMulti(
+                       [ 'localDomain' => ( new DatabaseDomain( $dbname, null, '' ) )->getId() ],
+                       [
+                               'dbName' => 'do_not_select_me' // explodes if DB is selected
+                       ]
+               );
+               $lb = $factory->getMainLB();
+               /** @var Database $db */
+               $db = $lb->getConnection( DB_MASTER, [], '' );
+
+               if ( $db->getType() === 'sqlite' ) {
+                       $this->assertFalse( $db->selectDB( 'garbage-db' ) );
+               } elseif ( $db->databasesAreIndependent() ) {
                        try {
                                $e = null;
                                $db->selectDB( 'garbage-db' );
@@ -510,11 +518,6 @@ class LBFactoryTest extends MediaWikiTestCase {
                        $this->assertFalse( $db->selectDB( 'garbage-db' ) );
                        \Wikimedia\restoreWarnings();
                }
-
-               $lb->reuseConnection( $db ); // don't care
-
-               $factory->closeAll();
-               $factory->destroy();
        }
 
        private function quoteTable( Database $db, $table ) {
index 6ced540..88cf0e0 100644 (file)
@@ -51,6 +51,7 @@ class LoadBalancerTest extends MediaWikiTestCase {
 
                $lb = new LoadBalancer( [
                        'servers' => $servers,
+                       'queryLogger' => MediaWiki\Logger\LoggerFactory::getInstance( 'DBQuery' ),
                        'localDomain' => new DatabaseDomain( $wgDBname, null, $this->dbPrefix() )
                ] );
 
@@ -67,18 +68,24 @@ class LoadBalancerTest extends MediaWikiTestCase {
                $this->assertTrue( $dbr->getLBInfo( 'master' ), 'DB_REPLICA also gets the master' );
                $this->assertTrue( $dbr->getFlag( $dbw::DBO_TRX ), "DBO_TRX set on replica" );
 
-               $dbwAuto = $lb->getConnection( DB_MASTER, [], false, $lb::CONN_TRX_AUTO );
-               $this->assertFalse( $dbwAuto->getFlag( $dbw::DBO_TRX ), "No DBO_TRX with CONN_TRX_AUTO" );
-               $this->assertTrue( $dbw->getFlag( $dbw::DBO_TRX ), "DBO_TRX still set on master" );
-               $this->assertNotEquals( $dbw, $dbwAuto, "CONN_TRX_AUTO uses separate connection" );
+               if ( !$lb->getServerAttributes( $lb->getWriterIndex() )[$dbw::ATTR_DB_LEVEL_LOCKING] ) {
+                       $dbwAuto = $lb->getConnection( DB_MASTER, [], false, $lb::CONN_TRX_AUTOCOMMIT );
+                       $this->assertFalse(
+                               $dbwAuto->getFlag( $dbw::DBO_TRX ), "No DBO_TRX with CONN_TRX_AUTOCOMMIT" );
+                       $this->assertTrue( $dbw->getFlag( $dbw::DBO_TRX ), "DBO_TRX still set on master" );
+                       $this->assertNotEquals(
+                               $dbw, $dbwAuto, "CONN_TRX_AUTOCOMMIT uses separate connection" );
 
-               $dbrAuto = $lb->getConnection( DB_REPLICA, [], false, $lb::CONN_TRX_AUTO );
-               $this->assertFalse( $dbrAuto->getFlag( $dbw::DBO_TRX ), "No DBO_TRX with CONN_TRX_AUTO" );
-               $this->assertTrue( $dbr->getFlag( $dbw::DBO_TRX ), "DBO_TRX still set on replica" );
-               $this->assertNotEquals( $dbr, $dbrAuto, "CONN_TRX_AUTO uses separate connection" );
+                       $dbrAuto = $lb->getConnection( DB_REPLICA, [], false, $lb::CONN_TRX_AUTOCOMMIT );
+                       $this->assertFalse(
+                               $dbrAuto->getFlag( $dbw::DBO_TRX ), "No DBO_TRX with CONN_TRX_AUTOCOMMIT" );
+                       $this->assertTrue( $dbr->getFlag( $dbw::DBO_TRX ), "DBO_TRX still set on replica" );
+                       $this->assertNotEquals(
+                               $dbr, $dbrAuto, "CONN_TRX_AUTOCOMMIT uses separate connection" );
 
-               $dbwAuto2 = $lb->getConnection( DB_MASTER, [], false, $lb::CONN_TRX_AUTO );
-               $this->assertEquals( $dbwAuto2, $dbwAuto, "CONN_TRX_AUTO reuses connections" );
+                       $dbwAuto2 = $lb->getConnection( DB_MASTER, [], false, $lb::CONN_TRX_AUTOCOMMIT );
+                       $this->assertEquals( $dbwAuto2, $dbwAuto, "CONN_TRX_AUTOCOMMIT reuses connections" );
+               }
 
                $lb->closeAll();
        }
@@ -114,6 +121,7 @@ class LoadBalancerTest extends MediaWikiTestCase {
                $lb = new LoadBalancer( [
                        'servers' => $servers,
                        'localDomain' => new DatabaseDomain( $wgDBname, null, $this->dbPrefix() ),
+                       'queryLogger' => MediaWiki\Logger\LoggerFactory::getInstance( 'DBQuery' ),
                        'loadMonitorClass' => LoadMonitorNull::class
                ] );
 
@@ -135,18 +143,24 @@ class LoadBalancerTest extends MediaWikiTestCase {
                $this->assertTrue( $dbr->getFlag( $dbw::DBO_TRX ), "DBO_TRX set on replica" );
                $this->assertWriteForbidden( $dbr );
 
-               $dbwAuto = $lb->getConnection( DB_MASTER, [], false, $lb::CONN_TRX_AUTO );
-               $this->assertFalse( $dbwAuto->getFlag( $dbw::DBO_TRX ), "No DBO_TRX with CONN_TRX_AUTO" );
-               $this->assertTrue( $dbw->getFlag( $dbw::DBO_TRX ), "DBO_TRX still set on master" );
-               $this->assertNotEquals( $dbw, $dbwAuto, "CONN_TRX_AUTO uses separate connection" );
+               if ( !$lb->getServerAttributes( $lb->getWriterIndex() )[$dbw::ATTR_DB_LEVEL_LOCKING] ) {
+                       $dbwAuto = $lb->getConnection( DB_MASTER, [], false, $lb::CONN_TRX_AUTOCOMMIT );
+                       $this->assertFalse(
+                               $dbwAuto->getFlag( $dbw::DBO_TRX ), "No DBO_TRX with CONN_TRX_AUTOCOMMIT" );
+                       $this->assertTrue( $dbw->getFlag( $dbw::DBO_TRX ), "DBO_TRX still set on master" );
+                       $this->assertNotEquals(
+                               $dbw, $dbwAuto, "CONN_TRX_AUTOCOMMIT uses separate connection" );
 
-               $dbrAuto = $lb->getConnection( DB_REPLICA, [], false, $lb::CONN_TRX_AUTO );
-               $this->assertFalse( $dbrAuto->getFlag( $dbw::DBO_TRX ), "No DBO_TRX with CONN_TRX_AUTO" );
-               $this->assertTrue( $dbr->getFlag( $dbw::DBO_TRX ), "DBO_TRX still set on replica" );
-               $this->assertNotEquals( $dbr, $dbrAuto, "CONN_TRX_AUTO uses separate connection" );
+                       $dbrAuto = $lb->getConnection( DB_REPLICA, [], false, $lb::CONN_TRX_AUTOCOMMIT );
+                       $this->assertFalse(
+                               $dbrAuto->getFlag( $dbw::DBO_TRX ), "No DBO_TRX with CONN_TRX_AUTOCOMMIT" );
+                       $this->assertTrue( $dbr->getFlag( $dbw::DBO_TRX ), "DBO_TRX still set on replica" );
+                       $this->assertNotEquals(
+                               $dbr, $dbrAuto, "CONN_TRX_AUTOCOMMIT uses separate connection" );
 
-               $dbwAuto2 = $lb->getConnection( DB_MASTER, [], false, $lb::CONN_TRX_AUTO );
-               $this->assertEquals( $dbwAuto2, $dbwAuto, "CONN_TRX_AUTO reuses connections" );
+                       $dbwAuto2 = $lb->getConnection( DB_MASTER, [], false, $lb::CONN_TRX_AUTOCOMMIT );
+                       $this->assertEquals( $dbwAuto2, $dbwAuto, "CONN_TRX_AUTOCOMMIT reuses connections" );
+               }
 
                $lb->closeAll();
        }
@@ -163,8 +177,6 @@ class LoadBalancerTest extends MediaWikiTestCase {
                                // re-throw original error, to preserve stack trace
                                throw $ex;
                        }
-               } finally {
-                       $db->rollback( __METHOD__, 'flush' );
                }
        }
 
@@ -172,6 +184,14 @@ class LoadBalancerTest extends MediaWikiTestCase {
                $table = $db->tableName( 'some_table' );
                try {
                        $db->dropTable( 'some_table' ); // clear for sanity
+
+                       // Trigger DBO_TRX to create a transaction so the flush below will
+                       // roll everything here back in sqlite. But don't actually do the
+                       // code below inside an atomic section becaue MySQL and Oracle
+                       // auto-commit transactions for DDL statements like CREATE TABLE.
+                       $db->startAtomic( __METHOD__ );
+                       $db->endAtomic( __METHOD__ );
+
                        // Use only basic SQL and trivial types for these queries for compatibility
                        $this->assertNotSame(
                                false,
@@ -183,12 +203,10 @@ class LoadBalancerTest extends MediaWikiTestCase {
                                $db->query( "DELETE FROM $table WHERE id=57634126", __METHOD__ ),
                                "delete query"
                        );
-                       $this->assertNotSame(
-                               false,
-                               $db->query( "DROP TABLE $table", __METHOD__ ),
-                               "table dropped"
-                       );
                } finally {
+                       // Drop the table to clean up, ignoring any error.
+                       $db->query( "DROP TABLE $table", __METHOD__, true );
+                       // Rollback the DBO_TRX transaction for sqlite's benefit.
                        $db->rollback( __METHOD__, 'flush' );
                }
        }
index 14e2e27..4c0ca04 100644 (file)
@@ -158,7 +158,8 @@ class KafkaHandlerTest extends MediaWikiTestCase {
                        ->method( 'send' )
                        ->will( $this->returnValue( true ) );
                // evil hax
-               TestingAccessWrapper::newFromObject( $mockMethod )->matcher->parametersMatcher =
+               $matcher = TestingAccessWrapper::newFromObject( $mockMethod )->matcher;
+               TestingAccessWrapper::newFromObject( $matcher )->parametersMatcher =
                        new \PHPUnit_Framework_MockObject_Matcher_ConsecutiveParameters( [
                                [ $this->anything(), $this->anything(), [ 'words' ] ],
                                [ $this->anything(), $this->anything(), [ 'lines' ] ]
index 0625edd..64dde77 100644 (file)
@@ -387,7 +387,7 @@ class JobQueueTest extends MediaWikiTestCase {
 class JobQueueDBSingle extends JobQueueDB {
        protected function getDB( $index ) {
                $lb = MediaWikiServices::getInstance()->getDBLoadBalancer();
-               // Override to not use CONN_TRX_AUTO so that we see the same temporary `job` table
+               // Override to not use CONN_TRX_AUTOCOMMIT so that we see the same temporary `job` table
                return $lb->getConnection( $index, [], $this->wiki );
        }
 }
index f2d5ef3..59a1c7c 100644 (file)
@@ -22,6 +22,43 @@ class CSSMinTest extends MediaWikiTestCase {
                ] );
        }
 
+       /**
+        * @dataProvider serializeStringValueProvider
+        * @covers CSSMin::serializeStringValue
+        */
+       public function testSerializeStringValue( $input, $expected ) {
+               $output = CSSMin::serializeStringValue( $input );
+               $this->assertEquals(
+                       $expected,
+                       $output,
+                       'Serialized output must be in the expected form.'
+               );
+       }
+
+       public function serializeStringValueProvider() {
+               return [
+                       [ 'Hello World!', '"Hello World!"' ],
+                       [ "Null\0Null", "\"Null\\fffd Null\"" ],
+                       [ '"', '"\\""' ],
+                       [ "'", '"\'"' ],
+                       [ "\\", '"\\\\"' ],
+                       [ "Tab\tTab", '"Tab\\9 Tab"' ],
+                       [ "Space  tab \t space", '"Space  tab \\9  space"' ],
+                       [ "Line\nfeed", '"Line\\a feed"' ],
+                       [ "Return\rreturn", '"Return\\d return"' ],
+                       [ "Next\xc2\x85line", "\"Next\xc2\x85line\"" ],
+                       [ "Del\x7fDel", '"Del\\7f Del"' ],
+                       [ "nb\xc2\xa0sp", "\"nb\xc2\xa0sp\"" ],
+                       [ "AMP&amp;AMP", "\"AMP&amp;AMP\"" ],
+                       [ '!"#$%&\'()*+,-./0123456789:;<=>?', '"!\\"#$%&\'()*+,-./0123456789:;<=>?"' ],
+                       [ '@[\\]^_`{|}~', '"@[\\\\]^_`{|}~"' ],
+                       [ 'ä', '"ä"' ],
+                       [ 'Ä', '"Ä"' ],
+                       [ '€', '"€"' ],
+                       [ '𝒞', '"𝒞"' ], // U+1D49E 'MATHEMATICAL SCRIPT CAPITAL C'
+               ];
+       }
+
        /**
         * @dataProvider mimeTypeProvider
         * @covers CSSMin::getMimeType
index bc9d9ea..c3cddc6 100644 (file)
@@ -69,7 +69,7 @@ class DBConnRefTest extends PHPUnit\Framework\TestCase {
 
                $lb->expects( $this->once() )
                        ->method( 'getConnection' )
-                       ->with( DB_MASTER, [ 'test' ], 'dummy', ILoadBalancer::CONN_TRX_AUTO )
+                       ->with( DB_MASTER, [ 'test' ], 'dummy', ILoadBalancer::CONN_TRX_AUTOCOMMIT )
                        ->willReturnCallback(
                                function () {
                                        return $this->getDatabaseMock();
@@ -78,7 +78,7 @@ class DBConnRefTest extends PHPUnit\Framework\TestCase {
 
                $ref = new DBConnRef(
                        $lb,
-                       [ DB_MASTER, [ 'test' ], 'dummy', ILoadBalancer::CONN_TRX_AUTO ]
+                       [ DB_MASTER, [ 'test' ], 'dummy', ILoadBalancer::CONN_TRX_AUTOCOMMIT ]
                );
 
                $this->assertInstanceOf( ResultWrapper::class, $ref->select( 'whatever', '*' ) );
index 62b84aa..be5125c 100644 (file)
@@ -55,8 +55,8 @@ MathML;
                                '<editsection> should survive tidy'
                        ],
                        [ '<mw:toc>foo</mw:toc>', '<mw:toc>foo</mw:toc>', '<mw:toc> should survive tidy' ],
-                       [ "<link foo=\"bar\" />\nfoo", '<link foo="bar"/>foo', '<link> should survive tidy' ],
-                       [ "<meta foo=\"bar\" />\nfoo", '<meta foo="bar"/>foo', '<meta> should survive tidy' ],
+                       [ "<link foo=\"bar\" />foo", '<link foo="bar"/>foo', '<link> should survive tidy' ],
+                       [ "<meta foo=\"bar\" />foo", '<meta foo="bar"/>foo', '<meta> should survive tidy' ],
                        [ $testMathML, $testMathML, '<math> should survive tidy' ],
                ];
        }
index 929ff0f..5dc7a96 100644 (file)
@@ -6,6 +6,7 @@
 class VersionCheckerTest extends PHPUnit\Framework\TestCase {
 
        use MediaWikiCoversValidator;
+       use PHPUnit4And6Compat;
 
        /**
         * @dataProvider provideCheck
index 5118218..aeaa1ae 100644 (file)
@@ -347,7 +347,7 @@ class ChangesListSpecialPageTest extends AbstractChangesListSpecialPageTestCase
                $user = $this->getTestSysop()->getUser();
                $this->assertConditions(
                        [ # expected
-                               'rc_patrolled = 0',
+                               'rc_patrolled' => 0,
                        ],
                        [
                                'hidepatrolled' => 1,
@@ -361,7 +361,7 @@ class ChangesListSpecialPageTest extends AbstractChangesListSpecialPageTestCase
                $user = $this->getTestSysop()->getUser();
                $this->assertConditions(
                        [ # expected
-                               'rc_patrolled != 0',
+                               'rc_patrolled' => [ 1, 2 ],
                        ],
                        [
                                'hideunpatrolled' => 1,
@@ -371,6 +371,30 @@ class ChangesListSpecialPageTest extends AbstractChangesListSpecialPageTestCase
                );
        }
 
+       public function testRcReviewStatusFilter() {
+               $user = $this->getTestSysop()->getUser();
+               $this->assertConditions(
+                       [ #expected
+                               'rc_patrolled' => 1,
+                       ],
+                       [
+                               'reviewStatus' => 'manual'
+                       ],
+                       "rc conditions: reviewStatus=manual",
+                       $user
+               );
+               $this->assertConditions(
+                       [ #expected
+                               'rc_patrolled' => [ 0, 2 ],
+                       ],
+                       [
+                               'reviewStatus' => 'unpatrolled;auto'
+                       ],
+                       "rc conditions: reviewStatus=unpatrolled;auto",
+                       $user
+               );
+       }
+
        public function testRcHideminorFilter() {
                $this->assertConditions(
                        [ # expected
index f06a353..52b1433 100644 (file)
@@ -12,7 +12,7 @@
 class BatchRowUpdateTest extends MediaWikiTestCase {
 
        public function testWriterBasicFunctionality() {
-               $db = $this->mockDb();
+               $db = $this->mockDb( [ 'update' ] );
                $writer = new BatchRowWriter( $db, 'echo_event' );
 
                $updates = [
@@ -36,17 +36,13 @@ class BatchRowUpdateTest extends MediaWikiTestCase {
        }
 
        public function testReaderBasicIterate() {
-               $db = $this->mockDb();
                $batchSize = 2;
-               $reader = new BatchRowIterator( $db, 'some_table', 'id_field', $batchSize );
-
                $response = $this->genSelectResult( $batchSize, /*numRows*/ 5, function () {
                        static $i = 0;
                        return [ 'id_field' => ++$i ];
                } );
-               $db->expects( $this->exactly( count( $response ) ) )
-                       ->method( 'select' )
-                       ->will( $this->consecutivelyReturnFromSelect( $response ) );
+               $db = $this->mockDbConsecutiveSelect( $response );
+               $reader = new BatchRowIterator( $db, 'some_table', 'id_field', $batchSize );
 
                $pos = 0;
                foreach ( $reader as $rows ) {
@@ -130,7 +126,7 @@ class BatchRowUpdateTest extends MediaWikiTestCase {
        public function testReaderSetFetchColumns(
                $message, array $columns, array $primaryKeys, array $fetchColumns
        ) {
-               $db = $this->mockDb();
+               $db = $this->mockDb( [ 'select' ] );
                $db->expects( $this->once() )
                        ->method( 'select' )
                        // only testing second parameter of Database::select
@@ -202,7 +198,7 @@ class BatchRowUpdateTest extends MediaWikiTestCase {
        }
 
        protected function mockDbConsecutiveSelect( array $retvals ) {
-               $db = $this->mockDb();
+               $db = $this->mockDb( [ 'select', 'addQuotes' ] );
                $db->expects( $this->any() )
                        ->method( 'select' )
                        ->will( $this->consecutivelyReturnFromSelect( $retvals ) );
@@ -238,11 +234,12 @@ class BatchRowUpdateTest extends MediaWikiTestCase {
                return $res;
        }
 
-       protected function mockDb() {
+       protected function mockDb( $methods = [] ) {
                // @TODO: mock from Database
                // FIXME: the constructor normally sets mAtomicLevels and mSrvCache
                $databaseMysql = $this->getMockBuilder( Wikimedia\Rdbms\DatabaseMysqli::class )
                        ->disableOriginalConstructor()
+                       ->setMethods( array_merge( [ 'isOpen', 'getApproximateLagStatus' ], $methods ) )
                        ->getMock();
                $databaseMysql->expects( $this->any() )
                        ->method( 'isOpen' )
index be51626..50e6c20 100644 (file)
@@ -776,7 +776,7 @@ class WatchedItemQueryServiceUnitTest extends MediaWikiTestCase {
                                null,
                                [],
                                [],
-                               [ 'rc_patrolled = 0' ],
+                               [ 'rc_patrolled' => 0 ],
                                [],
                                [],
                        ],
index 9485170..26f6908 100644 (file)
@@ -47,6 +47,7 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
        private function getMockCache() {
                $mock = $this->getMockBuilder( HashBagOStuff::class )
                        ->disableOriginalConstructor()
+                       ->setMethods( [ 'get', 'set', 'delete', 'makeKey' ] )
                        ->getMock();
                $mock->expects( $this->any() )
                        ->method( 'makeKey' )
@@ -2074,12 +2075,11 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
                        ->method( 'selectRow' );
 
                $mockCache = $this->getMockCache();
-               $mockDb->expects( $this->never() )
-                       ->method( 'get' );
-               $mockDb->expects( $this->never() )
-                       ->method( 'set' );
-               $mockDb->expects( $this->never() )
-                       ->method( 'delete' );
+               $mockCache->expects( $this->never() )->method( 'get' );
+               $mockCache->expects( $this->never() )->method( 'set' );
+               $mockCache->expects( $this->once() )
+                       ->method( 'delete' )
+                       ->with( '0:SomeDbKey:1' );
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
@@ -2168,12 +2168,11 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
                        ->method( 'selectRow' );
 
                $mockCache = $this->getMockCache();
-               $mockDb->expects( $this->never() )
-                       ->method( 'get' );
-               $mockDb->expects( $this->never() )
-                       ->method( 'set' );
-               $mockDb->expects( $this->never() )
-                       ->method( 'delete' );
+               $mockCache->expects( $this->never() )->method( 'get' );
+               $mockCache->expects( $this->never() )->method( 'set' );
+               $mockCache->expects( $this->once() )
+                       ->method( 'delete' )
+                       ->with( '0:SomeTitle:1' );
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
@@ -2235,12 +2234,13 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
                        ) );
 
                $mockCache = $this->getMockCache();
-               $mockDb->expects( $this->never() )
-                       ->method( 'get' );
-               $mockDb->expects( $this->never() )
-                       ->method( 'set' );
-               $mockDb->expects( $this->never() )
-                       ->method( 'delete' );
+               $mockCache->expects( $this->never() )->method( 'get' );
+               $mockCache->expects( $this->once() )
+                       ->method( 'set' )
+                       ->with( '0:SomeDbKey:1', $this->isType( 'object' ) );
+               $mockCache->expects( $this->once() )
+                       ->method( 'delete' )
+                       ->with( '0:SomeDbKey:1' );
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
@@ -2311,12 +2311,11 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
                        ->will( $this->returnValue( false ) );
 
                $mockCache = $this->getMockCache();
-               $mockDb->expects( $this->never() )
-                       ->method( 'get' );
-               $mockDb->expects( $this->never() )
-                       ->method( 'set' );
-               $mockDb->expects( $this->never() )
-                       ->method( 'delete' );
+               $mockCache->expects( $this->never() )->method( 'get' );
+               $mockCache->expects( $this->never() )->method( 'set' );
+               $mockCache->expects( $this->once() )
+                       ->method( 'delete' )
+                       ->with( '0:SomeDbKey:1' );
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
@@ -2378,12 +2377,13 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
                        ) );
 
                $mockCache = $this->getMockCache();
-               $mockDb->expects( $this->never() )
-                       ->method( 'get' );
-               $mockDb->expects( $this->never() )
-                       ->method( 'set' );
-               $mockDb->expects( $this->never() )
-                       ->method( 'delete' );
+               $mockCache->expects( $this->never() )->method( 'get' );
+               $mockCache->expects( $this->once() )
+                       ->method( 'set' )
+                       ->with( '0:SomeDbKey:1', $this->isType( 'object' ) );
+               $mockCache->expects( $this->once() )
+                       ->method( 'delete' )
+                       ->with( '0:SomeDbKey:1' );
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
@@ -2456,12 +2456,13 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
                        ) );
 
                $mockCache = $this->getMockCache();
-               $mockDb->expects( $this->never() )
-                       ->method( 'get' );
-               $mockDb->expects( $this->never() )
-                       ->method( 'set' );
-               $mockDb->expects( $this->never() )
-                       ->method( 'delete' );
+               $mockCache->expects( $this->never() )->method( 'get' );
+               $mockCache->expects( $this->once() )
+                       ->method( 'set' )
+                       ->with( '0:SomeDbKey:1', $this->isType( 'object' ) );
+               $mockCache->expects( $this->once() )
+                       ->method( 'delete' )
+                       ->with( '0:SomeDbKey:1' );
 
                $store = $this->newWatchedItemStore(
                        $this->getMockLoadBalancer( $mockDb ),
index fa249b2..7cf042d 100755 (executable)
@@ -80,7 +80,7 @@ class PHPUnitMaintClass extends Maintenance {
                                [ '--configuration', $IP . '/tests/phpunit/suite.xml' ] );
                }
 
-               $phpUnitClass = 'PHPUnit_TextUI_Command';
+               $phpUnitClass = PHPUnit_TextUI_Command::class;
 
                if ( $this->hasOption( 'with-phpunitclass' ) ) {
                        $phpUnitClass = $this->getOption( 'with-phpunitclass' );
diff --git a/tests/selenium/selenium.sh b/tests/selenium/selenium.sh
new file mode 100755 (executable)
index 0000000..519b7be
--- /dev/null
@@ -0,0 +1,9 @@
+#!/usr/bin/env bash
+set -euo pipefail
+chromedriver --url-base=/wd/hub --port=4444 &
+# Make sure it is killed to prevent file descriptors leak
+function kill_chromedriver() {
+    killall chromedriver > /dev/null
+}
+trap kill_chromedriver EXIT
+./node_modules/.bin/grunt webdriver:test
diff --git a/tests/selenium/wdio.conf.jenkins.js b/tests/selenium/wdio.conf.jenkins.js
deleted file mode 100644 (file)
index de2b738..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-'use strict';
-const merge = require( 'deepmerge' ),
-       password = 'testpass',
-       username = 'WikiAdmin',
-       wdioConf = require( './wdio.conf.js' );
-
-// Overwrite default settings
-exports.config = merge( wdioConf.config, {
-       username: process.env.MEDIAWIKI_USER === undefined ?
-               username :
-               process.env.MEDIAWIKI_USER,
-       password: process.env.MEDIAWIKI_PASSWORD === undefined ?
-               password :
-               process.env.MEDIAWIKI_PASSWORD,
-       screenshotPath: '../log/',
-       baseUrl: process.env.MW_SERVER + process.env.MW_SCRIPT_PATH,
-       exclude: [
-               './extensions/CirrusSearch/tests/selenium/specs/**/*.js'
-       ],
-       reporters: [ 'spec', 'junit' ],
-       reporterOptions: {
-               junit: {
-                       outputDir: '../log/'
-               }
-       }
-} );
index 7b74328..0930a0f 100644 (file)
@@ -1,8 +1,21 @@
 'use strict';
 
-const password = 'vagrant',
-       path = require( 'path' ),
+const fs = require( 'fs' ),
+       path = require( 'path' );
+
+let logPath, password, username;
+
+// username and password will be used only if
+// MEDIAWIKI_USER or MEDIAWIKI_PASSWORD environment variables are not set
+if ( process.env.JENKINS_HOME ) {
+       logPath = '../log/';
+       password = 'testpass';
+       username = 'WikiAdmin';
+} else {
+       logPath = './log/';
+       password = 'vagrant';
        username = 'Admin';
+}
 
 function relPath( foo ) {
        return path.resolve( __dirname, '../..', foo );
@@ -48,7 +61,7 @@ exports.config = {
        ],
        // Patterns to exclude.
        exclude: [
-       // 'path/to/excluded/files'
+               './extensions/CirrusSearch/tests/selenium/specs/**/*.js'
        ],
        //
        // ============
@@ -83,7 +96,12 @@ exports.config = {
                chromeOptions: {
                        // Run headless when there is no DISPLAY
                        // --headless: since Chrome 59 https://chromium.googlesource.com/chromium/src/+/59.0.3030.0/headless/README.md
-                       args: process.env.DISPLAY ? [] : [ '--headless' ]
+                       args: (
+                               process.env.DISPLAY ? [] : [ '--headless' ]
+                       ).concat(
+                               // Disable Chrome sandbox when running in Docker
+                               fs.existsSync( '/.dockerenv' ) ? [ '--no-sandbox' ] : []
+                       )
                }
        } ],
        //
@@ -111,7 +129,7 @@ exports.config = {
        bail: 0,
        //
        // Saves a screenshot to a given path if a command fails.
-       screenshotPath: './log/',
+       screenshotPath: logPath,
        //
        // Set a base URL in order to shorten url command calls. If your `url` parameter starts
        // with `/`, the base url gets prepended, not including the path portion of your baseUrl.
@@ -171,7 +189,12 @@ exports.config = {
        // Test reporter for stdout.
        // The only one supported by default is 'dot'
        // see also: http://webdriver.io/guide/testrunner/reporters.html
-       reporters: [ 'spec' ],
+       reporters: [ 'spec', 'junit' ],
+       reporterOptions: {
+               junit: {
+                       outputDir: logPath
+               }
+       },
        //
        // Options to be passed to Mocha.
        // See the full list at http://mochajs.org/