Merge "Message: Don't include Title objects in the serialization (part 1)"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Sat, 1 Dec 2018 10:49:38 +0000 (10:49 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Sat, 1 Dec 2018 10:49:38 +0000 (10:49 +0000)
134 files changed:
includes/DefaultSettings.php
includes/EditPage.php
includes/Storage/DerivedPageDataUpdater.php
includes/api/ApiBase.php
includes/api/ApiQueryAllDeletedRevisions.php
includes/api/ApiQueryAllRevisions.php
includes/api/ApiQueryDeletedRevisions.php
includes/api/ApiQueryDeletedrevs.php
includes/api/ApiQueryLogEvents.php
includes/api/ApiQueryRecentChanges.php
includes/api/ApiQueryRevisions.php
includes/api/ApiQueryUserContribs.php
includes/api/i18n/es.json
includes/api/i18n/pl.json
includes/api/i18n/zh-hant.json
includes/changetags/ChangeTags.php
includes/installer/MssqlUpdater.php
includes/installer/MysqlUpdater.php
includes/installer/OracleUpdater.php
includes/installer/PostgresUpdater.php
includes/installer/SqliteUpdater.php
includes/installer/i18n/et.json
includes/jobqueue/jobs/CategoryMembershipChangeJob.php
includes/preferences/DefaultPreferencesFactory.php
includes/revisiondelete/RevisionDeleteUser.php
includes/specials/pagers/ActiveUsersPager.php
languages/i18n/azb.json
languages/i18n/be-tarask.json
languages/i18n/bg.json
languages/i18n/bn.json
languages/i18n/ca.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/hu.json
languages/i18n/it.json
languages/i18n/jv.json
languages/i18n/kjp.json
languages/i18n/ko.json
languages/i18n/la.json
languages/i18n/lb.json
languages/i18n/mai.json
languages/i18n/ml.json
languages/i18n/ne.json
languages/i18n/pl.json
languages/i18n/pt-br.json
languages/i18n/qqq.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/sr-ec.json
languages/i18n/su.json
languages/i18n/ur.json
languages/i18n/zh-hant.json
maintenance/archives/patch-drop-ct_tag.sql [new file with mode: 0644]
maintenance/mssql/archives/patch-drop-ct_tag.sql [new file with mode: 0644]
maintenance/mssql/tables.sql
maintenance/oracle/archives/patch-drop-ct_tag.sql [new file with mode: 0644]
maintenance/oracle/tables.sql
maintenance/populateChangeTagDef.php
maintenance/postgres/archives/patch-drop-ct_tag.sql [new file with mode: 0644]
maintenance/postgres/tables.sql
maintenance/sqlite/archives/patch-actor-table.sql
maintenance/sqlite/archives/patch-comment-table.sql
maintenance/sqlite/archives/patch-drop-ct_tag.sql [new file with mode: 0644]
maintenance/sqlite/archives/patch-filearchive-fa_actor.sql [new file with mode: 0644]
maintenance/sqlite/archives/patch-filearchive-fa_description_id.sql [new file with mode: 0644]
maintenance/tables.sql
mw-config/config.css
package.json
resources/src/jquery.tipsy/jquery.tipsy.css
resources/src/jquery/jquery.makeCollapsible.css
resources/src/jquery/jquery.makeCollapsible.styles.less
resources/src/mediawiki.action/mediawiki.action.view.categoryPage.less
resources/src/mediawiki.apihelp.css
resources/src/mediawiki.feedback/feedback.css
resources/src/mediawiki.hlist/default.css
resources/src/mediawiki.htmlform.ooui.styles.less
resources/src/mediawiki.htmlform.styles/styles.css
resources/src/mediawiki.less/mediawiki.mixins.less
resources/src/mediawiki.less/mediawiki.mixins.rotation.less
resources/src/mediawiki.notification/default.css
resources/src/mediawiki.page.gallery.styles/print.css
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.ChangesListWrapperWidget.highlightCircles.seenunseen.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.ChangesListWrapperWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterItemHighlightButton.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterTagMultiselectWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterWrapperWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.HighlightColorPickerWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.ItemMenuOptionWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.LiveUpdateButtonWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.SavedLinksListItemWidget.less
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.TagItemWidget.less
resources/src/mediawiki.skinning/content.css
resources/src/mediawiki.skinning/content.parsoid.less
resources/src/mediawiki.skinning/elements.css
resources/src/mediawiki.special.block.less
resources/src/mediawiki.special.changeslist.less
resources/src/mediawiki.special.preferences.styles.css
resources/src/mediawiki.special.search.interwikiwidget.styles.less
resources/src/mediawiki.special.search.styles.css
resources/src/mediawiki.special.search/search.css
resources/src/mediawiki.special.userlogin.login.styles/login.css
resources/src/mediawiki.special/special.css
resources/src/mediawiki.special/userrights.css
resources/src/mediawiki.ui/components/anchors.less
resources/src/mediawiki.ui/components/forms.less
resources/src/mediawiki.ui/components/icons.less
resources/src/mediawiki.ui/components/inputs.less
resources/src/mediawiki.ui/components/text.less
resources/src/mediawiki.widgets.datetime/CalendarWidget.less
resources/src/mediawiki.widgets/mw.widgets.CalendarWidget.less
resources/src/mediawiki.widgets/mw.widgets.StashedFileWidget.less
resources/src/mediawiki.widgets/mw.widgets.TitleWidget.less
tests/phpunit/includes/Revision/RevisionStoreDbTestBase.php
tests/phpunit/includes/RevisionDbTestBase.php
tests/phpunit/includes/RevisionTest.php
tests/phpunit/includes/api/ApiBlockTest.php
tests/phpunit/includes/api/ApiDeleteTest.php
tests/phpunit/includes/api/ApiEditPageTest.php
tests/phpunit/includes/api/ApiUnblockTest.php
tests/phpunit/includes/api/ApiUserrightsTest.php
tests/phpunit/includes/changetags/ChangeTagsTest.php
tests/phpunit/includes/jobqueue/jobs/CategoryMembershipChangeJobTest.php
tests/phpunit/includes/page/PageArchiveMcrTest.php
tests/phpunit/includes/page/PageArchivePreMcrTest.php
tests/phpunit/includes/page/PageArchiveTestBase.php
tests/phpunit/includes/page/WikiPageDbTestBase.php
tests/phpunit/maintenance/populateChangeTagDefTest.php [deleted file]
tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js

index 5175543..358b466 100644 (file)
@@ -37,6 +37,7 @@
  *
  * @file
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * @cond file_level_code
@@ -7565,7 +7566,10 @@ $wgJobClasses = [
        'refreshLinksPrioritized' => RefreshLinksJob::class,
        'refreshLinksDynamic' => RefreshLinksJob::class,
        'activityUpdateJob' => ActivityUpdateJob::class,
-       'categoryMembershipChange' => CategoryMembershipChangeJob::class,
+       'categoryMembershipChange' => function ( Title $title, $params = [] ) {
+               $pc = MediaWikiServices::getInstance()->getParserCache();
+               return new CategoryMembershipChangeJob( $pc, $title, $params );
+       },
        'clearUserWatchlist' => ClearUserWatchlistJob::class,
        'cdnPurge' => CdnPurgeJob::class,
        'userGroupExpiry' => UserGroupExpiryJob::class,
@@ -8989,7 +8993,7 @@ $wgInterwikiPrefixDisplayTypes = [];
  * @since 1.30
  * @var int One of the MIGRATION_* constants
  */
-$wgCommentTableSchemaMigrationStage = MIGRATION_OLD;
+$wgCommentTableSchemaMigrationStage = MIGRATION_NEW;
 
 /**
  * RevisionStore table schema migration stage (content, slots, content_models & slot_roles tables).
@@ -9030,20 +9034,6 @@ $wgMultiContentRevisionSchemaMigrationStage = SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_
  */
 $wgActorTableSchemaMigrationStage = SCHEMA_COMPAT_OLD;
 
-/**
- * change_tag table schema migration stage.
- *
- * - MIGRATION_OLD: Do not use change_tag_def table or ct_tag_id.
- * - MIGRATION_WRITE_BOTH: Write to the change_tag_def table and ct_tag_id, but read from
- *   the old schema. This is different from the formal definition of the constants
- * - MIGRATION_WRITE_NEW: Behaves the same as MIGRATION_WRITE_BOTH
- * - MIGRATION_NEW: Use the change_tag_def table and ct_tag_id, do not read/write ct_tag
- *
- * @since 1.32
- * @var int One of the MIGRATION_* constants
- */
-$wgChangeTagsSchemaMigrationStage = MIGRATION_NEW;
-
 /**
  * Flag to enable Partial Blocks. This allows an admin to prevent a user from editing specific pages
  * or namespaces.
@@ -9054,6 +9044,16 @@ $wgChangeTagsSchemaMigrationStage = MIGRATION_NEW;
  */
 $wgEnablePartialBlocks = false;
 
+/**
+ * Enable stats monitoring when Block Notices are displayed in different places around core
+ * and extensions.
+ *
+ * @since 1.34
+ * @deprecated 1.34
+ * @var bool
+ */
+$wgEnableBlockNoticeStats = false;
+
 /**
  * For really cool vim folding this needs to be at the end:
  * vim: foldmarker=@{,@} foldmethod=marker
index 5f4c3ae..9e278af 100644 (file)
@@ -627,14 +627,23 @@ class EditPage {
                if ( $permErrors ) {
                        wfDebug( __METHOD__ . ": User can't edit\n" );
 
-                       // track block with a cookie if it doesn't exists already
-                       $this->context->getUser()->trackBlockWithCookie();
+                       if ( $this->context->getUser()->getBlock() ) {
+                               // track block with a cookie if it doesn't exists already
+                               $this->context->getUser()->trackBlockWithCookie();
+
+                               // Auto-block user's IP if the account was "hard" blocked
+                               if ( !wfReadOnly() ) {
+                                       DeferredUpdates::addCallableUpdate( function () {
+                                               $this->context->getUser()->spreadAnyEditBlock();
+                                       } );
+                               }
 
-                       // Auto-block user's IP if the account was "hard" blocked
-                       if ( !wfReadOnly() ) {
-                               DeferredUpdates::addCallableUpdate( function () {
-                                       $this->context->getUser()->spreadAnyEditBlock();
-                               } );
+                               $config = $this->context->getConfig();
+                               if ( $config->get( 'EnableBlockNoticeStats' ) ) {
+                                       $wiki = $config->get( 'DBname' );
+                                       $statsd = MediaWikiServices::getInstance()->getStatsdDataFactory();
+                                       $statsd->increment( 'BlockNotices.' . $wiki . '.WikitextEditor.shown' );
+                               }
                        }
                        $this->displayPermissionsError( $permErrors );
 
index d837a53..1fc41f0 100644 (file)
@@ -1395,12 +1395,9 @@ class DerivedPageDataUpdater implements IDBAccessObject {
                        // the recent change entry (also done via deferred updates) and carry over any
                        // bot/deletion/IP flags, ect.
                        $this->jobQueueGroup->lazyPush(
-                               new CategoryMembershipChangeJob(
+                               CategoryMembershipChangeJob::newSpec(
                                        $this->getTitle(),
-                                       [
-                                               'pageId' => $this->getPageId(),
-                                               'revTimestamp' => $this->revision->getTimestamp(),
-                                       ]
+                                       $this->revision->getTimestamp()
                                )
                        );
                }
index 1149d1e..32156d8 100644 (file)
@@ -21,6 +21,7 @@
  */
 
 use Wikimedia\Rdbms\IDatabase;
+use MediaWiki\MediaWikiServices;
 
 /**
  * This abstract class implements many basic API functions, and is the base of
@@ -2069,11 +2070,41 @@ abstract class ApiBase extends ContextSource {
                foreach ( (array)$actions as $action ) {
                        $errors = array_merge( $errors, $title->getUserPermissionsErrors( $action, $user ) );
                }
+
                if ( $errors ) {
+                       // track block notices
+                       if ( $this->getConfig()->get( 'EnableBlockNoticeStats' ) ) {
+                               $this->trackBlockNotices( $errors );
+                       }
+
                        $this->dieStatus( $this->errorArrayToStatus( $errors, $user ) );
                }
        }
 
+       /**
+        * Keep track of errors messages resulting from a block
+        *
+        * @param array $errors
+        */
+       private function trackBlockNotices( array $errors ) {
+               $errorMessageKeys = [
+                       'blockedtext',
+                       'blockedtext-partial',
+                       'autoblockedtext',
+                       'systemblockedtext',
+               ];
+
+               $statsd = MediaWikiServices::getInstance()->getStatsdDataFactory();
+
+               foreach ( $errors as $error ) {
+                       if ( in_array( $error[0], $errorMessageKeys ) ) {
+                               $wiki = $this->getConfig()->get( 'DBname' );
+                               $statsd->increment( 'BlockNotices.' . $wiki . '.MediaWikiApi.returned' );
+                               break;
+                       }
+               }
+       }
+
        /**
         * Will only set a warning instead of failing if the global $wgDebugAPI
         * is set to true. Otherwise behaves exactly as self::dieWithError().
index 7b4f15e..7a1c461 100644 (file)
@@ -43,8 +43,6 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
         * @return void
         */
        protected function run( ApiPageSet $resultPageSet = null ) {
-               global $wgChangeTagsSchemaMigrationStage;
-
                // Before doing anything at all, let's check permissions
                $this->checkUserRightsAny( 'deletedhistory' );
 
@@ -127,11 +125,7 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
                }
 
                if ( $this->fld_tags ) {
-                       $this->addTables( 'tag_summary' );
-                       $this->addJoinConds(
-                               [ 'tag_summary' => [ 'LEFT JOIN', [ 'ar_rev_id=ts_rev_id' ] ] ]
-                       );
-                       $this->addFields( 'ts_tags' );
+                       $this->addFields( [ 'ts_tags' => ChangeTags::makeTagSummarySubquery( 'archive' ) ] );
                }
 
                if ( !is_null( $params['tag'] ) ) {
@@ -139,16 +133,12 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
                        $this->addJoinConds(
                                [ 'change_tag' => [ 'INNER JOIN', [ 'ar_rev_id=ct_rev_id' ] ] ]
                        );
-                       if ( $wgChangeTagsSchemaMigrationStage > MIGRATION_WRITE_BOTH ) {
-                               $changeTagDefStore = MediaWikiServices::getInstance()->getChangeTagDefStore();
-                               try {
-                                       $this->addWhereFld( 'ct_tag_id', $changeTagDefStore->getId( $params['tag'] ) );
-                               } catch ( NameTableAccessException $exception ) {
-                                       // Return nothing.
-                                       $this->addWhere( '1=0' );
-                               }
-                       } else {
-                               $this->addWhereFld( 'ct_tag', $params['tag'] );
+                       $changeTagDefStore = MediaWikiServices::getInstance()->getChangeTagDefStore();
+                       try {
+                               $this->addWhereFld( 'ct_tag_id', $changeTagDefStore->getId( $params['tag'] ) );
+                       } catch ( NameTableAccessException $exception ) {
+                               // Return nothing.
+                               $this->addWhere( '1=0' );
                        }
                }
 
index 922d2c3..5343c33 100644 (file)
@@ -140,11 +140,7 @@ class ApiQueryAllRevisions extends ApiQueryRevisionsBase {
                $this->addTimestampWhereRange( $tsField, $dir, $params['start'], $params['end'] );
 
                if ( $this->fld_tags ) {
-                       $this->addTables( 'tag_summary' );
-                       $this->addJoinConds(
-                               [ 'tag_summary' => [ 'LEFT JOIN', [ 'rev_id=ts_rev_id' ] ] ]
-                       );
-                       $this->addFields( 'ts_tags' );
+                       $this->addFields( [ 'ts_tags' => ChangeTags::makeTagSummarySubquery( 'revision' ) ] );
                }
 
                if ( $params['user'] !== null ) {
index 8f71c1c..9275a7c 100644 (file)
@@ -39,8 +39,6 @@ class ApiQueryDeletedRevisions extends ApiQueryRevisionsBase {
        }
 
        protected function run( ApiPageSet $resultPageSet = null ) {
-               global $wgChangeTagsSchemaMigrationStage;
-
                $user = $this->getUser();
                // Before doing anything at all, let's check permissions
                $this->checkUserRightsAny( 'deletedhistory' );
@@ -79,11 +77,7 @@ class ApiQueryDeletedRevisions extends ApiQueryRevisionsBase {
                }
 
                if ( $this->fld_tags ) {
-                       $this->addTables( 'tag_summary' );
-                       $this->addJoinConds(
-                               [ 'tag_summary' => [ 'LEFT JOIN', [ 'ar_rev_id=ts_rev_id' ] ] ]
-                       );
-                       $this->addFields( 'ts_tags' );
+                       $this->addFields( [ 'ts_tags' => ChangeTags::makeTagSummarySubquery( 'archive' ) ] );
                }
 
                if ( !is_null( $params['tag'] ) ) {
@@ -91,16 +85,12 @@ class ApiQueryDeletedRevisions extends ApiQueryRevisionsBase {
                        $this->addJoinConds(
                                [ 'change_tag' => [ 'INNER JOIN', [ 'ar_rev_id=ct_rev_id' ] ] ]
                        );
-                       if ( $wgChangeTagsSchemaMigrationStage > MIGRATION_WRITE_BOTH ) {
-                               $changeTagDefStore = MediaWikiServices::getInstance()->getChangeTagDefStore();
-                               try {
-                                       $this->addWhereFld( 'ct_tag_id', $changeTagDefStore->getId( $params['tag'] ) );
-                               } catch ( NameTableAccessException $exception ) {
-                                       // Return nothing.
-                                       $this->addWhere( '1=0' );
-                               }
-                       } else {
-                               $this->addWhereFld( 'ct_tag', $params['tag'] );
+                       $changeTagDefStore = MediaWikiServices::getInstance()->getChangeTagDefStore();
+                       try {
+                               $this->addWhereFld( 'ct_tag_id', $changeTagDefStore->getId( $params['tag'] ) );
+                       } catch ( NameTableAccessException $exception ) {
+                               // Return nothing.
+                               $this->addWhere( '1=0' );
                        }
                }
 
index e84b9b2..8540190 100644 (file)
@@ -36,8 +36,6 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
        }
 
        public function execute() {
-               global $wgChangeTagsSchemaMigrationStage;
-
                // Before doing anything at all, let's check permissions
                $this->checkUserRightsAny( 'deletedhistory' );
 
@@ -133,11 +131,7 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                }
 
                if ( $fld_tags ) {
-                       $this->addTables( 'tag_summary' );
-                       $this->addJoinConds(
-                               [ 'tag_summary' => [ 'LEFT JOIN', [ 'ar_rev_id=ts_rev_id' ] ] ]
-                       );
-                       $this->addFields( 'ts_tags' );
+                       $this->addFields( [ 'ts_tags' => ChangeTags::makeTagSummarySubquery( 'archive' ) ] );
                }
 
                if ( !is_null( $params['tag'] ) ) {
@@ -145,16 +139,12 @@ class ApiQueryDeletedrevs extends ApiQueryBase {
                        $this->addJoinConds(
                                [ 'change_tag' => [ 'INNER JOIN', [ 'ar_rev_id=ct_rev_id' ] ] ]
                        );
-                       if ( $wgChangeTagsSchemaMigrationStage > MIGRATION_WRITE_BOTH ) {
-                               $changeTagDefStore = MediaWikiServices::getInstance()->getChangeTagDefStore();
-                               try {
-                                       $this->addWhereFld( 'ct_tag_id', $changeTagDefStore->getId( $params['tag'] ) );
-                               } catch ( NameTableAccessException $exception ) {
-                                       // Return nothing.
-                                       $this->addWhere( '1=0' );
-                               }
-                       } else {
-                               $this->addWhereFld( 'ct_tag', $params['tag'] );
+                       $changeTagDefStore = MediaWikiServices::getInstance()->getChangeTagDefStore();
+                       try {
+                               $this->addWhereFld( 'ct_tag_id', $changeTagDefStore->getId( $params['tag'] ) );
+                       } catch ( NameTableAccessException $exception ) {
+                               // Return nothing.
+                               $this->addWhere( '1=0' );
                        }
                }
 
index ba04193..edf7002 100644 (file)
@@ -42,8 +42,6 @@ class ApiQueryLogEvents extends ApiQueryBase {
                $fld_details = false, $fld_tags = false;
 
        public function execute() {
-               global $wgChangeTagsSchemaMigrationStage;
-
                $params = $this->extractRequestParams();
                $db = $this->getDB();
                $this->commentStore = CommentStore::getStore();
@@ -116,16 +114,12 @@ class ApiQueryLogEvents extends ApiQueryBase {
                        $this->addTables( 'change_tag' );
                        $this->addJoinConds( [ 'change_tag' => [ 'INNER JOIN',
                                [ 'log_id=ct_log_id' ] ] ] );
-                       if ( $wgChangeTagsSchemaMigrationStage > MIGRATION_WRITE_BOTH ) {
-                               $changeTagDefStore = MediaWikiServices::getInstance()->getChangeTagDefStore();
-                               try {
-                                       $this->addWhereFld( 'ct_tag_id', $changeTagDefStore->getId( $params['tag'] ) );
-                               } catch ( NameTableAccessException $exception ) {
-                                       // Return nothing.
-                                       $this->addWhere( '1=0' );
-                               }
-                       } else {
-                               $this->addWhereFld( 'ct_tag', $params['tag'] );
+                       $changeTagDefStore = MediaWikiServices::getInstance()->getChangeTagDefStore();
+                       try {
+                               $this->addWhereFld( 'ct_tag_id', $changeTagDefStore->getId( $params['tag'] ) );
+                       } catch ( NameTableAccessException $exception ) {
+                               // Return nothing.
+                               $this->addWhere( '1=0' );
                        }
                }
 
index b1dcf0d..7c6b463 100644 (file)
@@ -143,8 +143,6 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
         * @param ApiPageSet|null $resultPageSet
         */
        public function run( $resultPageSet = null ) {
-               global $wgChangeTagsSchemaMigrationStage;
-
                $user = $this->getUser();
                /* Get the parameters of the request. */
                $params = $this->extractRequestParams();
@@ -339,9 +337,7 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                        $resultPageSet && $params['generaterevisions'] );
 
                if ( $this->fld_tags ) {
-                       $this->addTables( 'tag_summary' );
-                       $this->addJoinConds( [ 'tag_summary' => [ 'LEFT JOIN', [ 'rc_id=ts_rc_id' ] ] ] );
-                       $this->addFields( 'ts_tags' );
+                       $this->addFields( [ 'ts_tags' => ChangeTags::makeTagSummarySubquery( 'recentchanges' ) ] );
                }
 
                if ( $this->fld_sha1 ) {
@@ -365,16 +361,12 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
                if ( !is_null( $params['tag'] ) ) {
                        $this->addTables( 'change_tag' );
                        $this->addJoinConds( [ 'change_tag' => [ 'INNER JOIN', [ 'rc_id=ct_rc_id' ] ] ] );
-                       if ( $wgChangeTagsSchemaMigrationStage > MIGRATION_WRITE_BOTH ) {
-                               $changeTagDefStore = MediaWikiServices::getInstance()->getChangeTagDefStore();
-                               try {
-                                       $this->addWhereFld( 'ct_tag_id', $changeTagDefStore->getId( $params['tag'] ) );
-                               } catch ( NameTableAccessException $exception ) {
-                                       // Return nothing.
-                                       $this->addWhere( '1=0' );
-                               }
-                       } else {
-                               $this->addWhereFld( 'ct_tag', $params['tag'] );
+                       $changeTagDefStore = MediaWikiServices::getInstance()->getChangeTagDefStore();
+                       try {
+                               $this->addWhereFld( 'ct_tag_id', $changeTagDefStore->getId( $params['tag'] ) );
+                       } catch ( NameTableAccessException $exception ) {
+                               // Return nothing.
+                               $this->addWhere( '1=0' );
                        }
                }
 
index ac7ee0a..cb2f616 100644 (file)
@@ -84,7 +84,7 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase {
        }
 
        protected function run( ApiPageSet $resultPageSet = null ) {
-               global $wgActorTableSchemaMigrationStage, $wgChangeTagsSchemaMigrationStage;
+               global $wgActorTableSchemaMigrationStage;
 
                $params = $this->extractRequestParams( false );
                $revisionStore = MediaWikiServices::getInstance()->getRevisionStore();
@@ -185,11 +185,7 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase {
                }
 
                if ( $this->fld_tags ) {
-                       $this->addTables( 'tag_summary' );
-                       $this->addJoinConds(
-                               [ 'tag_summary' => [ 'LEFT JOIN', [ 'rev_id=ts_rev_id' ] ] ]
-                       );
-                       $this->addFields( 'ts_tags' );
+                       $this->addFields( [ 'ts_tags' => ChangeTags::makeTagSummarySubquery( 'revision' ) ] );
                }
 
                if ( $params['tag'] !== null ) {
@@ -197,16 +193,12 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase {
                        $this->addJoinConds(
                                [ 'change_tag' => [ 'INNER JOIN', [ 'rev_id=ct_rev_id' ] ] ]
                        );
-                       if ( $wgChangeTagsSchemaMigrationStage > MIGRATION_WRITE_BOTH ) {
-                               $changeTagDefStore = MediaWikiServices::getInstance()->getChangeTagDefStore();
-                               try {
-                                       $this->addWhereFld( 'ct_tag_id', $changeTagDefStore->getId( $params['tag'] ) );
-                               } catch ( NameTableAccessException $exception ) {
-                                       // Return nothing.
-                                       $this->addWhere( '1=0' );
-                               }
-                       } else {
-                               $this->addWhereFld( 'ct_tag', $params['tag'] );
+                       $changeTagDefStore = MediaWikiServices::getInstance()->getChangeTagDefStore();
+                       try {
+                               $this->addWhereFld( 'ct_tag_id', $changeTagDefStore->getId( $params['tag'] ) );
+                       } catch ( NameTableAccessException $exception ) {
+                               // Return nothing.
+                               $this->addWhere( '1=0' );
                        }
                }
 
index f16f958..ed83130 100644 (file)
@@ -321,7 +321,7 @@ class ApiQueryUserContribs extends ApiQueryBase {
         * @param int $limit
         */
        private function prepareQuery( array $users, $limit ) {
-               global $wgActorTableSchemaMigrationStage, $wgChangeTagsSchemaMigrationStage;
+               global $wgActorTableSchemaMigrationStage;
 
                $this->resetQueryParams();
                $db = $this->getDB();
@@ -478,11 +478,7 @@ class ApiQueryUserContribs extends ApiQueryBase {
                $this->addFieldsIf( 'rc_patrolled', $this->fld_patrolled );
 
                if ( $this->fld_tags ) {
-                       $this->addTables( 'tag_summary' );
-                       $this->addJoinConds(
-                               [ 'tag_summary' => [ 'LEFT JOIN', [ $idField . ' = ts_rev_id' ] ] ]
-                       );
-                       $this->addFields( 'ts_tags' );
+                       $this->addFields( [ 'ts_tags' => ChangeTags::makeTagSummarySubquery( 'revision' ) ] );
                }
 
                if ( isset( $this->params['tag'] ) ) {
@@ -490,16 +486,12 @@ class ApiQueryUserContribs extends ApiQueryBase {
                        $this->addJoinConds(
                                [ 'change_tag' => [ 'INNER JOIN', [ $idField . ' = ct_rev_id' ] ] ]
                        );
-                       if ( $wgChangeTagsSchemaMigrationStage > MIGRATION_WRITE_BOTH ) {
-                               $changeTagDefStore = MediaWikiServices::getInstance()->getChangeTagDefStore();
-                               try {
-                                       $this->addWhereFld( 'ct_tag_id', $changeTagDefStore->getId( $this->params['tag'] ) );
-                               } catch ( NameTableAccessException $exception ) {
-                                       // Return nothing.
-                                       $this->addWhere( '1=0' );
-                               }
-                       } else {
-                               $this->addWhereFld( 'ct_tag', $this->params['tag'] );
+                       $changeTagDefStore = MediaWikiServices::getInstance()->getChangeTagDefStore();
+                       try {
+                               $this->addWhereFld( 'ct_tag_id', $changeTagDefStore->getId( $this->params['tag'] ) );
+                       } catch ( NameTableAccessException $exception ) {
+                               // Return nothing.
+                               $this->addWhere( '1=0' );
                        }
                }
        }
index f807411..31c9d8f 100644 (file)
                        "Luzcaru",
                        "Javiersanp",
                        "KATRINE1992",
-                       "Adjen"
+                       "Adjen",
+                       "Tiberius1701"
                ]
        },
-       "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 Mailing list]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API Announcements]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bugs & requests]\n</div>\n<strong>Status:</strong> Todas las funciones mostradas en esta página deberían estar funcionando, pero la API aún está en desarrollo activo, y puede cambiar en cualquier momento. Suscribase a [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce mailing list] para aviso de actualizaciones.\n\n<strong>Erroneous requests:</strong> Cuando se envían solicitudes erróneas a la API, se enviará un encabezado HTTP con la clave \"MediaWiki-API-Error\" y, luego, el valor del encabezado y el código de error devuelto se establecerán en el mismo valor. Para más información ver [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Errors and warnings]].\n\n<strong>Testing:</strong> Para facilitar la comprobación de las solicitudes de API, consulte [[Special:ApiSandbox]].",
+       "apihelp-main-extended-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Documentación]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista de correo]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Anuncios API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Errores y peticiones]\n</div>\n<strong>Estado:</strong> La API de MediaWiki es una interfaz madura y estable que se mejora y prueba activamente. Aunque tratamos de evitarlo, es posible que ocasionalmente debamos hacer cambios importantes; Suscribase a la [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ lista de correo the mediawiki-api-announce] para recibir avisos de actualizaciones.\n\n<strong>Solicitudes erróneas:</strong> Cuando se envían solicitudes erróneas a la API, se enviará un encabezado HTTP con la clave \"MediaWiki-API-Error\" y, luego, el valor del encabezado y el código de error devuelto se establecerán en el mismo valor. Para obtener más información, consulte [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Errores y advertencias]].\n\n<p class=\"mw-apisandbox-link\"><strong>Pruebas:</strong> Para facilitar la comprobación de las solicitudes de API, consulte [[Special:ApiSandbox]].</p>",
        "apihelp-main-param-action": "Qué acción se realizará.",
        "apihelp-main-param-format": "El formato de la salida.",
-       "apihelp-main-param-maxlag": "El retardo máximo puede utilizarse cuando MediaWiki se instala en una agrupación replicada de bases de datos. Para guardar las acciones que causan más retardo de replicación de sitio, este parámetro puede hacer que el cliente espere hasta que el retardo de replicación sea menor que el valor especificado. En caso de un retardo excesivo, se devuelve el código de error <samp>maxlag</samp> con un mensaje como <samp>Esperando a $host: $lag segundos de retardo</samp>.<br />Consulta [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Manual: parámetro Maxlag]] para más información.",
+       "apihelp-main-param-maxlag": "Se puede usar el retardo máximo cuando se instala MediaWiki en un clúster replicado de base de datos. Para evitar acciones que causen más retardo en la replicación del sitio, este parámetro puede hacer que el cliente espere hasta que el retardo en la replicación sea menor que el valor especificado. En caso de retardo excesivo, se devuelve el código de error <samp>maxlag</samp> con un mensaje como <samp>Esperando a $host: $lag segundos de retardo</samp>.<br />Consulta [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Manual: parámetro Maxlag]] para más información.",
        "apihelp-main-param-smaxage": "Establece la cabecera HTTP <code>s-maxage</code> de control de antememoria a esta cantidad de segundos. Los errores nunca se almacenan en la antememoria.",
        "apihelp-main-param-maxage": "Establece la cabecera HTTP <code>max-age</code> de control de antememoria a esta cantidad de segundos. Los errores nunca se almacenan en la antememoria.",
        "apihelp-main-param-assert": "Comprobar que el usuario haya iniciado sesión si el valor es <kbd>user</kbd> o si tiene el permiso de bot si es <kbd>bot</kbd>.",
@@ -89,7 +90,7 @@
        "apihelp-compare-param-toid": "Segunda identificador de página para comparar.",
        "apihelp-compare-param-torev": "Segunda revisión para comparar.",
        "apihelp-compare-param-tosection": "Solamente usar la sección especificada del contenido 'to' especificado.",
-       "apihelp-compare-param-prop": "Cuáles fragmentos de información se obtendrán.",
+       "apihelp-compare-param-prop": "Qué fragmentos de información se obtendrán.",
        "apihelp-compare-paramvalue-prop-diff": "El HTML de las diferencias.",
        "apihelp-compare-paramvalue-prop-diffsize": "El tamaño del HTML de las diferencias, en bytes.",
        "apihelp-compare-example-1": "Crear una diferencia entre las revisiones 1 y 2.",
        "apihelp-delete-param-watchlist": "Añadir o quitar incondicionalmente la página de la lista de seguimiento del usuario actual, usar preferencias o no cambiar el estado de seguimiento.",
        "apihelp-delete-param-unwatch": "Quitar la página de la lista de seguimiento del usuario actual.",
        "apihelp-delete-param-oldimage": "El nombre de la imagen antigua es proporcionado conforme a lo dispuesto por [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]].",
-       "apihelp-delete-example-simple": "Borrar <kbd>Main Page</kbd>.",
-       "apihelp-delete-example-reason": "Eliminar <kbd>Main Page</kbd> con el motivo <kbd>Preparing for move</kbd>.",
+       "apihelp-delete-example-simple": "Borrar <kbd>Pagina principal</kbd>.",
+       "apihelp-delete-example-reason": "Eliminar <kbd>Main Page</kbd> con el motivo <kbd>Preparándose para traslado</kbd>.",
        "apihelp-disabled-summary": "Se desactivó este módulo.",
        "apihelp-edit-summary": "Crear y editar páginas.",
        "apihelp-edit-param-title": "Título de la página a editar. No se puede utilizar junto a <var>$1pageid</var>.",
        "apihelp-edit-param-tags": "Cambia las etiquetas para aplicarlas a la revisión.",
        "apihelp-edit-param-minor": "Edición menor.",
        "apihelp-edit-param-notminor": "Edición no menor.",
-       "apihelp-edit-param-bot": "Marcar esta como una edición de robot.",
+       "apihelp-edit-param-bot": "Marcar esta como una edición de bot.",
        "apihelp-edit-param-basetimestamp": "Marca de tiempo de la revisión base, usada para detectar conflictos de edición. Se puede obtener mediante [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]]",
        "apihelp-edit-param-starttimestamp": "Marca de tiempo de cuando empezó el proceso de edición, usada para detectar conflictos de edición. Se puede obtener un valor apropiado usando <var>[[Special:ApiHelp/main|curtimestamp]]</var> cuando comiences el proceso de edición (por ejemplo, al cargar el contenido de la página por editar).",
        "apihelp-edit-param-recreate": "Reemplazar los errores acerca de la página de haber sido eliminados en el ínterin.",
        "apihelp-edit-example-undo": "Deshacer intervalo de revisiones 13579-13585 con resumen automático",
        "apihelp-emailuser-summary": "Enviar un mensaje de correo electrónico a un usuario.",
        "apihelp-emailuser-param-target": "Cuenta de usuario destinatario.",
-       "apihelp-emailuser-param-subject": "Cabecera de asunto.",
+       "apihelp-emailuser-param-subject": "Cabecera del asunto.",
        "apihelp-emailuser-param-text": "Cuerpo del mensaje.",
        "apihelp-emailuser-param-ccme": "Enviarme una copia de este mensaje.",
        "apihelp-emailuser-example-email": "Enviar un correo al usuario <kbd>WikiSysop</kbd> con el texto <kbd>Content</kbd>.",
        "apihelp-expandtemplates-summary": "Expande todas las plantillas en wikitexto.",
        "apihelp-expandtemplates-param-title": "Título de la página.",
-       "apihelp-expandtemplates-param-text": "Sintaxis wiki que se convertirá.",
+       "apihelp-expandtemplates-param-text": "Wikitexto que se convertirá.",
        "apihelp-expandtemplates-param-revid": "Id. de revisión, para <code><nowiki>{{REVISIONID}}</nowiki></code> y variables similares.",
        "apihelp-expandtemplates-param-prop": "Qué elementos de información se utilizan para llegar.\n\nTenga en cuenta que si no se seleccionan los valores, el resultado contendrá el wikitexto, pero la salida será en un formato obsoleto.",
        "apihelp-expandtemplates-paramvalue-prop-wikitext": "El wikitexto expandido.",
        "apihelp-query+watchlist-paramvalue-prop-tags": "Enumera las etiquetas de la entrada.",
        "apihelp-query+watchlist-param-show": "Muestra solo los elementos que cumplan estos criterios. Por ejemplo, para ver solo ediciones menores realizadas por usuarios conectados, introduce $1show=minor|!anon.",
        "apihelp-query+watchlist-param-type": "Qué tipos de cambios mostrar:",
-       "apihelp-query+watchlist-paramvalue-type-edit": "Ediciones comunes a páginas",
+       "apihelp-query+watchlist-paramvalue-type-edit": "Ediciones comunes en páginas",
        "apihelp-query+watchlist-paramvalue-type-external": "Cambios externos.",
        "apihelp-query+watchlist-paramvalue-type-new": "Creaciones de páginas.",
        "apihelp-query+watchlist-paramvalue-type-log": "Entradas del registro.",
index 7b29b1f..53cc928 100644 (file)
@@ -14,7 +14,8 @@
                        "Matma Rex",
                        "Sethakill",
                        "Woytecr",
-                       "InternerowyGołąb"
+                       "InternerowyGołąb",
+                       "CiaPan"
                ]
        },
        "apihelp-main-extended-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Dokumentacja]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista dyskusyjna]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Ogłoszenia dotyczące API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Błędy i propozycje]\n</div>\n<strong>Stan:</strong> Wszystkie funkcje opisane na tej stronie powinny działać, ale API nadal jest aktywnie rozwijane i mogą się zmienić w dowolnym czasie. Subskrybuj [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ listę dyskusyjną mediawiki-api-announce], aby móc na bieżąco dowiadywać się o aktualizacjach.\n\n<strong>Błędne żądania:</strong> Gdy zostanie wysłane błędne żądanie do API, zostanie wysłany w odpowiedzi nagłówek HTTP z kluczem \"MediaWiki-API-Error\" i zarówno jego wartość jak i wartość kodu błędu wysłanego w odpowiedzi będą miały taką samą wartość. Aby uzyskać więcej informacji, zobacz [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Błędy i ostrzeżenia]].\n\n<strong>Testowanie:</strong> Aby łatwo testować żądania API, zobacz [[Special:ApiSandbox]].",
@@ -42,6 +43,8 @@
        "apihelp-block-param-reblock": "Jeżeli ten użytkownik jest już zablokowany, nadpisz blokadę.",
        "apihelp-block-param-watchuser": "Obserwuj stronę użytkownika lub IP oraz ich strony dyskusji.",
        "apihelp-block-param-tags": "Zmieniaj tagi by potwierdzić wejście do bloku logów.",
+       "apihelp-block-param-partial": "Zablokuj użytkownikowi dostęp do wybranych stron lub przestrzeni nazw zamiast do całej witryny.",
+       "apihelp-block-param-pagerestrictions": "Lista tytułów stron do zablokowania użytkownikowi możliwości edycji. Ma zastosowanie tylko gdy 'partial' (częściowa) jest ustawione na true (prawda).",
        "apihelp-block-example-ip-simple": "Zablokuj IP <kbd>192.0.2.5</kbd> na 3 dni z powodem <kbd>First strike</kbd>.",
        "apihelp-block-example-user-complex": "Zablokuj użytkownika <kbd>Vandal</kbd> na zawsze z powodem <kbd>Vandalism</kbd> i uniemożliw utworzenie nowego konta oraz wysyłanie emaili.",
        "apihelp-changeauthenticationdata-summary": "Zmień dane logowania bieżącego użytkownika.",
        "apihelp-opensearch-summary": "Przeszukaj wiki przy użyciu protokołu OpenSearch.",
        "apihelp-opensearch-param-search": "Wyszukaj tekst.",
        "apihelp-opensearch-param-limit": "Maksymalna liczba zwracanych wyników.",
-       "apihelp-opensearch-param-namespace": "Przestrzenie nazw do przeszukania.",
+       "apihelp-opensearch-param-namespace": "Przestrzenie nazw do przeszukania. Pomijane jeśli <var>$1search</var> zaczyna się od poprawnego przedrostka przestrzeni nazw.",
        "apihelp-opensearch-param-suggest": "Nic nie robi, jeżeli <var>[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var> ustawiono na false.",
        "apihelp-opensearch-param-redirects": "Jak obsługiwać przekierowania:\n;return:Zwróć samo przekierowanie.\n;resolve:Zwróć stronę docelową. Może zwrócić mniej niż wyników określonych w $1limit.\nZ powodów historycznych, domyślnie jest to \"return\" dla $1format=json, a \"resolve\" dla innych formatów.",
        "apihelp-opensearch-param-format": "Format danych wyjściowych.",
        "apihelp-query+blocks-paramvalue-prop-expiry": "Dodaje znacznik czasu wygaśnięcia blokady.",
        "apihelp-query+blocks-paramvalue-prop-reason": "Dodaje powód zablokowania.",
        "apihelp-query+blocks-paramvalue-prop-range": "Dodaje zakres adresów IP, na który zastosowano blokadę.",
+       "apihelp-query+blocks-paramvalue-prop-restrictions": "Dodaje częściowe ograniczenia jeśli blokada nie jest całościowa.",
        "apihelp-query+blocks-example-simple": "Listuj blokady.",
        "apihelp-query+categories-summary": "Lista kategorii, do których należą strony",
        "apihelp-query+categories-paramvalue-prop-timestamp": "Dodaje znacznik czasu dodania kategorii.",
        "apihelp-query+imageusage-example-simple": "Pokaż strony, które korzystają z [[:File:Albert Einstein Head.jpg]].",
        "apihelp-query+info-summary": "Pokaż podstawowe informacje o stronie.",
        "apihelp-query+info-paramvalue-prop-watchers": "Liczba obserwujących, jeśli jest to dozwolone.",
-       "apihelp-query+info-paramvalue-prop-readable": "Czy użytkownik może przeczytać tę stronę.",
+       "apihelp-query+info-paramvalue-prop-readable": "Czy użytkownik może przeczytać tę stronę. Zamiast tego użyj <kbd>intestactions=read</kbd>.",
        "apihelp-query+iwbacklinks-param-prefix": "Prefix interwiki.",
        "apihelp-query+iwbacklinks-param-limit": "Łączna liczba stron do zwrócenia.",
        "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "Dodaje prefiks interwiki.",
        "apihelp-query+pageswithprop-example-simple": "Lista pierwszych 10 stron za pomocą <code>&#123;&#123;DISPLAYTITLE:&#125;&#125;</code>.",
        "apihelp-query+pageswithprop-example-generator": "Pobierz dodatkowe informacje o pierwszych 10 stronach wykorzystując <code>_&#95;NOTOC_&#95;</code>.",
        "apihelp-query+prefixsearch-param-search": "Wyszukaj tekst.",
-       "apihelp-query+prefixsearch-param-namespace": "Przestrzenie nazw do przeszukania.",
+       "apihelp-query+prefixsearch-param-namespace": "Przestrzenie nazw do przeszukania. Pomijane jeśli <var>$1search</var> zaczyna się od poprawnego przedrostka przestrzeni nazw.",
        "apihelp-query+prefixsearch-param-limit": "Maksymalna liczba zwracanych wyników.",
        "apihelp-query+prefixsearch-param-offset": "Liczba wyników do pominięcia.",
        "apihelp-query+protectedtitles-summary": "Lista wszystkich tytułów zabezpieczonych przed tworzeniem.",
index 71a2a08..9c6e090 100644 (file)
        "apihelp-delete-param-reason": "刪除的原因。 若未設定,將會使用自動產生的原因。",
        "apihelp-delete-param-tags": "在刪除日誌裡更改套用到項目的標籤。",
        "apihelp-delete-param-watch": "加入目前頁面至您的監視清單。",
-       "apihelp-delete-param-watchlist": "無條件使用設置將頁面加入或移除目前使用者的監視清單或者是不更改監視清單。",
+       "apihelp-delete-param-watchlist": "使用偏好設定無條件地將頁面加入至或移除自目前使用者的監視清單,或不更改監視。",
        "apihelp-delete-param-unwatch": "從您的監視清單中移除目前頁面。",
        "apihelp-delete-param-oldimage": "由 [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]] 所提供要刪除的舊圖片名稱。",
        "apihelp-delete-example-simple": "刪除 <kbd>Main Page</kbd>。",
        "apihelp-edit-param-nocreate": "若頁面不存在,則產生錯誤。",
        "apihelp-edit-param-watch": "加入目前頁面至您的監視清單。",
        "apihelp-edit-param-unwatch": "從您的監視清單中移除目前頁面。",
-       "apihelp-edit-param-watchlist": "無條件使用設置將頁面加入或移除目前使用者的監視清單或者是不更改監視清單。",
+       "apihelp-edit-param-watchlist": "使用偏好設定無條件地將頁面加入至或移除自目前使用者的監視清單,或不更改監視。",
        "apihelp-edit-param-prependtext": "添加此文字至頁面開頭。覆蓋$1text。",
        "apihelp-edit-param-undo": "復原此修訂。覆寫 $1text、$1prependtext 與 $1appendtext。",
        "apihelp-edit-param-undoafter": "撤銷從 $1undo 至此為止的所有修訂。若不設定則僅會撤銷一次修訂。",
        "apihelp-expandtemplates-paramvalue-prop-encodedjsconfigvars": "指定頁面的 JavaScript 設置變量為 JSON 字串。",
        "apihelp-expandtemplates-paramvalue-prop-parsetree": "輸出的 XML 解析樹狀。",
        "apihelp-expandtemplates-param-includecomments": "輸出裡是否包含 HTML 註解。",
+       "apihelp-expandtemplates-param-generatexml": "產生 XML 解析樹狀(以 $1prop=parsetree 取代)。",
        "apihelp-expandtemplates-example-simple": "展開 wiki 文字<kbd><nowiki>{{Project:Sandbox}}</nowiki></kbd>。",
        "apihelp-feedcontributions-summary": "回傳使用者貢獻 Feed。",
        "apihelp-feedcontributions-param-feedformat": "Feed 的格式。",
        "apihelp-filerevert-param-archivename": "要復原的修訂存檔名稱。",
        "apihelp-filerevert-example-revert": "回退 <kbd>Wiki.png</kbd> 至 <kbd>2011-03-05T15:27:40Z</kbd> 的版本。",
        "apihelp-help-summary": "顯示指定模組的說明。",
+       "apihelp-help-param-wrap": "在標準 API 回應結構裡包裹輸出。",
        "apihelp-help-param-toc": "在 HTML 輸出裡包含目錄。",
        "apihelp-help-example-main": "主模組使用說明",
        "apihelp-help-example-submodules": "用於 <kbd>action=query</kbd> 與其所有子模組的幫助。",
        "apihelp-imagerotate-example-simple": "<kbd>90</kbd> 度旋轉 <kbd>File:Example.png</kbd>。",
        "apihelp-imagerotate-example-generator": "<kbd>180</kbd> 度旋轉所有在 <kbd>Category:Flip</kbd> 裡的圖片。",
        "apihelp-import-summary": "從其它 wiki 或 XML 檔案來匯入頁面。",
+       "apihelp-import-extended-description": "請注意當發送用於 <var>xml</var> 參數的檔案時,必須以 HTTP POST 作為檔案上傳(註:使用 multipart/form-data)。",
        "apihelp-import-param-summary": "匯入摘要。",
        "apihelp-import-param-xml": "上載的 XML 檔。",
        "apihelp-import-param-assignknownusers": "分配編輯至所命名使用者已存在本地的本地使用者。",
        "apihelp-move-param-noredirect": "不要建立重新導向。",
        "apihelp-move-param-watch": "將頁面和重定向加入目前使用者的監視清單。",
        "apihelp-move-param-unwatch": "從目前使用者的監視清單中移除頁面和重定向。",
-       "apihelp-move-param-watchlist": "在目前使用者的監視清單中無條件地加入或移除頁面,或使用設定,或不變更監視清單。",
+       "apihelp-move-param-watchlist": "使用偏好設定無條件地將頁面加入至或移除自目前使用者的監視清單,或不更改監視。",
        "apihelp-move-param-ignorewarnings": "忽略所有警告。",
        "apihelp-move-example-move": "將<kbd>Badtitle</kbd>移動至<kbd>Goodtitle</kbd>,不留下重定向。",
        "apihelp-opensearch-summary": "使用 OpenSearch 協定搜尋本 wiki。",
        "apihelp-opensearch-param-suggest": "若<var>[[mw:Special:MyLanguage/Manual:$wgEnableOpenSearchSuggest|$wgEnableOpenSearchSuggest]]</var>設定為false,則不做任何事。",
        "apihelp-opensearch-param-redirects": "如何處理重定向:\n;return:傳回重定向本身。\n;resolve:傳回目標頁面,傳回的結果數目可能少於$1limit。\n由於歷史原因,$1format=json的預設值為「return」,其他格式則為「resolve」。",
        "apihelp-opensearch-param-format": "輸出的格式。",
+       "apihelp-opensearch-param-warningsaserror": "若警告以 <kbd>format=json</kbd> 提升時,回傳 API 錯誤而非忽略掉。",
        "apihelp-opensearch-example-te": "找出以 <kbd>Te</kbd> 為開頭的頁面。",
        "apihelp-options-summary": "更改目前使用者的偏好設定。",
        "apihelp-options-param-reset": "重設偏好設定為網站預設值。",
        "apihelp-parse-paramvalue-prop-properties": "指定多項定義在已解析原始 wiki 文字的屬性。",
        "apihelp-parse-paramvalue-prop-limitreportdata": "取得結構化限制報告。當有設定 <var>$1disablelimitreport</var> 時,則不會給予資料。",
        "apihelp-parse-paramvalue-prop-limitreporthtml": "取得限制報告的 HTML 版本。當有設定 <var>$1disablelimitreport</var> 時,則不會給予資料。",
+       "apihelp-parse-paramvalue-prop-parsetree": "修訂內容的 XML 解析樹狀(需要內容模組 <code>$1</code>)",
        "apihelp-parse-paramvalue-prop-parsewarnings": "提供發生在解析內容時的警告。",
        "apihelp-parse-param-wrapoutputclass": "要包在解析器輸出內容的 CSS 類別。",
+       "apihelp-parse-param-disablelimitreport": "從解析輸出內容裡省略限制報告(\"NewPP limit report\")。",
        "apihelp-parse-param-disablepp": "請改用<var>$1disablelimitreport</var>。",
        "apihelp-parse-param-disableeditsection": "從解析輸出內容省略編輯段落連結。",
        "apihelp-parse-param-disabletidy": "不要在解析輸出裡執行 HTML 內容清理(例如使用 tidy 軟體工具)",
        "apihelp-protect-param-tags": "修改標籤以套用於保護日誌裡的項目。",
        "apihelp-protect-param-cascade": "啟用連鎖保護(也就是保護包含於此頁面的頁面)。如果所有提供的保護等級不支援連鎖,就將其忽略。",
        "apihelp-protect-param-watch": "如果被設定,就將被(解除)保護的頁面加至目前使用者的監視列表。",
-       "apihelp-protect-param-watchlist": "無條件地將該頁面加入至或移除自目前使用者的監視列表、使用偏好設定或不更改監視。",
+       "apihelp-protect-param-watchlist": "使用偏好設定無條件地將頁面加入至或移除自目前使用者的監視清單,或不更改監視。",
        "apihelp-protect-example-protect": "保護一個頁面。",
        "apihelp-protect-example-unprotect": "透過設定為 <kbd>all</kbd>(註:代表任何人都可以執行操作),來解除對頁面的保護。",
        "apihelp-protect-example-unprotect2": "透過設定為沒有限制,來解除對頁面的保護。",
        "apihelp-query+allpages-param-prlevel": "篩選基於保護級別的保護(必須與 $1prtype= 參數一起使用)。",
        "apihelp-query+allpages-param-limit": "要回傳的頁面總數。",
        "apihelp-query+allpages-param-dir": "列出時所採用的方向。",
+       "apihelp-query+allpages-param-filterlanglinks": "篩選基於頁面是否有語言連結。請注意這可能不會考慮由擴充所添加的語言連結。",
        "apihelp-query+allpages-example-B": "顯示以字母 <kbd>B</kbd> 為開頭的所有頁面清單。",
        "apihelp-query+allpages-example-generator": "顯示 4 個以 <kbd>T</kbd> 為開頭的頁面之資訊。",
        "apihelp-query+allpages-example-generator-revisions": "顯示前 2 個以 <kbd>Re</kbd> 為開頭的非重新導向頁面內容。",
        "apihelp-query+blocks-paramvalue-prop-expiry": "添加當封鎖到期的時間戳記。",
        "apihelp-query+blocks-paramvalue-prop-reason": "添加封鎖的原因。",
        "apihelp-query+blocks-paramvalue-prop-range": "添加受封鎖影響的 IP 地址範圍。",
+       "apihelp-query+blocks-param-show": "僅顯示符合這些標準的項目。\n例如僅想查看在 IP 地址的無限期封鎖,請設定 <kbd>$1show=ip|!temp</kbd>。",
        "apihelp-query+blocks-example-simple": "列出封鎖。",
        "apihelp-query+blocks-example-users": "列出使用者 <kbd>Alice</kbd> 與 <kbd>Bob</kbd> 的封鎖。",
        "apihelp-query+categories-summary": "列出頁面隸屬的所有分類。",
        "apihelp-query+extlinks-summary": "回傳所有指定頁面的外部 URL (非 interwiki)。",
        "apihelp-query+extlinks-param-limit": "要回傳的連結數量。",
        "apihelp-query+extlinks-param-protocol": "URL 協定。若為空且有設定 <var>$1query</var>,會是 <kbd>http</kbd> 協定。將此與 <var>$1query</var> 一同留空會列出所有外部連結。",
+       "apihelp-query+extlinks-param-query": "不以協議來搜尋字串,對於檢查某頁面是否包含某個外部 URL 時很有用。",
        "apihelp-query+extlinks-example-simple": "取得 <kbd>Main Page</kbd> 的外部連結清單。",
        "apihelp-query+exturlusage-summary": "列舉包含指定 URL 的頁面。",
        "apihelp-query+exturlusage-param-prop": "要包含的資訊部份:",
        "apihelp-query+imageinfo-param-start": "列出的起始時間戳記。",
        "apihelp-query+imageinfo-param-end": "列出的終止時間戳記。",
        "apihelp-query+imageinfo-param-urlheight": "與 $1urlwidth 相似。",
+       "apihelp-query+imageinfo-param-metadataversion": "要使用的詮釋資料版本。若有指定 <kbd>latest</kbd>,會使用最新版本。預設為 <kbd>1</kbd>,以便向下兼容。",
        "apihelp-query+imageinfo-param-extmetadatamultilang": "若用於 extmetadata 屬性的翻譯可用,則全部索取。",
        "apihelp-query+imageinfo-param-extmetadatafilter": "若有指定且非空,僅會為 $1prop=extmetadata 回傳這些鍵。",
        "apihelp-query+imageinfo-param-badfilecontexttitle": "若有設定 <kbd>$2prop=badfile</kbd>,此頁面使用在當評估 [[MediaWiki:Bad image list]] 的時候",
        "apihelp-rollback-param-user": "編輯被回退的使用者名稱。",
        "apihelp-rollback-param-summary": "自定義編輯摘要。若為空,則使用預設摘要。",
        "apihelp-rollback-param-markbot": "將回退的編輯以及回退操作標記為機器人所做編輯。",
-       "apihelp-rollback-param-watchlist": "無條件使用設置將頁面加入或移除目前使用者的監視清單或者是不更改監視清單。",
+       "apihelp-rollback-param-watchlist": "使用偏好設定無條件地將頁面加入至或移除自目前使用者的監視清單,或不更改監視。",
        "apihelp-rollback-example-simple": "回退由使用者 <kbd>Example</kbd> 對頁面 <kbd>Main Page</kbd> 所做的最新編輯。",
        "apihelp-rsd-summary": "匯出一個簡易探索(Really Simple Discovery、RSD)架構。",
        "apihelp-rsd-example-simple": "匯出 RSD 架構。",
        "apihelp-undelete-param-title": "要恢復的頁面標題。",
        "apihelp-undelete-param-reason": "還原的原因。",
        "apihelp-undelete-param-tags": "在刪除日誌裡更改套用到項目的標籤。",
+       "apihelp-undelete-param-watchlist": "使用偏好設定無條件地將頁面加入至或移除自目前使用者的監視清單,或不更改監視。",
        "apihelp-undelete-example-page": "取消刪除頁面 <kbd>Main Page</kbd>。",
        "apihelp-undelete-example-revisions": "取消刪除 <kbd>Main Page</kbd> 的兩筆修訂。",
        "apihelp-unlinkaccount-summary": "移除目前使用者所連結到的第三方帳號。",
        "apihelp-upload-summary": "上傳檔案,或取得等待上傳的狀態。",
        "apihelp-upload-param-filename": "目標檔案名稱。",
        "apihelp-upload-param-comment": "上傳註釋。如果 <var>$1text</var> 未指定的話,也會作為新檔案用的初始頁面文字。",
+       "apihelp-upload-param-tags": "更改標籤來套用到上傳日誌項目以及檔案頁面修訂。",
        "apihelp-upload-param-text": "用於新檔案的初始頁面文字。",
        "apihelp-upload-param-watch": "監視頁面。",
+       "apihelp-upload-param-watchlist": "使用偏好設定無條件地將頁面加入至或移除自目前使用者的監視清單,或不更改監視。",
        "apihelp-upload-param-ignorewarnings": "忽略所有警告。",
        "apihelp-upload-param-file": "檔案內容。",
        "apihelp-upload-param-url": "索取檔案的來源 URL。",
        "apihelp-upload-param-chunk": "大量內容。",
        "apihelp-upload-param-async": "在可能的情況下讓潛在的大型檔案非同步處理。",
        "apihelp-upload-example-url": "從 URL 上傳。",
+       "apihelp-upload-example-filekey": "完成出於警告而失敗的上傳。",
        "apihelp-userrights-summary": "變更一位使用者的群組成員。",
        "apihelp-userrights-param-user": "使用者名稱。",
        "apihelp-userrights-param-userid": "使用者ID。",
        "api-pageset-param-titles": "要使用的標題清單。",
        "api-pageset-param-pageids": "要使用的頁面 ID 清單。",
        "api-pageset-param-revids": "要使用的修訂 ID 清單。",
+       "api-pageset-param-redirects-generator": "自動解決在 <var>$1titles</var>、<var>$1pageids</var>、<var>$1revids</var>,以及由 <var>$1generator</var> 所回傳頁面裡的重新導向。",
+       "api-pageset-param-redirects-nogenerator": "自動解決在 <var>$1titles</var>、<var>$1pageids</var>,與 <var>$1revids</var> 的重新導向。",
        "api-help-title": "MediaWiki API 說明",
        "api-help-lead": "此頁為自動產生的 MediaWiki API 說明文件頁面。\n\n說明文件與範例:https://www.mediawiki.org/wiki/API",
        "api-help-main-header": "主要模組",
        "api-help-parameters": "{{PLURAL:$1|參數}}:",
        "api-help-param-deprecated": "已停用。",
        "api-help-param-required": "此參數為必填。",
+       "api-help-param-templated-var": "<var>&#x7B;$1&#x7D;</var> 與 <var>$2</var> 的值",
        "api-help-datatypes-header": "資料類型",
        "api-help-datatypes": "至MediaWiki的輸入值應為NFC標準化的UTF-8。MediaWiki可以嘗試轉換其他輸入值,但這可能導致一些操作失敗(例如附帶MD5檢查的[[Special:ApiHelp/edit|編輯]])。\n\n一些在API請求中的參數類型需要更進一步解釋:\n;boolean\n:布林參數產生作用就像HTML複選框一樣:如果參數被指定,無論何值都被視為真(true)。如果要假值(false),則必須省略參數。\n;timestamp\n:時間戳記可被指定為多種格式。推荐使用ISO 8601日期和時間標準。所有時間為UTC時間,包含的任何時區都會被忽略。\n:* ISO 8601日期和時間,<kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd>(標點和<kbd>Z</kbd>為選用)\n:* 帶小數秒(會被忽略)的ISO 8601日期和時間,<kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>.<var>00001</var>Z</kbd>(破折號、冒號和<kbd>Z</kbd>為選用)\n:* MediaWiki格式,<kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* 一般數字格式,<kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>(<kbd>GMT</kbd>、<kbd>+<var>##</var></kbd>或<kbd>-<var>##</var></kbd>的選用時區會被忽略)\n:* EXIF格式,<kbd><var>2001</var>:<var>01</var>:<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* RFC 2822格式(時區可省略),<kbd><var>Mon</var>, <var>15</var> <var>Jan</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* RFC 850格式(時區可省略),<kbd><var>Monday</var>, <var>15</var>-<var>Jan</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* C ctime格式,<kbd><var>Mon</var> <var>Jan</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>2001</var></kbd>\n:* 從1970-01-01T00:00:00Z開始的秒數,作為1到13位數的整數(除了<kbd>0</kbd>)\n:* 字串<kbd>now</kbd>\n;替代多值分隔符號\n:使用多個值的參數通常會與垂直線符號(|)分隔的值一起提交,例如<kbd>param=value1|value2</kbd>或<kbd>param=value1%7Cvalue2</kbd>。如果值必須包含垂直線符號,使用U+001F(單位分隔符號)作為分隔符號,''並且''在值前加前綴U+001F,例如<kbd>param=%1Fvalue1%1Fvalue2</kbd>。",
        "api-help-templatedparams-header": "模板參數",
        "apierror-badconfig-resulttoosmall": "在此 wiki 上 <code>$wgAPIMaxResultSize</code> 的值太小,而無法含有基本結果資訊。",
        "apierror-baddiffto": "<var>$1diffto</var> 必須設定成非負值的數字、<kbd>prev</kbd>、<kbd>next</kbd>、或 <kbd>cur</kbd>。",
        "apierror-badformat-generic": "內容模組 $2 不支援使用請求格式 $1。",
+       "apierror-badformat": "由 $3 所使用的內容模組 $2 不支援使用請求格式 $1。",
        "apierror-badgenerator-notgenerator": "模組 <kbd>$1</kbd> 不能作為產生器。",
        "apierror-badgenerator-unknown": "未知的 <kbd>generator=$1</kbd>。",
        "apierror-badip": "IP 參數無效。",
        "apierror-badquery": "無效的查詢。",
        "apierror-badtimestamp": "用於時間戳記參數 <var>$1</var> 的值「$2」無效。",
        "apierror-badtoken": "無效 CSRF 權杖。",
+       "apierror-badurl": "用於 URL 參數 <var>$1</var> 的值「$2」無效。",
+       "apierror-baduser": "用於使用者參數 <var>$1</var> 的值「$2」無效。",
        "apierror-bad-watchlist-token": "提供無效的監視清單權杖。請在 [[Special:Preferences]] 設定正確權杖。",
        "apierror-blockedfrommail": "您已被封鎖,無法發送電子郵件。",
        "apierror-blocked": "您已被封鎖,無法編輯。",
index c6e8e1f..5e83f95 100644 (file)
@@ -262,8 +262,6 @@ class ChangeTags {
                &$rev_id = null, &$log_id = null, $params = null, RecentChange $rc = null,
                User $user = null
        ) {
-               global $wgChangeTagsSchemaMigrationStage;
-
                $tagsToAdd = array_filter( (array)$tagsToAdd ); // Make sure we're submitting all tags...
                $tagsToRemove = array_filter( (array)$tagsToRemove );
 
@@ -347,35 +345,27 @@ class ChangeTags {
                $changeTagDefStore = MediaWikiServices::getInstance()->getChangeTagDefStore();
                if ( count( $tagsToAdd ) ) {
                        $changeTagMapping = [];
-                       if ( $wgChangeTagsSchemaMigrationStage > MIGRATION_OLD ) {
-                               foreach ( $tagsToAdd as $tag ) {
-                                       $changeTagMapping[$tag] = $changeTagDefStore->acquireId( $tag );
-                               }
-                               // T207881: update the counts at the end of the transaction
-                               $dbw->onTransactionPreCommitOrIdle( function () use ( $dbw, $tagsToAdd ) {
-                                       $dbw->update(
-                                               'change_tag_def',
-                                               [ 'ctd_count = ctd_count + 1' ],
-                                               [ 'ctd_name' => $tagsToAdd ],
-                                               __METHOD__
-                                       );
-                               } );
+                       foreach ( $tagsToAdd as $tag ) {
+                               $changeTagMapping[$tag] = $changeTagDefStore->acquireId( $tag );
                        }
+                       // T207881: update the counts at the end of the transaction
+                       $dbw->onTransactionPreCommitOrIdle( function () use ( $dbw, $tagsToAdd ) {
+                               $dbw->update(
+                                       'change_tag_def',
+                                       [ 'ctd_count = ctd_count + 1' ],
+                                       [ 'ctd_name' => $tagsToAdd ],
+                                       __METHOD__
+                               );
+                       } );
 
                        $tagsRows = [];
                        foreach ( $tagsToAdd as $tag ) {
-                               if ( $wgChangeTagsSchemaMigrationStage > MIGRATION_WRITE_BOTH ) {
-                                       $tagName = null;
-                               } else {
-                                       $tagName = $tag;
-                               }
                                // Filter so we don't insert NULLs as zero accidentally.
                                // Keep in mind that $rc_id === null means "I don't care/know about the
                                // rc_id, just delete $tag on this revision/log entry". It doesn't
                                // mean "only delete tags on this revision/log WHERE rc_id IS NULL".
                                $tagsRows[] = array_filter(
                                        [
-                                               'ct_tag' => $tagName,
                                                'ct_rc_id' => $rc_id,
                                                'ct_log_id' => $log_id,
                                                'ct_rev_id' => $rev_id,
@@ -392,24 +382,16 @@ class ChangeTags {
                // delete from change_tag
                if ( count( $tagsToRemove ) ) {
                        foreach ( $tagsToRemove as $tag ) {
-                               if ( $wgChangeTagsSchemaMigrationStage > MIGRATION_WRITE_BOTH ) {
-                                       $tagName = null;
-                                       $tagId = $changeTagDefStore->getId( $tag );
-                               } else {
-                                       $tagName = $tag;
-                                       $tagId = null;
-                               }
                                $conds = array_filter(
                                        [
-                                               'ct_tag' => $tagName,
                                                'ct_rc_id' => $rc_id,
                                                'ct_log_id' => $log_id,
                                                'ct_rev_id' => $rev_id,
-                                               'ct_tag_id' => $tagId,
+                                               'ct_tag_id' => $changeTagDefStore->getId( $tag ),
                                        ]
                                );
                                $dbw->delete( 'change_tag', $conds, __METHOD__ );
-                               if ( $dbw->affectedRows() && $wgChangeTagsSchemaMigrationStage > MIGRATION_OLD ) {
+                               if ( $dbw->affectedRows() ) {
                                        // T207881: update the counts at the end of the transaction
                                        $dbw->onTransactionPreCommitOrIdle( function () use ( $dbw, $tag ) {
                                                $dbw->update(
@@ -788,7 +770,7 @@ class ChangeTags {
        public static function modifyDisplayQuery( &$tables, &$fields, &$conds,
                &$join_conds, &$options, $filter_tag = ''
        ) {
-               global $wgChangeTagsSchemaMigrationStage, $wgUseTagFilter;
+               global $wgUseTagFilter;
 
                // Normalize to arrays
                $tables = (array)$tables;
@@ -817,24 +799,20 @@ class ChangeTags {
 
                        $tables[] = 'change_tag';
                        $join_conds['change_tag'] = [ 'INNER JOIN', $join_cond ];
-                       if ( $wgChangeTagsSchemaMigrationStage > MIGRATION_WRITE_BOTH ) {
-                               $filterTagIds = [];
-                               $changeTagDefStore = MediaWikiServices::getInstance()->getChangeTagDefStore();
-                               foreach ( (array)$filter_tag as $filterTagName ) {
-                                       try {
-                                               $filterTagIds[] = $changeTagDefStore->getId( $filterTagName );
-                                       } catch ( NameTableAccessException $exception ) {
-                                               // Return nothing.
-                                               $conds[] = '0';
-                                               break;
-                                       };
-                               }
+                       $filterTagIds = [];
+                       $changeTagDefStore = MediaWikiServices::getInstance()->getChangeTagDefStore();
+                       foreach ( (array)$filter_tag as $filterTagName ) {
+                               try {
+                                       $filterTagIds[] = $changeTagDefStore->getId( $filterTagName );
+                               } catch ( NameTableAccessException $exception ) {
+                                       // Return nothing.
+                                       $conds[] = '0';
+                                       break;
+                               };
+                       }
 
-                               if ( $filterTagIds !== [] ) {
-                                       $conds['ct_tag_id'] = $filterTagIds;
-                               }
-                       } else {
-                               $conds['ct_tag'] = $filter_tag;
+                       if ( $filterTagIds !== [] ) {
+                               $conds['ct_tag_id'] = $filterTagIds;
                        }
 
                        if (
@@ -855,8 +833,6 @@ class ChangeTags {
         * @throws MWException When unable to determine appropriate JOIN condition for tagging
         */
        public static function makeTagSummarySubquery( $tables ) {
-               global $wgChangeTagsSchemaMigrationStage;
-
                // Normalize to arrays
                $tables = (array)$tables;
 
@@ -873,15 +849,9 @@ class ChangeTags {
                        throw new MWException( 'Unable to determine appropriate JOIN condition for tagging.' );
                }
 
-               $tagTables[] = 'change_tag';
-               if ( $wgChangeTagsSchemaMigrationStage > MIGRATION_WRITE_BOTH ) {
-                       $tagTables[] = 'change_tag_def';
-                       $join_cond_ts_tags = [ 'change_tag_def' => [ 'INNER JOIN', 'ct_tag_id=ctd_id' ] ];
-                       $field = 'ctd_name';
-               } else {
-                       $field = 'ct_tag';
-                       $join_cond_ts_tags = [];
-               }
+               $tagTables = [ 'change_tag', 'change_tag_def' ];
+               $join_cond_ts_tags = [ 'change_tag_def' => [ 'INNER JOIN', 'ct_tag_id=ctd_id' ] ];
+               $field = 'ctd_name';
 
                return wfGetDB( DB_REPLICA )->buildGroupConcatField(
                        ',', $tagTables, $field, $join_cond, $join_cond_ts_tags
@@ -948,32 +918,20 @@ class ChangeTags {
         * @since 1.25
         */
        public static function defineTag( $tag ) {
-               global $wgChangeTagsSchemaMigrationStage;
-
                $dbw = wfGetDB( DB_MASTER );
-               if ( $wgChangeTagsSchemaMigrationStage > MIGRATION_OLD ) {
-                       $tagDef = [
-                               'ctd_name' => $tag,
-                               'ctd_user_defined' => 1,
-                               'ctd_count' => 0
-                       ];
-                       $dbw->upsert(
-                               'change_tag_def',
-                               $tagDef,
-                               [ 'ctd_name' ],
-                               [ 'ctd_user_defined' => 1 ],
-                               __METHOD__
-                       );
-               }
+               $tagDef = [
+                       'ctd_name' => $tag,
+                       'ctd_user_defined' => 1,
+                       'ctd_count' => 0
+               ];
+               $dbw->upsert(
+                       'change_tag_def',
+                       $tagDef,
+                       [ 'ctd_name' ],
+                       [ 'ctd_user_defined' => 1 ],
+                       __METHOD__
+               );
 
-               if ( $wgChangeTagsSchemaMigrationStage < MIGRATION_NEW ) {
-                       $dbw->replace(
-                               'valid_tag',
-                               [ 'vt_tag' ],
-                               [ 'vt_tag' => $tag ],
-                               __METHOD__
-                       );
-               }
                // clear the memcache of defined tags
                self::purgeTagCacheAll();
        }
@@ -987,28 +945,20 @@ class ChangeTags {
         * @since 1.25
         */
        public static function undefineTag( $tag ) {
-               global $wgChangeTagsSchemaMigrationStage;
-
                $dbw = wfGetDB( DB_MASTER );
 
-               if ( $wgChangeTagsSchemaMigrationStage > MIGRATION_OLD ) {
-                       $dbw->update(
-                               'change_tag_def',
-                               [ 'ctd_user_defined' => 0 ],
-                               [ 'ctd_name' => $tag ],
-                               __METHOD__
-                       );
-
-                       $dbw->delete(
-                               'change_tag_def',
-                               [ 'ctd_name' => $tag, 'ctd_count' => 0 ],
-                               __METHOD__
-                       );
-               }
+               $dbw->update(
+                       'change_tag_def',
+                       [ 'ctd_user_defined' => 0 ],
+                       [ 'ctd_name' => $tag ],
+                       __METHOD__
+               );
 
-               if ( $wgChangeTagsSchemaMigrationStage < MIGRATION_NEW ) {
-                       $dbw->delete( 'valid_tag', [ 'vt_tag' => $tag ], __METHOD__ );
-               }
+               $dbw->delete(
+                       'change_tag_def',
+                       [ 'ctd_name' => $tag, 'ctd_count' => 0 ],
+                       __METHOD__
+               );
 
                // clear the memcache of defined tags
                self::purgeTagCacheAll();
@@ -1310,19 +1260,14 @@ class ChangeTags {
         * @since 1.25
         */
        public static function deleteTagEverywhere( $tag ) {
-               global $wgChangeTagsSchemaMigrationStage;
                $dbw = wfGetDB( DB_MASTER );
                $dbw->startAtomic( __METHOD__ );
 
                // delete from valid_tag and/or set ctd_user_defined = 0
                self::undefineTag( $tag );
 
-               if ( $wgChangeTagsSchemaMigrationStage > MIGRATION_WRITE_BOTH ) {
-                       $tagId = MediaWikiServices::getInstance()->getChangeTagDefStore()->getId( $tag );
-                       $conditions = [ 'ct_tag_id' => $tagId ];
-               } else {
-                       $conditions = [ 'ct_tag' => $tag ];
-               }
+               $tagId = MediaWikiServices::getInstance()->getChangeTagDefStore()->getId( $tag );
+               $conditions = [ 'ct_tag_id' => $tagId ];
 
                // find out which revisions use this tag, so we can delete from tag_summary
                $result = $dbw->select( 'change_tag',
@@ -1338,17 +1283,9 @@ class ChangeTags {
                }
 
                // delete from change_tag
-               if ( $wgChangeTagsSchemaMigrationStage > MIGRATION_WRITE_BOTH ) {
-                       $tagId = MediaWikiServices::getInstance()->getChangeTagDefStore()->getId( $tag );
-                       $dbw->delete( 'change_tag', [ 'ct_tag_id' => $tagId ], __METHOD__ );
-               } else {
-                       $dbw->delete( 'change_tag', [ 'ct_tag' => $tag ], __METHOD__ );
-               }
-
-               if ( $wgChangeTagsSchemaMigrationStage > MIGRATION_OLD ) {
-                       $dbw->delete( 'change_tag_def', [ 'ctd_name' => $tag ], __METHOD__ );
-               }
-
+               $tagId = MediaWikiServices::getInstance()->getChangeTagDefStore()->getId( $tag );
+               $dbw->delete( 'change_tag', [ 'ct_tag_id' => $tagId ], __METHOD__ );
+               $dbw->delete( 'change_tag_def', [ 'ctd_name' => $tag ], __METHOD__ );
                $dbw->endAtomic( __METHOD__ );
 
                // give extensions a chance
@@ -1514,16 +1451,16 @@ class ChangeTags {
                        $cache->makeKey( 'valid-tags-db' ),
                        WANObjectCache::TTL_MINUTE * 5,
                        function ( $oldValue, &$ttl, array &$setOpts ) use ( $fname ) {
-                               global $wgChangeTagsSchemaMigrationStage;
                                $dbr = wfGetDB( DB_REPLICA );
 
                                $setOpts += Database::getCacheSetOptions( $dbr );
 
-                               if ( $wgChangeTagsSchemaMigrationStage > MIGRATION_WRITE_BOTH ) {
-                                       $tags = self::listExplicitlyDefinedTagsNewBackend();
-                               } else {
-                                       $tags = $dbr->selectFieldValues( 'valid_tag', 'vt_tag', [], $fname );
-                               }
+                               $tags = $dbr->selectFieldValues(
+                                       'change_tag_def',
+                                       'ctd_name',
+                                       [ 'ctd_user_defined' => 1 ],
+                                       __METHOD__
+                               );
 
                                return array_filter( array_unique( $tags ) );
                        },
@@ -1535,22 +1472,6 @@ class ChangeTags {
                );
        }
 
-       /**
-        * Lists tags explicitly user defined tags. When ctd_user_defined is true.
-        *
-        * @return string[] Array of strings: tags
-        * @since 1.25
-        */
-       private static function listExplicitlyDefinedTagsNewBackend() {
-               $dbr = wfGetDB( DB_REPLICA );
-               return $dbr->selectFieldValues(
-                       'change_tag_def',
-                       'ctd_name',
-                       [ 'ctd_user_defined' => 1 ],
-                       __METHOD__
-               );
-       }
-
        /**
         * Lists tags defined by core or extensions using the ListDefinedTags hook.
         * Extensions need only define those tags they deem to be in active use.
@@ -1613,57 +1534,9 @@ class ChangeTags {
         * Returns a map of any tags used on the wiki to number of edits
         * tagged with them, ordered descending by the hitcount.
         * This does not include tags defined somewhere that have never been applied.
-        *
-        * Keeps a short-term cache in memory, so calling this multiple times in the
-        * same request should be fine.
-        *
         * @return array Array of string => int
         */
        public static function tagUsageStatistics() {
-               global $wgChangeTagsSchemaMigrationStage;
-               if ( $wgChangeTagsSchemaMigrationStage > MIGRATION_WRITE_BOTH ) {
-                       return self::newTagUsageStatistics();
-               }
-
-               $fname = __METHOD__;
-               $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
-               return $cache->getWithSetCallback(
-                       $cache->makeKey( 'change-tag-statistics' ),
-                       WANObjectCache::TTL_MINUTE * 5,
-                       function ( $oldValue, &$ttl, array &$setOpts ) use ( $fname ) {
-                               $dbr = wfGetDB( DB_REPLICA, 'vslow' );
-
-                               $setOpts += Database::getCacheSetOptions( $dbr );
-
-                               $res = $dbr->select(
-                                       'change_tag',
-                                       [ 'ct_tag', 'hitcount' => 'count(*)' ],
-                                       [],
-                                       $fname,
-                                       [ 'GROUP BY' => 'ct_tag', 'ORDER BY' => 'hitcount DESC' ]
-                               );
-
-                               $out = [];
-                               foreach ( $res as $row ) {
-                                       $out[$row->ct_tag] = $row->hitcount;
-                               }
-
-                               return $out;
-                       },
-                       [
-                               'checkKeys' => [ $cache->makeKey( 'change-tag-statistics' ) ],
-                               'lockTSE' => WANObjectCache::TTL_MINUTE * 5,
-                               'pcTTL' => WANObjectCache::TTL_PROC_LONG
-                       ]
-               );
-       }
-
-       /**
-        * Same self::tagUsageStatistics() but uses change_tag_def.
-        *
-        * @return array Array of string => int
-        */
-       private static function newTagUsageStatistics() {
                $dbr = wfGetDB( DB_REPLICA );
                $res = $dbr->select(
                        'change_tag_def',
index 4a12d4c..db4cbdf 100644 (file)
@@ -152,6 +152,9 @@ class MssqlUpdater extends DatabaseUpdater {
                        [ 'addField', 'ipblocks', 'ipb_sitewide', 'patch-ipb_sitewide.sql' ],
                        [ 'addTable', 'ipblocks_restrictions', 'patch-ipblocks_restrictions-table.sql' ],
                        [ 'migrateImageCommentTemp' ],
+
+                       // 1.33
+                       [ 'dropField', 'change_tag', 'ct_tag', 'patch-drop-ct_tag.sql' ],
                ];
        }
 
index 82cf7f4..532ccb0 100644 (file)
@@ -372,6 +372,9 @@ class MysqlUpdater extends DatabaseUpdater {
                        [ 'addField', 'ipblocks', 'ipb_sitewide', 'patch-ipb_sitewide.sql' ],
                        [ 'addTable', 'ipblocks_restrictions', 'patch-ipblocks_restrictions-table.sql' ],
                        [ 'migrateImageCommentTemp' ],
+
+                       // 1,33
+                       [ 'dropField', 'change_tag', 'ct_tag', 'patch-drop-ct_tag.sql' ],
                ];
        }
 
index 78b53aa..19c4cfe 100644 (file)
@@ -164,6 +164,9 @@ class OracleUpdater extends DatabaseUpdater {
                        [ 'addTable', 'ipblocks_restrictions', 'patch-ipblocks_restrictions-table.sql' ],
                        [ 'migrateImageCommentTemp' ],
 
+                       // 1.33
+                       [ 'dropField', 'change_tag', 'ct_tag', 'patch-drop-ct_tag.sql' ],
+
                        // KEEP THIS AT THE BOTTOM!!
                        [ 'doRebuildDuplicateFunction' ],
 
index 71c1a52..5730743 100644 (file)
@@ -598,6 +598,9 @@ class PostgresUpdater extends DatabaseUpdater {
                        [ 'addPgField', 'ipblocks', 'ipb_sitewide', 'SMALLINT NOT NULL DEFAULT 1' ],
                        [ 'addTable', 'ipblocks_restrictions', 'patch-ipblocks_restrictions-table.sql' ],
                        [ 'migrateImageCommentTemp' ],
+
+                       // 1.33
+                       [ 'dropField', 'change_tag', 'ct_tag', 'patch-drop-ct_tag.sql' ],
                ];
        }
 
index cba6a8a..2f39912 100644 (file)
@@ -191,6 +191,7 @@ class SqliteUpdater extends DatabaseUpdater {
 
                        // This field was added in 1.31, but is put here so it can be used by 'migrateComments'
                        [ 'addField', 'image', 'img_description_id', 'patch-image-img_description_id.sql' ],
+                       [ 'addField', 'filearchive', 'fa_description_id', 'patch-filearchive-fa_description_id.sql' ],
 
                        [ 'migrateComments' ],
                        [ 'renameIndex', 'l10n_cache', 'lc_lang_key', 'PRIMARY', false,
@@ -204,6 +205,7 @@ class SqliteUpdater extends DatabaseUpdater {
                        [ 'addTable', 'slot_roles', 'patch-slot_roles.sql' ],
                        [ 'migrateArchiveText' ],
                        [ 'addTable', 'actor', 'patch-actor-table.sql' ],
+                       [ 'addField', 'filearchive', 'fa_actor', 'patch-filearchive-fa_actor.sql' ],
                        [ 'migrateActors' ],
                        [ 'modifyField', 'revision', 'rev_text_id', 'patch-rev_text_id-default.sql' ],
                        [ 'modifyTable', 'site_stats', 'patch-site_stats-modify.sql' ],
@@ -237,6 +239,9 @@ class SqliteUpdater extends DatabaseUpdater {
                        [ 'addField', 'ipblocks', 'ipb_sitewide', 'patch-ipb_sitewide.sql' ],
                        [ 'addTable', 'ipblocks_restrictions', 'patch-ipblocks_restrictions-table.sql' ],
                        [ 'migrateImageCommentTemp' ],
+
+                       // 1.33
+                       [ 'dropField', 'change_tag', 'ct_tag', 'patch-drop-ct_tag.sql' ],
                ];
        }
 
index c9d2886..f5aee2d 100644 (file)
@@ -38,7 +38,7 @@
        "config-env-hhvm": "HHVM $1 on installitud.",
        "config-diff3-bad": "GNU diff3 ei leitud.",
        "config-db-type": "Andmebaasi tüüp:",
-       "config-db-name": "Andmebaasi nimi:",
+       "config-db-name": "Andmebaasi nimi (sidekriipsudeta):",
        "config-db-name-oracle": "Andmebaasi skeem:",
        "config-db-username": "Andmebaasi kasutajanimi:",
        "config-db-password": "Andmebaasi parool:",
index c39823f..1c7647c 100644 (file)
@@ -41,11 +41,38 @@ class CategoryMembershipChangeJob extends Job {
 
        const ENQUEUE_FUDGE_SEC = 60;
 
-       public function __construct( Title $title, array $params ) {
+       /**
+        * @var ParserCache
+        */
+       private $parserCache;
+
+       /**
+        * @param Title $title The title of the page for which to update category emmbership.
+        * @param string $revisionTimestamp The timestamp of the new revision that triggered the job.
+        * @return JobSpecification
+        */
+       public static function newSpec( Title $title, $revisionTimestamp ) {
+               return new JobSpecification(
+                       'categoryMembershipChange',
+                       [
+                               'pageId' => $title->getArticleID(),
+                               'revTimestamp' => $revisionTimestamp,
+                       ],
+                       [],
+                       $title
+               );
+       }
+
+       /**
+        * Constructor for use by the Job Queue infrastructure.
+        * @note Don't call this when queueing a new instance, use newSpec() instead.
+        */
+       public function __construct( ParserCache $parserCache, Title $title, array $params ) {
                parent::__construct( 'categoryMembershipChange', $title, $params );
                // Only need one job per page. Note that ENQUEUE_FUDGE_SEC handles races where an
                // older revision job gets inserted while the newer revision job is de-duplicated.
                $this->removeDuplicates = true;
+               $this->parserCache = $parserCache;
        }
 
        public function run() {
@@ -236,10 +263,12 @@ class CategoryMembershipChangeJob extends Job {
                $options = $page->makeParserOptions( 'canonical' );
                $options->setTimestamp( $parseTimestamp );
 
-               // This could possibly use the parser cache if it checked the revision ID,
-               // but that's more complicated than it's worth.
-               $output = $renderer->getRenderedRevision( $rev->getRevisionRecord(), $options )
-                       ->getRevisionParserOutput();
+               $output = $rev->isCurrent() ? $this->parserCache->get( $page, $options ) : null;
+
+               if ( !$output || $output->getCacheRevisionId() !== $rev->getId() ) {
+                       $output = $renderer->getRenderedRevision( $rev->getRevisionRecord(), $options )
+                               ->getRevisionParserOutput();
+               }
 
                // array keys will cast numeric category names to ints
                // so we need to cast them back to strings to avoid breaking things!
index 32a5404..769954d 100644 (file)
@@ -796,6 +796,7 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                        'section' => 'rendering/timeoffset',
                        'id' => 'wpTimeCorrection',
                        'filter' => TimezoneFilter::class,
+                       'placeholder-message' => 'timezone-useoffset-placeholder',
                ];
        }
 
index a8bf814..19fe0c3 100644 (file)
@@ -120,14 +120,17 @@ class RevisionDeleteUser {
                        $actorId = $dbw->selectField( 'actor', 'actor_id', [ 'actor_name' => $name ], __METHOD__ );
                        if ( $actorId ) {
                                # Hide name from live edits
-                               $subquery = $dbw->selectSQLText(
+                               $ids = $dbw->selectFieldValues(
                                        'revision_actor_temp', 'revactor_rev', [ 'revactor_actor' => $actorId ], __METHOD__
                                );
-                               $dbw->update(
-                                       'revision',
-                                       [ self::buildSetBitDeletedField( 'rev_deleted', $op, $delUser, $dbw ) ],
-                                       [ "rev_id IN ($subquery)" ],
-                                       __METHOD__ );
+                               if ( $ids ) {
+                                       $dbw->update(
+                                               'revision',
+                                               [ self::buildSetBitDeletedField( 'rev_deleted', $op, $delUser, $dbw ) ],
+                                               [ 'rev_id' => $ids ],
+                                               __METHOD__
+                                       );
+                               }
 
                                # Hide name from deleted edits
                                $dbw->update(
index 552e92f..506cd3c 100644 (file)
@@ -149,14 +149,17 @@ class ActiveUsersPager extends UsersPager {
                // is done in two queries to avoid huge quicksorts and to make COUNT(*) correct.
                $dbr = $this->getDatabase();
                $res = $dbr->select( 'ipblocks',
-                       [ 'ipb_user', 'MAX(ipb_deleted) AS block_status' ],
+                       [ 'ipb_user', 'MAX(ipb_deleted) AS deleted, MAX(ipb_sitewide) AS sitewide' ],
                        [ 'ipb_user' => $uids ],
                        __METHOD__,
                        [ 'GROUP BY' => [ 'ipb_user' ] ]
                );
                $this->blockStatusByUid = [];
                foreach ( $res as $row ) {
-                       $this->blockStatusByUid[$row->ipb_user] = $row->block_status; // 0 or 1
+                       $this->blockStatusByUid[$row->ipb_user] = [
+                               'deleted' => $row->deleted,
+                               'sitewide' => $row->sitewide,
+                       ];
                }
                $this->mResult->seek( 0 );
        }
@@ -181,13 +184,20 @@ class ActiveUsersPager extends UsersPager {
 
                $item = $lang->specialList( $ulinks, $groups );
 
+               // If there is a block, 'deleted' and 'sitewide' are both set on
+               // $this->blockStatusByUid[$row->user_id].
+               $blocked = '';
                $isBlocked = isset( $this->blockStatusByUid[$row->user_id] );
-               if ( $isBlocked && $this->blockStatusByUid[$row->user_id] == 1 ) {
-                       $item = "<span class=\"deleted\">$item</span>";
+               if ( $isBlocked ) {
+                       if ( $this->blockStatusByUid[$row->user_id]['deleted'] == 1 ) {
+                               $item = "<span class=\"deleted\">$item</span>";
+                       }
+                       if ( $this->blockStatusByUid[$row->user_id]['sitewide'] == 1 ) {
+                               $blocked = ' ' . $this->msg( 'listusers-blocked', $userName )->escaped();
+                       }
                }
                $count = $this->msg( 'activeusers-count' )->numParams( $row->recentedits )
                        ->params( $userName )->numParams( $this->RCMaxAge )->escaped();
-               $blocked = $isBlocked ? ' ' . $this->msg( 'listusers-blocked', $userName )->escaped() : '';
 
                return Html::rawElement( 'li', [], "{$item} [{$count}]{$blocked}" );
        }
index 9b8a1fa..0f573ff 100644 (file)
        "tag-filter-submit": "سۆزگَج",
        "tag-list-wrapper": "[[Special:Tags|{{PLURAL:$1|اِتیکِت|اِتیکِتلر}}]]: $2",
        "tag-mw-new-redirect": "یئنی یوْللاندیرما",
+       "tag-mw-removed-redirect": "یوْللاندیرما سیلیندی",
        "tag-mw-blank": "بوْشالتما",
        "tags-title": "اِتیکتلر",
        "tags-intro": "بو صفحه، نرم افزار دَییشدیرمه‌لری علامتله‌ین اِتیکِتلری و اونلارین معنالارینی گؤستریر.",
index 458ca5e..fad0d1a 100644 (file)
        "shared-repo-name-wikimediacommons": "Вікісховішча",
        "upload-disallowed-here": "Вы ня можаце перазапісаць гэты файл.",
        "filerevert": "Вярнуць $1",
-       "filerevert-legend": "Вярнуць папярэднюю вэрсію файла",
+       "filerevert-legend": "Вярнуць папярэднюю вэрсію файлу",
        "filerevert-intro": "Вы вяртаеце '''[[Media:$1|$1]]''' да [вэрсіі $4 ад $3, $2].",
        "filerevert-comment": "Прычына:",
        "filerevert-defaultcomment": "Вернутая вэрсія ад $2 $1 ($3)",
index 7281cdc..2cc7e2e 100644 (file)
        "right-deletedtext": "Преглед на изтрития текст и промените между изтритите версии",
        "right-browsearchive": "Търсене на изтрити страници",
        "right-undelete": "Възстановяване на страници",
-       "right-suppressrevision": "Преглед и възстановяване на версии, скрити от администраторите",
+       "right-suppressrevision": "Преглед, скриване и възстановяване на отделни версии на страници от който и да е потребител",
        "right-viewsuppressed": "Преглеждане на версии, скрити от който и да е потребител",
        "right-suppressionlog": "Преглеждане на скритите дневници",
        "right-block": "Спиране на достъпа до редактиране",
        "rcfilters-watchlist-markseen-button": "Отбелязване на всички промени като прегледани",
        "rcfilters-watchlist-edit-watchlist-button": "Редактиране на списъка за наблюдение",
        "rcfilters-watchlist-showupdated": "Промени по страници, които не сте посетили откакто са внесени промените, са в <strong>получер</strong>, с удебелени маркери.",
-       "rcfilters-preference-label": "СкÑ\80иване Ð½Ð° Ð¿Ð¾Ð´Ð¾Ð±Ñ\80енаÑ\82а Ð²ÐµÑ\80Ñ\81иÑ\8f Ð½Ð° Ð\9fоÑ\81ледни Ð¿Ñ\80омени",
+       "rcfilters-preference-label": "Ð\98зползване Ð½Ð° Ð¸Ð½Ñ\82еÑ\80Ñ\84ейÑ\81 Ð±ÐµÐ· JavaScript",
        "rcfilters-preference-help": "Отменя преработката на интерфейса направена през 2017 година, както и всички инструменти добавени от тогава до сега.",
-       "rcfilters-watchlist-preference-label": "СкÑ\80иване Ð½Ð° Ð¿Ð¾Ð´Ð¾Ð±Ñ\80енаÑ\82а Ð²ÐµÑ\80Ñ\81иÑ\8f Ð½Ð° Ð¡Ð¿Ð¸Ñ\81Ñ\8aк Ð·Ð° Ð½Ð°Ð±Ð»Ñ\8eдение",
+       "rcfilters-watchlist-preference-label": "Ð\98зползване Ð½Ð° Ð¸Ð½Ñ\82еÑ\80Ñ\84ейÑ\81 Ð±ÐµÐ· JavaScript",
        "rcfilters-watchlist-preference-help": "Отменя преработката на интерфейса направена през 2017 година, както и всички инструменти добавени от тогава до сега.",
        "rcfilters-filter-showlinkedfrom-label": "Показване на промени на страници, към които има връзка от",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>Страници, към които има връзка от</strong> избраната страница",
index cd7d0f8..bb963c6 100644 (file)
        "passwordtooshort": "পাসওয়ার্ড কমপক্ষে {{PLURAL:$1|১ অক্ষরের|$1 অক্ষরের}} হতে হবে।",
        "passwordtoolong": "পাসওয়ার্ড {{PLURAL:$1|১|$1}} অক্ষরের চেয়ে দীর্ঘ হতে পারবে না।",
        "passwordtoopopular": "সাধারণভাবে নির্বাচিত পাসওয়ার্ড ব্যবহার করা যাবে না। দয়া করে এমন একটি পাসওয়ার্ড নির্বাচন করুন যা অনুমান করা আরও কঠিন।",
+       "passwordinlargeblacklist": "লিখিত পাসওয়ার্ডটি খুব সাধারণভাবে ব্যবহৃত পাসওয়ার্ডের তালিকায় থাকা একটি পাসওয়ার্ড। দয়া করে একটি আরো শক্তিশালী পাসওয়ার্ড নির্বাচন করুন।",
        "password-name-match": "আপনার পাসওয়ার্ড আপনার ব্যবহারকারী নাম থেকে আলাদা হতে হবে।",
        "password-login-forbidden": "এই ব্যবহারকারীর নাম এবং পাসওয়ার্ডটি ব্যবহার নিষিদ্ধ করা হয়েছে।",
        "mailmypassword": "পাসওয়ার্ড পুনঃস্থাপন",
        "prefs-displayrc": "প্রদর্শনীর পছন্দগুলি",
        "prefs-displaywatchlist": "প্রদর্শনী অপশন",
        "prefs-changesrc": "পরিবর্তন প্রদর্শন",
+       "prefs-changeswatchlist": "পরিবর্তন প্রদর্শন",
        "prefs-pageswatchlist": "নজরে রাখা পাতা",
        "prefs-tokenwatchlist": "টোকেন",
        "prefs-diffs": "পার্থক্য",
        "rcfilters-preference-label": "জাভাস্ক্রিপ্টহীন ইন্টারফেস ব্যবহার করুন",
        "rcfilters-preference-help": "ছাঁকনিগুলি বা আলোকপাতকরণ কার্যকারিতা ছাড়া সাম্প্রতিক পরিবর্তন লোড করে",
        "rcfilters-watchlist-preference-label": "জাভাস্ক্রিপ্টহীন ইন্টারফেস ব্যবহার করুন",
+       "rcfilters-watchlist-preference-help": "ছাঁকনি বা আলোকপাতকরণ বৈশিষ্ট্য ছাড়া নজরতালিকা লোড করে।",
        "rcfilters-target-page-placeholder": "একটি পাতার নাম (বা বিষয়শ্রেণী) লিখুন",
        "rcnotefrom": "<strong>$2</strong>টা থেকে সংঘটিত পরিবর্তনগুলি (সর্বোচ্চ <strong>$1টি</strong> দেখানো হয়েছে)।",
        "rclistfromreset": "তারিখ নির্বাচন পুনঃস্থাপন করুন",
        "move-watch": "এই পাতাটি নজরে রাখুন",
        "movepagebtn": "পাতা স্থানান্তর করুন",
        "pagemovedsub": "সরিয়ে নেওয়া হয়েছে",
+       "cannotmove": "নিন্মলিখিত {{PLURAL:$1|কারণে}}, পাতাটি স্থানান্তর করা যায়নি:",
        "movepage-moved": "'''\"$1\"-কে \"$2\" শিরোনামে স্থানান্তর করা হয়েছে'''",
        "movepage-moved-redirect": "একটি পুনর্নির্দেশনা তৈরি হয়েছে।",
        "movepage-moved-noredirect": "পুনর্নির্দেশ তৈরীতে বাধা দেয়া হয়েছে।",
index 22d956a..d2c7d60 100644 (file)
        "specialpage-securitylevel-not-allowed-title": "No permès",
        "specialpage-securitylevel-not-allowed": "Ho sentim, no podeu utilitzar la pàgina perquè no es pot verificar la vostra identitat.",
        "authpage-cannot-login": "No s'ha pogut iniciar la sessió.",
-       "authpage-cannot-login-continue": "No es pot continuar amb l'inicio de sessió. Probablement la vostra sessió ha expirat.",
+       "authpage-cannot-login-continue": "No es pot continuar amb l'inici de sessió. Probablement la vostra sessió ha expirat.",
        "authpage-cannot-create": "No s'ha pogut iniciar la creació del compte.",
        "authpage-cannot-create-continue": "No es pot prosseguir la creació del compte. Probablement la vostra sessió ha expirat.",
        "authpage-cannot-link": "No s'ha pogut iniciar l'enllaç del compte.",
index b2a755d..dd94787 100644 (file)
        "timezonelegend": "Time zone:",
        "localtime": "Local time:",
        "timezoneuseserverdefault": "Use wiki default ($1)",
-       "timezoneuseoffset": "Other (specify offset)",
+       "timezoneuseoffset": "Other (specify offset below)",
+       "timezone-useoffset-placeholder": "Example values: \"-07:00\" or \"01:00\"",
        "servertime": "Server time:",
        "guesstimezone": "Fill in from browser",
        "timezoneregion-africa": "Africa",
index 94ce631..c43d74c 100644 (file)
        "badaccess": "Vi ne havas sufiĉe da redaktorajtoj por ĉi tiu paĝo.",
        "badaccess-group0": "Vi ne rajtas plenumi la agon, kiun vi petis.",
        "badaccess-groups": "La ago, kiun vi petis, estas limigita al uzantoj en {{PLURAL:$2|la grupo|unu el la grupoj}}: $1.",
-       "versionrequired": "Versio $1 de MediaWiki nepras",
+       "versionrequired": "Versio $1 de MediaWiki estas deviga",
        "versionrequiredtext": "La versio $1 de MediaWiki estas necesa por uzi ĉi tiun paĝon. Vidu [[Special:Version|paĝon pri versio]].",
        "ok": "Bone",
        "retrievedfrom": "Elŝutita el  \"$1\"",
        "right-editcontentmodel": "Redakti paĝan enhavmodelon",
        "right-editinterface": "Redakti la uzantointerfacon",
        "right-editusercss": "Redaktu CSS-dosierojn de aliaj uzantoj",
+       "right-edituserjson": "Redakti JSON-dosierojn de aliaj uzantoj",
        "right-edituserjs": "Redaktu JS-dosierojn de aliaj uzantoj",
        "right-editmyusercss": "Redakti viajn proprajn CSS-dosierojn",
        "right-editmyuserjs": "Redakti viajn proprajn JavaScript-dosierojn",
        "rcfilters-savedqueries-new-name-label": "Nomo",
        "rcfilters-savedqueries-new-name-placeholder": "Priskribas la celon de la filtrilo",
        "rcfilters-savedqueries-apply-label": "Krei filtrilon",
+       "rcfilters-savedqueries-apply-and-setdefault-label": "Krei defaŭltan filtrilon",
        "rcfilters-savedqueries-cancel-label": "Nuligi",
+       "rcfilters-savedqueries-add-new-title": "Konservi la nunajn filtrilajn agordojn",
        "rcfilters-restore-default-filters": "Restarigi defaŭltajn filtrilojn",
        "rcfilters-clear-all-filters": "Nuligi ĉiujn filtrilojn",
        "rcfilters-show-new-changes": "Vidi la plej novajn ŝanĝojn",
        "rcfilters-filter-bots-description": "Redaktoj farita de aŭtomatigitaj iloj.",
        "rcfilters-filter-humans-label": "Homa (ne robota)",
        "rcfilters-filter-humans-description": "Redaktoj farita de homaj redaktantoj.",
+       "rcfilters-filter-reviewstatus-unpatrolled-label": "Ne patrolita",
+       "rcfilters-filter-reviewstatus-manual-description": "Redaktoj mane markita kiel patrolita.",
+       "rcfilters-filter-reviewstatus-manual-label": "Mane patrolita",
+       "rcfilters-filter-reviewstatus-auto-description": "Redaktoj de altnivelaj uzantoj kies laboro estas aŭtomate markita kiel patrolita.",
+       "rcfilters-filter-reviewstatus-auto-label": "Aŭtomate patrolita",
        "rcfilters-filtergroup-significance": "Signifo",
        "rcfilters-filter-minor-label": "Etaj redaktoj",
        "rcfilters-filter-minor-description": "Redaktoj kiujn la aŭtoro markis kiel \"redakteto\".",
        "rcfilters-filter-major-label": "Redaktoj kiujn la aŭtoro ne markis kiel \"redakteto\".",
        "rcfilters-filter-major-description": "Redaktoj kiujn la aŭtoro ne markis kiel \"redakteto\".",
+       "rcfilters-filtergroup-watchlist": "Atentataj paĝoj",
        "rcfilters-filter-watchlist-watched-label": "Sur atentaro",
        "rcfilters-filter-watchlist-watched-description": "Ŝanĝoj al paĝoj sur via atentaro.",
        "rcfilters-filter-watchlist-watchednew-label": "Nova ŝanĝoj en la atentaro",
        "fileexists": "Dosiero kun tiu ĉi nomo jam ekzistas.\nBonvolu kontroli <strong>[[:$1]]</strong> krom se vi certas ke {{GENDER:|vi}} konscie volas ŝanĝi ĝuste tiun.\n[[$1|thumb]]",
        "filepageexists": "La priskriba paĝo por ĉi tiu dosiero jam estis kreita ĉe <strong>[[:$1]]</strong>, sed neniu dosiero kun ĉi tiu nomo nune ekzistas.\nLa resumo kiun vi entajpos ne aperos en la priskribo-paĝo.\nPor aperigi vian resumon, vi devos permane redakti ĝin.\n[[$1|thumb]]",
        "fileexists-extension": "Dosiero kun simila nomo ekzistas: [[$2|thumb]]\n* Nomo de la alŝutanta dosiero: <strong>[[:$1]]</strong>\n* Nomo de la ekzistanta dosiero: <strong>[[:$2]]</strong>\nBonvolu elekti malsaman nomon.",
-       "fileexists-thumbnail-yes": "Ĉi tiu dosiero ŝajnas kiel bildo de malkreskigita grandeco ''(bildeto)''. [[$1|thumb]]\nBonvolu kontroli la dosieron <strong>[[:$1]]</strong>.\nSe la kontrolita dosiero estas la sama bildo kiel la originala grandeco, ĝi ne nepras alŝuti plian bideton.",
+       "fileexists-thumbnail-yes": "Ĉi tiu dosiero ŝajnas kiel bildo de malkreskigita grandeco ''(bildeto)''. [[$1|thumb]]\nBonvolu kontroli la dosieron <strong>[[:$1]]</strong>.\nSe la kontrolita dosiero estas la sama bildo kiel la originala grandeco, ĝi ne devigas alŝuti plian bideton.",
        "file-thumbnail-no": "La dosiernomo komencas kun <strong>$1</strong>.\nĜi ŝajnas kiel bildo de malgrandigita grandeco ''(thumbnail)''.\nSe vi havas ĉi tiun bildon en plena distingivo, alŝutu ĉi tiun, alikaze bonvolu ŝanĝi la dosieran nomon.",
        "fileexists-forbidden": "Dosiero kun ĉi tiu nomo jam ekzistas kaj ne povas anstataŭigi ĝin.\nSe vi ankoraŭ volas alŝuti vian dosieron, bonvolu reprovi kun nova nomo.\n[[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Dosiero kun ĉi tia nomo jam ekzistas en la komuna dosierujo.\nSe vi ankoraŭ volas alŝuti vian dosieron, bonvolu retroigi kaj uzi novan nomon.[[File:$1|thumb|center|$1]]",
        "uploadstash-refresh": "Aktualigi la dosierliston.",
        "uploadstash-thumbnail": "Vidi bildeton",
        "uploadstash-exception": "Ne eblas alŝuti en kaŝkonservejon ($1): \"$2\".",
+       "uploadstash-bad-path-unrecognized-thumb-name": "Nerekonita miniatura nomo.",
        "invalid-chunk-offset": "Malvalida deŝovo de dosierpeco",
        "img-auth-accessdenied": "Atingo malpermisita",
        "img-auth-nopathinfo": "Mankas informo pri vojo.\nVia servilo estu agordita por sendi la variablojn REQUEST_URI kaj/aŭ PATH_INFO.\nSe ĝi jam estas, provu aktivigon de $wgUsePathInfo.\nVidu https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "deadendpages": "Paĝoj sen interna ligilo",
        "deadendpagestext": "La sekvaj paĝoj ne ligas al aliaj paĝoj en {{SITENAME}}.",
        "protectedpages": "Protektitaj paĝoj",
+       "protectedpages-filters": "Filtriloj",
        "protectedpages-indef": "Nur ĉiamaj protektaĵoj",
        "protectedpages-summary": "Ĉi tiu paĝo listigas ekzistantajn paĝojn, kiuj nuntempe estas protektitaj. Por listo de titoloj, kiuj estas protektitaj kontraŭ kreado, vidu [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Nur kaskadaj protektoj",
        "apisandbox-dynamic-error-exists": "Parametro nomata \"$1\" jam ekzistas.",
        "apisandbox-deprecated-parameters": "Evitindajn parametrojn",
        "apisandbox-fetch-token": "Aŭtoplenigu ĵetonon",
+       "apisandbox-add-multi": "Aldoni",
        "apisandbox-submit-invalid-fields-title": "Iuj kampoj estas malvalidaj.",
        "apisandbox-submit-invalid-fields-message": "Bonvolu ĝustigi la markitajn kampojn kaj provi denove.",
        "apisandbox-results": "Rezultoj",
        "dellogpage": "Protokolo pri forigoj",
        "dellogpagetext": "Jen listo de la plej lastaj forigoj.",
        "deletionlog": "protokolo pri forigoj",
+       "logentry-create-create": "$1 {{GENDER:$2|kreis}} paĝon $3",
        "reverted": "Malfaris al antaŭa revisio",
        "deletecomment": "Kialo:",
        "deleteotherreason": "Alia/plua kialo:",
        "contribsub2": "De {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Uzanto-konto \"$1\" ne estas registrita.",
        "nocontribs": "Trovis neniajn redaktojn laŭ tiu kriterio.",
-       "uctop": " aktuala",
+       "uctop": "nuna",
        "month": "Ekde monato (kaj pli frue):",
        "year": "Ekde jaro (kaj pli frue):",
        "sp-contributions-newbies": "Montri nur kontribuojn de novaj kontoj",
        "ipb-disableusertalk": "Preventi ĉi tiun uzanton redakti sian diskutpaĝon, dum ĝi estas forbarata",
        "ipb-change-block": "Reforbari la uzanton kun ĉi tiuj preferoj",
        "ipb-confirm": "Konfirmi forbaron",
+       "ipb-sitewide": "Tutreteja",
+       "ipb-partial": "Parta",
+       "ipb-pages-label": "Paĝoj",
        "badipaddress": "Neniu uzanto, aŭ la IP-adreso estas misformita.",
        "blockipsuccesssub": "Forbaro sukcesis.",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] estas forbarita. <br />\nVidu la [[Special:BlockList|liston de forbaroj]] por kontroli.",
        "unblocked-id": "Forbaro $1 estas forigita.",
        "unblocked-ip": "[[Special:Contributions/$1|$1]] estis malforbarita.",
        "blocklist": "Forbaritaj uzantoj",
+       "autoblocklist-submit": "Serĉi",
        "ipblocklist": "Forbaritaj uzantoj",
        "ipblocklist-legend": "Trovi forbaritan uzanton.",
        "blocklist-userblocks": "Kaŝi konto-forbarojn",
        "createaccountblock": "Kreado de kontoj forbarita",
        "emailblock": "retpoŝto forbarita",
        "blocklist-nousertalk": "ne povas redakti sian propran diskuto-paĝon",
+       "blocklist-editing": "redaktado",
+       "blocklist-editing-sitewide": "redaktado (tutreteja)",
        "ipblocklist-empty": "La forbarlibro estas malplena.",
        "ipblocklist-no-results": "Ĉi tiu IP-adreso aŭ salutnomo ne estas forbarita.",
        "blocklink": "forbari",
        "ipbnounblockself": "Vi ne rajtas malforbari vin mem",
        "lockdb": "Ŝlosi datumbazon",
        "unlockdb": "Malŝlosi datumaron",
-       "lockdbtext": "Se vi ŝlosos la datumaron, tio malebligos al ĉiuj uzantoj\nredakti paĝojn, ŝanĝi preferojn, priumi atentarojn, kaj fari diversajn aliajn\naferojn, por kiuj nepras ŝanĝi la datumaron.\nBonvolu certigu, ke vi efektive intencas tion fari, kaj ke vi ja malŝlosos\nla datumaron post ol vi finos vian riparadon.",
-       "unlockdbtext": "Se vi malŝlosos la datumaron, tio reebligos al ĉiuj uzantoj\nredakti paĝojn, ŝanĝi preferojn, priumi la atentaron, kaj fari aliajn aferojn,\npor kiuj nepras ŝanĝi al la datumaro.\nBonvolu certigu, ke vi efektive intencas tion fari.",
+       "lockdbtext": "Se vi ŝlosos la datumaron, tio malebligos al ĉiuj uzantoj\nredakti paĝojn, ŝanĝi preferojn, priumi atentarojn, kaj fari diversajn aliajn\naferojn, por kiuj estas deviga ŝanĝi la datumaron.\nBonvolu certigu, ke vi efektive intencas tion fari, kaj ke vi ja malŝlosos\nla datumaron post ol vi finos vian riparadon.",
+       "unlockdbtext": "Se vi malŝlosos la datumaron, tio reebligos al ĉiuj uzantoj\nredakti paĝojn, ŝanĝi preferojn, priumi la atentaron, kaj fari aliajn aferojn,\npor kiuj estas deviga ŝanĝi al la datumaro.\nBonvolu certigu, ke vi efektive intencas tion fari.",
        "lockconfirm": "Jes, mi vere volas ŝlosi la datumaron.",
        "unlockconfirm": "Jes, mi vere volas malŝlosi la datumaron.",
        "lockbtn": "Ŝlosi datumbazon",
        "newimages-summary": "Ĉi tiu speciala paĝo montras la lastajn alŝutitajn dosierojn.",
        "newimages-legend": "Dosiernomo",
        "newimages-label": "Dosiernomo (aŭ parto de ĝi):",
+       "newimages-user": "IP-adreso aŭ uzantnomo",
        "newimages-showbots": "Montri alŝutojn per robotoj",
        "newimages-hidepatrolled": "Malvidigi la patrolitajn alŝutitojn",
        "noimages": "Nenio videbla.",
        "compare-title-not-exists": "La titolo kiun vi specifis ne ekzistas.",
        "compare-revision-not-exists": "La revizio kiun vi specifis ne ekzistas.",
        "diff-form": "Malsamoj",
+       "permanentlink": "Konstanta ligilo",
        "dberr-problems": "Bedaŭrinde, ĉi tiu retejo suferas pro teknikaj problemoj.",
        "dberr-again": "Bonvolu atendi kelkajn minutojn kaj reŝargi.",
        "dberr-info": "(Ne eblas konekti la datumbazon: $1)",
        "htmlform-chosen-placeholder": "Elektu opcion",
        "htmlform-cloner-create": "Aldoni plian",
        "htmlform-cloner-delete": "Forigi",
-       "htmlform-cloner-required": "Almenaŭ unu valoro estas nepra.",
+       "htmlform-cloner-required": "Almenaŭ unu valoro estas deviga.",
        "htmlform-date-placeholder": "JJJJ-MM-TT",
        "htmlform-time-placeholder": "HH:MM:SS",
        "htmlform-datetime-placeholder": "JJJJ-MM-TT HH:MM:SS",
index 5ca68d0..f0f713d 100644 (file)
                ]
        },
        "tog-underline": "Subrayar los enlaces:",
-       "tog-hideminor": "Ocultar las ediciones menores de los cambios recientes",
-       "tog-hidepatrolled": "Ocultar las ediciones verificadas de los cambios recientes",
+       "tog-hideminor": "Ocultar las ediciones menores en cambios recientes",
+       "tog-hidepatrolled": "Ocultar las ediciones verificadas de cambios recientes",
        "tog-newpageshidepatrolled": "Ocultar las páginas verificadas de la lista de páginas nuevas",
        "tog-hidecategorization": "Ocultar la categorización de páginas",
        "tog-extendwatchlist": "Mostrar todos los cambios en la lista de seguimiento, no solo los más recientes",
-       "tog-usenewrc": "Agrupar los cambios por página en los cambios recientes y en la lista de seguimiento",
+       "tog-usenewrc": "Agrupar los cambios por página en cambios recientes y en la lista de seguimiento",
        "tog-numberheadings": "Numerar automáticamente los encabezados",
        "tog-editondblclick": "Editar páginas al hacer doble clic",
        "tog-editsectiononrightclick": "Permitir las modificaciones de sección al hacer clic derecho en sus títulos",
        "tog-watchcreations": "Añadir a mi lista de seguimiento las páginas que cree y los archivos que suba",
        "tog-watchdefault": "Añadir a mi lista de seguimiento las páginas y archivos que edite",
-       "tog-watchmoves": "Añadir a mi lista de seguimiento las páginas y archivos que mueva",
+       "tog-watchmoves": "Añadir a mi lista de seguimiento las páginas y archivos que traslade",
        "tog-watchdeletion": "Añadir las páginas y archivos que borre a mi lista de seguimiento",
        "tog-watchuploads": "Añadir a mi lista de seguimiento los archivos nuevos que suba",
        "tog-watchrollback": "Añadir a mi lista de seguimiento las páginas en las que haya realizado una reversión",
        "tog-enotifwatchlistpages": "Enviarme un mensaje de correo cuando se modifique una página o un archivo de mi lista de seguimiento",
        "tog-enotifusertalkpages": "Enviarme un mensaje de correo cuando se modifique mi página de discusión",
        "tog-enotifminoredits": "Notificarme también por correo electrónico los cambios menores de las páginas y archivos",
-       "tog-enotifrevealaddr": "Revelar mi dirección de correo electrónico en los correos de notificación",
+       "tog-enotifrevealaddr": "Mostrar mi dirección de correo electrónico en los correos de notificación",
        "tog-shownumberswatching": "Mostrar el número de usuarios que la vigilan",
        "tog-oldsig": "Tu firma actual:",
        "tog-fancysig": "Tratar la firma como wikitexto (sin un enlace automático)",
        "underline-default": "Configuración predeterminada de la apariencia o el navegador",
        "editfont-style": "Tipo de letra del área de edición:",
        "editfont-monospace": "Tipo de letra monoespaciado",
-       "editfont-sansserif": "Tipo de letra de palo seco",
-       "editfont-serif": "Tipo de letra con serifas",
+       "editfont-sansserif": "Tipo de letra Sans-serif",
+       "editfont-serif": "Tipo de letra con Serif",
        "sunday": "domingo",
        "monday": "lunes",
        "tuesday": "martes",
        "index-category": "Páginas indizadas",
        "noindex-category": "Páginas no indizadas",
        "broken-file-category": "Páginas con enlaces rotos a archivos",
+       "categoryviewer-pagedlinks": "($1) ($2)",
+       "category-header-numerals": "$1–$2",
        "about": "Acerca de",
        "article": "Página de contenido",
        "newwindow": "(se abre en una ventana nueva)",
        "versionrequired": "Se requiere la versión $1 de MediaWiki",
        "versionrequiredtext": "Se necesita la versión $1 de MediaWiki para utilizar esta página. Para más información, consulta [[Special:Version|la página de versión]].",
        "ok": "Aceptar",
+       "pagetitle": "$1 - {{SITENAME}}",
+       "pagetitle-view-mainpage": "{{SITENAME}}",
+       "backlinksubtitle": "← $1",
        "retrievedfrom": "Obtenido de «$1»",
        "youhavenewmessages": "{{PLURAL:$3|Tienes}} $1 ($2).",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|Tienes}} $1 de {{PLURAL:$3|otro usuario|$3 usuarios}} ($2).",
        "page-rss-feed": "Canal RSS de «$1»",
        "page-atom-feed": "Canal Atom de «$1»",
        "feed-atom": "Atom",
+       "feed-rss": "RSS",
        "red-link-title": "$1 (la página no existe)",
        "sort-descending": "Orden descendente",
        "sort-ascending": "Orden ascendente",
        "badarticleerror": "Esta acción no se puede llevar a cabo en esta página.",
        "cannotdelete": "No se ha podido borrar la página o archivo «$1».\nPuede que ya haya sido borrado por otro usuario.",
        "cannotdelete-title": "No se puede borrar la página «$1»",
+       "delete-scheduled": "La página «$1» está programada para su borrado.\nPor favor se paciente.",
        "delete-hook-aborted": "Una extensión ha evitado el borrado de la página. No hay explicación disponible.",
-       "no-null-revision": "No se pudo crear una nueva revisión nula para la página «$1»",
+       "no-null-revision": "No se pudo crear una nueva revisión nula en la página «$1»",
        "badtitle": "Título incorrecto",
        "badtitletext": "El título de la página solicitada no es válido, está vacío, o es un título entre idiomas o interwiki incorrectamente vinculado.\nPuede que contenga uno o más caracteres que no se pueden usar en los títulos.",
        "title-invalid-empty": "El título de la página solicitada está vacío o contiene solo el nombre de un espacio de nombres.",
        "protectedpagetext": "Esta página ha sido protegida para evitar su edición u otras acciones.",
        "viewsourcetext": "Puedes ver y copiar el código fuente de esta página.",
        "viewyourtext": "Puedes ver y copiar el código de <strong>tus ediciones</strong> en esta página.",
-       "protectedinterface": "Esta página proporciona el texto de la interfaz del software en este wiki, y está protegida para prevenir el abuso.\nPara agregar o cambiar las traducciones para todos los wikis, usa [https://translatewiki.net/ translatewiki.net], el proyecto de localización de MediaWiki.",
+       "protectedinterface": "Esta página proporciona el texto de la interfaz del software en este wiki y está protegido para evitar abusos.\nPara agregar o cambiar las traducciones para todos los wikis, usa [https://translatewiki.net/ translatewiki.net], el proyecto de localización de MediaWiki.",
        "editinginterface": "<strong>Advertencia:</strong> estás editando una página usada para proporcionar texto de la interfaz al software. \nLos cambios en esta página afectarán la apariencia de la interfaz de los demás usuarios de este wiki.",
        "translateinterface": "Para añadir o cambiar traducciones para todos los wikis, usa [https://translatewiki.net/ translatewiki.net], el proyecto de regionalización de MediaWiki.",
        "cascadeprotected": "Esta página ha sido protegida contra edición porque está transcluida en {{PLURAL:$1|la siguiente página protegida|las siguientes páginas protegidas}} con la opción de «cascada» activa:\n$2",
        "namespaceprotected": "No tienes permiso para editar las páginas del espacio de nombres <strong>$1</strong>.",
-       "customcssprotected": "No tienes permiso para editar esta página CSS, porque contiene configuraciones personales de otro usuario.",
+       "customcssprotected": "No tienes permiso para editar esta página CSS porque contiene configuraciones personales de otro usuario.",
        "customjsonprotected": "No tienes permiso para editar esta página JSON porque contiene configuraciones personales de otro usuario.",
-       "customjsprotected": "No tienes permiso para editar esta página JavaScript, porque contiene configuraciones personales de otro usuario.",
+       "customjsprotected": "No tienes permiso para editar esta página JavaScript porque contiene configuraciones personales de otro usuario.",
        "sitecssprotected": "No tienes permiso para editar esta página CSS porque puede afectar a todos los visitantes.",
        "sitejsonprotected": "No tienes permiso para editar esta página JSON porque puede afectar a todos los visitantes.",
        "sitejsprotected": "No tienes permiso para editar esta página de JavaScript porque puede afectar a todos los visitantes.",
        "userlogin-yourpassword": "Contraseña",
        "userlogin-yourpassword-ph": "Escribe tu contraseña",
        "createacct-yourpassword-ph": "Escribe una contraseña",
-       "yourpasswordagain": "Confirma la contraseña:",
+       "yourpasswordagain": "Repite la contraseña:",
        "createacct-yourpasswordagain": "Confirma la contraseña",
-       "createacct-yourpasswordagain-ph": "Repite la contraseña",
+       "createacct-yourpasswordagain-ph": "Introduce de nuevo la contraseña",
        "userlogin-remembermypassword": "Mantener mi sesión iniciada",
        "userlogin-signwithsecure": "Usar conexión segura",
        "cannotlogin-title": "No se puede iniciar sesión",
        "nocookiesnew": "Se ha creado la cuenta de usuario, pero aún no has iniciado sesión.\n{{SITENAME}} usa <em>cookies</em> para identificar a los usuarios registrados.\nTu navegador tiene desactivadas las cookies.\nPor favor, actívalas e inicia sesión con tu nuevo nombre de usuario y contraseña.",
        "nocookieslogin": "{{SITENAME}} utiliza <em>cookies</em> para la autenticación de usuarios. Las <em>cookies</em> están desactivadas en tu navegador. Por favor, actívalas e inténtalo de nuevo.",
        "nocookiesfornew": "No se pudo crear la cuenta de usuario, porque no pudimos confirmar su origen.\nAsegúrate de que tienes las cookies activadas, luego recarga esta página e inténtalo de nuevo.",
+       "nocookiesforlogin": "{{int:nocookieslogin}}",
        "createacct-loginerror": "La cuenta se ha creado correctamente, pero no se pudo ingresar automáticamente. Procede al [[Special:UserLogin|acceso manual]].",
        "noname": "No se ha especificado un nombre de usuario válido.",
        "loginsuccesstitle": "Has accedido",
        "passwordtooshort": "Las contraseñas deben tener al menos {{PLURAL:$1|1 carácter|$1 caracteres}}.",
        "passwordtoolong": "Las contraseñas no deben tener más de {{PLURAL:$1|1 carácter|$1 caracteres}}.",
        "passwordtoopopular": "No es posible utilizar las contraseñas más comunes. Elige una que sea más difícil de descifrar.",
-       "passwordinlargeblacklist": "La contraseña utilizada está en una lista de contraseñas usadas comúnmente. Por favor seleccione una contraseña más única.",
+       "passwordinlargeblacklist": "La contraseña usada está en la lista de contraseñas más usadas. Por favor selecciona una contraseña única.",
        "password-name-match": "Tu contraseña debe ser diferente de tu nombre de usuario.",
        "password-login-forbidden": "El uso de este nombre de usuario y contraseña han sido prohibidos.",
        "mailmypassword": "Restablecer la contraseña",
        "botpasswords-invalid-name": "El nombre de usuario especificado no contiene el separador de contraseña de bot («$1»).",
        "botpasswords-not-exist": "El usuario «$1» no tiene una contraseña de bot llamada «$2».",
        "botpasswords-needs-reset": "Se debe restablecer la contraseña del bot «$2», propiedad {{GENDER:$1|del usuario|de la usuaria}} «$1».",
+       "botpasswords-locked": "No puedes iniciar sesión con una contraseña de bot ya que tu cuenta está bloqueada.",
        "resetpass_forbidden": "No se pueden cambiar las contraseñas",
        "resetpass_forbidden-reason": "Las contraseñas no pueden cambiarse: $1",
        "resetpass-no-info": "Debes iniciar sesión para acceder directamente a esta página.",
        "resetpass-submit-loggedin": "Cambiar contraseña",
        "resetpass-submit-cancel": "Cancelar",
        "resetpass-wrong-oldpass": "La contraseña actual, o temporal, no es correcta.\nPuede que ya hayas cambiado tu contraseña o que hayas pedido una nueva contraseña temporal.",
-       "resetpass-recycled": "Cambia tu contraseña a algo distinto de tu contraseña actual.",
+       "resetpass-recycled": "Cambia tu contraseña por otra que no sea tu contraseña actual.",
        "resetpass-temp-emailed": "Has iniciado sesión con una contraseña temporal enviada por correo electrónico.\nPara continuar, debes establecer una nueva contraseña aquí:",
        "resetpass-temp-password": "Contraseña temporal:",
        "resetpass-abort-generic": "Una extensión ha cancelado el cambio de la contraseña.",
        "resetpass-expired": "Tu contraseña ha caducado. Por favor, establece una nueva contraseña para iniciar sesión.",
-       "resetpass-expired-soft": "Tu contraseña ha caducado, por lo que debes cambiarla. Elige ahora una contraseña nueva o pulsa en «{{int:authprovider-resetpass-skip-label}}» para cambiarla más tarde.",
+       "resetpass-expired-soft": "Tu contraseña ha caducado, por lo que debes cambiarla. Elige una contraseña nueva o pulsa en «{{int:authprovider-resetpass-skip-label}}» para cambiarla más tarde.",
        "resetpass-validity-soft": "La contraseña no es válida: $1\n\nCámbiala ahora por una nueva, o bien, pulsa en «{{int:authprovider-resetpass-skip-label}}» para cambiarla más tarde.",
        "passwordreset": "Restablecer contraseña",
        "passwordreset-text-one": "Completa este formulario para recibir una contraseña temporal por correo electrónico.",
        "passwordreset-emailelement": "Nombre de {{GENDER:$1|usuario|usuaria}}: \n$1\n\nContraseña temporal: \n$2",
        "passwordreset-emailsentemail": "Si esta dirección de correo electrónico está asociada a tu cuenta, entonces se enviará un correo electrónico para restablecer la contraseña.",
        "passwordreset-emailsentusername": "Si existe una dirección de correo electrónico asociada a este nombre de usuario, entonces se enviará un correo para restablecer la contraseña.",
-       "passwordreset-nocaller": "Debe de proporcionarse un interlocutor",
-       "passwordreset-nosuchcaller": "La persona que llama no existe: $1",
+       "passwordreset-nocaller": "Debes proporcionar un interlocutor",
+       "passwordreset-nosuchcaller": "El interlocutor no existe: $1",
        "passwordreset-ignored": "No se logró el reestablecimiento de la contraseña. ¿Tal vez no se configuró un proveedor?",
        "passwordreset-invalidemail": "Dirección de correo electrónico no válida.",
        "passwordreset-nodata": "No se ha proporcionado ni un nombre de usuario ni una dirección de correo electrónico",
        "resettokens-no-tokens": "No hay claves para restablecer.",
        "resettokens-tokens": "Claves:",
        "resettokens-token-label": "$1 (valor actual: $2)",
-       "resettokens-watchlist-token": "Clave para el canal (RSS/Atom) de los [[Special:Watchlist|cambios a las páginas en tu lista de seguimiento]]",
+       "resettokens-watchlist-token": "Clave del canal (Atom/RSS) de [[Special:Watchlist|cambios en las páginas de tu lista de seguimiento]]",
        "resettokens-done": "Restablecimiento de claves.",
        "resettokens-resetbutton": "Restablecer las claves",
        "bold_sample": "Texto en negrita",
        "subject-preview": "Previsualización del asunto:",
        "previewerrortext": "Se ha producido un error al intentar previsualizar tus cambios.",
        "blockedtitle": "El usuario está bloqueado",
-       "blockedtext": "<strong>Tu nombre de usuario o dirección IP ha sido bloqueada.</strong>\n\nEl bloqueo fue realizado por $1.\nEl motivo dado es el siguiente: <em>$2</em>.\n\n* Inicio del bloqueo: $8\n* Caducidad del bloqueo: $6\n* Bloqueo destinado a: $7\n\nPuedes contactar con $1 o con otro de los [[{{MediaWiki:Grouppage-sysop}}|administradores]] para discutir el bloqueo.\nObserva que no puedes utilizar la función «{{int:emailuser}}» a menos que hayas registrado una dirección de correo electrónico válida en tus [[Special:Preferences|preferencias de usuario]] y la función no haya sido también bloqueada.\nTu dirección IP actual es $3, y el identificador del bloqueo es el n.º $5.\nIncluye todos los datos aquí mostrados en cualquier consulta que hagas.",
+       "blocked-email-user": "<strong>Tu usuario ha sido bloqueado para evitar el envío de correos electrónicos. Aún puedes editar otras páginas en este wiki.</strong> Puedes ver los detalles completos del bloqueo en [[Special:MyContributions|Contribuciones del usuario]].\n\nEl bloqueo fue realizado por $1.\n\nLa razón dada es <em>$2</em>.\n\n* Inicio de bloqueo: $8\n* Caducidad del bloqueo: $6\n* Bloqueo destinado a: $7\n* Id. del bloqueo n.º $5",
+       "blockedtext-partial": "<strong>Se ha bloqueado tu usuario o dirección IP para para evitar que realices cambios en esta página. Aún puedes editar otras páginas en este wiki.</strong> Puedes ver los detalles completos del bloqueo en [[Special:MyContributions|Contribuciones del usuario]].\n\nEl bloqueo fue realizado por $1.\n\nLa razón dada es <em>$2</em>.\n\n* Inicio de bloqueo: $8\n* Caducidad del bloqueo: $6\n* Bloqueo destinado a: $7\n* Id. del bloqueo n.º $5",
+       "blockedtext": "<strong>Se ha bloqueado tu nombre de usuario o dirección IP.</strong>\n\nEl bloqueo fue realizado por $1.\nEl motivo dado es el siguiente: <em>$2</em>.\n\n* Inicio del bloqueo: $8\n* Caducidad del bloqueo: $6\n* Bloqueo destinado a: $7\n\nPuedes contactar con $1 o con otro de los [[{{MediaWiki:Grouppage-sysop}}|administradores]] para discutir el bloqueo.\nObserva que no puedes utilizar la función «{{int:emailuser}}» a menos que hayas registrado una dirección de correo electrónico válida en tus [[Special:Preferences|preferencias de usuario]] y la función no haya sido también bloqueada.\nTu dirección IP actual es $3, y el identificador del bloqueo es el n.º $5.\nIncluye todos los datos aquí mostrados en cualquier consulta que hagas.",
        "autoblockedtext": "Tu dirección IP ha sido bloqueada automáticamente porque fue utilizada por otro usuario, que resultó bloqueado por $1.\nEl motivo dado es el siguiente:\n\n:<em>$2</em>\n\n* Inicio del bloqueo: $8\n* Caducidad del bloqueo: $6\n* Bloqueo destinado a: $7\n\nPuedes contactar con $1 o con otro de los [[{{MediaWiki:Grouppage-sysop}}|administradores]] para discutir el bloqueo.\n\nObserva que no puedes utilizar la función «{{int:emailuser}}» a menos que hayas registrado una dirección de correo electrónico válida en tus [[Special:Preferences|preferencias de usuario]] y la función no haya sido también bloqueada.\n\nTu dirección IP actual es $3, y el identificador del bloqueo es n.º $5.\nIncluye todos los datos aquí mostrados en cualquier consulta que hagas.",
        "systemblockedtext": "Tu nombre de usuario o dirección IP ha sido bloqueado automáticamente por el software MediaWiki.\nLa razón dada es:\n\n:<em>$2</em>\n\n* Inicio del bloqueo: $8\n* Caducidad de bloqueo: $6\n* Destinatario del bloqueo: $7\n\nTu dirección IP actual es $3.\nPor favor, incluye todos los datos aquí mostrados en cualquier consulta que hagas.",
        "blockednoreason": "no se ha especificado el motivo",
        "template-semiprotected": "(semiprotegida)",
        "hiddencategories": "Esta página pertenece a {{PLURAL:$1|1 categoría oculta|$1 categorías ocultas}}:",
        "edittools": "<!-- Este texto aparecerá bajo los formularios de edición y subida. -->",
+       "edittools-upload": "-",
        "nocreatetext": "{{SITENAME}} ha restringido la posibilidad de crear nuevas páginas.\nPuedes volver atrás y editar una página existente, [[Special:UserLogin|identificarte o crear una cuenta]].",
        "nocreate-loggedin": "No tienes permiso para crear páginas nuevas.",
        "sectioneditnotsupported-title": "Edición de sección no admitida",
        "content-model-text": "texto sin formato",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-model-json": "JSON",
        "content-json-empty-object": "Objeto vacío",
        "content-json-empty-array": "Matriz vacía",
        "deprecated-self-close-category": "Páginas que utilizan etiquetas HTML autocerradas no válidas",
        "cantcreateaccount-text": "[[User:$3|$3]] ha bloqueado la creación de cuentas desde esta dirección IP (<strong>$1</strong>).\n\nEl motivo dado por $3 es <em>$2</em>",
        "cantcreateaccount-range-text": "[[User:$3|$3]] ha bloqueado la creación de cuentas de usuario desde direcciones IP en el rango <strong>$1</strong>, en el que se encuentra tu dirección IP (<strong>$4</strong>).\n\nEl motivo dado por $3 es <em>$2</em>",
        "viewpagelogs": "Ver los registros de esta página",
-       "nohistory": "No hay historial de ediciones para esta página.",
+       "nohistory": "No hay historial de ediciones de esta página.",
        "currentrev": "Revisión actual",
        "currentrev-asof": "Revisión actual del $1",
        "revisionasof": "Revisión del $1",
        "historysize": "({{PLURAL:$1|1 byte|$1 bytes}})",
        "historyempty": "(vacío)",
        "history-feed-title": "Historial de revisiones",
-       "history-feed-description": "Historial de revisiones para esta página en el wiki",
+       "history-feed-description": "Historial de revisiones de esta página en el wiki",
        "history-feed-item-nocomment": "$1 en $2",
        "history-feed-empty": "La página solicitada no existe.\nPuede que haya sido renombrada o borrada del wiki.\nPrueba a [[Special:Search|buscar en el wiki]] otras páginas relacionadas.",
        "history-edit-tags": "Editar etiquetas de revisiones seleccionadas",
        "mergehistory-comment": "Se ha fusionado [[:$1]] en [[:$2]]: $3",
        "mergehistory-same-destination": "Las páginas origen y destino no pueden ser la misma",
        "mergehistory-reason": "Motivo:",
+       "mergehistory-revisionrow": "$1 ($2) $3 . . $4 $5 $6",
        "mergelog": "Registro de fusiones",
        "revertmerge": "Deshacer fusión",
        "mergelogpagetext": "A continuación se muestra una lista de las fusiones de historiales más recientes.",
        "stub-threshold-disabled": "Desactivado",
        "recentchangesdays": "Días que mostrar en los cambios recientes:",
        "recentchangesdays-max": "Máximo {{PLURAL:$1|un día|$1 días}}",
-       "recentchangescount": "Número de ediciones que mostrar de manera predeterminada en Cambios recientes, los historiales de las páginas y en los registros:",
+       "recentchangescount": "Número de ediciones que mostrar de manera predeterminada en cambios recientes, en los historiales de las páginas y en los registros:",
        "prefs-help-recentchangescount": "Número máximo: 1000",
        "prefs-help-watchlist-token2": "Esta es la clave secreta del suministro web de tu lista de seguimiento.\nCualquiera que la conozca podrá consultar la lista, así que no la compartas.\n[[Special:ResetTokens|Puedes restablecerla si lo necesitas]].",
        "prefs-help-tokenmanagement": "Puedes ver y reiniciar la clave secreta que te permite ver tu lista de seguimiento vía Web. Cualquier persona que conozca dicha clave podrá ver tu lista de seguimiento. No la compartas.",
        "youremail": "Correo electrónico:",
        "username": "{{GENDER:$1|Nombre de usuario|Nombre de usuaria}}:",
        "prefs-memberingroups": "{{GENDER:$2|Miembro}} {{PLURAL:$1|del grupo|de los grupos}}:",
+       "prefs-memberingroups-type": "$1",
        "group-membership-link-with-expiry": "$1 (hasta $2)",
        "prefs-registration": "Fecha y hora de registro:",
+       "prefs-registration-date-time": "$1",
        "yourrealname": "Nombre real:",
        "yourlanguage": "Idioma:",
        "yourvariant": "Variante lingüística del contenido:",
        "email": "Correo electrónico",
        "prefs-help-realname": "El nombre real es opcional.\nSi lo proporcionas, se usará para dar atribución a tu trabajo.",
        "prefs-help-email": "La dirección de correo electrónico es opcional, pero es necesaria para el restablecimiento de tu contraseña, en caso de que la olvides.",
-       "prefs-help-email-others": "También puedes permitir que otros usuarios te contacten por correo a través de un enlace en tus páginas de usuario y de discusión.\nTu dirección de correo no se revela cuando otros usuarios te contactan.",
+       "prefs-help-email-others": "También puedes permitir que otros usuarios contacten contigo por correo electrónico a través de un enlace en tu página de usuario o de discusión.\nTu dirección de correo no se muestra cuando otros usuarios se ponen en contacto contigo.",
        "prefs-help-email-required": "Es necesario proporcionar una dirección de correo electrónico.",
        "prefs-info": "Información básica",
        "prefs-i18n": "Internacionalización",
        "prefs-advancedwatchlist": "Opciones avanzadas",
        "prefs-displayrc": "Opciones de visualización",
        "prefs-displaywatchlist": "Opciones de visualización",
+       "prefs-changesrc": "Cambios mostrados",
+       "prefs-changeswatchlist": "Cambios mostrados",
+       "prefs-pageswatchlist": "Páginas vistas",
        "prefs-tokenwatchlist": "Clave",
        "prefs-diffs": "Diferencias",
        "prefs-help-prefershttps": "Los cambios surtirán efecto en tu próximo inicio de sesión.",
        "saveusergroups": "Guardar grupos {{GENDER:$1|del usuario|de la usuaria}}",
        "userrights-groupsmember": "Miembro de:",
        "userrights-groupsmember-auto": "Miembro implícito de:",
+       "userrights-groupsmember-type": "$1",
        "userrights-groups-help": "Puedes modificar los grupos a los que pertenece {{GENDER:$1|este usuario|esta usuaria}}:\n* Una casilla marcada significa que {{GENDER:$1|el usuario|la usuaria}} está en ese grupo.\n* Una casilla sin marcar significa que {{GENDER:$1|el usuario|la usuaria}} no está en ese grupo.\n* Un * indica que no podrás eliminar el grupo una vez que lo añadas, o viceversa.\n* Un # indica que puedes únicamente postergar, y no adelantar, la fecha de caducidad de la membresía a este grupo.",
        "userrights-reason": "Motivo:",
        "userrights-no-interwiki": "No tienes permiso para editar permisos de usuario en otros wikis.",
        "userrights-nodatabase": "La base de datos $1 no existe o no es local.",
        "userrights-changeable-col": "Grupos que puedes cambiar",
        "userrights-unchangeable-col": "Grupos que no puedes cambiar",
+       "userrights-irreversible-marker": "$1*",
        "userrights-expiry-current": "Caduca el $1",
        "userrights-expiry-none": "No caduca",
        "userrights-expiry": "Caduca:",
        "grant-editprotected": "Editar páginas protegidas",
        "grant-highvolume": "Gran cantidad de ediciones",
        "grant-oversight": "Ocultar a los usuarios y suprimir las revisiones",
-       "grant-patrol": "Verificar cambios a páginas",
+       "grant-patrol": "Verificar cambios en páginas",
        "grant-privateinfo": "Acceder a información privada",
        "grant-protect": "Proteger y desproteger páginas",
-       "grant-rollback": "Revertir cambios a páginas",
+       "grant-rollback": "Revertir cambios en páginas",
        "grant-sendemail": "Enviar mensajes de correo a otros usuarios",
        "grant-uploadeditmovefile": "Subir, reemplazar y renombrar archivos",
        "grant-uploadfile": "Subir archivos nuevos",
        "action-suppressrevision": "revisar y restaurar revisiones ocultas",
        "action-suppressionlog": "ver este registro privado",
        "action-block": "bloquear a este usuario para que no edite",
-       "action-protect": "cambiar los niveles de protección para esta página",
+       "action-protect": "cambiar los niveles de protección en esta página",
        "action-rollback": "revertir rápidamente las ediciones del último usuario que modificó una página en particular",
        "action-import": "importar páginas desde otro wiki",
        "action-importupload": "importar páginas mediante la carga de un archivo",
        "rcfilters-liveupdates-button-title-off": "Mostar los cambios en tiempo real",
        "rcfilters-watchlist-markseen-button": "Marcar todos los cambios como vistos",
        "rcfilters-watchlist-edit-watchlist-button": "Edita tu lista de seguimiento",
-       "rcfilters-watchlist-showupdated": "Los cambios hechos a páginas que no has visitado desde que se efectuaron aparecen en <strong>negrita</strong>, acompañados de marcadores sólidos.",
-       "rcfilters-preference-label": "Ocultar la versión mejorada de cambios recientes",
-       "rcfilters-preference-help": "Revierte el rediseño de la interfaz de 2017 y desactiva todas las herramientas añadidas desde entonces.",
-       "rcfilters-watchlist-preference-label": "Ocultar la versión mejorada de la lista de seguimiento",
-       "rcfilters-watchlist-preference-help": "Revierte el rediseño de la interfaz de 2017 y desactiva todas las herramientas añadidas desde entonces.",
+       "rcfilters-watchlist-showupdated": "Los cambios hechos en páginas que no has visitado desde que se efectuaron aparecen en <strong>negrita</strong>, acompañados de marcadores sólidos.",
+       "rcfilters-preference-label": "Usar la interfaz sin JavaScript",
+       "rcfilters-preference-help": "Cargar cambios recientes sin filtros ni la funcionalidad de resaltado.",
+       "rcfilters-watchlist-preference-label": "Usar interfaz sin JavaScript",
+       "rcfilters-watchlist-preference-help": "Cargar la lista de seguimiento sin filtros ni la funcionalidad de resaltado.",
        "rcfilters-filter-showlinkedfrom-label": "Mostrar cambios en páginas enlazadas desde",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>Páginas enlazadas desde</strong> la página seleccionada",
        "rcfilters-filter-showlinkedto-label": "Mostrar cambios en páginas que enlazan a",
        "fileexists-thumbnail-yes": "El archivo parece ser una imagen de tamaño reducido ''(thumbnail)''. [[$1|thumb]]\nPor favor comprueba el archivo <strong>[[:$1]]</strong>.\nSi el archivo comprobado es la misma imagen a tamaño original no es necesario subir un thumbnail más.",
        "file-thumbnail-no": "El nombre del archivo comienza con <strong>$1</strong>.\nParece ser una imagen de tamaño reducido ''(thumbnail)''.\nSi tiene esta imagen a toda resolución súbala, si no, por favor cambie el nombre del archivo.",
        "fileexists-forbidden": "Ya existe un archivo con este nombre, y no puede ser grabado encima de otro. Si quiere subir su archivo de todos modos, por favor vuelva atrás y utilice otro nombre. [[File:$1|thumb|center|$1]]",
-       "fileexists-shared-forbidden": "Ya existe un archivo con este nombre en el repositorio compartido.\nSi todavía quiere subir su archivo, por favor, regrese a la página anterior y use otro nombre. [[File:$1|thumb|center|$1]]",
+       "fileexists-shared-forbidden": "Ya existe un archivo con este nombre en el repositorio compartido.\nSi todavía quieres subir tu archivo, por favor, regresa a la página anterior y usa otro nombre. [[File:$1|thumb|center|$1]]",
        "fileexists-no-change": "Este es un duplicado exacto de la versión actual de <strong>[[:$1]]</strong>.",
        "fileexists-duplicate-version": "Este es un duplicado exacto de {{PLURAL:$2|una versión anterior|versiones anteriores}} de <strong>[[:$1]]</strong>.",
        "file-exists-duplicate": "Este archivo es un duplicado {{PLURAL:$1|del siguiente|de los siguientes}}:",
        "file-deleted-duplicate": "Un archivo idéntico a este ([[:$1]]) ha sido borrado con anterioridad. Debes comprobar el historial de borrado del archivo ante de volver a subirlo.",
-       "file-deleted-duplicate-notitle": "Un archivo idéntico a este ha sido borrado con anterioridad, y el título ha sido suprimido. Deberías contactar con alguien capaz de ver los datos de archivos borrados para que revise esta situación antes de proceder a subir de nuevo este archivo.",
+       "file-deleted-duplicate-notitle": "Un archivo idéntico a este ha sido borrado con anterioridad y el título ha sido suprimido. Deberías contactar con alguien capaz de ver los datos de archivos borrados para que revise esta situación antes de proceder a subir de nuevo este archivo.",
        "uploadwarning": "Alerta de carga",
        "uploadwarning-text": "Modifica la descripción del archivo abajo indicada e inténtalo de nuevo.",
        "uploadwarning-text-nostash": "Carga el archivo una vez más, modifica la descripción siguiente e inténtalo de nuevo.",
        "prefixindex": "Todas las páginas con prefijo",
        "prefixindex-namespace": "Todas las páginas con el prefijo (espacio de nombres $1)",
        "prefixindex-submit": "Mostrar",
-       "prefixindex-strip": "Quitar prefijos en la lista",
+       "prefixindex-strip": "Ocultar el prefijo en los resultados",
        "shortpages": "Páginas cortas",
        "longpages": "Páginas largas",
        "deadendpages": "Páginas sin salida",
        "apisandbox-dynamic-parameters-add-label": "Añadir parámetro:",
        "apisandbox-dynamic-parameters-add-placeholder": "Nombre del parámetro",
        "apisandbox-dynamic-error-exists": "Ya existe un parámetro llamado \"$1\".",
+       "apisandbox-templated-parameter-reason": "Esta [[Special:ApiHelp/main#main/templatedparams|plantilla de parámetros]] se ofrece en función {{PLURAL:$1|del valor|de los valores}} de $2.",
        "apisandbox-deprecated-parameters": "Parámetros en desuso",
        "apisandbox-fetch-token": "Rellenar la ficha automáticamente",
        "apisandbox-add-multi": "Añadir",
        "apisandbox-request-selectformat-label": "Mostrar los datos de la petición como:",
        "apisandbox-request-format-url-label": "Cadena de consulta de la URL",
        "apisandbox-request-url-label": "Petición URL:",
+       "apisandbox-request-format-json-label": "JSON",
        "apisandbox-request-json-label": "Petición JSON:",
        "apisandbox-request-time": "Tiempo de solicitud: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Corrige el token y vuelve a enviar",
        "enotif_lastvisited": "Consulta $1 para ver todos los cambios desde tu última visita",
        "enotif_lastdiff": "Consulta $1 para ver este cambio",
        "enotif_anon_editor": "usuario anónimo $1",
-       "enotif_body": "Hola, $WATCHINGUSERNAME:\n\n$PAGEINTRO $NEWPAGE\n\nResumen del editor: $PAGESUMMARY $PAGEMINOREDIT\n\nContacta con el editor:\ncorreo: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNo enviaremos más notificaciones si ocurre más actividad, a menos que visites esta página con la sesión iniciada. También puedes restablecer los estados de notificación para todas las páginas en tu lista de seguimiento.\n\nAtentamente, el sistema de notificaciones de {{SITENAME}}\n\n--\nPara cambiar tus ajustes de notificación por correo, visita\n{{canonicalurl:{{#special:Preferences}}}}\n\nPara cambiar los ajustes de tu lista de seguimiento, visita\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPara quitar la página de tu lista de seguimiento, visita\n$UNWATCHURL\n\nPara ayuda y comentarios:\n$HELPPAGE",
+       "enotif_body": "Hola, $WATCHINGUSERNAME:\n\n$PAGEINTRO $NEWPAGE\n\nResumen del editor: $PAGESUMMARY $PAGEMINOREDIT\n\nContacta con el editor:\ncorreo: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nNo enviaremos más notificaciones si ocurre más actividad, a menos que visites esta página con la sesión iniciada. También puedes restablecer los estados de notificación en todas las páginas de tu lista de seguimiento.\n\nAtentamente, el sistema de notificaciones de {{SITENAME}}\n\n--\nPara cambiar tus ajustes de notificación por correo, visita\n{{canonicalurl:{{#special:Preferences}}}}\n\nPara cambiar los ajustes de tu lista de seguimiento, visita\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPara quitar la página de tu lista de seguimiento, visita\n$UNWATCHURL\n\nPara ayuda y comentarios:\n$HELPPAGE",
        "enotif_minoredit": "Esta es una edición menor",
        "created": "creada",
        "changed": "modificada",
        "ipaddressorusername": "Dirección IP o nombre de usuario:",
        "ipbexpiry": "Caducidad:",
        "ipbreason": "Motivo:",
-       "ipbreason-dropdown": "*Motivos comunes de bloqueo\n** Añadir información falsa\n** Eliminar contenido de las páginas\n** Publicitar enlaces a otras páginas web\n** Añadir basura a las páginas\n** Comportamiento intimidatorio u hostil\n** Abuso de múltiples cuentas\n** Nombre de usuario inaceptable",
+       "ipbreason-dropdown": "*Motivos comunes de bloqueo\n** Añadir información falsa\n** Eliminar contenido de las páginas\n** Publicitar enlaces a otras páginas web\n** Añadir basura en las páginas\n** Comportamiento intimidatorio u hostil\n** Abuso de múltiples cuentas\n** Nombre de usuario inaceptable",
        "ipb-hardblock": "Impedir que los usuarios identificados editen desde esta dirección IP",
        "ipbcreateaccount": "Prevenir la creación de cuentas de usuario",
        "ipbemailban": "Impedir que el usuario envíe correo electrónico",
        "ipb-disableusertalk": "Impedir que este usuario edite su propia página de discusión mientras esté bloqueado",
        "ipb-change-block": "Rebloquear al usuario con estos datos",
        "ipb-confirm": "Confirmar bloqueo",
+       "ipb-sitewide": "En todo el sitio",
+       "ipb-partial": "Parcial",
+       "ipb-type-label": "Tipo",
        "ipb-pages-label": "Páginas",
        "badipaddress": "La dirección IP no tiene el formato correcto.",
        "blockipsuccesssub": "Bloqueo realizado con éxito",
        "emailblock": "correo electrónico bloqueado",
        "blocklist-nousertalk": "no puede editar su propia página de discusión",
        "blocklist-editing": "editando",
+       "blocklist-editing-sitewide": "edición (en todo el sitio)",
        "ipblocklist-empty": "La lista de bloqueos está vacía.",
        "ipblocklist-no-results": "El nombre de usuario o IP indicado no está bloqueado.",
        "blocklink": "bloquear",
        "move-watch": "Vigilar páginas de origen y destino",
        "movepagebtn": "Trasladar la página",
        "pagemovedsub": "Traslado realizado con éxito",
+       "cannotmove": "La página podría no trasladarse por {{PLURAL:$1|el siguiente motivo|los siguientes motivos}}:",
        "movepage-moved": "<strong>«$1» ha sido trasladada a «$2»</strong>",
        "movepage-moved-redirect": "Se ha creado una redirección.",
        "movepage-moved-noredirect": "Se ha suprimido la creación de la redirección.",
+       "movepage-delete-first": "La página de destino tiene demasiadas revisiones a eliminar como parte de una página trasladada. Primero elimina la página de forma manual y a continuación inténtalo de nuevo.",
        "articleexists": "Ya existe una página con ese nombre o el nombre que elegiste no es válido.\nElige otro nombre.",
        "cantmove-titleprotected": "No puedes trasladar la página a esta ubicación, porque el nuevo título ha sido protegido para evitar su creación.",
        "movetalk": "Renombrar la página de discusión asociada",
        "import-interwiki-text": "Selecciona un wiki y un título de página para importar.\nLas fechas de revisiones y los nombres de editores se preservarán.\nTodas las importaciones de otros wikis se registran en el [[Special:Log/import|registro de importaciones]].",
        "import-interwiki-sourcewiki": "Wiki de origen:",
        "import-interwiki-sourcepage": "Página de origen:",
-       "import-interwiki-history": "Copiar todas las versiones históricas para esta página",
+       "import-interwiki-history": "Copiar todas las versiones históricas de esta página",
        "import-interwiki-templates": "Incluir todas las plantillas",
        "import-interwiki-submit": "Importar",
        "import-mapping-default": "Importar a ubicaciones predeterminadas",
        "tooltip-ca-protect": "Proteger esta página",
        "tooltip-ca-unprotect": "Cambiar protección de esta página",
        "tooltip-ca-delete": "Borrar esta página",
-       "tooltip-ca-undelete": "Restaurar las ediciones hechas a esta página antes de que fuese borrada",
+       "tooltip-ca-undelete": "Restaurar las ediciones hechas en esta página antes de que fuese borrada",
        "tooltip-ca-move": "Trasladar esta página",
        "tooltip-ca-watch": "Añadir esta página a tu lista de seguimiento",
        "tooltip-ca-unwatch": "Quitar esta página de tu lista de seguimiento",
        "siteusers": "{{PLURAL:$2|{{GENDER:$1|el usuario|la usuaria}}|los usuarios}} $1 de {{SITENAME}}",
        "anonusers": "{{PLURAL:$2|el usuario anónimo|los usuarios anónimos}} $1 de {{SITENAME}}",
        "creditspage": "Créditos de la página",
-       "nocredits": "No hay información de créditos para esta página.",
+       "nocredits": "No hay información de créditos en esta página.",
        "spamprotectiontitle": "Filtro de protección contra spam",
        "spamprotectiontext": "La página que quería guardar fue bloqueada por el filtro de spam.\nEsto podría estar causado por un enlace a un sitio externo incluido en la lista negra.",
        "spamprotectionmatch": "El siguiente texto es el que activó nuestro filtro de spam: $1",
        "previousdiff": "← Edición anterior",
        "nextdiff": "Edición siguiente →",
        "mediawarning": "<strong>Atención:</strong> este archivo puede contener código malicioso.\nEjecutarlo podría comprometer la seguridad de tu equipo.",
-       "imagemaxsize": "Límite de tamaño de imagen:<br />''(para páginas de descripción de archivo)''",
+       "imagemaxsize": "Límite de tamaño de imagen en páginas de descripción de archivo:",
        "thumbsize": "Tamaño de las vistas en miniatura:",
        "widthheight": "$1 × $2",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:|página|páginas}}",
        "confirm-unwatch-button": "Aceptar",
        "confirm-unwatch-top": "¿Quitar esta página de tu lista de seguimiento?",
        "confirm-rollback-button": "Aceptar",
-       "confirm-rollback-top": "¿Revertir las ediciones a esta página?",
+       "confirm-rollback-top": "¿Revertir las ediciones en esta página?",
        "confirm-mcrrestore-title": "Restaurar la revisión",
        "confirm-mcrundo-title": "Deshacer un cambio",
        "mcrundofailed": "Error al deshacer",
        "mcrundo-missingparam": "Faltan parámetros requeridos en la solicitud.",
        "mcrundo-changed": "La página ha sido cambiada desde que viste el diff. Por favor revisa el nuevo cambio.",
+       "mcrundo-parse-failed": "Error al analizar la nueva revisión: $1",
        "comma-separator": ",&#32;",
        "ellipsis": "…",
        "percent": "$1 %",
        "autosumm-changed-redirect-target": "Se cambió el destino de la redirección de [[$1]] a [[$2]]",
        "autosumm-new": "Página creada con «$1»",
        "autosumm-newblank": "Se creó una página vacía",
+       "size-pixel": "$1 {{PLURAL:$1|píxel|píxeles}}",
        "lag-warn-normal": "Los cambios realizados en {{PLURAL:$1|el último segundo|los últimos $1 segundos}} podrían no mostrarse en esta lista.",
        "lag-warn-high": "Debido a una alta latencia el servidor de base de datos, los cambios realizados en {{PLURAL:$1|el último segundo|los últimos $1 segundos}} podrían no mostrarse en esta lista.",
        "watchlistedit-normal-title": "Editar lista de seguimiento",
        "logentry-block-block": "$1 {{GENDER:$2|bloqueó}} a {{GENDER:$4|$3}} durante un plazo de $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|desbloqueó}} a {{GENDER:$4|$3}}",
        "logentry-block-reblock": "$1 {{GENDER:$2|cambió}} la configuración del bloqueo de {{GENDER:$4|$3}} durante un plazo de $5 $6",
+       "logentry-partialblock-block": "$1 {{GENDER:$2|bloqueó}} a {{GENDER:$4|$3}} la edición en {{PLURAL:$8|la página|las páginas}} $7 por un tiempo de caducidad de $5 $6",
+       "logentry-partialblock-reblock": "$1 {{GENDER:$2|cambió}} la configuración del bloqueo a {{GENDER:$4|$3}} impidiendo la edición en {{PLURAL:$8|la página|las páginas}} $7 por un tiempo de caducidad de $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|bloqueó}} a {{GENDER:$4|$3}} durante un plazo de $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|cambió}} la configuración del bloqueo de {{GENDER:$4|$3}} durante un plazo de $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|importó}} $3 subiendo un archivo",
        "feedback-close": "Hecho",
        "feedback-external-bug-report-button": "Enviar una tarea técnica",
        "feedback-dialog-title": "Enviar comentarios",
-       "feedback-dialog-intro": "Puedes usar el formulario sencillo debajo para enviar tus comentarios. Ellos se agregarán a la página \"$1\", junto con tu nombre de usuario.",
+       "feedback-dialog-intro": "Puedes usar el sencillo formulario a continuación para enviar tus comentarios. Tu comentario se añadirá a la página «$1», junto con tu nombre de usuario.",
        "feedback-error1": "Error: No se reconoce resultado de API",
        "feedback-error2": "Error: Falló la edición",
        "feedback-error3": "Error: No hay respuesta de la API",
        "special-characters-title-endash": "semirraya",
        "special-characters-title-emdash": "raya",
        "special-characters-title-minus": "signo de resta",
-       "mw-widgets-abandonedit": "¿Estás seguro de quieres salir del modo de edición sin guardar primero?",
+       "mw-widgets-abandonedit": "¿Seguro que deseas abandonar el modo de edición sin guardar primero?",
        "mw-widgets-abandonedit-discard": "Descartar ediciones",
        "mw-widgets-abandonedit-keep": "Continuar editando",
-       "mw-widgets-abandonedit-title": "¿Lo confirmas?",
+       "mw-widgets-abandonedit-title": "¿Seguro?",
        "mw-widgets-dateinput-no-date": "Ninguna fecha seleccionada",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
        "mw-widgets-titleinput-description-redirect": "redirigir a $1",
        "mw-widgets-categoryselector-add-category-placeholder": "Agregar una categoría...",
        "mw-widgets-usersmultiselect-placeholder": "Añadir más…",
+       "mw-widgets-titlesmultiselect-placeholder": "Añadir más...",
        "date-range-from": "Desde la fecha:",
        "date-range-to": "Hasta la fecha:",
        "sessionmanager-tie": "No se pueden combinar múltiples tipos de autenticación de solicitudes: $1.",
        "authmanager-provider-password-domain": "Autenticación basada en contraseña y dominio",
        "authmanager-provider-temporarypassword": "Contraseña temporal",
        "authprovider-confirmlink-message": "Basado en tus últimos intentos para iniciar sesión, las siguientes cuentas pueden vincularse a tu cuenta wiki. Vincularlas permite iniciar sesión a través de esas cuentas. Selecciona cuáles deben vincularse.",
+       "authprovider-confirmlink-option": "$1 ($2)",
        "authprovider-confirmlink-request-label": "Cuentas que deberían vincularse",
        "authprovider-confirmlink-success-line": "$1: vinculado exitosamente.",
+       "authprovider-confirmlink-failed-line": "$1: $2",
        "authprovider-confirmlink-failed": "La vinculación de cuentas no se ha realizado con éxito: $1",
        "authprovider-confirmlink-ok-help": "Continuar luego de mostrar los mensajes de error en la vinculación.",
        "authprovider-resetpass-skip-label": "Omitir",
        "passwordpolicies-policy-passwordcannotmatchblacklist": "La contraseña no puede coincidir con la lista de contraseñas específicamente prohibidas",
        "passwordpolicies-policy-maximalpasswordlength": "La contraseña no puede tener más de $1 {{PLURAL:$1|caracter|caracteres}}",
        "passwordpolicies-policy-passwordcannotbepopular": "La contraseña no puede {{PLURAL:$1|ser la contraseña más popular|encontrarse en la lista de $1 contraseñas populares}}",
-       "passwordpolicies-policy-passwordnotinlargeblacklist": "La contraseña no puede estar en la lista de las 100.000 contraseñas utilizadas más comúnmente.",
-       "easydeflate-invaliddeflate": "El contenido proporcionado no esta comprimido correctamente"
+       "passwordpolicies-policy-passwordnotinlargeblacklist": "La contraseña no puede estar en la lista de las 100.000 contraseñas más usadas.",
+       "easydeflate-invaliddeflate": "El contenido proporcionado no esta comprimido correctamente",
+       "unprotected-js": "Por razones de seguridad, JavaScript no se puede cargar desde páginas desprotegidas. Crea javascript solo en MediaWiki: espacio de nombres o como subpágina de usuario"
 }
index 484579e..2e20801 100644 (file)
        "passwordtooshort": "Parool peab koosnema vähemalt {{PLURAL:$1|ühest|$1}} tähemärgist.",
        "passwordtoolong": "Parool ei saa olla pikem kui {{PLURAL:$1|üks märk|$1 märk}}.",
        "passwordtoopopular": "Liiga levinud paroole ei saa kasutada. Palun vali parool, mida on keerulisem ära arvata.",
+       "passwordinlargeblacklist": "Sisestatud parool on väga sageli kasutatud paroolide loendis. Palun vali haruldasem parool.",
        "password-name-match": "Parool peab kasutajanimest erinema.",
        "password-login-forbidden": "Selle kasutajanime ja parooli kasutamine on keelatud.",
        "mailmypassword": "Lähtesta parool",
        "prefs-advancedwatchlist": "Täpsemad eelistused",
        "prefs-displayrc": "Kuvasätted",
        "prefs-displaywatchlist": "Kuvasätted",
+       "prefs-changesrc": "Näidatavad muudatused",
+       "prefs-changeswatchlist": "Näidatavad muudatused",
+       "prefs-pageswatchlist": "Jälgitavad leheküljed",
        "prefs-tokenwatchlist": "Luba",
        "prefs-diffs": "Erinevused",
        "prefs-help-prefershttps": "See eelistus jõustub pärast järgmist sisselogimist.",
        "rcfilters-watchlist-markseen-button": "Märgi kõik muudatused nähtuks",
        "rcfilters-watchlist-edit-watchlist-button": "Muuda jälgimisloendit",
        "rcfilters-watchlist-showupdated": "Muudatused lehekülgedel, mida sa pole pärast muudatuste tegemist külastanud, on <strong>rasvases</strong> kirjas ja tähistatud täidetud punktiga.",
-       "rcfilters-preference-label": "Peida viimaste muudatuste täiustatud versioon",
-       "rcfilters-preference-help": "Pöörab tagasi 2017. aastast alates tehtud muudatused kujunduses ja lisatud tööriistad.",
-       "rcfilters-watchlist-preference-label": "Peida jälgimisloendi täiustatud versioon",
-       "rcfilters-watchlist-preference-help": "Pöörab tagasi 2017. aastast alates tehtud muudatused kujunduses ja lisatud tööriistad.",
+       "rcfilters-preference-label": "Kasuta JavaScripti-vaba liidest",
+       "rcfilters-preference-help": "Laadib viimased muudatused ilma filtrite ja esiletõstmise võimaluseta.",
+       "rcfilters-watchlist-preference-label": "Kasuta JavaScripti-vaba liidest",
+       "rcfilters-watchlist-preference-help": "Laadib jälgimisloendi ilma filtrite ja esiletõstmise võimaluseta.",
        "rcfilters-filter-showlinkedfrom-label": "Näita muudatusi lehekülgedel, millele viidatakse leheküljelt:",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>Leheküljed, millele viidatakse</strong> valitud leheküljel",
        "rcfilters-filter-showlinkedto-label": "Näita muudatusi lehekülgedel, millel viidatakse leheküljele",
        "move-watch": "Jälgi lähte- ja sihtlehekülge",
        "movepagebtn": "Teisalda lehekülg",
        "pagemovedsub": "Lehekülg on teisaldatud",
+       "cannotmove": "Lehekülge ei õnnestunud teisaldada {{PLURAL:$1|järgmisel põhjusel|järgmistel põhjustel}}:",
        "movepage-moved": "<strong>\"$1\" on teisaldatud pealkirja \"$2\" alla.</strong>",
        "movepage-moved-redirect": "Ümbersuunamisleht loodud.",
        "movepage-moved-noredirect": "Ümbersuunamist ei loodud.",
        "pageinfo-category-files": "Faile",
        "pageinfo-user-id": "Kasutaja identifikaator",
        "pageinfo-file-hash": "Räsiväärtus",
-       "pageinfo-view-protect-log": "Vaata selle lehekülje kaitsmislogi.",
+       "pageinfo-view-protect-log": "Vaata selle lehekülje kaitsmislogi",
        "markaspatrolleddiff": "Märgi kontrollituks",
        "markaspatrolledtext": "Märgi see leht kontrollituks",
        "markaspatrolledtext-file": "Märgi see failiversioon kontrollituks",
        "logentry-block-reblock": "$1 {{GENDER:$2|muutis}} kasutaja {{GENDER:$4|$3}} blokeeringut; aegumistähtaeg $5 $6",
        "logentry-partialblock-block": "$1 {{GENDER:$2|blokeeris}} kasutaja {{GENDER:$4|$3}} redigeerimast {{PLURAL:$8|lehekülge|lehekülgi}} $7; aegumistähtaeg $5 $6",
        "logentry-partialblock-reblock": "$1 {{GENDER:$2|muutis}} kasutaja {{GENDER:$4|$3}} blokeeringut, mis takistab redigeerimist {{PLURAL:$8|leheküljel|lehekülgedel}} $7; aegumistähtaeg $5 $6",
-       "logentry-non-editing-block-block": "$1 {{GENDER:$2|blokeeris}} kasutaja {{GENDER:$4|$3}} tegemast teisi tegevusi peale redigeerimise; aegumistähtaeg $5 $6",
-       "logentry-non-editing-block-reblock": "$1 {{GENDER:$2|muutis}} kasutaja {{GENDER:$4|$3}} blokeeringut, mis takistab tegemast teisi tegevusi peale redigeerimise; aegumistähtaeg $5 $6",
+       "logentry-non-editing-block-block": "$1 {{GENDER:$2|blokeeris}} kasutaja {{GENDER:$4|$3}} tegemast määratud tegevusi peale redigeerimise; aegumistähtaeg $5 $6",
+       "logentry-non-editing-block-reblock": "$1 {{GENDER:$2|muutis}} kasutaja {{GENDER:$4|$3}} blokeeringut, mis takistab tegemast määratud tegevusi peale redigeerimise; aegumistähtaeg $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|blokeeris}} kasutaja {{GENDER:$4|$3}}; aegumistähtaeg $5 $6",
        "logentry-suppress-reblock": "$1 {{GENDER:$2|muutis}} kasutaja {{GENDER:$4|$3}} blokeeringut; aegumistähtaeg $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|importis}} lehekülje $3 faili üleslaadimise teel",
        "passwordpolicies-policy-passwordcannotmatchblacklist": "Parool ei tohi olla kantud musta nimekirja.",
        "passwordpolicies-policy-maximalpasswordlength": "Parool peab olema $1 {{PLURAL:$1|märgist}} lühem.",
        "passwordpolicies-policy-passwordcannotbepopular": "Parool ei tohi olla {{PLURAL:$1|populaarne parool|$1 populaarse parooli loendis}}.",
+       "passwordpolicies-policy-passwordnotinlargeblacklist": "Parool ei saa olla 100&nbsp;000 kõige levinuma parooli loendis.",
        "easydeflate-invaliddeflate": "Ette antud sisu ei ole õigesti vähendatud",
        "unprotected-js": "Turvalisuse huvides ei saa JavaScripti laadida kaitsmata lehekülgedelt. Palun koosta JavaScripti ainult nimeruumis MediaWiki või kasutajate nimeruumi alamleheküljel."
 }
index a5974bb..e598609 100644 (file)
@@ -59,7 +59,8 @@
                        "Rueter",
                        "Kyykaarme",
                        "Surjection",
-                       "OneMember"
+                       "OneMember",
+                       "Valtlait"
                ]
        },
        "tog-underline": "Linkkien alleviivaus:",
        "versionrequiredtext": "MediaWikistä tarvitaan vähintään versio $1 tämän sivun käyttämiseen. Katso [[Special:Version|versio]].",
        "ok": "OK",
        "pagetitle": "$1 – {{SITENAME}}",
-       "retrievedfrom": "Noudettu kohteesta \"$1\"",
+       "retrievedfrom": "Noudettu kohteesta ”$1”",
        "youhavenewmessages": "Sinulle on $1 ($2).",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|Sinulle on}} $1 {{PLURAL:$3|toiselta käyttäjältä|$3 käyttäjältä}} ($2).",
        "youhavenewmessagesmanyusers": "Sinulle on $1 uusia viestejä useilta käyttäjiltä ($2).",
        "readonly": "Tietokanta on lukittu",
        "enterlockreason": "Anna lukituksen syy sekä sen arvioitu poistamisaika",
        "readonlytext": "Tietokanta on tällä hetkellä lukittu. Uusia sivuja ei voi luoda eikä muitakaan muutoksia tehdä. Syynä on todennäköisesti rutiininomainen tietokannan huoltaminen.\n\nTietokannan lukinneen palvelinjärjestelmän ylläpitäjän antama selitys on: $1",
-       "missing-article": "Sivun sisältöä ei löytynyt tietokannasta nimellä \"$1\" $2.\n\nYleensä tämä johtuu vanhentuneesta vertailu- tai historialinkistä sivulle, joka on poistettu.\n\nJos kyseessä ei ole poistettu sivu, olet ehkä löytänyt virheen ohjelmistossa.\nIlmoita tästä [[Special:ListUsers/sysop|ylläpitäjälle]] ja kerro viestissäsi sivun URL.",
+       "missing-article": "Sivun sisältöä ei löytynyt tietokannasta nimellä ”$1” $2.\n\nYleensä tämä johtuu vanhentuneesta vertailu- tai historialinkistä sivulle, joka on poistettu.\n\nJos kyseessä ei ole poistettu sivu, olet ehkä löytänyt virheen ohjelmistossa.\nIlmoita tästä [[Special:ListUsers/sysop|ylläpitäjälle]] ja kerro viestissäsi sivun URL.",
        "missingarticle-rev": "(versio nro: $1)",
        "missingarticle-diff": "(vertailu: $1, $2)",
        "readonly_lag": "Tietokanta on automaattisesti lukittu, jotta kaikki tietokantapalvelimet saisivat kaikki tuoreet muutokset",
        "nonwrite-api-promise-error": "HTTP-header 'Promise-Non-Write-API-Action' on lähetetty, mutta pyyntö oli kohdistettu API:n kirjoitusmoduuliin (API write module).",
        "internalerror": "Sisäinen virhe",
        "internalerror_info": "Sisäinen virhe: $1",
-       "internalerror-fatal-exception": "Vakava virhe, jonka tyyppi on \"$1\"",
+       "internalerror-fatal-exception": "Vakava virhe, jonka tyyppi on ”$1”",
        "filecopyerror": "Tiedostoa <b>$1</b> ei voitu kopioida tiedostoksi <b>$2</b>.",
        "filerenameerror": "Tiedostoa <b>$1</b> ei voitu nimetä uudelleen nimellä <b>$2</b>.",
        "filedeleteerror": "Tiedostoa <b>$1</b> ei voitu poistaa.",
        "formerror": "Lomakkeen tiedot eivät kelpaa",
        "badarticleerror": "Tätä toimintoa ei voi suorittaa tälle sivulle.",
        "cannotdelete": "Sivun tai tiedoston ”$1” poisto epäonnistui.\nJoku muu on saattanut poistaa sen.",
-       "cannotdelete-title": "Sivua \"$1\" ei voi poistaa",
-       "delete-scheduled": "Sivu \"$1\" on poistumassa piakkoin.\nOdota rauhassa.",
+       "cannotdelete-title": "Sivua ”$1” ei voi poistaa",
+       "delete-scheduled": "Sivu ”$1” on poistumassa piakkoin.\nOdota rauhassa.",
        "delete-hook-aborted": "Laajennuskoodi esti poiston antamatta syytä.",
-       "no-null-revision": "Nollamuokkausta sivulla \"$1\" ei voi tehdä",
+       "no-null-revision": "Nollamuokkausta sivulla ”$1” ei voi tehdä",
        "badtitle": "Kelvoton sivun nimi",
        "badtitletext": "Pyytämäsi sivunimi oli virheellinen, tyhjä tai väärin linkitetty kieltenvälinen tai wikienvälinen nimi.\nSiinä saattaa olla yksi tai useampi sellainen merkki, jota ei voi käyttää sivujen nimissä.",
        "title-invalid-empty": "Pyydetty sivunimi on tyhjä tai sisältää ainoastaan nimiavaruuden nimen.",
        "mypreferencesprotected": "Sinulla ei ole oikeutta muuttaa omia asetuksiasi.",
        "ns-specialprotected": "Toimintosivuja ei voi muokata.",
        "titleprotected": "Käyttäjä [[User:$1|$1]] on suojannut tämän sivunimen, ja sivua ei voi luoda.\nSuojauksen syy on: <em>$2</em>.",
-       "filereadonlyerror": "Tiedostoa \"$1\" ei voida muuttaa, koska jaettu mediavarasto \"$2\" on asetettu tilaan ''vain lukeminen sallittu''.\n\nTietokannan lukinneen palvelinjärjestelmän ylläpitäjän antama selitys on: $3.",
+       "filereadonlyerror": "Tiedostoa ”$1” ei voida muuttaa, koska jaettu mediavarasto \"$2\" on asetettu tilaan ''vain lukeminen sallittu''.\n\nTietokannan lukinneen palvelinjärjestelmän ylläpitäjän antama selitys on: $3.",
        "invalidtitle": "Virheellinen sivun nimi",
-       "invalidtitle-knownnamespace": "Virheellinen sivunimi, nimiavaruus \"$2\" ja teksti \"$3\"",
-       "invalidtitle-unknownnamespace": "Virheellinen sivunimi, tuntematon nimiavaruus numero $1 ja teksti \"$2\"",
+       "invalidtitle-knownnamespace": "Virheellinen sivunimi, nimiavaruus ”$2” ja teksti ”$3”",
+       "invalidtitle-unknownnamespace": "Virheellinen sivunimi, tuntematon nimiavaruus numero $1 ja teksti ”$2”",
        "exception-nologin": "Et ole kirjautunut sisään",
        "exception-nologin-text": "Ole hyvä ja kirjaudu sisään, niin pääset tälle sivulle tai tähän toimintoon.",
        "exception-nologin-text-manual": "Sinun pitää $1, jotta pääset tälle sivulle tai toimintoon.",
        "noname": "Et ole määritellyt kelvollista käyttäjänimeä.",
        "loginsuccesstitle": "Olet kirjautunut sisään",
        "loginsuccess": "'''Olet kirjautunut sivustolle {{SITENAME}} käyttäjänä $1.'''",
-       "nosuchuser": "Käyttäjää \"$1\" ei ole olemassa.\nNimet ovat kirjainkoosta riippuvaisia. \nTarkista kirjoititko nimen oikein, tai [[Special:CreateAccount|luo uusi käyttäjätunnus]].",
+       "nosuchuser": "Käyttäjää ”$1” ei ole olemassa.\nNimet ovat kirjainkoosta riippuvaisia. \nTarkista, kirjoititko nimen oikein, tai [[Special:CreateAccount|luo uusi käyttäjätunnus]].",
        "nosuchusershort": "Käyttäjää nimeltä ”$1” ei ole. Kirjoititko nimen oikein?",
        "nouserspecified": "Käyttäjätunnusta ei ole määritelty.",
        "login-userblocked": "Tämä käyttäjä on estetty. Kirjautuminen ei ole sallittua.",
        "accountcreated": "Käyttäjätunnus luotiin",
        "accountcreatedtext": "Käyttäjätunnus [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|keskustelu]]) luotiin.",
        "createaccount-title": "Tunnuksen luominen {{GRAMMAR:illative|{{SITENAME}}}}",
-       "createaccount-text": "Joku on luonut tunnuksen $2 {{GRAMMAR:illative|{{SITENAME}}}} ($4).\nTunnus on \"$2\" ja sen salasana on \"$3\". Sinun on syytä kirjautua sisään ja vaihtaa salasanasi heti.\n\nSinun ei tarvitse välittää tästä viestistä, jos tämä tunnus on luotu virheellisesti.",
+       "createaccount-text": "Joku on luonut tunnuksen $2 {{GRAMMAR:illative|{{SITENAME}}}} ($4).\nTunnus on ”$2” ja sen salasana on ”$3”. Sinun on syytä kirjautua sisään ja vaihtaa salasanasi heti.\n\nSinun ei tarvitse välittää tästä viestistä, jos tämä tunnus on luotu virheellisesti.",
        "login-throttled": "Olet tehnyt liian monta kirjautumisyritystä.\nOdota $1 ennen kuin yrität uudelleen.",
        "login-abort-generic": "Kirjautuminen epäonnistui – keskeytetty",
        "login-migrated-generic": "Tunnuksesi on siirretty, ja käyttäjänimeäsi ei löydy enää tästä wikistä.",
        "botpasswords-label-grants": "Valittavissa olevat toimintaoikeudet:",
        "botpasswords-help-grants": "Toimintaoikeudet sallivat pääsyn oikeuksiin, joita käyttäjätililläsi jo on. Toimintaoikeuden käyttöönotto täällä ei lisää käyttäjätilillesi oikeuksia, joita sillä ei jo ole. Lisätietoja löytyy [[Special:ListGrants|toimintaoikeuksien luettelosta]].",
        "botpasswords-label-grants-column": "Myönnetään",
-       "botpasswords-bad-appid": "Botin nimi \"$1\" ei kelpaa.",
-       "botpasswords-insert-failed": "Botin nimen \"$1\" lisääminen epäonnsitui. Onko se jo lisätty?",
-       "botpasswords-update-failed": "Botin nimen \"$1\" päivittäminen epäonnistui. Onko se poistettu?",
+       "botpasswords-bad-appid": "Botin nimi ”$1” ei kelpaa.",
+       "botpasswords-insert-failed": "Botin nimen ”$1” lisääminen epäonnistui. Onko se jo lisätty?",
+       "botpasswords-update-failed": "Botin nimen ”$1” päivittäminen epäonnistui. Onko se poistettu?",
        "botpasswords-created-title": "Bottisalasana luotu",
-       "botpasswords-created-body": "Bottisalasana {{GENDER:$2|käyttäjän}} \"$2\" bottinimelle \"$1\" luotiin.",
+       "botpasswords-created-body": "Bottisalasana {{GENDER:$2|käyttäjän}} ”$2” bottinimelle ”$1” luotiin.",
        "botpasswords-updated-title": "Bottisalasana päivitetty",
-       "botpasswords-updated-body": "Bottisalasana {{GENDER:$2|käyttäjän}} \"$2\" bottinimelle \"$1\" päivitettiin.",
+       "botpasswords-updated-body": "Bottisalasana {{GENDER:$2|käyttäjän}} ”$2” bottinimelle ”$1” päivitettiin.",
        "botpasswords-deleted-title": "Bottisalasana poistettu",
-       "botpasswords-deleted-body": "Bottisalasana {{GENDER:$2|käyttäjän}} \"$2\" bottinimelle \"$1\" poistettiin.",
+       "botpasswords-deleted-body": "Bottisalasana {{GENDER:$2|käyttäjän}} ”$2” bottinimelle ”$1” poistettiin.",
        "botpasswords-newpassword": "Uusi salasana kirjautumiseen käyttäjällä <strong>$1</strong> on <strong>$2</strong>. <em>Säilytä tämä myöhempää käyttöä varten.</em> <br> (Vanhoilla boteilla, jotka vaativat kirjautumisnimen olevan sama kuin lopullinen käyttäjänimi, voit myös käyttää nimeä <strong>$3</strong> ja salasanaa <strong>$4</strong>.)",
        "botpasswords-no-provider": "BotPasswordsSessionProvider ei ole saatavilla.",
        "botpasswords-restriction-failed": "Bottisalasanan rajoitukset estävät tämän sisäänkirjautumisen.",
-       "botpasswords-invalid-name": "Annetussa käyttäjätunnuksessa ei ole bottisalasanan erotinta (\"$1\").",
-       "botpasswords-not-exist": "Käyttäjällä \"$1\" ei ole bottisalasanaa nimellä \"$2\".",
-       "botpasswords-needs-reset": "Bottisalasana {{GENDER:$1|käyttäjän}} \"$1\" bottinimelle \"$2\" täytyy nollata.",
+       "botpasswords-invalid-name": "Annetussa käyttäjätunnuksessa ei ole bottisalasanan erotinta (”$1”).",
+       "botpasswords-not-exist": "Käyttäjällä ”$1” ei ole bottisalasanaa nimellä ”$2”.",
+       "botpasswords-needs-reset": "Bottisalasana {{GENDER:$1|käyttäjän}} ”$1” bottinimelle ”$2” täytyy nollata.",
        "botpasswords-locked": "Et voi kirjautua sisään bottisalasanalla, koska tunnuksesi on lukittu.",
        "resetpass_forbidden": "Salasanoja ei voi vaihtaa.",
        "resetpass_forbidden-reason": "Salasanoja ei voi muuttaa: $1",
        "resetpass-temp-password": "Väliaikainen salasana:",
        "resetpass-abort-generic": "Laajennus keskeytti salasanan vaihdon.",
        "resetpass-expired": "Salasanasi on vanhentunut. Valitse uusi salasana, jotta pääset kirjautumaan sisään.",
-       "resetpass-expired-soft": "Salasanasi on vanhentunut ja se pitää vaihtaa. Valitse uusi salasana nyt tai paina \"{{int:authprovider-resetpass-skip-label}}\", niin voit vaihtaa salasanan myöhemmin.",
-       "resetpass-validity-soft": "Salasanasi ei ole kelvollinen: $1\n\nValitse nyt uusi salasana tai paina \"{{int:authprovider-resetpass-skip-label}}\", niin voit vaihtaa sen myöhemmin.",
+       "resetpass-expired-soft": "Salasanasi on vanhentunut ja se pitää vaihtaa. Valitse uusi salasana nyt tai paina ”{{int:authprovider-resetpass-skip-label}}”, niin voit vaihtaa salasanan myöhemmin.",
+       "resetpass-validity-soft": "Salasanasi ei ole kelvollinen: $1\n\nValitse nyt uusi salasana tai paina ”{{int:authprovider-resetpass-skip-label}}”, niin voit vaihtaa sen myöhemmin.",
        "passwordreset": "Salasanan uusiminen",
        "passwordreset-text-one": "Täytä tämä lomake uudistaaksesi salasanasi.",
        "passwordreset-text-many": "{{PLURAL:$1|Täytä yksi seuraavista kentistä, jolloin saat väliaikaisen salasanan sähköpostitse.}}",
        "preview": "Esikatselu",
        "showpreview": "Esikatsele",
        "showdiff": "Näytä muutokset",
-       "blankarticle": "<strong>Varoitus:</strong> Sivu, jota olet luomassa on tyhjä.\nJos napsautat \"$1\" uudelleen, sivu luodaan ilman sisältöä.",
+       "blankarticle": "<strong>Varoitus:</strong> Sivu, jota olet luomassa on tyhjä.\nJos napsautat ”$1” uudelleen, sivu luodaan ilman sisältöä.",
        "anoneditwarning": "<strong>Varoitus:</strong> Et ole kirjautunut sisään. IP-osoitteesi näkyy julkisesti kaikille, jos muokkaat. Jos <strong>[$1 kirjaudut sisään]</strong> tai <strong>[$2 luot tunnuksen]</strong>, muokkauksesi kirjataan käyttäjätunnuksesi tekemiksi ja samalla saat käyttöösi hyödyllisiä välineitä.",
        "anonpreviewwarning": "''Et ole kirjautunut sisään. Tallentaminen kirjaa IP-osoitteesi tämän sivun muutoshistoriaan.''",
        "missingsummary": "Et ole antanut yhteenvetoa. Jos valitset Tallenna uudelleen, niin muokkauksesi tallennetaan ilman yhteenvetoa.",
-       "selfredirect": "<strong>Varoitus:</strong> Olet tekemässä uudelleenohjausta, joka johtaa tästä sivusta tähän samaan sivuun. \n\nOlet ehkä määrittänyt ohjauksen kohteen väärin tai kenties muokkaat parhaillaan väärää sivua.\n\nJos painat toimintoa \"$1\" uudestaan, tämä ohjaussivu luodaan joka tapauksessa.",
+       "selfredirect": "<strong>Varoitus:</strong> Olet tekemässä uudelleenohjausta, joka johtaa tästä sivusta tähän samaan sivuun. \n\nOlet ehkä määrittänyt ohjauksen kohteen väärin tai kenties muokkaat parhaillaan väärää sivua.\n\nJos painat toimintoa ”$1” uudestaan, tämä ohjaussivu luodaan joka tapauksessa.",
        "missingcommenttext": "Kirjoita kommentti.",
        "missingcommentheader": "<strong>Muistutus:</strong> Et ole antanut aiheotsikkoa tälle kommentille. Napsauta ”$1”, jos haluat tallentaa kommenttisi ilman sellaista.",
        "summary-preview": "Yhteenvedon esikatselu:",
        "anontalkpagetext": "----''Tämä on nimettömän käyttäjän keskustelusivu. Hän ei ole joko luonut itselleen käyttäjätunnusta tai ei käytä sitä, jonka vuoksi hänet tunnistetaan nyt numeerisella IP-osoitteella. Kyseinen IP-osoite voi olla useamman henkilön käytössä. Jos olet nimetön käyttäjä ja sinusta tuntuu, että aiheettomia kommentteja on ohjattu sinulle, [[Special:CreateAccount|luo itsellesi käyttäjätunnus]] tai [[Special:UserLogin|kirjaudu sisään]] välttääksesi jatkossa sekaannukset muiden nimettömien käyttäjien kanssa.''",
        "noarticletext": "Tällä hetkellä tällä sivulla ei ole tekstiä.\nVoit [[Special:Search/{{PAGENAME}}|etsiä sivun nimellä]] muilta sivuilta,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} hakea aiheeseen liittyviä lokeja]\ntai [{{fullurl:{{FULLPAGENAME}}|action=edit}} luoda tämän sivun]</span>.",
        "noarticletext-nopermission": "Tällä hetkellä tällä sivulla ei ole tekstiä.\nVoit [[Special:Search/{{PAGENAME}}|etsiä sivun nimellä]] muilta sivuilta tai <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} hakea aiheeseen liittyviä lokeja]</span>, mutta sinulla ei ole oikeutta luoda tätä sivua.",
-       "missing-revision": "Sivusta \"{{FULLPAGENAME}}\" ei ole olemassa versiota $1.\n\nYleensä tämä johtuu vanhentuneesta historialinkistä sivulle, joka on poistettu.\nTarkempia tietoja löytyy [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} poistolokista].",
-       "userpage-userdoesnotexist": "Käyttäjätunnusta \"$1\" ei ole rekisteröity. \nVarmista, haluatko luoda tämän sivun tai muokata sitä.",
+       "missing-revision": "Sivusta ”{{FULLPAGENAME}}” ei ole olemassa versiota $1.\n\nYleensä tämä johtuu vanhentuneesta historialinkistä sivulle, joka on poistettu.\nTarkempia tietoja löytyy [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} poistolokista].",
+       "userpage-userdoesnotexist": "Käyttäjätunnusta ”$1” ei ole rekisteröity. \nVarmista, haluatko luoda tämän sivun tai muokata sitä.",
        "userpage-userdoesnotexist-view": "Käyttäjätunnusta ”$1” ei ole rekisteröity.",
        "blocked-notice-logextract": "Tämä käyttäjä on tällä hetkellä estetty.\nAlla on viimeisin estolokin tapahtuma:",
        "clearyourcache": "<strong>Huomautus:</strong> Selaimen välimuisti pitää tyhjentää asetusten tallentamisen jälkeen, jotta muutokset tulisivat voimaan.\n* <strong>Firefox ja Safari:</strong> Napsauta <em>Shift</em>-näppäin pohjassa <em>Päivitä</em>, tai paina <em>Ctrl-F5</em> tai <em>Ctrl-R</em> (<em>⌘-R</em> Macilla)\n* <strong>Google Chrome:</strong> Paina <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> Macilla)\n* <strong>Internet Explorer:</strong> Napsauta <em>Ctrl</em>-näppäin pohjassa <em>Päivitä</em> tai paina <em>Ctrl-F5</em>\n* <strong>Opera:</strong> <em>Menu → Settings</em> (<em>Opera → Preferences</em> Macilla) ja sitten <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
        "usercssyoucanpreview": "Voit testata uutta CSS:ää ennen tallennusta käyttämällä painiketta ”{{int:showpreview}}”.",
-       "userjsonyoucanpreview": "<strong>Vihje:</strong> Käytä \"{{int:showpreview}}\" painiketta testataksesi uutta JSON:iasi ennen tallentamista.",
+       "userjsonyoucanpreview": "<strong>Vihje:</strong> Voit testata uutta JSONia ennen tallennusta käyttämällä painiketta ”{{int:showpreview}}”.",
        "userjsyoucanpreview": "Voit testata uutta JavaScriptiä ennen tallennusta käyttämällä painiketta ”{{int:showpreview}}”.",
        "usercsspreview": "'''Tämä on CSS:n esikatselu. Muutoksia ei ole vielä tallennettu.'''",
        "userjsonpreview": "<strong>Huomaa, että tämä on vasta JSON-käyttäjäasetusten esikatselu.\nMuutoksia ei ole vielä tallennettu!</strong>",
        "sitecsspreview": "'''Huomaa, että tämä on vasta CSS:n esikatselu.''' \n'''Muutoksia ei ole vielä tallennettu.'''",
        "sitejsonpreview": "<strong>Huomaa, että tämä on vasta JSON-asetusten esikatselu.\nMuutoksia ei ole vielä tallennettu!</strong>",
        "sitejspreview": "'''Huomaa, että tämä on vasta JavaScript-koodin esikatselu.'''\n'''Muutoksia ei ole vielä tallennettu.'''",
-       "userinvalidconfigtitle": "<strong>Varoitus:</strong> Tyyliä nimeltä ”$1” ei ole olemassa. Muista, että käyttäjän määrittelemät .css-, -json- ja .js-sivut alkavat pienellä alkukirjaimella, esim. {{ns:user}}:Matti Meikäläinen/vector.css eikä {{ns:user}}:Matti Meikäläinen/Vector.css.",
+       "userinvalidconfigtitle": "<strong>Varoitus:</strong> Tyyliä nimeltä ”$1” ei ole olemassa. Muista, että käyttäjän määrittelemät .css-, -.json- ja .js-sivut alkavat pienellä alkukirjaimella, esim. {{ns:user}}:Matti Meikäläinen/vector.css eikä {{ns:user}}:Matti Meikäläinen/Vector.css.",
        "updated": "(Päivitetty)",
        "note": "'''Huomautus:'''",
        "previewnote": "'''Tämä on vasta sivun esikatselu.'''\nTekemiäsi muutoksia ei ole vielä tallennettu.",
        "editingsection": "Muokataan osiota sivusta $1",
        "editingcomment": "Muokataan uutta osiota sivulla $1",
        "editconflict": "Päällekkäinen muokkaus: $1",
-       "explainconflict": "Joku muu on muuttanut tätä sivua sen jälkeen, kun aloit muokata sitä.\nYlempi tekstialue sisältää tämänhetkisen tekstin.\nTekemäsi muutokset näkyvät alemmassa ikkunassa.\nSinun täytyy yhdistää muutoksesi olemassa olevaan tekstiin.\n<strong>Vain</strong> ylemmässä alueessa oleva teksti tallentuu, kun napsautat \"$1\".",
+       "explainconflict": "Joku muu on muuttanut tätä sivua sen jälkeen, kun aloit muokata sitä.\nYlempi tekstialue sisältää tämänhetkisen tekstin.\nTekemäsi muutokset näkyvät alemmassa ikkunassa.\nSinun täytyy yhdistää muutoksesi olemassa olevaan tekstiin.\n<strong>Vain</strong> ylemmässä alueessa oleva teksti tallentuu, kun napsautat ”$1”.",
        "yourtext": "Oma tekstisi",
        "storedversion": "Tallennettu versio",
        "editingold": "'''Varoitus: Olet muokkaamassa vanhaa versiota tämän sivun tekstistä. Jos tallennat sen, kaikki tämän version jälkeen tehdyt muutokset katoavat.'''",
        "content-failed-to-parse": "Sisältö tyypiltään $2 ei jäsenny tyypiksi $1: $3",
        "invalid-content-data": "Virheellinen sisältö",
        "content-not-allowed-here": "Sivun [[$2]] sisältö ei voi olla tyyppiä $1.",
-       "editwarning-warning": "Tältä sivulta poistuminen saattaa aiheuttaa kaikkien tekemiesi muutosten katoamisen.\nJos olet kirjautunut sisään, voit poistaa tämän varoituksen käytöstä omien asetuksien osiossa \"{{int:prefs-editing}}\".",
+       "editwarning-warning": "Tältä sivulta poistuminen saattaa aiheuttaa kaikkien tekemiesi muutosten katoamisen.\nJos olet kirjautunut sisään, voit poistaa tämän varoituksen käytöstä omien asetuksien osiossa ”{{int:prefs-editing}}”.",
        "editpage-invalidcontentmodel-title": "Sisältömalli ei ole tuettu",
-       "editpage-invalidcontentmodel-text": "Sisältömalli \"$1\" ei ole tuettu.",
+       "editpage-invalidcontentmodel-text": "Sisältömalli ”$1” ei ole tuettu.",
        "editpage-notsupportedcontentformat-title": "Sisällön muotoa ei tueta",
        "editpage-notsupportedcontentformat-text": "Sisällön muotoa $1 ei tueta sisältömallilla $2.",
        "content-model-wikitext": "wikiteksti",
        "content-json-empty-array": "Tyhjä array",
        "deprecated-self-close-category": "Sivut, joissa on virheellisiä itsensäsulkevia HTML-tageja",
        "deprecated-self-close-category-desc": "Sivulla on virheellisiä itsensäsulkevia HTML-tageja, kuten <code>&lt;b/></code> tai <code>&lt;span/></code>. Niiden käyttäytyminen muuttuu pian HTLM5:n määritysten mukaiseksi, joten niiden käyttö wikitekstissä on vanhentunut.",
-       "duplicate-args-warning": "<strong>Varoitus:</strong> [[:$1]] kutsuu mallinetta [[:$2]] niin, että parametrille \"$3\" on annettu enemmän kuin yksi arvo. Ainoastaan viimeksi annettu arvo otetaan huomioon.",
+       "duplicate-args-warning": "<strong>Varoitus:</strong> [[:$1]] kutsuu mallinetta [[:$2]] niin, että parametrille ”$3” on annettu enemmän kuin yksi arvo. Ainoastaan viimeksi annettu arvo otetaan huomioon.",
        "duplicate-args-category": "Sivut, jotka käyttävät kaksinkertaisia argumentteja mallinekutsuissa",
        "duplicate-args-category-desc": "Tämä sivu sisältää sellaisia mallinekutsuja, jotka käyttävät kaksi kertaa samaa argumenttia kuten <nowiki>{{foo|bar=1|bar=2}}</nowiki></code> taikka <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Tällä sivulla on liian monta hitaiden laajennusfunktioiden kutsua.\nKutsuja pitäisi olla alle $2 {{PLURAL:$2|kappale|kappaletta}}, mutta nyt niitä on $1 {{PLURAL:$1|kappale|kappaletta}}.",
        "deletedhist": "Poistettujen versioiden historia",
        "revdelete-hide-current": "Virhe piilotettaessa kohdetta päivämäärällä $1 kello $2: Tämä on uusin versio.\nSitä ei voi piilottaa.",
        "revdelete-show-no-access": "Virhe näyttäessä kohtaa $2 kello $1: kohta on merkitty ”rajoitetuksi”.\nSinulla ei ole oikeutta siihen.",
-       "revdelete-modify-no-access": "Virhe kohteen päivämäärällä $1 kello $2 muutoksessa: tämä kohde on merkitty \"rajoitetuksi\". \nSinulla ei ole oikeutta muuttaa kohdetta.",
+       "revdelete-modify-no-access": "Virhe kohteen päivämäärällä $1 kello $2 muutoksessa: tämä kohde on merkitty ”rajoitetuksi”. \nSinulla ei ole oikeutta muuttaa kohdetta.",
        "revdelete-modify-missing": "Virhe muuttaessa kohdetta, jonka tunniste on $1: Se puuttuu tietokannasta.",
        "revdelete-no-change": "'''Varoitus.''' Kohteessa päivämäärällä $1 kello $2 on jo valmiiksi haluamasi näkyvyysasetukset.",
        "revdelete-concurrent-change": "Virhe kohteen päivämäärällä $1 kello $2 muutoksessa: sen näkyvyysasetuksia on ilmeisesti joku muuttanut sillä aikaa kun yritit muuttaa sitä.\nOle hyvä ja tarkista lokit.",
        "diff-paragraph-moved-toold": "Kappale siirrettiin. Klikkaa hypätäksesi vanhaan sijaintiin.",
        "difference-missing-revision": "{{PLURAL:$2|Yhtä versiota|$2 versiota}} tästä vertailusta ($1) {{PLURAL:$2|ei}} löytynyt.\n\nUseimmiten tämä johtuu vanhentuneesta vertailulinkistä poistettuun sivuun.\nLisätietoja löytyy [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} poistolokista].",
        "searchresults": "Hakutulokset",
-       "search-filter-title-prefix": "Haetaan vain sivuista, joiden otsikko alkaa \"$1\"",
+       "search-filter-title-prefix": "Haetaan vain sivuista, joiden otsikko alkaa ”$1”",
        "search-filter-title-prefix-reset": "Hae kaikista sivuista",
        "searchresults-title": "Haun tulokset hakusanalle ”$1”",
        "titlematches": "Osumat sivujen otsikoissa",
        "shown-title": "Näytä $1 {{PLURAL:$1|osuma|osumaa}} sivulla",
        "viewprevnext": "Näytä [$3] kerralla.\n\n$1 {{int:pipe-separator}} $2",
        "searchmenu-exists": "'''Tässä wikissä on sivu nimellä [[:$1]].'''",
-       "searchmenu-new": "<strong>Luo sivu \"[[:$1]]\" tähän wikiin.</strong> {{PLURAL:$2|0=|Katso myös sivua, joka löytyi hakutoiminnolla.\n|Katso myös hakutuloksia.}}",
+       "searchmenu-new": "<strong>Luo sivu ”[[:$1]]” tähän wikiin.</strong> {{PLURAL:$2|0=|Katso myös sivua, joka löytyi hakutoiminnolla.\n|Katso myös hakutuloksia.}}",
        "searchprofile-articles": "Sisältösivut",
        "searchprofile-images": "Kuvat ja tiedostot",
        "searchprofile-everything": "Kaikki",
        "prefs-advancedwatchlist": "Lisäasetukset",
        "prefs-displayrc": "Perusasetukset",
        "prefs-displaywatchlist": "Näyttöasetukset",
+       "prefs-changesrc": "Näytettävät muutokset",
+       "prefs-changeswatchlist": "Näytettävät muutokset",
+       "prefs-pageswatchlist": "Tarkkailtavat sivut",
        "prefs-tokenwatchlist": "Avain",
        "prefs-diffs": "Eroavaisuudet",
        "prefs-help-prefershttps": "Tämä asetus tulee voimaan seuraavan sisäänkirjautumisesi yhteydessä.",
-       "prefswarning-warning": "Olet tehnyt asetuksiisi muutoksia, joita ei ole vielä tallennettu.\nJos poistut sivulta klikkaamatta \"$1\", asetuksiasi ei päivitetä.",
+       "prefswarning-warning": "Olet tehnyt asetuksiisi muutoksia, joita ei ole vielä tallennettu.\nJos poistut sivulta klikkaamatta ”$1”, asetuksiasi ei päivitetä.",
        "prefs-tabs-navigation-hint": "Vihje: Voit käyttää vasenta ja oikeata nuolinäppäintä liikkumiseen välilehtien välillä.",
        "userrights": "Käyttäjän oikeudet",
        "userrights-lookup-user": "Valitse käyttäjä",
        "userrights-expiry-existing": "Nykyinen vanhentumisaika: $2 kello $3",
        "userrights-expiry-othertime": "Muu aika:",
        "userrights-expiry-options": "1 päivä:1 day,1 viikko:1 week,1 kuukausi:1 month,3 kuukautta:3 months,6 kuukautta:6 months,1 vuosi:1 year",
-       "userrights-invalid-expiry": "Ryhmän \"$1\" vanhentumisaika on virheellinen.",
-       "userrights-expiry-in-past": "Ryhmän \"$1\" vanhentumisaika on mennyt.",
-       "userrights-cannot-shorten-expiry": "Et voi aikaistaa ryhmän \"$1\" jäsenyyden erääntymisaikoja. Vain käyttäjät, joilla on oikeus lisätä ja poistaa ryhmiä, voivat aikaistaa erääntymisaikoja.",
+       "userrights-invalid-expiry": "Ryhmän ”$1” vanhentumisaika on virheellinen.",
+       "userrights-expiry-in-past": "Ryhmän ”$1” vanhentumisaika on mennyt.",
+       "userrights-cannot-shorten-expiry": "Et voi aikaistaa ryhmän ”$1” jäsenyyden erääntymisaikoja. Vain käyttäjät, joilla on oikeus lisätä ja poistaa ryhmiä, voivat aikaistaa erääntymisaikoja.",
        "userrights-conflict": "Päällekkäinen käyttöoikeuksien muutos! Tarkista tekemäsi muutokset ja vahvista ne.",
        "group": "Ryhmä",
        "group-user": "käyttäjät",
        "right-ipblock-exempt": "Ohittaa IP-, automaattiset ja osoitealue-estot",
        "right-unblockself": "Poistaa esto itseltään",
        "right-protect": "Muuttaa suojaustasoja ja muokata tarttuvasti suojattuja sivuja",
-       "right-editprotected": "Muokata sivuja, jotka on suojattu tasolle \"{{int:protect-level-sysop}}\"",
-       "right-editsemiprotected": "Muokata sivuja, jotka on suojattu tasolle \"{{int:protect-level-autoconfirmed}}\"",
+       "right-editprotected": "Muokata sivuja, jotka on suojattu tasolle ”{{int:protect-level-sysop}}”",
+       "right-editsemiprotected": "Muokata sivuja, jotka on suojattu tasolle ”{{int:protect-level-autoconfirmed}}”",
        "right-editcontentmodel": "Muokata sivun sisältömallia (content model)",
        "right-editinterface": "Muokata käyttöliittymätekstejä",
        "right-editusercss": "Muokata toisten käyttäjien CSS-tiedostoja",
        "right-applychangetags": "Asettaa [[Special:Tags|merkkauksia]] omien muutosten yhteyteen",
        "right-changetags": "Lisätä ja poistaa satunnaisia [[Special:Tags|merkkauksia]] yksittäisissä sivuversioissa tai lokimerkinnöissä",
        "right-deletechangetags": "Poistaa [[Special:Tags|merkkauksia]] tietokannasta",
-       "grant-generic": "\"$1\" oikeuksien joukko",
+       "grant-generic": "”$1” oikeuksien joukko",
        "grant-group-page-interaction": "Käsitellä sivuja",
        "grant-group-file-interaction": "Käsitellä mediatiedostoja",
        "grant-group-watchlist-interaction": "Käsitellä tarkkailulistaasi",
        "rcfilters-filter-user-experience-level-newcomer-label": "Tulokkaat",
        "rcfilters-filter-user-experience-level-newcomer-description": "Rekisteröityneet muokkaajat, joilla vähemmän kuin 10 muokkausta tai 4 päivää aktiivisuutta.",
        "rcfilters-filter-user-experience-level-learner-label": "Oppijat",
-       "rcfilters-filter-user-experience-level-learner-description": "Rekisteröityneet muokkaajat, joiden kokemus on välillä \"tulokas\" ja \"kokenut käyttäjä\".",
+       "rcfilters-filter-user-experience-level-learner-description": "Rekisteröityneet muokkaajat, joiden kokemus on välillä ”tulokas” ja ”kokenut käyttäjä”.",
        "rcfilters-filter-user-experience-level-experienced-label": "Kokeneet käyttäjät",
        "rcfilters-filter-user-experience-level-experienced-description": "Rekisteröityneet muokkaajat, joilla enemmän kuin 500 muokkausta ja 30 päivää aktiivisuutta.",
        "rcfilters-filtergroup-automated": "Automatisoidut muutokset",
        "rcfilters-filter-categorization-description": "Tulokset sivuista, joita on lisätty luokkiin tai poistettu luokista.",
        "rcfilters-filter-logactions-label": "Lokitoiminnot",
        "rcfilters-filter-logactions-description": "Ylläpidolliset toimet, tunnusten luonnit, sivujen poistot, tiedostolataukset…",
-       "rcfilters-hideminor-conflicts-typeofchange-global": "\"Pienet muutokset\" -suodatin on ristiriidassa yhden tai useamman Muutoksen tyyppi suodattimen kanssa, koska joitain muutostyyppejä ei voida pitää \"pieninä\". Ristiriidassa oleva suodatin on merkittynä Aktiivisissa suodattimissa, yläpuolella.",
-       "rcfilters-hideminor-conflicts-typeofchange": "Joitain muutostyyppejä ei voida määrittää \"pieneksi\", joten tämä suodatin on ristiriidassa seuraavien Muutoksen tyyppi suodattimien kanssa: $1",
-       "rcfilters-typeofchange-conflicts-hideminor": "\"Muutoksen tyyppi\" on ristiriidassa \"Pienet muutokset\" -suodattimen kanssa. Joitain muutostyyppejä ei voida merkitä \"pieniksi\".",
+       "rcfilters-hideminor-conflicts-typeofchange-global": "”Pienet muutokset” -suodatin on ristiriidassa yhden tai useamman Muutoksen tyyppi -suodattimen kanssa, koska joitain muutostyyppejä ei voida pitää ”pieninä”. Ristiriidassa oleva suodatin on merkittynä Aktiivisissa suodattimissa, yläpuolella.",
+       "rcfilters-hideminor-conflicts-typeofchange": "Joitain muutostyyppejä ei voida määrittää ”pieneksi”, joten tämä suodatin on ristiriidassa seuraavien Muutoksen tyyppi suodattimien kanssa: $1",
+       "rcfilters-typeofchange-conflicts-hideminor": "”Muutoksen tyyppi” on ristiriidassa ”Pienet muutokset” -suodattimen kanssa. Joitain muutostyyppejä ei voida merkitä ”pieniksi”.",
        "rcfilters-filtergroup-lastRevision": "Viimeisimmät versiot",
        "rcfilters-filter-lastrevision-label": "Viimeisin versio",
        "rcfilters-filter-lastrevision-description": "Vain viimeisin muutos sivuun.",
        "rcfilters-filter-previousrevision-label": "Ei viimeisin muutos",
-       "rcfilters-filter-previousrevision-description": "Kaikki muutokset, jotka eivät ole \"viimeisin versio\".",
+       "rcfilters-filter-previousrevision-description": "Kaikki muutokset, jotka eivät ole ”viimeisin versio”.",
        "rcfilters-filter-excluded": "Poissuljettu",
        "rcfilters-tag-prefix-namespace-inverted": "<strong>:ei</strong> $1",
        "rcfilters-exclude-button-off": "Poissulje valitut",
        "rcfilters-watchlist-markseen-button": "Merkitse kaikki muutokset nähdyiksi",
        "rcfilters-watchlist-edit-watchlist-button": "Muokkaa tarkkailemiasi sivuja",
        "rcfilters-watchlist-showupdated": "Muutokset sivuihin, joilla et ole vieraillut sen jälkeen kun muutokset on tehty, on <strong>lihavoitu</strong> ja värimerkitty.",
-       "rcfilters-preference-label": "Piilota tuoreiden muutosten parannettu versio",
-       "rcfilters-preference-help": "Peruuttaa vuoden 2017 käyttöliittymän uudistuksen ja kaikki sen jälkeen lisätyt työkalut.",
-       "rcfilters-watchlist-preference-label": "Piilota tarkkailulistan parannettu versio",
-       "rcfilters-watchlist-preference-help": "Poistaa käytöstä vuoden 2017 ulkoasun uudistuksen ja kaikki sen jälkeen lisätyt työkalut.",
+       "rcfilters-preference-label": "Käytä ilman JavaScriptiä toimivaa käyttöliittymää",
+       "rcfilters-preference-help": "Lataa tuoreimmat muutokset -näkymän ilman suodattimia tai korostustoimintoa.",
+       "rcfilters-watchlist-preference-label": "Käytä ilman JavaScriptiä toimivaa käyttöliittymää",
+       "rcfilters-watchlist-preference-help": "Lataa tarkkailulistan ilman suodattimia tai korostustoimintoa.",
        "rcfilters-filter-showlinkedfrom-label": "Näytä muutokset sivuilla, jonne on linkki sivulta",
        "rcfilters-filter-showlinkedfrom-option-label": "<strong>Sivut, joihin linkitetään</strong> valitulta sivulta",
        "rcfilters-filter-showlinkedto-label": "Näytä muutokset sivuilla, joista on linkki sivulle",
        "newsectionsummary": "/* $1 */ uusi osio",
        "rc-enhanced-expand": "Näytä yksityiskohdat",
        "rc-enhanced-hide": "Piilota yksityiskohdat",
-       "rc-old-title": "alun perin luotu nimellä \"$1\"",
+       "rc-old-title": "alun perin luotu nimellä ”$1”",
        "recentchangeslinked": "Linkitettyjen sivujen muutokset",
        "recentchangeslinked-feed": "Linkitettyjen sivujen muutokset",
        "recentchangeslinked-toolbox": "Linkitettyjen sivujen muutokset",
        "upload_directory_read_only": "Palvelimella ei ole kirjoitusoikeuksia tallennushakemistoon $1.",
        "uploaderror": "Tallennusvirhe",
        "upload-recreate-warning": "<strong>Varoitus: Tiedosto tällä nimellä on poistettu tai siirretty.</strong>\n\nPoisto- ja siirtoloki tälle sivulle näkyy alla:",
-       "uploadtext": "Käytä tätä alla olevaa lomaketta tiedostojen tallentamiseen.\nVoit katsella luetteloa aiemmin tallennetuista tiedostoista sivulla [[Special:FileList|tiedostoluettelo]]. Kaikki tallennukset kirjataan myös [[Special:Log/upload|tallennuslokiin]] ja tiedostojen poistot [[Special:Log/delete|poistolokiin]].\n\nJotta saat tiedoston näkymään sivulla, käytä jotakin seuraavista muotoiluista linkkinä siihen:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Tiedosto.jpg]]</nowiki></code></strong> käyttääksesi tiedoston kokonaista versiota.\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Tiedosto.png|200px|thumb|left|teksti tähän]]</nowiki></code></strong> käyttääksesi tiedostoa sovitettuna 200 kuvapistettä leveään laatikkoon kuvatekstillä \"teksti tähän\".\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Tiedosto.ogg]]</nowiki></code></strong>, jos haluat suoran linkin tiedostoon ilman että tiedostoa näytetään.",
+       "uploadtext": "Käytä tätä alla olevaa lomaketta tiedostojen tallentamiseen.\nVoit katsella luetteloa aiemmin tallennetuista tiedostoista sivulla [[Special:FileList|tiedostoluettelo]]. Kaikki tallennukset kirjataan myös [[Special:Log/upload|tallennuslokiin]] ja tiedostojen poistot [[Special:Log/delete|poistolokiin]].\n\nJotta saat tiedoston näkymään sivulla, käytä jotakin seuraavista muotoiluista linkkinä siihen:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Tiedosto.jpg]]</nowiki></code></strong> käyttääksesi tiedoston kokonaista versiota.\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Tiedosto.png|200px|thumb|left|teksti tähän]]</nowiki></code></strong> käyttääksesi tiedostoa sovitettuna 200 kuvapistettä leveään laatikkoon kuvatekstillä ”teksti tähän”.\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Tiedosto.ogg]]</nowiki></code></strong>, jos haluat suoran linkin tiedostoon ilman että tiedostoa näytetään.",
        "upload-permitted": "{{PLURAL:$2|Sallittu tiedostomuoto|Sallitut tiedostomuodot}}: $1.",
        "upload-preferred": "{{PLURAL:$2|Suositeltu tiedostomuoto|Suositellut tiedostomuodot}}: $1.",
        "upload-prohibited": "{{PLURAL:$2|Kielletty tiedostomuoto|Kielletyt tiedostomuodot}}: $1.",
        "backend-fail-read": "Tiedostoa $1 ei voitu lukea.",
        "backend-fail-create": "Tiedostoa $1 ei voitu luoda.",
        "backend-fail-maxsize": "Tiedostoa $1 ei voitu luoda, koska se on suurempi kuin {{PLURAL:$2|yksi tavu|$2 tavua}}.",
-       "backend-fail-readonly": "Taustajärjestelmä \"$1\" on tällä hetkellä vain lukutilassa. Syy tähän on: \"''$2''\"",
-       "backend-fail-synced": "Tiedoston \"$1\" tila ei vastaa tiedoston tilaa sisäisissä taustajärjestelmissä.",
-       "backend-fail-connect": "Varastojärjestelmään \"$1\" ei saada yhteyttä.",
-       "backend-fail-internal": "Tuntematon virhe taustajärjestelmässä \"$1\".",
+       "backend-fail-readonly": "Taustajärjestelmä ”$1” on tällä hetkellä vain luku -tilassa. Syy tähän on: ”''$2''”",
+       "backend-fail-synced": "Tiedoston ”$1” tila ei vastaa tiedoston tilaa sisäisissä taustajärjestelmissä.",
+       "backend-fail-connect": "Varastojärjestelmään ”$1” ei saada yhteyttä.",
+       "backend-fail-internal": "Tuntematon virhe taustajärjestelmässä ”$1”.",
        "backend-fail-contenttype": "Tiedostoa ei voitu tallentaa kohteeseen $1, koska tiedostomuotoa ei voitu määrittää.",
        "backend-fail-batchsize": "Taustajärjestelmälle on annettu $1 {{PLURAL:$1|tiedostotoiminto|toimintoa}}; enimmäismäärä on $2 {{PLURAL:$2|tiedostotoiminto|toimintoa}}.",
        "backend-fail-usable": "Tiedostoa $1 ei voitu lukea tai luoda, koska käyttöoikeudet eivät riittäneet tai hakemisto puuttuu.",
-       "filejournal-fail-dbconnect": "Ei voitu yhdistää kohteeseen journal database for storage backend \"$1\".",
-       "filejournal-fail-dbquery": "Ei voitu päivittää kohdetta journal database for storage backend \"$1\".",
+       "filejournal-fail-dbconnect": "Ei voitu yhdistää kohteeseen journal database for storage backend ”$1”.",
+       "filejournal-fail-dbquery": "Ei voitu päivittää kohdetta journal database for storage backend ”$1”.",
        "lockmanager-notlocked": "Kohteen $1 lukitusta ei voitu poistaa, koska se ei ole lukittu.",
        "lockmanager-fail-closelock": "Tiedoston $1 lukkotiedostoa ei voitu sulkea.",
        "lockmanager-fail-deletelock": "Tiedoston $1 lukkotiedostoa ei voitu poistaa.",
-       "lockmanager-fail-acquirelock": "Tiedostopolulle \"$1\" ei voitu luoda suojausta.",
+       "lockmanager-fail-acquirelock": "Tiedostopolulle ”$1” ei voitu luoda suojausta.",
        "lockmanager-fail-openlock": "Tiedoston $1 lukkotiedostoa ei voitu avata. Varmista että latauskansiosi on määritetty oikein ja verkkopalvelimellasi on oikeudet kirjoittaa tähän kansioon. Katso https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgUploadDirectory saadaksesi lisätietoja.",
        "lockmanager-fail-releaselock": "Tiedoston $1 lukituksen avaaminen epäonnistui.",
        "lockmanager-fail-db-bucket": "Ei voitu yhdistää riittävästi tietokantoja kohdassa $1.",
        "uploadstash-errclear": "Tiedostojen tyhjentäminen epäonnistui.",
        "uploadstash-refresh": "Päivitä tiedostoluettelo",
        "uploadstash-thumbnail": "näytä pienoiskuva",
-       "uploadstash-exception": "Tiedostoa ei kyetty säilömään latausmuistiin ($1): \"$2\"",
+       "uploadstash-exception": "Tiedostoa ei kyetty säilömään latausmuistiin ($1): ”$2”.",
        "uploadstash-bad-path": "\nPolkua ei ole.",
        "uploadstash-bad-path-invalid": "Polku ei kelpaa.",
-       "uploadstash-bad-path-unknown-type": "Tuntematon tyyppi \"$1\".",
+       "uploadstash-bad-path-unknown-type": "Tuntematon tyyppi ”$1”.",
        "uploadstash-bad-path-unrecognized-thumb-name": "Tunnistamaton pienoiskuvan nimi.",
        "uploadstash-bad-path-no-handler": "Tiedoston $2 MIME-tyypille $1 ei löytynyt käsittelijää.",
-       "uploadstash-bad-path-bad-format": "Avain \"$1\" ei ole sopivassa muodossa.",
-       "uploadstash-file-not-found": "Avainta \"$1\" ei löytynyt kätköstä.",
+       "uploadstash-bad-path-bad-format": "Avain ”$1” ei ole sopivassa muodossa.",
+       "uploadstash-file-not-found": "Avainta ”$1” ei löytynyt kätköstä.",
        "uploadstash-file-not-found-no-thumb": "Pienoiskuvaa ei voitu saada.",
        "uploadstash-file-not-found-no-local-path": "Skaalatulla kohteella ei ole paikallista polkua.",
        "uploadstash-file-not-found-no-object": "Ei voitu luoda paikallista tiedostokohdetta pienoiskuvalle.",
        "img-auth-public": "Img_auth.php:n tarkoitus on näyttää tiedostoja yksityisessä wikissä.\nTämä wiki on asennettu julkiseksi wikiksi.\nParhaan turvallisuuden vuoksi img_auth.php on poissa käytöstä.",
        "img-auth-noread": "Käyttäjillä ei ole oikeutta lukea tiedostoa ”$1”.",
        "http-invalid-url": "Kelpaamaton URL: $1",
-       "http-invalid-scheme": "Verkko-osoitteita kaavalla \"$1\" ei tueta",
+       "http-invalid-scheme": "Verkko-osoitteita kaavalla ”$1” ei tueta.",
        "http-request-error": "HTTP-pyyntö epäonnistui tuntemattoman virheen takia.",
        "http-read-error": "HTTP-lukuvirhe.",
        "http-timed-out": "HTTP-pyyntö aikakatkaistiin.",
        "listfiles-delete": "poista",
        "listfiles-summary": "Tämä toimintosivu näyttää kaikki tallennetut tiedostot.",
        "listfiles_search_for": "Etsi tiedoston nimellä:",
-       "listfiles-userdoesnotexist": "Käyttäntunnusta \"$1\" ei ole rekisteröity.",
+       "listfiles-userdoesnotexist": "Käyttäjätunnusta ”$1” ei ole rekisteröity.",
        "imgfile": "tiedosto",
        "listfiles": "Tiedostoluettelo",
        "listfiles_thumb": "Pienoiskuva",
        "uncategorizedcategories": "Luokittelemattomat luokat",
        "uncategorizedimages": "Luokittelemattomat tiedostot",
        "uncategorizedtemplates": "Luokittelemattomat mallineet",
-       "uncategorized-categories-exceptionlist": "# Sisältää luettelon luokkia, joita ei tulisi mainita Special:UncategorizedCategories-sivulla. Yksi riviä kohden, alkaen \"*\"-merkillä. Muilla merkeillä alkavat rivit jätetään huomiotta. Käytä \"#\"-merkkiä kommenttien kirjoittamiseen.",
+       "uncategorized-categories-exceptionlist": "# Sisältää luettelon luokkia, joita ei tulisi mainita Special:UncategorizedCategories-sivulla. Yksi riviä kohden, alkaen ”*”-merkillä. Muilla merkeillä alkavat rivit jätetään huomiotta. Käytä ”#”-merkkiä kommenttien kirjoittamiseen.",
        "unusedcategories": "Käyttämättömät luokat",
        "unusedimages": "Käyttämättömät tiedostot",
        "wantedcategories": "Halutut luokat",
        "apisandbox-submit": "Tee pyyntö",
        "apisandbox-reset": "Tyhjennä",
        "apisandbox-retry": "Yritä uudestaan",
-       "apisandbox-loading": "Ladataan tietoja API-moduulista \"$1\"...",
-       "apisandbox-load-error": "Tapahtui virhe ladattaessa tietoja API-moduulista \"$1\": $2",
+       "apisandbox-loading": "Ladataan tietoja API-moduulista ”$1”…",
+       "apisandbox-load-error": "Tapahtui virhe ladattaessa tietoja API-moduulista ”$1”: $2",
        "apisandbox-no-parameters": "Tässä API-moduulissa ei ole parametreja.",
        "apisandbox-helpurls": "Linkit ohjeisiin",
        "apisandbox-examples": "Esimerkit",
        "apisandbox-request-url-label": "Pyynnön URL",
        "apisandbox-request-json-label": "Pyydetty JSON:",
        "apisandbox-request-time": "Pyyntöön kulunut aika: {{PLURAL:$1|$1 ms}}",
-       "apisandbox-results-fixtoken": "Korjaa \"token\" ja lähetä uudelleen",
-       "apisandbox-results-fixtoken-fail": "\"$1\"-avaimen haku epäonnistui.",
+       "apisandbox-results-fixtoken": "Korjaa ”token” ja lähetä uudelleen",
+       "apisandbox-results-fixtoken-fail": "”$1”-avaimen haku epäonnistui.",
        "apisandbox-alert-page": "Tällä sivulla olevat kentät eivät ole kelvollisia.",
        "apisandbox-alert-field": "Tässä kentässä oleva arvo ei ole kelvollinen.",
        "apisandbox-continue": "Jatka",
        "linksearch-pat": "Hakuehto:",
        "linksearch-ns": "Nimiavaruus:",
        "linksearch-ok": "Hae",
-       "linksearch-text": "Jokerimerkkejä, kuten \"*.wikipedia.org\", voidaan käyttää.\nVaaditaan vähintään ylätason verkkotunnus, esimerkiksi \"*.org\".<br />\n{{PLURAL:$2|Tuettu protokolla|Tuetut protokollat}}: $1 (oletuksena on <code>http://</code>, jos protokollaa ei määritetä).",
+       "linksearch-text": "Jokerimerkkejä, kuten ”*.wikipedia.org”, voidaan käyttää.\nVaaditaan vähintään ylätason verkkotunnus, esimerkiksi ”*.org”.<br />\n{{PLURAL:$2|Tuettu protokolla|Tuetut protokollat}}: $1 (oletuksena on <code>http://</code>, jos protokollaa ei määritetä).",
        "linksearch-line": "$1 on linkitetty sivulta $2",
        "linksearch-error": "Jokerimerkkiä voi käyttää ainoastaan osoitteen alussa.",
        "listusersfrom": "Käyttäjien tunnukset alkavat kirjaimilla:",
        "watchlistanontext": "Sinun täytyy kirjautua sisään, jos haluat nähdä oman tarkkailulistasi.",
        "watchnologin": "Et ole kirjautunut sisään",
        "addwatch": "Lisää tarkkailulistalle",
-       "addedwatchtext": "\"[[:$1]]\" ja sen keskustelusivu on lisätty [[Special:Watchlist|tarkkailulistallesi]].",
-       "addedwatchtext-talk": "\"[[:$1]]\" ja siihen liittyvä sivu on lisätty [[Special:Watchlist|tarkkailulistallesi]].",
-       "addedwatchtext-short": "Sivu \"$1\" on lisätty tarkkailulistallesi.",
+       "addedwatchtext": "”[[:$1]]” ja sen keskustelusivu on lisätty [[Special:Watchlist|tarkkailulistallesi]].",
+       "addedwatchtext-talk": "”[[:$1]]” ja siihen liittyvä sivu on lisätty [[Special:Watchlist|tarkkailulistallesi]].",
+       "addedwatchtext-short": "Sivu ”$1” on lisätty tarkkailulistallesi.",
        "removewatch": "Poista tarkkailulistalta",
-       "removedwatchtext": "\"[[:$1]]\" ja sen keskustelusivu on poistettu [[Special:Watchlist|tarkkailulistaltasi]].",
-       "removedwatchtext-talk": "\"[[:$1]]\" ja siihen liittyvä sivu on poistettu [[Special:Watchlist|tarkkailulistaltasi]].",
+       "removedwatchtext": "”[[:$1]]” ja sen keskustelusivu on poistettu [[Special:Watchlist|tarkkailulistaltasi]].",
+       "removedwatchtext-talk": "”[[:$1]]” ja siihen liittyvä sivu on poistettu [[Special:Watchlist|tarkkailulistaltasi]].",
        "removedwatchtext-short": "Sivu ”$1” on poistettu tarkkailulistaltasi.",
        "watch": "Tarkkaile",
        "watchthispage": "Tarkkaile tätä sivua",
        "deletepage": "Poista sivu",
        "confirm": "Toteuta",
        "excontent": "sisälsi: ”$1”",
-       "excontentauthor": "sisältö oli: \"$1\", ja ainoa muokkaaja oli \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|keskustelu]])",
+       "excontentauthor": "sisältö oli: ”$1”, ja ainoa muokkaaja oli ”[[Special:Contributions/$2|$2]]” ([[User talk:$2|keskustelu]])",
        "exbeforeblank": "ennen tyhjentämistä sisälsi: ”$1”",
        "delete-confirm": "Poista ”$1”",
        "delete-legend": "Sivun poisto",
        "changecontentmodel-emptymodels-text": "Sisältöä sivulla [[:$1]] ei voida muuntaa mihinkään muotoon.",
        "log-name-contentmodel": "Sisältömallin muutosten loki",
        "log-description-contentmodel": "Tällä sivulla on lueteltu muutokset sivujen sisältömalliin, ja sivut, jotka on luotu muulla kuin oletussisältömallilla.",
-       "logentry-contentmodel-new": "$1 {{GENDER:$2|loi}} sivun $3 käyttäen normaalista poikkeavaa sisältömallia \"$5\"",
-       "logentry-contentmodel-change": "$1 {{GENDER:$2|muutti}} sivun $3 sisältömallia muodosta \"$4\" muotoon \"$5\"",
+       "logentry-contentmodel-new": "$1 {{GENDER:$2|loi}} sivun $3 käyttäen normaalista poikkeavaa sisältömallia ”$5”",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|muutti}} sivun $3 sisältömallia muodosta ”$4” muotoon ”$5”",
        "logentry-contentmodel-change-revertlink": "kumoa",
        "logentry-contentmodel-change-revert": "kumottu",
        "protectlogpage": "Suojausloki",
        "modifiedarticleprotection": "muutti sivun [[$1]] suojausasetuksia",
        "unprotectedarticle": "poisti suojauksen sivulta [[$1]]",
        "movedarticleprotection": "siirsi suojausasetukset sivulta [[$2]] sivulle [[$1]]",
-       "protectedarticle-comment": "{{GENDER:$2|Suojasi}} sivun \"[[$1]]\"",
-       "modifiedarticleprotection-comment": "{{GENDER:$2|Muutti suojaustasoa}} sivulla \"[[$1]]\"",
-       "unprotectedarticle-comment": "{{GENDER:$2|Otti pois suojauksen}} sivulta \"[[$1]]\"",
+       "protectedarticle-comment": "{{GENDER:$2|Suojasi}} sivun ”[[$1]]”",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Muutti suojaustasoa}} sivulla ”[[$1]]”",
+       "unprotectedarticle-comment": "{{GENDER:$2|Otti pois suojauksen}} sivulta ”[[$1]]”",
        "protect-title": "Muuta suojausta sivulla ”$1”",
        "protect-title-notallowed": "Katsele kohteen $1 suojauksen tasoa",
        "prot_1movedto2": "siirsi sivun [[$1]] uudelle nimelle [[$2]]",
        "blockipsuccesssub": "Esto onnistui",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] on estetty.<br />\nVoimassa olevat estot näkyvät [[Special:BlockList|estolistasta]].",
        "ipb-blockingself": "Olet estämässä itseäsi. Oletko varma, että haluat tehdä niin?",
-       "ipb-confirmhideuser": "Olet estämässä käyttäjää ”piilota käyttäjä” -toiminnon kanssa.  Tämä piilottaa käyttäjän nimen kaikissa luetteloissa ja lokitapahtumissa.  Oletko varma, että haluat tehdä näin?",
-       "ipb-confirmaction": "Jos olet varma että haluat todella tehdä tämän, tarkista kentän \"{{int:ipb-confirm}}\" sisältö alhaalta.",
+       "ipb-confirmhideuser": "Olet estämässä käyttäjää ”piilota käyttäjä” -toiminnon kanssa. Tämä piilottaa käyttäjän nimen kaikissa luetteloissa ja lokitapahtumissa. Oletko varma, että haluat tehdä näin?",
+       "ipb-confirmaction": "Jos olet varma että haluat todella tehdä tämän, tarkista kentän ”{{int:ipb-confirm}}” sisältö alhaalta.",
        "ipb-edit-dropdown": "Muokkaa estosyitä",
        "ipb-unblock-addr": "Poista käyttäjän $1 esto",
        "ipb-unblock": "Poista käyttäjän tai IP-osoitteen muokkausesto",
        "change-blocklink": "muuta estoa",
        "contribslink": "muokkaukset",
        "emaillink": "lähetä sähköpostia",
-       "autoblocker": "Olet automaattisesti estetty, koska jaat IP-osoitteen käyttäjän [[User:$1|$1]] kanssa. \nKäyttäjän $1 saaman eston syy on: \"$2\".",
+       "autoblocker": "Olet automaattisesti estetty, koska jaat IP-osoitteen käyttäjän [[User:$1|$1]] kanssa. \nKäyttäjän $1 saaman eston syy on: ”$2”.",
        "blocklogpage": "Estoloki",
        "blocklog-showlog": "Tämä käyttäjä on ollut aiemmin estettynä.\nAlla on ote estolokista.",
        "blocklog-showsuppresslog": "Tämä käyttäjä on ollut estettynä ja häivytettynä.\nAlla on ote häivytyslokista.",
        "cant-move-category-page": "Sinulla ei ole oikeutta siirtää luokkien sivuja.",
        "cant-move-to-category-page": "Sinulla ei ole oikeutta siirtää sivua luokkasivuksi.",
        "cant-move-subpages": "Sivulla ei ole oikeutta siirtää alasivuja.",
-       "namespace-nosubpages": "Nimiavaruus \"$1\" ei hyväksy alasivuja.",
+       "namespace-nosubpages": "Nimiavaruus ”$1” ei hyväksy alasivuja.",
        "newtitle": "Uusi nimi sivulle:",
        "move-watch": "Tarkkaile tätä sivua",
        "movepagebtn": "Siirrä sivu",
        "pagemovedsub": "Siirto onnistui",
+       "cannotmove": "Sivua ei voi siirtää {{PLURAL:$1|seuraavasta syystä|seuraavista syistä}}:",
        "movepage-moved": "'''$1 on siirretty nimelle $2'''",
        "movepage-moved-redirect": "Ohjaus luotiin.",
        "movepage-moved-noredirect": "Ohjausta ei luotu.",
        "delete_and_move_confirm": "Kyllä, poista kohdesivu",
        "delete_and_move_reason": "Sivu on sivun [[$1]] siirron tiellä.",
        "selfmove": "Nimi on sama;\nSivua ei voi siirtää itsensä päälle.",
-       "immobile-source-namespace": "Sivuja ei voi siirtää nimiavaruudessa ”$1”",
-       "immobile-target-namespace": "Sivuja ei voi siirtää nimiavaruuteen ”$1”",
+       "immobile-source-namespace": "Sivuja ei voi siirtää nimiavaruudessa ”$1”.",
+       "immobile-target-namespace": "Sivuja ei voi siirtää nimiavaruuteen ”$1”.",
        "immobile-target-namespace-iw": "Kielilinkki ei ole kelvollinen kohde sivun siirrolle.",
        "immobile-source-page": "Tämä sivu ei ole siirrettävissä.",
        "immobile-target-page": "Kyseiselle kohdenimelle ei voi siirtää.",
        "import-error-special": "Sivua $1 ei tuotu, koska se kuuluu erityiseen nimiavaruuteen, joka ei salli sivuja.",
        "import-error-invalid": "Sivua $1 ei tuotu, koska se nimi, jolle se tuotaisiin, ei ole kelvollinen tässä wikissä.",
        "import-error-unserialize": "Versiota $2 sivusta $1 ei voida jakaa osiin. Version ilmoitettiin käyttävän sisältömallia $3 ja sarjoitusmuotoilua $4.",
-       "import-error-bad-location": "Sivun versiota $2, joka käyttää sisällön mallia $3, ei voi tallettaa kohteeseen \"$1\" tässä wikissä, koska tuota mallia ei tueta kyseisellä sivulla.",
+       "import-error-bad-location": "Sivun versiota $2, joka käyttää sisällön mallia $3, ei voi tallettaa kohteeseen ”$1” tässä wikissä, koska tuota mallia ei tueta kyseisellä sivulla.",
        "import-options-wrong": "{{PLURAL:$2|Väärä asetus|Väärät asetukset}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "Annettu perussivun nimi ei kelpaa.",
-       "import-rootpage-nosubpage": "Annetun perussivun nimiavaruus \"$1\" ei salli alasivuja.",
+       "import-rootpage-nosubpage": "Annetun perussivun nimiavaruus ”$1” ei salli alasivuja.",
        "importlogpage": "Tuontiloki",
        "importlogpagetext": "Loki ylläpitäjien toisista wikeistä tuomista sivuista, joissa on muokkaushistoriaa.",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|versio|versiota}} tuotiin",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|versio|versiota}} tuotiin wikistä $2",
        "javascripttest": "JavaScriptin testaus",
-       "javascripttest-pagetext-unknownaction": "Tuntematon toiminto \"$1\".",
+       "javascripttest-pagetext-unknownaction": "Tuntematon toiminto ”$1”.",
        "javascripttest-qunit-intro": "Katso [$1 testausohjeet] mediawiki.orgissa.",
        "tooltip-pt-userpage": "{{GENDER:|Oma käyttäjäsivusi}}",
        "tooltip-pt-anonuserpage": "IP-osoitteesi käyttäjäsivu",
        "invalidateemail": "Sähköpostiosoitteen varmennuksen peruuttaminen",
        "notificationemail_subject_changed": "Sivuston {{SITENAME}} rekisteröity sähköpostiosoite on vaihdettu",
        "notificationemail_subject_removed": "Sivuston {{SITENAME}} rekisteröity sähköpostiosoite on poistettu",
-       "notificationemail_body_changed": "Joku, todennäköisesti sinä, IP-osoitteesta $1 on vaihtanut tunnuksen \"$2\" sähköpostiosoitteeksi \"$3\" sivustolla {{SITENAME}}.\n\nJos se et ollut sinä, ota yhteyttä sivuston ylläpitäjään välittömästi.",
-       "notificationemail_body_removed": "Joku, todennäköisesti sinä, IP-osoitteesta $1 on poistanut tunnuksen \"$2\" sähköpostiosoitteen sivustolla {{SITENAME}}.\n\nJos se et ollut sinä, ota yhteyttä sivuston ylläpitäjään välittömästi.",
+       "notificationemail_body_changed": "Joku, todennäköisesti sinä, IP-osoitteesta $1 on vaihtanut tunnuksen ”$2” sähköpostiosoitteeksi ”$3” sivustolla {{SITENAME}}.\n\nJos se et ollut sinä, ota yhteyttä sivuston ylläpitäjään välittömästi.",
+       "notificationemail_body_removed": "Joku, todennäköisesti sinä, IP-osoitteesta $1 on poistanut tunnuksen ”$2” sähköpostiosoitteen sivustolla {{SITENAME}}.\n\nJos se et ollut sinä, ota yhteyttä sivuston ylläpitäjään välittömästi.",
        "scarytranscludedisabled": "[Wikienvälinen sisällytys ei ole käytössä]",
        "scarytranscludefailed": "[Mallineen hakeminen epäonnistui: $1]",
        "scarytranscludefailed-httpstatus": "[Mallineen hakeminen epäonnistui: $1 HTTP $2]",
        "mcrundo-changed": "Sivu on muuttunut siitä lähtien, kun katsoit tätä muokkausta. Arvioi uusi muokkaus.",
        "mcrundo-parse-failed": "Uuden version jäsentäminen epäonnistui: $1",
        "percent": "$1&#160;%",
-       "quotation-marks": "\"$1\"",
+       "quotation-marks": "”$1”",
        "imgmultipageprev": "← edellinen sivu",
        "imgmultipagenext": "seuraava sivu →",
        "imgmultigo": "Siirry",
        "watchlisttools-raw": "Muokkaa listaa raakamuodossa",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|keskustelu]])",
        "timezone-local": "Paikallinen",
-       "duplicate-defaultsort": "'''Varoitus:''' Oletuslajitteluavain ”$2” korvaa aiemman oletuslajitteluavaimen ”$1”.",
-       "duplicate-displaytitle": "<strong>Varoitus:</strong> Näytettävä otsikko \"$2\" päällekirjoittaa edellisen otsikon \"$1\".",
-       "restricted-displaytitle": "<strong>Varoitus:</strong> Näytettävää otsikkoa \"$1\" ei huomioitu, koska se ei vastaa sivun oikeaa nimeä.",
+       "duplicate-defaultsort": "<strong>Varoitus:</strong> Oletuslajitteluavain ”$2” korvaa aiemman oletuslajitteluavaimen ”$1”.",
+       "duplicate-displaytitle": "<strong>Varoitus:</strong> Näytettävä otsikko ”$2” korvaa edellisen otsikon ”$1”.",
+       "restricted-displaytitle": "<strong>Varoitus:</strong> Näytettävää otsikkoa ”$1” ei huomioitu, koska se ei vastaa sivun oikeaa nimeä.",
        "invalid-indicator-name": "<strong>Virhe:</strong> Sivun tilan osoittimien attribuutti <code>name</code> ei saa olla tyhjä.",
        "version": "Versio",
        "version-extensions": "Asennetut laajennukset",
        "tags-create-no-name": "Sinun täytyy antaa merkkaukselle nimi.",
        "tags-create-invalid-chars": "Merkkausten nimissä ei saa olla pilkkuja (<code>,</code>), putkia (<code>|</code>) tai kauttaviivoja (<code>/</code>).",
        "tags-create-invalid-title-chars": "Merkkausten nimissä ei saa olla sellaisia merkkejä, joita ei voida käyttää sivujen nimissä.",
-       "tags-create-already-exists": "Merkkaus \"$1\" on jo olemassa.",
-       "tags-create-warnings-above": "{{PLURAL:$2|Seuraava varoitus|Seuraavat varoitukset}} ilmenivät, kun yritettiin luoda merkkausta \"$1\":",
+       "tags-create-already-exists": "Merkkaus ”$1” on jo olemassa.",
+       "tags-create-warnings-above": "{{PLURAL:$2|Seuraava varoitus|Seuraavat varoitukset}} ilmenivät, kun yritettiin luoda merkkausta ”$1”:",
        "tags-create-warnings-below": "Haluatko jatkaa merkkauksen luomista?",
        "tags-delete-title": "Hävitä merkkaus pysyvästi",
-       "tags-delete-explanation-initial": "Olet parhaillaan poistamassa (eli tuhoamassa pysyvästi) merkkauksen \"$1\" tietokannasta.",
+       "tags-delete-explanation-initial": "Olet parhaillaan poistamassa (eli tuhoamassa pysyvästi) merkkauksen ”$1” tietokannasta.",
        "tags-delete-explanation-in-use": "Se poistuu {{PLURAL:$2|$2 sivun versiosta tai lokimerkinnästä|kaikista $2 sivuversiosta tai lokimerkinnöistä}}, joissa se tällä hetkellä on käytössä.",
        "tags-delete-explanation-warning": "Tämä toimenpide on <strong>peruuttamaton</strong> ja <strong>poistettua merkkausta ei voi palauttaa takaisin</strong>. Siihen ei pysty edes tietokannan ylläpitohenkilöstö. Sinun pitää olla täysin varma, että haluat poistettavaksi juuri tämän merkkauksen.",
-       "tags-delete-explanation-active": "<stron>Merkkaus \"$1\" on edelleen käytössä ja sitä käytetään myös jatkossa.</strong>. Jos haluat merkkauksen pois käytöstä, mene sinne missä merkkaus on asetettu ja ota se pois siellä.",
+       "tags-delete-explanation-active": "<strong>Merkkaus ”$1” on edelleen käytössä ja sitä käytetään myös jatkossa.</strong>. Jos haluat merkkauksen pois käytöstä, mene sinne missä merkkaus on asetettu ja ota se pois siellä.",
        "tags-delete-reason": "Syy:",
        "tags-delete-submit": "Tuhoa tämä merkkaus peruuttamattomasti ja pysyvästi",
        "tags-delete-not-allowed": "Sellaisia merkkauksia, jotka tulevat erityisestä ohjelmistolaajennuksesta, ei voi poistaa ennen kuin tämä laajennus erityisesti sallii sen.",
-       "tags-delete-not-found": "Merkkausta \"$1\" ei ole olemassa.",
-       "tags-delete-too-many-uses": "Tämä merkkaus \"$1\" on käytössä useammassa kuin $2 sivuversiossa, joten sitä ei voi poistaa.",
-       "tags-delete-warnings-after-delete": "Merkkaus \"$1\" poistettiin, mutta toimenpide sai aikaan {{PLURAL:$2|seuraavan varoituksen|seuraavat varoitukset}}:",
+       "tags-delete-not-found": "Merkkausta ”$1” ei ole olemassa.",
+       "tags-delete-too-many-uses": "Tämä merkkaus ”$1” on käytössä useammassa kuin $2 sivuversiossa, joten sitä ei voi poistaa.",
+       "tags-delete-warnings-after-delete": "Merkkaus ”$1” poistettiin, mutta toimi sai aikaan {{PLURAL:$2|seuraavan varoituksen|seuraavat varoitukset}}:",
        "tags-delete-no-permission": "Sinulla ei ole oikeutta poistaa muutoksien yhteydessä olevia merkkauksia.",
        "tags-activate-title": "Aktivoi merkkaus",
-       "tags-activate-question": "Olet nyt aktivoimassa merkkausta \"$1\".",
+       "tags-activate-question": "Olet nyt aktivoimassa merkkausta ”$1”.",
        "tags-activate-reason": "Syy:",
-       "tags-activate-not-allowed": "Ei ole mahdollista aktivoida merkkausta \"$1\".",
-       "tags-activate-not-found": "Merkkausta \"$1\" ei ole olemassa.",
+       "tags-activate-not-allowed": "Ei ole mahdollista aktivoida merkkausta ”$1”.",
+       "tags-activate-not-found": "Merkkausta ”$1” ei ole olemassa.",
        "tags-activate-submit": "Aktivoi",
        "tags-deactivate-title": "Ota merkkaus pois käytöstä",
-       "tags-deactivate-question": "Olet parhaillaan poistamassa käytöstä (eli deaktivoimassa) merkkausta \"$1\".",
+       "tags-deactivate-question": "Olet parhaillaan poistamassa käytöstä (eli deaktivoimassa) merkkausta ”$1”.",
        "tags-deactivate-reason": "Syy:",
-       "tags-deactivate-not-allowed": "Ei ole mahdollista poistaa käytöstä merkkausta \"$1\".",
+       "tags-deactivate-not-allowed": "Ei ole mahdollista poistaa käytöstä merkkausta ”$1”.",
        "tags-deactivate-submit": "Poista käytöstä",
        "tags-apply-no-permission": "Sinulla ei ole oikeutta käyttää merkkauksia muutostesi yhteydessä.",
        "tags-apply-blocked": "Et voi asettaa merkkauksia muutostesi yhteyteen, kun {{GENDER:$1|olet}} estettynä.",
-       "tags-apply-not-allowed-one": "Merkkausta \"$1\" ei ole sallittua asettaa käsin.",
+       "tags-apply-not-allowed-one": "Merkkausta ”$1” ei ole sallittua asettaa käsin.",
        "tags-apply-not-allowed-multi": "Seuraavia {{PLURAL:$2|merkkauksia}} ei ole sallittua asettaa käsin: $1",
        "tags-update-no-permission": "Sinulla ei ole oikeutta lisätä tai poistaa merkkauksia yksittäisissä sivuversioissa tai lokimerkinnöissä.",
        "tags-update-blocked": "Et voi lisätä tai poistaa merkkauksia, kun {{GENDER:$1|olet}} estettynä.",
-       "tags-update-add-not-allowed-one": "Merkkausta \"$1\" ei ole sallittua asettaa käsin.",
+       "tags-update-add-not-allowed-one": "Merkkausta ”$1” ei ole sallittua asettaa käsin.",
        "tags-update-add-not-allowed-multi": "Seuraavia {{PLURAL:$2|merkkauksia}} ei ole sallittua asettaa käsin: $1",
-       "tags-update-remove-not-allowed-one": "Merkkausta \"$1\" ei ole sallittua poistaa.",
+       "tags-update-remove-not-allowed-one": "Merkkausta ”$1” ei ole sallittua poistaa.",
        "tags-update-remove-not-allowed-multi": "Seuraavia {{PLURAL:$2|merkkauksia}} ei ole sallittua poistaa käsin: $1",
        "tags-edit-title": "Muokkaa merkkauksia",
        "tags-edit-manage-link": "Hallinnoi merkkauksia",
        "logentry-upload-revert": "$1 {{GENDER:$2|tallensi}} tiedoston $3",
        "log-name-managetags": "Merkkausten hallinnan loki",
        "log-description-managetags": "Tällä sivulla on luettelo tehtävistä, jotka koskevat [[Special:Tags|merkkauksia]]. Lokissa ovat vain ne toimenpiteet, jotka ylläpitäjä on suorittanut käsin. Merkkauksia voi syntyä ja poistua myös wikin ohjelmiston kautta eivätkä ne näy tässä lokissa.",
-       "logentry-managetags-create": "$1 {{GENDER:$2|on luonut}} merkkauksen \"$4\"",
-       "logentry-managetags-delete": "$1 {{GENDER:$2|tuhosi}} merkkauksen \"$4\" (poistettu $5 {{PLURAL:$5|sivuversiosta tai lokimerkinnästä}})",
-       "logentry-managetags-activate": "$1 {{GENDER:$2|aktivoi}} merkkauksen \"$4\" käyttäjien ja bottien käytettäväksi",
-       "logentry-managetags-deactivate": "$1 {{GENDER:$2|otti pois käytöstä}} merkkauksen \"$4\" käyttäjiltä ja boteilta",
+       "logentry-managetags-create": "$1 {{GENDER:$2|on luonut}} merkkauksen ”$4”",
+       "logentry-managetags-delete": "$1 {{GENDER:$2|tuhosi}} merkkauksen ”$4” (poistettu $5 {{PLURAL:$5|sivuversiosta tai lokimerkinnästä}})",
+       "logentry-managetags-activate": "$1 {{GENDER:$2|aktivoi}} merkkauksen ”$4” käyttäjien ja bottien käytettäväksi",
+       "logentry-managetags-deactivate": "$1 {{GENDER:$2|otti pois käytöstä}} merkkauksen ”$4” käyttäjiltä ja boteilta",
        "log-name-tag": "Merkkausloki",
        "log-description-tag": "Tällä sivulla näytetään käyttäjien lisäämät tai poistamat [[Special:Tags|merkkaukset]] yksittäisissä sivuversioissa tai lokimerkinnöissä. Lokiin eivät kirjaudu merkkaukset silloin, kun ne tulevat muokkaamisen, poistamisen tai muun vastaavan toimenpiteen yhteydessä.",
        "logentry-tag-update-add-revision": "$1 {{GENDER:$2|lisäsi}} {{PLURAL:$7|merkkauksen|merkkaukset}} $6 kohdeversioon $4 sivulla $3",
        "feedback-back": "Takaisin",
        "feedback-bugcheck": "Hyvä! Varmista vielä, että ohjelmointivirhettä ei löydy [$1 tunnettujen virheiden luettelosta].",
        "feedback-bugnew": "Olen varmistanut. Ilmoitan uuden ohjelmointivirheen",
-       "feedback-bugornote": "Jos voit kuvailla teknisen ongelman tarkasti – [$1 ilmoita ohjelmointivirheestä].\nMuussa tapauksessa voit käyttää alla olevaa helpompaa lomaketta. Kommenttisi lisätään sivulle [$3 $2], ja siinä on mukana käyttäjätunnuksesi.",
+       "feedback-bugornote": "Jos voit kuvailla teknisen ongelman tarkasti, [$1 ilmoita ohjelmointivirheestä].\nMuussa tapauksessa voit käyttää alla olevaa helpompaa lomaketta. Kommenttisi lisätään sivulle [$3 $2], ja siinä on mukana käyttäjätunnuksesi.",
        "feedback-cancel": "Peruuta",
        "feedback-close": "Valmis",
        "feedback-external-bug-report-button": "Lähetä tekninen tehtävä",
        "feedback-dialog-title": "Lähetä palautetta",
-       "feedback-dialog-intro": "Voit käyttää tätä helppoa lomaketta palautteesi lähettämiseen. Kommenttisi lisätään sivulle \"$1\" käyttäjätunnuksesi kera.",
+       "feedback-dialog-intro": "Voit käyttää tätä helppoa lomaketta palautteesi lähettämiseen. Kommenttisi lisätään sivulle ”$1” käyttäjätunnuksesi kera.",
        "feedback-error1": "Virhe: Ohjelmointirajapinnan vastausta ei tunnistettu",
        "feedback-error2": "Virhe: Muokkaus epäonnistui",
        "feedback-error3": "Virhe: Ohjelmointirajapinta ei vastaa",
        "api-error-emptypage": "Ei ole sallittua luoda uutta, tyhjää sivua.",
        "api-error-publishfailed": "Sisäinen virhe: Väliaikaisen tiedoston julkaiseminen epäonnistui.",
        "api-error-stashfailed": "Sisäinen virhe: Väliaikaisen tiedoston tallentaminen epäonnistui.",
-       "api-error-unknown-warning": "Tuntematon varoitus: \"$1\".",
+       "api-error-unknown-warning": "Tuntematon varoitus: ”$1”.",
        "api-error-unknownerror": "Tuntematon virhe: $1.",
        "duration-seconds": "$1 {{PLURAL:$1|sekunti|sekuntia}}",
        "duration-minutes": "$1 {{PLURAL:$1|minuutti|minuuttia}}",
        "authprovider-confirmlink-ok-help": "Jatka yhteydenottohäiriöilmoitusten näyttämisen jälkeen.",
        "authprovider-resetpass-skip-label": "Ohita",
        "authprovider-resetpass-skip-help": "Ohita salasanan palautus.",
-       "authform-nosession-login": "Varmennus onnistui, mutta selaimesi ei pysty \"muistamaan\" sisäänkirjautumista.\n\n$1",
-       "authform-nosession-signup": "Tunnus luotiin, mutta selaimesi ei pysty \"muistamaan\" sisäänkirjautumista.\n\n$1",
-       "authform-newtoken": "Puuttuva \"token\". $1",
-       "authform-notoken": "Puuttuva \"token\"",
-       "authform-wrongtoken": "Väärä \"token\"",
+       "authform-nosession-login": "Varmennus onnistui, mutta selaimesi ei pysty ”muistamaan” sisäänkirjautumista.\n\n$1",
+       "authform-nosession-signup": "Tunnus luotiin, mutta selaimesi ei pysty ”muistamaan” sisäänkirjautumista.\n\n$1",
+       "authform-newtoken": "Puuttuva ”token”. $1",
+       "authform-notoken": "Puuttuva ”token”",
+       "authform-wrongtoken": "Väärä ”token”",
        "specialpage-securitylevel-not-allowed-title": "Ei sallittu",
        "specialpage-securitylevel-not-allowed": "Valitettavasti sinulla ei ole oikeutta muokata tätä sivua, koska henkilöllisyyttäsi ei voitu varmentaa.",
        "authpage-cannot-login": "Kirjautumista ei voitu aloittaa.",
        "passwordpolicies-policy-passwordcannotmatchblacklist": "Salasana ei saa olla mustalla listalla",
        "passwordpolicies-policy-maximalpasswordlength": "Salasanan tulee olla lyhyempi kuin $1 {{PLURAL:$1|merkki|merkkiä}}",
        "passwordpolicies-policy-passwordcannotbepopular": "Salasana ei saa olla {{PLURAL:$1|suosittu salasana|$1 suosituimman salasanan listalla}}",
+       "passwordpolicies-policy-passwordnotinlargeblacklist": "Salasana ei voi olla 100&nbsp;000 yleisimmin käytetyn joukossa.",
        "unprotected-js": "Turvallisuussyistä JavaScriptiä ei voi ladata suojaamattomilta sivuilta. Luo JavaScript-sivuja vain MediaWiki-nimiavaruuteen tai käyttäjän alasivulle."
 }
index 1716146..b457f4c 100644 (file)
        "exif-compression": "Type de compression",
        "exif-photometricinterpretation": "Modèle colorimétrique",
        "exif-orientation": "Orientation",
-       "exif-samplesperpixel": "Composantes par pixel",
+       "exif-samplesperpixel": "Nombre de composants",
        "exif-planarconfiguration": "Arrangement des données",
        "exif-ycbcrsubsampling": "Taux de sous-échantillonnage de Y à C",
        "exif-ycbcrpositioning": "Positionnement YCbCr",
index 3327882..efff545 100644 (file)
@@ -87,7 +87,7 @@
        "tog-watchlisthideminor": "Apró változtatások elrejtése",
        "tog-watchlisthideliu": "Bejelentkezett szerkesztők módosításainak elrejtése a figyelőlistáról",
        "tog-watchlistreloadautomatically": "A figyelőlista automatikus újratöltése bármelyik szűrő megváltoztatása esetén (JavaScript szükséges)",
-       "tog-watchlistunwatchlinks": "Figyelőlista elemeinek eltávolítására szolgáló közvetlen link hozzáadása (JavaScript szükséges)",
+       "tog-watchlistunwatchlinks": "Figyelőlista elemeinek eltávolítására szolgáló közvetlen link ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) hozzáadása (JavaScript szükséges)",
        "tog-watchlisthideanons": "Névtelen szerkesztések elrejtése",
        "tog-watchlisthidepatrolled": "Az ellenőrzött szerkesztések elrejtése",
        "tog-watchlisthidecategorization": "Lapok kategorizálásának elrejtése",
        "passwordtooshort": "A jelszónak legalább $1 karakterből kell állnia.",
        "passwordtoolong": "A jelszó nem lehet hosszabb $1 karakternél.",
        "passwordtoopopular": "A gyakran használt jelszavak nem használhatók. Válassz olyan jelszót, amit nehezebb kitalálni.",
+       "passwordinlargeblacklist": "A megadott jelszó szerepel a gyakran használt jelszavak listáján. Kérlek, válassz egyedibb jelszót.",
        "password-name-match": "A jelszavadnak különböznie kell a szerkesztőnevedtől.",
        "password-login-forbidden": "Ezen felhasználónév és jelszó használata tiltott.",
        "mailmypassword": "Jelszó alaphelyzetbe állítása",
        "recentchangescount": "Az alapértelmezettként mutatott szerkesztések száma a friss változtatásoknál, laptörténetekben és naplókban:",
        "prefs-help-recentchangescount": "Legfeljebb 1000",
        "prefs-help-watchlist-token2": "Ez a titkos kulcs a figyelőlistádhoz.\nAki ismeri, meg tudja nézni, milyen lapokat figyelsz, úgyhogy ne oszd meg másokkal.\nHa meg szeretnéd változtatni, [[Special:ResetTokens|kattints ide]].",
+       "prefs-help-tokenmanagement": "Megtekintheted és új titkos kulcsot generálhatsz, amivel a webes feedek hozzáférhetnek a figyelőlistádhoz. Bárki, aki ismeri ezt a kulcsot képes olvasni a figyelőlistád tartalmát, ezért ne oszd meg mással.",
        "savedprefs": "Az új beállításaid érvénybe léptek.",
        "savedrights": "{{GENDER:$1|$1}} felhasználói csoportjai el lettek mentve.",
        "timezonelegend": "Időzóna:",
        "rcfilters-watchlist-markseen-button": "Összes változtatás megjelölése olvasottként",
        "rcfilters-watchlist-edit-watchlist-button": "A figyelőlistád szerkesztése",
        "rcfilters-watchlist-showupdated": "Az újabb változtatások, amiket még nem néztél meg, <strong>vastagítva</strong> láthatók, kitöltött jelzőkkel.",
-       "rcfilters-preference-label": "A friss változtatások fejlesztett változatának elrejtése",
-       "rcfilters-preference-help": "A 2017-es felületátdolgozás és minden azóta hozzáadott eszköz visszaállítása.",
-       "rcfilters-watchlist-preference-label": "A Figyelőlista fejlesztett változatának elrejtése",
-       "rcfilters-watchlist-preference-help": "A 2017-es felületátdolgozás és minden azóta hozzáadott eszköz visszaállítása.",
+       "rcfilters-preference-label": "JavaScript-nélküli felület használata",
+       "rcfilters-preference-help": "Friss változtatások betöltése szűrők és kiemelések nélkül.",
+       "rcfilters-watchlist-preference-label": "JavaScript-nélküli felület használata",
+       "rcfilters-watchlist-preference-help": "Friss változtatások betöltése szűrők és kiemelések nélkül.",
        "rcfilters-filter-showlinkedfrom-label": "A következő lapra hivatkozó lapok változtatásainak megjelenítése",
        "rcfilters-filter-showlinkedfrom-option-label": "A kiválasztott <strong>lapról</strong> hivatkozott lapok",
        "rcfilters-filter-showlinkedto-label": "A következő lapról hivatkozott lapok változtatásainak megjelenítése",
        "passwordpolicies-policy-passwordcannotmatchblacklist": "A jelszó nem lehet azonos a feketelistán szereplő jelszavakkal.",
        "passwordpolicies-policy-maximalpasswordlength": "A jelszó legfeljebb $1 karakter hosszú lehet",
        "passwordpolicies-policy-passwordcannotbepopular": "A jelszó nem {{PLURAL:$1|lehet a gyakran használt jelszó|szerepelhet a(z) $1 leggyakrabban használt jelszó listáján}}",
+       "passwordpolicies-policy-passwordnotinlargeblacklist": "A jelszó nem szerepelhet a 100 000 leggyakrabban használt jelszó listáján .",
        "unprotected-js": "Biztonsági okokból JavaScript nem tölthető be védtelen lapokról. Kérlek egyedül a MediaWiki névtérben készíts JavaScriptet, vagy szerkesztői allapként."
 }
index 7231d39..53dd90a 100644 (file)
        "tooltip-ca-move": "Sposta questa pagina (cambia titolo)",
        "tooltip-ca-watch": "Aggiungi questa pagina alla tua lista degli osservati speciali",
        "tooltip-ca-unwatch": "Rimuovi questa pagina dalla tua lista degli osservati speciali",
-       "tooltip-search": "Cerca all'interno di {{SITENAME}}",
+       "tooltip-search": "Cerca in {{SITENAME}}",
        "tooltip-search-go": "Vai a una pagina con il titolo indicato, se esiste",
        "tooltip-search-fulltext": "Cerca il testo indicato nelle pagine",
        "tooltip-p-logo": "Visita la pagina principale",
        "feedback-thanks": "Grazie! Il tuo feedback è stato pubblicato alla pagina \"[$2 $1]\".",
        "feedback-thanks-title": "Grazie!",
        "feedback-useragent": "User agent:",
-       "searchsuggest-search": "Cerca all'interno di {{SITENAME}}",
+       "searchsuggest-search": "Cerca in {{SITENAME}}",
        "searchsuggest-containing": "contenente...",
        "api-error-badtoken": "Errore interno: token errato.",
        "api-error-emptypage": "La creazione di nuove pagine vuote non è consentita.",
index fdbe738..f50fe7c 100644 (file)
        "newsectionsummary": "/* $1 */ pérangan anyar",
        "rc-enhanced-expand": "Tuduhaké princèn",
        "rc-enhanced-hide": "Dhelikaké princèn",
-       "rc-old-title": "kawitané digawé minangka \"$1\"",
+       "rc-old-title": "kawitané kagawé minangka \"$1\"",
        "recentchangeslinked": "Owahan magepokan",
        "recentchangeslinked-feed": "Owah-owahan kang magepokan",
        "recentchangeslinked-toolbox": "Owahan magepokan",
index ad8495c..81ff335 100644 (file)
        "preferences": "ဆ်ုလုဲႋလ်ုဖး",
        "mypreferences": "မ်ုလုဲႋၯံင်လ်ုဖး",
        "prefs-user-pages": "ဆ်ုသုံႋဏင့်ဆာႋ လိက်မေံၜၠါ်လ်ုဖး",
+       "prefs-watchlist": "ခိုဝ်ယောဝ်ႋစ်ုရင့်",
        "username": "{{GENDER:$1|ဆ်ုသုံႋဆာႋမိင်}}:",
        "editusergroup": "မ်ုၮဲဖှ်ေ ဆ်ုသုံႋဆာႋကုံရွာဲ",
        "group-user": "ဆ်ုသုံႋဆာႋလ်ုဖး",
        "upload": "မ်ုပ္တုံင်ထါင်ဖိုင်ႋ",
        "uploadlogpage": "ဖိုင်ႋတုံထါင်း ဆ်ုမာၮါင်း",
        "filedesc": "အ်ုအိင်း",
+       "upload-form-label-infoform-description": "ဆ်ုဏဲဖၠဟ်",
        "license": "လိုင်စင်ပၞံင့်ပ္တုံ",
        "license-header": "လိုင်စင်ပၞံင့်ပ္တုံ",
        "imgfile": "ဖိုင်ႋ",
        "listfiles": "ဖိုင်ႋစ်ုရင့်",
+       "listfiles_description": "ဆ်ုဏဲဖၠဟ်",
        "listfiles-latestversion-yes": "မွာဲ",
        "file-anchor-link": "ဖိုင်",
        "filehist": "ဃွှာန့်မေင်ႋစိင်",
        "nmembers": "ကုံလွာဲဆာ $1 {{PLURAL:$1|ၮါင်း|ၮါင်းလ်ုဖး}}",
        "prefixindex": "အ်ုမေံယာ့ prefix အှ် လိက်မေံၜၠါ်လုက်ဆိင့်",
        "listusers": "ဆ်ုအင်းသုံ့ဆာစ်ုရင့်",
+       "usercreated": "$1 $2 အ်ုခါ့ဏှ် {{GENDER:$3|ပ္တံင်ထ​ဝေ့လှ်}}",
        "newpages": "လိက်မေံသင့်",
        "newpages-username": "ဏင့်ဆာႋမိင်:",
        "move": "မ်ုသုဂ်",
        "namespace_association": "ထိုဝ်ၜိုဒ်ၜးဍံင်အှ် ၮဲဖှ်ေမိင်ႋ",
        "tooltip-namespace_association": "လုဲႋထ အ်ုမၠိင်က္ဍာထါင်လ်ု ၜးထိုဝ်ၜုဂ်လိက်လ်ုဖး အှ်ကုံဆ်ုခၠါင် လ်ုမွာဲၜး အ်ုၯာင်းအ်ုကျံင် အ်ုမိင်ထါင်ၮဲထါင် မ်ုပါ့ၯင်း လိက်လင်ခွင်ဝယ်ယိုဝ် ဆူ့လင်ဆ်ုၜးကီလာဆှ်",
        "blanknamespace": "(ခေါဟ်)",
-       "contributions": "{{GENDER:$1|á\80\86á\80ºá\80¯á\80\9eá\80¯á\80¶á\82\8bá\80\86á\80¬á\82\8b}}á\80\81á\80\9dá\80·á\80º á\80\86á\80ºá\80¯á\80\9eá\80¯á\80\82á\80ºá\80\80á\81 á\80\9aá\80ºလ်ုဖး",
+       "contributions": "{{GENDER:$1|á\80\86á\80ºá\80¯á\80\9eá\80¯á\80¶á\82\8bá\80\8fá\80\84á\80·á\80ºá\80\86á\80¬á\82\8b}}á\80\81á\80\9dá\80·á\80º á\80\86á\80ºá\80¯á\80¡á\80\84á\80ºá\80¸á\80\99á\80¬လ်ုဖး",
        "contributions-title": "$1 ၯင်း ဆ်ုအင်းသုံ့က်ုဆာ ဆ်ုဍုဂ်ဆ်ုကၠယ် $1",
        "mycontris": "ဆ်ုမာဖှ်ေထဆာႋလ်ုဖး",
        "anoncontribs": "ဆ်ုမာဖှ်ေထဆာႋလ်ုဖး",
        "tooltip-t-whatlinkshere": "အ်ုလင်ယိုဝ် ဆ်ုၮဲလင်လင့်ထ ဝီကီလိက်မေံစ်ုရင့်",
        "tooltip-t-recentchangeslinked": "လိက်မေံယိုဝ်ခဝ့် ၮဲဖှ်ေထါင်ထဝေ့ လိက်မေံသယ်လ်ုဖး အ်ုခါ့ ဆ်ုအင်းလဲါသာ့လ်ုဖး",
        "tooltip-feed-atom": "လိက်မေံယိုဝ်ၯင်း Atom feed",
-       "tooltip-t-contributions": "{{GENDER:$1|á\80\86á\80ºá\80¯á\80\9eá\80¯á\80¶á\80·á\80\80á\80ºá\80¯á\80\86á\80¬á\80\9aá\80­á\80¯á\80\9dá\80º}}á\80\81á\80\9dá\80·á\80º á\80\86á\80ºá\80¯á\80\90á\80¯á\80\82á\80ºá\80\80á\81 á\80\9aá\80º စ်ုရင့်",
+       "tooltip-t-contributions": "{{GENDER:$1|á\80\86á\80ºá\80¯á\80\9eá\80¯á\80¶á\80·á\80\8fá\80\84á\80·á\80ºá\80\86á\80¬á\82\8bá\80\9aá\80­á\80¯á\80\9dá\80º}}á\80\81á\80\9dá\80·á\80º á\80\86á\80ºá\80¯á\80¡á\80\84á\80ºá\80¸á\80\99á\80¬á\80\9cá\80ºá\80¯á\80\96á\80¸ စ်ုရင့်",
        "tooltip-t-emailuser": "{{GENDER:$1|ဆ်ုသုံ့ဆာအိုဝ်}} မ်ုသုံ့အီးမေး",
        "tooltip-t-upload": "မ်ုပ္တုံင်ထါင်ဖိုင်ႋ",
        "tooltip-t-specialpages": "လိက်မေံ ခေါဟ် လုက်ဆိင့်",
        "watchlisttools-raw": "ခိုဝ်ယောဝ်ႋစ်ုရင့် လိက်ခၠံင့်သယ် မ်ုအင်းတင်",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|လေဝ်ထါင်ဆ်ုခၠါင်]])",
        "version-specialpages": "လိက်မေံၜၠါ်ခေါဟ်လ်ုဖး",
+       "version-ext-colheader-description": "ဆ်ုဏဲဖၠဟ်",
+       "version-libraries-description": "ဆ်ုဏဲဖၠဟ်",
        "redirect": "ဖိုင်ႋ၊ သုံ့က်ုဆာ၊ လိက်မေံၜၠါ်၊ ဆ်ုအင်းတင်၊ လ်ုမွာဲၜး မာၮါင်းအိုင်ဒီ ခဝ့် ထါင်ၮဲထါင်ဖှ်ေ",
        "redirect-summary": "လိက်မေံခေါဟ်ယိုဝ် ဖိုင်ႋလ်ုၮါင်း (ဖှ်ေထ ဖိုင်ႋအ်ုမိင်)၊ လိက်မေံလ်ုၮါင်း (ဖှ်ေထ ဆ်ုအင်းတင် အိုင်ဒီ လ်ု လိက်မေံၜၠါ်အိုင်ဒီ)၊ ဆ်ုသုံ့ဆာမိင် (ဖှ်ေထ ဆ်ုသုံ့ဆာမိင်ဝီႋဖၠုံးအိုင်ဒီ)၊ လ်ုမွာဲၜး မာၮါင်းလ်ုၮါင်း (ဖှ်ေထ ဆ်ုမာၮါင်းအိုင်ဒီ) ခဝ့်အိုဝ် ထါင်ၮဲထါင်ဆေဝ်ႋလှ်။ ၜးသုံ့ပ်ုဍံင် - [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], လ်ုမွာဲၜး [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "လေဝ်",
index 4a381f3..7ede986 100644 (file)
        "userlogin-reauth": "당신이 {{GENDER:$1|$1}}임을 검증하려면 다시 로그인해야 합니다.",
        "userlogin-createanother": "다른 계정 만들기",
        "createacct-emailrequired": "이메일 주소",
-       "createacct-emailoptional": "이메일 주소 (선택 사항)",
+       "createacct-emailoptional": "이메일 주소(선택 사항)",
        "createacct-email-ph": "이메일 주소를 입력하세요",
        "createacct-another-email-ph": "이메일 주소를 입력하세요",
        "createaccountmail": "임의의 임시 비밀번호를 이메일로 보내기",
        "createaccountmail-help": "비밀번호를 기억하지 않고도 다른 사용자를 위한 계정을 만들 수 있습니다.",
        "createacct-realname": "실명 (선택 사항)",
        "createacct-reason": "이유",
-       "createacct-reason-ph": "왜 다른 계정을 또 만들어야 합니까",
+       "createacct-reason-ph": "다른 계정을 만들어야 하는 이유가 있나요",
        "createacct-reason-help": "계정 생성 로그에 표시되는 메시지",
        "createacct-submit": "계정 만들기",
        "createacct-another-submit": "계정 만들기",
        "prefs-advancedwatchlist": "고급 옵션",
        "prefs-displayrc": "표시 설정",
        "prefs-displaywatchlist": "표시 설정",
+       "prefs-changesrc": "표시되는 변경사항",
+       "prefs-changeswatchlist": "표시되는 변경사항",
        "prefs-pageswatchlist": "주시 중인 문서",
        "prefs-tokenwatchlist": "토큰",
        "prefs-diffs": "차이",
index bde1da2..880416a 100644 (file)
        "updated": "(Novata)",
        "note": "'''Nota:'''",
        "previewnote": "<strong>Memento istud nihil esse nisi prospectum!</strong>\nMutationes tuae nondum servatae sunt!",
-       "editing": "Recensio paginae \"$1\"",
-       "creating": "Creans $1",
-       "editingsection": "Recensens $1 (partem)",
-       "editingcomment": "Recensens $1 (nova pars)",
+       "editing": "Recensetur $1",
+       "creating": "Creabitur $1",
+       "editingsection": "Recensetur $1 (partim)",
+       "editingcomment": "Recensetur $1 (nova pars)",
        "editconflict": "Contentio recensionis: $1",
        "explainconflict": "Alius hanc paginam mutavit postquam eadem recensere incipiebas.\nCapsa superior paginae verba recentissima continet.\nMutationes tuae in capsa inferiore monstrantur.\nMutationes tuae in verba superiora adiungare debes.\n'''Solum''' verba capsae superioris servabuntur quando \"$1\" premes.",
        "yourtext": "Tua redactio",
index 700ae7c..33c0478 100644 (file)
        "rcfilters-watchlist-edit-watchlist-button": "Ännert Är Lëscht vun iwwerwaachte Säiten",
        "rcfilters-watchlist-showupdated": "Ännerungen op Säiten déi Dir net besicht hutt zanter d'Ännerunge gemaach goufen si <strong>fett</strong> geschriwwen.",
        "rcfilters-preference-label": "Déi verbessert Versioun vun de rezenten Ännerunge verstoppen",
-       "rcfilters-watchlist-preference-label": "Déi verbessert Versioun vun der Iwwerwaachungslëscht verstoppen",
+       "rcfilters-watchlist-preference-label": "Den Interface ouni JavaScript benotzen",
        "rcfilters-target-page-placeholder": "Gitt en Numm vun enger Säit (oder enger Kategorie) an",
        "rcnotefrom": "Hei drënner {{PLURAL:$5|gëtt d'Ännerung|ginn d'Ännerungen}} zanter <strong>$3, $4</strong> (maximal <strong>$1</strong> Ännerunge gi gewisen).",
        "rclistfromreset": "Eraussiche vum Datum zrécksetzen",
index 23be18d..71caf85 100644 (file)
        "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-user": "प्रयोक्ता $1 {{अन्तर्जाल}} पर अहाँक खाता विवरणक {{SITENAME}} लेल फेरसँ ($4) आग्रह केने छथि। ई प्रयोक्ता {{PLURAL:$3|खाता अछि|खाता सभ अछि}} ऐ ई-पत्र संकेतसँ जुड़ल: $2\n{{PLURAL:$3| ई अस्थायी कूटशब्द|ई सभ अस्थायी कूटशब्द}} खतम भऽ जाएत {{PLURAL:$5|एक दिन|$5 दिन}} मे।\nअहाँ सम्प्रवेश करू आ एकटा नव कूटशब्द आब चुनू। जँ कियो दोसर ई आग्रह केने छथि, वा जँ अहाँकेँ अपन मूल कूटशब्द मोन पड़ि गेल अछि, आ अहाँ आब ओइ कूटशब्दकेँ नै बदलऽ चाहै छी, अहाँ ऐ संदेशकेँ बिसरि सकै छी आ अपन पुरान कूटशब्दक प्रयोग जारी राखि सकै छी।",
        "passwordreset-emailelement": "प्रयोक्ता: \n$1\n\nअस्थायी कूटशब्द: \n$2",
        "passwordreset-emailsentemail": "एकटा ई-पत्र मोन पाड़बा लेल पठाओल गेल अछि।",
+       "passwordreset-nocaller": "कॉलर प्रदान करैलजाय",
        "passwordreset-invalidemail": "अवैध इमेल ठेगान",
        "passwordreset-nodata": "प्रयोगकर्ता नाम वा इमेल ठेगान नै देल गेल छल",
        "changeemail": "ई-मेल पता परिवर्तित करी",
        "publishpage": "पृष्ठ प्रकाशित करी",
        "publishchanges": "परिवर्तन प्रकाशित करी",
        "savearticle-start": "पन्नाक रक्षण करू",
+       "savechanges-start": "रक्षण करी",
+       "publishpage-start": "पृष्ठ प्रकाशित करी",
+       "publishchanges-start": "परिवर्तन प्रकाशित करी",
        "preview": "पूर्वावलोकन",
        "showpreview": "पूर्वप्रदर्शन",
        "showdiff": "परिवर्तन देखाबी",
        "rcfilters-filter-watchlistactivity-seen-label": "परिवर्तन सभ चुनु",
        "rcfilters-filtergroup-changetype": "बदल क प्रकार:",
        "rcfilters-filter-pageedits-label": "पन्नाक संपादनसभ",
+       "rcfilters-liveupdates-button": "अखुनका अद्यतन",
        "rcnotefrom": "नीचाँमे '''$2''' सँ भेल परिवर्तन अछि ('''$1''' धरि देखाएल)।",
        "rclistfrom": "$3 $2 सँ शुरू भेल नव परिवर्तन देखी",
        "rcshowhideminor": "$1 अल्प सम्पादन",
index 901ca80..23d2ba7 100644 (file)
        "prefs-advancedwatchlist": "വിപുലമായ ഉപാധികൾ",
        "prefs-displayrc": "പ്രദർശന ഐച്ഛികങ്ങൾ",
        "prefs-displaywatchlist": "പ്രദർശന ഐച്ഛികങ്ങൾ",
+       "prefs-changesrc": "പ്രദർശിപ്പിച്ച മാറ്റങ്ങൾ",
+       "prefs-changeswatchlist": "പ്രദർശിപ്പിച്ച മാറ്റങ്ങൾ",
+       "prefs-pageswatchlist": "ശ്രദ്ധിച്ച താളുകൾ",
        "prefs-tokenwatchlist": "ചീട്ട്",
        "prefs-diffs": "വ്യത്യാസങ്ങൾ",
        "prefs-help-prefershttps": "താങ്കൾ അടുത്ത പ്രാവശ്യം പ്രവേശിക്കുമ്പോൾ ഇവ ഫലത്തിൽ വരുന്നതാണ്.",
        "saveusergroups": "{{GENDER:$1|ഉപയോക്തൃസംഘങ്ങൾ}} സേവ് ചെയ്യുക",
        "userrights-groupsmember": "അംഗത്വമുള്ളത്:",
        "userrights-groupsmember-auto": "അന്തർലീനമായ അംഗത്വം:",
-       "userrights-groups-help": "à´\88 à´\89പയàµ\8bà´\95àµ\8dതാവàµ\8d à´\89ൾപàµ\8dà´ªàµ\86à´\9fàµ\8dà´\9fà´¿à´\9fàµ\8dà´\9fàµ\81à´³àµ\8dà´³ à´¸à´\82à´\98à´\99àµ\8dà´\99ൾ à´¤à´¾à´\99àµ\8dà´\95ൾà´\95àµ\8dà´\95àµ\8d à´®à´¾à´±àµ\8dറാവàµ\81à´¨àµ\8dനതാണàµ\8d:\n* à´\89പയàµ\8bà´\95àµ\8dതാവàµ\8d à´\86 à´¸à´\82à´\98à´¤àµ\8dതിലàµ\81à´£àµ\8dà´\9fàµ\86à´¨àµ\8dà´¨àµ\8d à´¶à´°à´¿à´¯à´¿à´\9fàµ\8dà´\9f à´\9aà´¤àµ\81à´°à´\82 à´\85ർതàµ\8dഥമാà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨àµ\81.\n* à´\89പയàµ\8bà´\95àµ\8dതാവàµ\8d à´\86 à´¸à´\82à´\98à´¤àµ\8dതിലിലàµ\8dà´²àµ\86à´¨àµ\8dà´¨àµ\8d à´¶à´°à´¿à´¯à´¿à´\9fാതàµ\8dà´¤ à´\9aà´¤àµ\81à´°à´\82 à´\85ർതàµ\8dഥമാà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨àµ\81.\n* à´¸à´\82à´\98à´\99àµ\8dà´\99à´³àµ\8bà´\9fàµ\8aà´ªàµ\8dപമàµ\81à´³àµ\8dà´³ *,  à´\92à´°à´¿à´\95àµ\8dà´\95ൽ à´®à´¾à´±àµ\8dà´±à´\82 à´µà´°àµ\81à´¤àµ\8dതിയാൽ à´ªà´¿à´¨àµ\8dà´¨àµ\80à´\9fàµ\8d à´\85തിൽ à´®à´¾à´±àµ\8dà´±à´\82 à´µà´°àµ\81à´¤àµ\8dതാൻ à´¤à´¾à´\99àµ\8dà´\95ൾà´\95àµ\8dà´\95àµ\8d à´\95ഴിയിലàµ\8dà´²àµ\86à´¨àµ\8dà´¨àµ\8d à´\85ർതàµ\8dഥമാà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨àµ\81.\n* à´¸à´\82à´\98à´\99àµ\8dà´\99à´³àµ\8bà´\9fàµ\8aà´ªàµ\8dപമàµ\81à´³àµ\8dà´³ #, à´¸à´\82à´\98à´¾à´\82à´\97à´¤àµ\8dവതàµ\8dതിനàµ\8dà´±àµ\86 à´\95ാലാവാധി à´ªà´¿à´¨àµ\8dà´¨àµ\8bà´\9fàµ\8dà´\9fà´¾à´\95àµ\8dà´\95ാമàµ\86à´¨àµ\8dà´¨àµ\8d à´¸àµ\82à´\9aà´¿à´ªàµ\8dപിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨àµ\81; à´¤à´¾à´\99àµ\8dà´\95ൾà´\95àµ\8dà´\95à´¤àµ\8d à´®àµ\81à´¨àµ\8dà´¨àµ\8bà´\9fàµ\8dà´\9fà´¾à´\95àµ\8dà´\95ാൻ à´¸à´¾à´§à´¿à´\95àµ\8dà´\95àµ\81à´\95യിലàµ\8dà´².",
+       "userrights-groups-help": "ഈ ഉപയോക്താവ് ഉൾപ്പെട്ടിട്ടുള്ള സംഘങ്ങൾ താങ്കൾക്ക് മാറ്റാവുന്നതാണ്:\n* ഉപയോക്താവ് ആ സംഘത്തിലുണ്ടെന്ന് ശരിയിട്ട ചതുരം അർത്ഥമാക്കുന്നു.\n* ഉപയോക്താവ് ആ സംഘത്തിലില്ലെന്ന് ശരിയിടാത്ത ചതുരം അർത്ഥമാക്കുന്നു.\n* സംഘങ്ങളോടൊപ്പമുള്ള *,  ഒരിക്കൽ മാറ്റം വരുത്തിയാൽ പിന്നീട് അതിൽ മാറ്റം വരുത്താൻ താങ്കൾക്ക് കഴിയില്ലെന്ന് അർത്ഥമാക്കുന്നു.\n* സംഘങ്ങളോടൊപ്പമുള്ള #, സംഘാംഗത്വത്തിന്റെ കാലാവധി പിന്നോട്ടാക്കാമെന്ന് സൂചിപ്പിക്കുന്നു; താങ്കൾക്കത് മുന്നോട്ടാക്കാൻ സാധിക്കുകയില്ല.",
        "userrights-reason": "കാരണം:",
        "userrights-no-interwiki": "മറ്റ് വിക്കികളിലെ ഉപയോക്തൃ അവകാശങ്ങൾ തിരുത്തുവാൻ താങ്കൾക്ക് അനുമതിയില്ല.",
        "userrights-nodatabase": "$1 എന്ന ഡാറ്റാബേസ് നിലവിലില്ല അല്ലെങ്കിൽ പ്രാദേശികമല്ല.",
        "group-autoconfirmed": "യാന്ത്രികമായി സ്ഥിരീകരിക്കപ്പെട്ട ഉപയോക്താക്കൾ",
        "group-bot": "യന്ത്രങ്ങൾ",
        "group-sysop": "കാര്യനിർവാഹകർ",
+       "group-interface-admin": "സമ്പർക്കമുഖ കാര്യനിർവാഹകർ",
        "group-bureaucrat": "ബ്യൂറോക്രാറ്റുകൾ",
        "group-suppress": "അമർച്ചകർ",
        "group-all": "(എല്ലാം)",
        "group-autoconfirmed-member": "{{GENDER:$1|യാന്ത്രികമായി സ്ഥിരീകരിക്കപ്പെട്ട ഉപയോക്താവ്}}",
        "group-bot-member": "{{GENDER:$1|യന്ത്രം}}",
        "group-sysop-member": "{{GENDER:$1|കാര്യനിർവാഹകൻ|കാര്യനിർവാഹക}}",
+       "group-interface-admin-member": "{{GENDER:$1|സമ്പർക്കമുഖ കാര്യനിർവാഹകൻ|സമ്പർക്കമുഖ കാര്യനിർവാഹക}}",
        "group-bureaucrat-member": "{{GENDER:$1|ബ്യൂറോക്രാറ്റ്}}",
        "group-suppress-member": "{{GENDER:$1|അമർച്ചക|അമർച്ചകൻ}}",
        "grouppage-user": "{{ns:project}}:ഉപയോക്താക്കൾ",
        "grouppage-autoconfirmed": "{{ns:project}}:യാന്ത്രികമായി സ്ഥിരീകരിക്കപ്പെട്ട ഉപയോക്താക്കൾ",
        "grouppage-bot": "{{ns:project}}:യന്ത്രങ്ങൾ",
        "grouppage-sysop": "{{ns:project}}:കാര്യനിർവാഹകർ",
+       "grouppage-interface-admin": "{{ns:project}}:സമ്പർക്കമുഖ കാര്യനിർവാഹകർ",
        "grouppage-bureaucrat": "{{ns:project}}:ബ്യൂറോക്രാറ്റ്",
        "grouppage-suppress": "{{ns:project}}:ഒതുക്കൽ",
        "right-read": "\nതാളുകൾ വായിക്കുക",
        "right-editusercss": "മറ്റ് ഉപയോക്താക്കളുടെ CSS പ്രമാണങ്ങൾ തിരുത്തുക",
        "right-edituserjson": "മറ്റ് ഉപയോക്താക്കളുടെ ജെസൺ പ്രമാണങ്ങൾ തിരുത്തുക",
        "right-edituserjs": "മറ്റ് ഉപയോക്താക്കളുടെ JS പ്രമാണങ്ങൾ തിരുത്തുക",
+       "right-editsitecss": "സൈറ്റ്-വ്യാപക സി.എസ്.എസ്. തിരുത്തുക",
+       "right-editsitejson": "സൈറ്റ്-വ്യാപക ജെസൺ തിരുത്തുക",
+       "right-editsitejs": "സൈറ്റ്-വ്യാപക ജാവാസ്ക്രിപ്റ്റ് തിരുത്തുക",
        "right-editmyusercss": "താങ്കളുടെ സ്വന്തം ഉപയോക്തൃ സി.എസ്.എസ്. പ്രമാണങ്ങൾ തിരുത്തുക",
+       "right-editmyuserjson": "താങ്കളുടെ സ്വന്തം ഉപയോക്തൃ ജെസൺ പ്രമാണങ്ങൾ തിരുത്തുക",
        "right-editmyuserjs": "താങ്കളുടെ സ്വന്തം ഉപയോക്തൃ ജാവാസ്ക്രിപ്റ്റ് പ്രമാണങ്ങൾ തിരുത്തുക",
        "right-viewmywatchlist": "താങ്കളുടെ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടിക സ്വയം കാണുക",
        "right-editmywatchlist": "താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടിക സ്വയം തിരുത്തുക. ഈ അവകാശമില്ലാതെതന്നെ ചില പ്രവൃത്തികൾ താളുകൾ കൂട്ടിച്ചേർക്കുമെന്ന് അറിഞ്ഞിരിക്കുക.",
        "right-managechangetags": "[[Special:Tags|ടാഗുകൾ]] സൃഷ്ടിക്കുക അല്ലെങ്കിൽ പ്രവർത്തനരഹിതമാക്കുക",
        "right-applychangetags": "മാറ്റങ്ങളോടൊപ്പം [[Special:Tags|ടാഗുകളും]] ബാധകമാക്കുക",
        "right-changetags": "ഒറ്റയൊറ്റ നാൾപ്പതിപ്പുകൾക്കും രേഖയിലെ ഉൾപ്പെടുത്തലുകൾക്കും ഐച്ഛിക [[Special:Tags|ടാഗുകൾ]] ചേർക്കുക അല്ലെങ്കിൽ നീക്കംചെയ്യുക",
+       "right-deletechangetags": "ഡേറ്റാബേസിൽ നിന്നും [[Special:Tags|റ്റാഗുകൾ]] മായ്ക്കുക",
        "grant-generic": "\"$1\" അവകാശ സഞ്ചയം",
        "grant-group-page-interaction": "താളുകളുമായി സമ്പർക്കം പുലർത്തുക",
        "grant-group-file-interaction": "മീഡിയയുമായി സമ്പർക്കം പുലർത്തുക",
        "grant-createaccount": "അംഗത്വങ്ങൾ സൃഷ്ടിക്കുക",
        "grant-createeditmovepage": "താളുകൾ സൃഷ്ടിക്കുക, തിരുത്തുക, മാറ്റുക",
        "grant-delete": "താളുകൾ, നാൾപ്പതിപ്പുകൾ, രേഖകളിലെ ഉൾപ്പെടുത്തലുകൾ മായ്ക്കുക",
-       "grant-editinterface": "à´®àµ\80ഡിയവിà´\95àµ\8dà´\95à´¿ à´¨à´¾à´®à´®àµ\87à´\96ലയàµ\81à´\82 à´\89പയàµ\8bà´\95àµ\8dà´¤àµ\83 à´¸à´¿.à´\8eà´¸àµ\8d.à´\8eà´¸àµ\8d./à´\9càµ\86സൺ/à´\9cാവാസàµ\8dà´\95àµ\8dà´°à´¿à´ªàµ\8dà´±àµ\8dà´±ും തിരുത്തുക",
+       "grant-editinterface": "à´®àµ\80ഡിയവിà´\95àµ\8dà´\95à´¿ à´¨à´¾à´®à´®àµ\87à´\96ലയàµ\81à´\82 à´¸àµ\88à´±àµ\8dà´±àµ\8d-à´µàµ\8dയാപà´\95/à´\89പയàµ\8bà´\95àµ\8dà´¤àµ\83 à´\9càµ\86സണും തിരുത്തുക",
        "grant-editmycssjs": "താങ്കളുടെ ഉപയോക്തൃ സി.എസ്.എസ്./ജെസൺ/ജാവാസ്ക്രിപ്റ്റ് തിരുത്തുക",
        "grant-editmyoptions": "താങ്കളുടെ ഉപയോക്തൃ ക്രമീകരണങ്ങൾ തിരുത്തുക",
        "grant-editmywatchlist": "താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടിക തിരുത്തുക",
+       "grant-editsiteconfig": "സൈറ്റ്-വ്യാപകവും ഉപയോക്താക്കളുടെയും സി.എസ്.എസ്./ജെ.എസ്. തിരുത്തുക",
        "grant-editpage": "നിലവിലുള്ള താളുകൾ തിരുത്തുക",
        "grant-editprotected": "സംരക്ഷിച്ചിട്ടുള്ള താളുകൾ തിരുത്തുക",
        "grant-highvolume": "ഉയർന്ന അളവിലുള്ള തിരുത്തുകൾ",
        "grant-oversight": "ഉപയോക്താക്കളെ മറയ്ക്കുക ഒപ്പം നാൾപ്പതിപ്പുകൾ ഒതുക്കുക",
        "grant-patrol": "താളുകളിലെ മാറ്റങ്ങളിൽ റോന്തുചുറ്റുക",
+       "grant-privateinfo": "സ്വകാര്യ വിവരങ്ങൾ എടുക്കാൻ കഴിയുക",
        "grant-protect": "താളുകൾ സംരക്ഷിക്കുക, സംരക്ഷണം നീക്കുക",
        "grant-rollback": "താളുകളിലെ മാറ്റങ്ങൾ മുൻപ്രാപനം ചെയ്യുക",
        "grant-sendemail": "മറ്റുപയോക്താക്കൾക്ക് ഇമെയിൽ അയയ്ക്കുക",
        "grant-basic": "അടിസ്ഥാന അവകാശങ്ങൾ",
        "grant-viewdeleted": "മായ്ക്കപ്പെട്ട പ്രമാണങ്ങളും താളുകളും കാണുക",
        "grant-viewmywatchlist": "താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടിക കാണുക",
+       "grant-viewrestrictedlogs": "പരിമിതപ്പെടുത്തിയിട്ടുള്ള രേഖാ ഉൾപ്പെടുത്തലുകൾ കാണുക",
        "newuserlogpage": "ഉപയോക്തൃ സൃഷ്ടിയുടെ രേഖ",
        "newuserlogpagetext": "പുതിയതായി അംഗത്വമെടുത്ത ഉപയോക്താക്കളുടെ പട്ടിക താഴെ കാണാം.",
        "rightslog": "ഉപയോക്തൃ അവകാശ രേഖ",
        "rcfilters-watchlist-markseen-button": "എല്ലാ മാറ്റങ്ങളും കണ്ടതായി അടയാളപ്പെടുത്തുക",
        "rcfilters-watchlist-edit-watchlist-button": "താങ്കൾ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടിക തിരുത്തുക",
        "rcfilters-watchlist-showupdated": "മാറ്റങ്ങൾ ഉണ്ടായ ശേഷം താങ്കൾ സന്ദർശിക്കാത്ത താളുകളിലെ മാറ്റങ്ങൾ, തളിക അടയാളത്തോടൊപ്പം <strong>കടുപ്പിച്ച്</strong> കാണിച്ചിരിക്കുന്നു.",
-       "rcfilters-preference-label": "സമàµ\80à´ªà´\95ാലമാറàµ\8dà´±à´\99àµ\8dà´\99à´³àµ\81à´\9fàµ\86 à´ªàµ\81à´¤àµ\81à´\95àµ\8dà´\95à´¿à´¯ à´ªà´¤à´¿à´ªàµ\8dà´ªàµ\8d à´ªàµ\8dരദർശിപàµ\8dപിà´\95àµ\8dà´\95àµ\87à´£àµ\8dà´\9f",
-       "rcfilters-preference-help": "സമàµ\8dപർà´\95àµ\8dà´\95à´®àµ\81à´\96à´¤àµ\8dതിൽ 2017-ൽ à´µà´°àµ\81à´¤àµ\8dതിയ à´°àµ\82à´ªà´\95à´²àµ\8dപനാമാറàµ\8dà´±à´\99àµ\8dà´\99à´³àµ\81à´\82, à´\85à´¤àµ\8bà´\9fàµ\8aà´ªàµ\8dപവàµ\81à´\82 à´ªà´¿à´¨àµ\8dà´¨àµ\80à´\9fàµ\81à´\82 à´\9aàµ\87ർതàµ\8dà´¤ à´\8eà´²àµ\8dലാ à´\89à´ªà´\95à´°à´£à´\99àµ\8dà´\99à´³àµ\81à´\82 à´\92ഴിവാà´\95àµ\8dà´\95àµ\81à´\95.",
-       "rcfilters-watchlist-preference-label": "à´¶àµ\8dà´°à´¦àµ\8dധിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dനവയàµ\81à´\9fàµ\86 à´ªà´\9fàµ\8dà´\9fà´¿à´\95à´¯àµ\81à´\9fàµ\86 à´ªàµ\81à´¤àµ\81à´\95àµ\8dà´\95à´¿à´¯ à´ªà´¤à´¿à´ªàµ\8dà´ªàµ\8d à´ªàµ\8dരദർശിപàµ\8dപിà´\95àµ\8dà´\95àµ\87à´£àµ\8dà´\9fതിലàµ\8dà´²",
-       "rcfilters-watchlist-preference-help": "2017-ലെ സമ്പർക്കമുഖ പുനർരൂപകല്പനയും അതോടൊപ്പവും പിന്നീടും ചേർത്ത എല്ലാ ഉപകരണങ്ങളും ഒഴിവാക്കുക",
+       "rcfilters-preference-label": "à´\9cാവാസàµ\8dà´\95àµ\8dà´°à´¿à´ªàµ\8dà´±àµ\8dà´±àµ\8d-രഹിത à´¸à´®àµ\8dപർà´\95àµ\8dà´\95à´®àµ\81à´\96à´\82 à´\89പയàµ\8bà´\97à´¿à´\95àµ\8dà´\95àµ\81à´\95",
+       "rcfilters-preference-help": "à´\85à´°à´¿à´ªàµ\8dà´ªà´\95à´³àµ\81à´\82 à´ªàµ\8dà´°à´®àµ\81à´\96മാà´\95àµ\8dà´\95à´¿à´\95àµ\8dà´\95à´¾à´\9fàµ\8dà´\9fൽ à´¸àµ\97à´\95à´°àµ\8dയവàµ\81à´\82 à´\87à´²àµ\8dലാതàµ\86 à´¸à´®àµ\80à´ªà´\95ാലമാറàµ\8dà´±à´\99àµ\8dà´\99ൾ à´\8eà´\9fàµ\81à´\95àµ\8dà´\95àµ\81à´\95",
+       "rcfilters-watchlist-preference-label": "à´\9cാവാസàµ\8dà´\95àµ\8dà´°à´¿à´ªàµ\8dà´±àµ\8dà´±àµ\8d-രഹിത à´¸à´®àµ\8dപർà´\95àµ\8dà´\95à´®àµ\81à´\96à´\82 à´\89പയàµ\8bà´\97à´¿à´\95àµ\8dà´\95àµ\81à´\95",
+       "rcfilters-watchlist-preference-help": "അരിപ്പകളും പ്രമുഖമാക്കിക്കാട്ടൽ സൗകര്യവും ഇല്ലാതെ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടിക എടുക്കുക.",
        "rcfilters-filter-showlinkedfrom-label": "കണ്ണി ചേർക്കപ്പെട്ട താളുകളിലെ മാറ്റങ്ങൾ കാണിക്കുക",
        "rcfilters-filter-showlinkedfrom-option-label": "തിരഞ്ഞെടുത്ത താളിൽ <strong>കണ്ണി ചേർക്കപ്പെട്ട താളുകൾ</strong>",
        "rcfilters-filter-showlinkedto-label": "കണ്ണി ചേർക്കപ്പെട്ട താളുകളിലെ മാറ്റങ്ങൾ കാണിക്കുക",
        "prefixindex": "പൂർവ്വപദത്തോടു കൂടിയ എല്ലാ താളുകളും",
        "prefixindex-namespace": "പൂർവ്വപദമുള്ള എല്ലാ താളുകളും (നാമമേഖല $1)",
        "prefixindex-submit": "പ്രദർശിപ്പിക്കുക",
-       "prefixindex-strip": "à´ªà´\9fàµ\8dà´\9fà´¿à´\95യിൽ à´¨à´¿à´¨àµ\8dà´¨àµ\8d à´ªàµ\82ർവàµ\8dവപദà´\82 à´\92ഴിവാക്കുക",
+       "prefixindex-strip": "à´«à´²à´\99àµ\8dà´\99ളിൽ à´¨à´¿à´¨àµ\8dà´¨àµ\8d à´ªàµ\82ർവàµ\8dവപദà´\82 à´®à´±à´¯àµ\8dക്കുക",
        "shortpages": "വിവരം ഏറ്റവും കുറവുള്ള താളുകൾ",
        "longpages": "വലിയ താളുകളുടെ പട്ടിക",
        "deadendpages": "അന്തർ വിക്കി കണ്ണിയാൽ ബന്ധിപ്പിക്കപ്പെടാത്ത താളുകൾ",
        "speciallogtitlelabel": "ലക്ഷ്യം (തലക്കെട്ട് അല്ലെങ്കിൽ ഉപയോക്താവിനെ തിരയാനുള്ള {{ns:user}}:ഉപയോക്തൃനാമം) :",
        "log": "പ്രവർത്തനരേഖകൾ",
        "logeventslist-submit": "പ്രദർശിപ്പിക്കുക",
+       "logeventslist-patrol-log": "റോന്തുചുറ്റൽ പ്രവർത്തനരേഖ",
+       "logeventslist-tag-log": "റ്റാഗ് രേഖ",
        "all-logs-page": "എല്ലാ പൊതുരേഖകളും",
        "alllogstext": "{{SITENAME}} സംരംഭത്തിൽ ലഭ്യമായ വിവിധ പ്രവർത്തന രേഖകൾ ഈ താളിൽ ഒരുമിച്ച് കാണാം. താങ്കൾക്ക് രേഖകളുടെ സ്വഭാവം, ഉപയോക്തൃനാമം (കേസ് സെൻസിറ്റീവ്), ബന്ധപ്പെട്ട താൾ (കേസ് സെൻസിറ്റീവ്) മുതലായവ തിരഞ്ഞെടുത്ത് അന്വേഷണം കൂടുതൽ ക്ഌപ്തപ്പെടുത്താവുന്നതാണ്.",
        "logempty": "പ്രവർത്തനരേഖയിൽ ബന്ധമുള്ളവ ഇല്ല.",
        "cachedspecial-refresh-now": "ഏറ്റവും പുതിയ പതിപ്പ് കാണുക.",
        "categories": "വർഗ്ഗങ്ങൾ",
        "categories-submit": "പ്രദർശിപ്പിക്കുക",
-       "categoriespagetext": "താഴàµ\86 à´\95àµ\8aà´\9fàµ\81à´¤àµ\8dതിരിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨ {{PLURAL:$1|വർà´\97àµ\8dà´\97à´¤àµ\8dതിൽ|വർà´\97àµ\8dà´\97à´\99àµ\8dà´\99ളിൽ}} à´¤à´¾à´³àµ\81à´\95à´³àµ\81à´\82 à´ªàµ\8dരമാണà´\99àµ\8dà´\99à´³àµ\81à´®àµ\81à´£àµ\8dà´\9fàµ\8d.\n[[Special:UnusedCategories|à´\89പയàµ\8bà´\97à´¿à´\95àµ\8dà´\95à´ªàµ\8dà´ªàµ\86à´\9fാതàµ\8dà´¤ à´µàµ¼à´\97àµ\8dà´\97à´\99àµ\8dà´\99ൾ]] à´\87വിà´\9fàµ\86 à´\95ാണിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dനിലàµ\8dà´².\n[[Special:WantedCategories|അവശ്യവർഗ്ഗങ്ങൾ]] കൂടി കാണുക.",
+       "categoriespagetext": "താഴàµ\86 à´\95àµ\8aà´\9fàµ\81à´¤àµ\8dതിരിà´\95àµ\8dà´\95àµ\81à´¨àµ\8dà´¨ {{PLURAL:$1|വർà´\97àµ\8dà´\97à´\82|വർà´\97àµ\8dà´\97à´\99àµ\8dà´\99ൾ}} à´µà´¿à´\95àµ\8dà´\95ിയിലàµ\81à´£àµ\8dà´\9fàµ\86à´\99àµ\8dà´\95à´¿à´²àµ\81à´\82, à´\89പയàµ\8bà´\97à´¿à´\95àµ\8dà´\95à´ªàµ\8dà´ªàµ\86à´\9fാനàµ\8b à´\89പയàµ\8bà´\97à´¿à´\95àµ\8dà´\95à´ªàµ\8dà´ªàµ\86à´\9fാതിരിà´\95àµ\8dà´\95ാനàµ\8b à´¸à´¾à´¦àµ\8dà´§àµ\8dയതയàµ\81à´£àµ\8dà´\9fàµ\8d.\n[[Special:WantedCategories|അവശ്യവർഗ്ഗങ്ങൾ]] കൂടി കാണുക.",
        "categoriesfrom": "ഇങ്ങനെ തുടങ്ങുന്ന വർഗ്ഗങ്ങൾ കാട്ടുക:",
        "deletedcontributions": "മായ്ക്കപ്പെട്ട ഉപയോക്തൃസംഭാവനകൾ",
        "deletedcontributions-title": "മായ്ക്കപ്പെട്ട ഉപയോക്തൃസംഭാവനകൾ",
        "ipb-disableusertalk": "തടയപ്പെട്ടിരിക്കുമ്പോൾ സ്വന്തം സംവാദം താൾ തിരുത്തുന്നതിൽ നിന്നും ഈ ഉപയോക്താവിനെ തടയുക",
        "ipb-change-block": "ഈ ക്രമീകരണപ്രകാരം ഉപയോക്താവിനെ വീണ്ടും തടയുക",
        "ipb-confirm": "തടയൽ സ്ഥിരീകരിക്കുക",
+       "ipb-sitewide": "സൈറ്റ്-വ്യാപകം",
+       "ipb-partial": "ഭാഗികം",
+       "ipb-type-label": "തരം",
+       "ipb-pages-label": "താളുകൾ",
        "badipaddress": "അസാധുവായ ഐ.പി. വിലാസം.",
        "blockipsuccesssub": "തടയൽ വിജയിച്ചിരിക്കുന്നു",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] എന്ന ഉപയോക്താവിനെ തടഞ്ഞിരിക്കുന്നു.<br />\nതടയൽ പുനഃപരിശോധിക്കാൻ [[Special:BlockList|തടയൽ പട്ടിക]] കാണുക.",
        "createaccountblock": "അംഗത്വം സൃഷ്ടിക്കുന്നതിൽനിന്ന് തടഞ്ഞിരിക്കുന്നു",
        "emailblock": "ഇമെയിൽ ഉപയോഗിക്കുന്നതു തടഞ്ഞിരിക്കുന്നു",
        "blocklist-nousertalk": "സ്വന്തം സം‌വാദ താളിൽ തിരുത്താൻ സാധിക്കില്ല",
+       "blocklist-editing": "തിരുത്ത്",
+       "blocklist-editing-sitewide": "തിരുത്ത് (സൈറ്റ്-വ്യാപകം)",
        "ipblocklist-empty": "തടയൽപ്പട്ടിക ശൂന്യമാണ്‌.",
        "ipblocklist-no-results": "ഈ ഐ.പി. വിലാസമോ ഉപയോക്തൃനാമമോ തടഞ്ഞിട്ടില്ല.",
        "blocklink": "തടയുക",
        "move-watch": "ഈ താളിലെ മാറ്റങ്ങൾ ശ്രദ്ധിക്കുക",
        "movepagebtn": "താൾ മാറ്റുക",
        "pagemovedsub": "തലക്കെട്ടു മാറ്റം വിജയിച്ചിരിക്കുന്നു",
+       "cannotmove": "ഇനി പറയുന്ന {{PLURAL:$1|കാരണത്താൽ|കാരണങ്ങളാൽ}} താൾ മാറ്റാൻ കഴിയില്ല:",
        "movepage-moved": "'''\"$1\" എന്ന ലേഖനം \"$2\" എന്ന തലക്കെട്ടിലേക്ക് മാറ്റിയിരിക്കുന്നു'''",
        "movepage-moved-redirect": "ഒരു തിരിച്ചുവിടൽ സൃഷ്ടിച്ചിരിക്കുന്നു.",
        "movepage-moved-noredirect": "തിരിച്ചുവിടലിന്റെ സൃഷ്ടി ഒതുക്കിയിരിക്കുന്നു.",
        "pageinfo-category-files": "പ്രമാണങ്ങളുടെ എണ്ണം",
        "pageinfo-user-id": "ഉപയോക്തൃ ഐ.ഡി.",
        "pageinfo-file-hash": "ഹാഷ് വില",
+       "pageinfo-view-protect-log": "ഈ താളിന്റെ സംരക്ഷണ രേഖ കാണുക.",
        "markaspatrolleddiff": "റോന്തുചുറ്റിയതായി അടയാളപ്പെടുത്തുക",
        "markaspatrolledtext": "ഈ താളിൽ റോന്തുചുറ്റിയതായി രേഖപ്പെടുത്തുക",
        "markaspatrolledtext-file": "പ്രമാണത്തിന്റെ ഈ പതിപ്പിൽ റോന്തുചുറ്റിയതായി അടയാളപ്പെടുത്തുക",
        "previousdiff": "← മുൻപത്തെ വ്യത്യാസം",
        "nextdiff": "അടുത്ത വ്യത്യാസം →",
        "mediawarning": "'''മുന്നറിയിപ്പ്''': ഈ തരത്തിലുള്ള പ്രമാണത്തിൽ വിനാശകാരിയായ കോഡ് ഉണ്ടായേക്കാം. ഇതു തുറക്കുന്നതു താങ്കളുടെ കമ്പ്യൂട്ടറിനു അപകടമായി തീർന്നേക്കാം.",
-       "imagemaxsize": "à´\9aà´¿à´¤àµ\8dà´°à´¤àµ\8dതിനàµ\8dà´±àµ\86 à´µà´²à´¿à´ªàµ\8dà´ªà´\82:<br />''(à´ªàµ\8dരമാണതàµ\8dതിനàµ\8dà´±àµ\86 à´µà´¿à´µà´°à´£ à´¤à´¾à´³àµ\81à´\95ളിൽ)''",
+       "imagemaxsize": "à´ªàµ\8dരമാണതàµ\8dതിനàµ\8dà´±àµ\86 à´µà´¿à´µà´°à´£ à´¤à´¾à´³àµ\81à´\95ളിൽ à´\9aà´¿à´¤àµ\8dà´°à´¤àµ\8dതിനàµ\8dà´±àµ\86 à´µà´²à´¿à´ªàµ\8dà´ªà´\82:",
        "thumbsize": "ലഘുചിത്രത്തിന്റെ വലിപ്പം:",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|താൾ|താളുകൾ}}",
        "file-info": "പ്രമാണത്തിന്റെ വലിപ്പം: $1, മൈം തരം: $2",
        "confirm-unwatch-top": "ഈ താൾ ഞാൻ ശ്രദ്ധിക്കുന്ന താളുകളുടെ പട്ടികയിൽനിന്നും നീക്കട്ടെ?",
        "confirm-rollback-button": "ശരി",
        "confirm-rollback-top": "ഈ താളിലെ തിരുത്തുകൾ തിരിച്ചാക്കണോ?",
+       "confirm-mcrrestore-title": "ഒരു നാൾപ്പതിപ്പ് പുനഃസ്ഥാപിക്കുക",
+       "confirm-mcrundo-title": "ഒരു മാറ്റം തിരസ്കരിക്കുക",
+       "mcrundofailed": "തിരസ്കരണം പരാജയപ്പെട്ടു",
+       "mcrundo-missingparam": "അഭ്യർത്ഥനയ്ക്ക് ആവശ്യമുള്ള ചരങ്ങൾ നൽകിയിട്ടില്ല.",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← മുൻപത്തെ താൾ",
        "imgmultipagenext": "അടുത്ത താൾ →",
        "special-characters-title-emdash": "എം ഡാഷ്",
        "special-characters-title-minus": "വ്യവകലന ചിഹ്നം",
        "mw-widgets-abandonedit": "സേവ് ചെയ്യാതെ തന്നെ തിരുത്തുന്നതിൽ നിന്ന് പോകണം എന്ന് താങ്കൾക്കുറപ്പാണോ?",
-       "mw-widgets-abandonedit-discard": "തിരàµ\81à´¤àµ\8dà´¤àµ\81à´\95ൾ à´\85à´µà´\97à´£ിക്കുക",
+       "mw-widgets-abandonedit-discard": "തിരàµ\81à´¤àµ\8dà´¤àµ\81à´\95ൾ à´¨à´¿à´°à´¾à´\95à´°ിക്കുക",
        "mw-widgets-abandonedit-keep": "തിരുത്ത് തുടരുക",
        "mw-widgets-abandonedit-title": "താങ്കൾക്ക് ഉറപ്പാണോ?",
        "mw-widgets-dateinput-no-date": "തീയതി ഒന്നും തിരഞ്ഞെടുത്തിട്ടില്ല",
        "mw-widgets-titleinput-description-redirect": "$1 എന്ന താളിലേക്കുള്ള തിരിച്ചുവിടൽ",
        "mw-widgets-categoryselector-add-category-placeholder": "വർഗ്ഗം ചേർക്കുക...",
        "mw-widgets-usersmultiselect-placeholder": "കൂടുതൽ ചേർക്കുക...",
+       "mw-widgets-titlesmultiselect-placeholder": "കൂടുതൽ ചേർക്കുക...",
        "date-range-from": "ഈ തീയതി മുതൽ:",
        "date-range-to": "ഈ തീയതി വരെ:",
        "sessionmanager-tie": "വ്യത്യസ്ത തരത്തിലുള്ള അനുമതി നൽകൽ തരങ്ങൾ സംയോജിപ്പിക്കാനാവില്ല: $1.",
index f7d7dbf..76efaca 100644 (file)
        "cascadeprotected": "यो पृष्ठ सम्पादन गर्नबाट सुरक्षित गरिएकोछ किनभनें {{PLURAL:$1|पृष्ठ |पृष्ठहरू}}मा सुरक्षित गर्नुका साथै प्रपात (\"cascading\") विकल्प खुल्ला राखिएको छ:\n$2",
        "namespaceprotected": " '''$1'''  नेमस्पेसमा रहेका पृष्ठहरू सम्पादन गर्ने अनुमति यहाँलाई छैन ।",
        "customcssprotected": "तपाईंलाई यो  पृष्ठ सम्पादन गर्ने अनुमति छैन, किनकी यसमा कुनै अर्को प्रयोगकर्ताको व्यक्तिगत अभिरुचीहरू संग्रहित छन् ।",
+       "customjsonprotected": "तपाईँसँग यस जेसन (JSON) फाइललाई सम्पादन गर्ने अनुमति छैन् किनकि यसमा कुनै अरू व्यक्तिका वैयक्तिक मिलानहरू रहेका छन्।",
        "customjsprotected": "तपाईंलाई यो जाभास्कृप्ट पृष्ठ सम्पादन गर्ने अनुमति छैन, किनकी यसमा कुनै अर्को प्रयोगकर्ताको व्यक्तिगत अभिरुचीहरू संग्रहित छन् ।",
+       "sitecssprotected": "तपाईँसँग यो सिएसएस (CSS) पृष्ठ सम्पादन गर्ने अनुमति छैन् किनकि यसले सबै आगन्तुकहरूलाई असर पार्न सक्दछ।",
+       "sitejsonprotected": "तपाईँसँग यो जेसन (JSON) पृष्ठ सम्पादन गर्ने अनुमति छैन् किनकि यसले सबै आगन्तुकहरूलाई असर पार्न सक्दछ।",
        "mycustomcssprotected": "यो CSSपृष्ठ सम्पादन गर्नको लागि लागि तपाईंलाई अनुमति छैन ।",
        "mycustomjsprotected": "यो जावास्क्रिप्ट पृष्ठ सम्पादन गर्नको लागि तपाईंलाई अनुमति छैन ।",
        "myprivateinfoprotected": "तपाईंसँग तपाईंको निजी जानकारीहरू सम्पादन गर्ने अनुमती छैन",
        "botpasswords": "बोट पासवर्ड",
        "botpasswords-disabled": "बोट पासवर्डहरू असक्षम गरिएका छन्।",
        "botpasswords-createnew": "नयाँ बोटको लागि पासवर्ड बनाउने",
+       "botpasswords-editexisting": "उपलब्ध बोट पासवर्ड सम्पादन गर्नुहोस्",
+       "botpasswords-label-needsreset": "(पासवर्ड फेर्न आवश्यक छ)",
        "botpasswords-label-appid": "बोट नाम",
        "botpasswords-label-create": "बनाउनुहोस्",
        "botpasswords-label-update": "अद्यतन गर्ने (अपडेट)",
        "botpasswords-insert-failed": "\"$1\" बोट नाम थप्न असफल भयो। के यो पहिले नै थपिएको थियो?",
        "botpasswords-update-failed": "\"$1\" बोट नाम अद्यावधिक गर्न असफल भयो। के यो हटाइयो हो?",
        "botpasswords-created-title": "बोट पासवर्ड सिर्जना गरियो",
+       "botpasswords-updated-title": "बोट पासवर्ड परिवर्तन गरियो",
+       "botpasswords-deleted-title": "बोट पासवर्ड मेटाइयो",
        "resetpass_forbidden": "पासवर्ड परिवर्तन गर्न मिल्दैन",
+       "resetpass_forbidden-reason": "पासवर्डहरू परिवर्तन गर्न सकिदैन: $1",
        "resetpass-no-info": "यो पृष्ठ सिधै हेर्नको लागि तपाईंले प्रवेश गर्नुपर्छ ।",
        "resetpass-submit-loggedin": "प्रवेसशब्द परिवर्तन गर्ने",
        "resetpass-submit-cancel": "रद्द गर्ने",
        "passwordreset-emailelement": "प्रयोगकर्ताको नाम: \n$1\n\nअस्थाई पासवर्ड: \n$2",
        "passwordreset-emailsentemail": "पासवर्ड परिवर्तनको लागि इमेल पठाइएको छ।",
        "passwordreset-invalidemail": "अमान्य इमेल ठेगाना",
-       "changeemail": "à¤\87मà¥\87ल à¤ à¥\87à¤\97ाना à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रà¥\8dनà¥\81हà¥\8bस",
+       "changeemail": "à¤\87मà¥\87ल à¤ à¥\87à¤\97ाना à¤¹à¤\9fाà¤\89नà¥\81हà¥\8bसà¥\8d à¤µà¤¾ à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रà¥\8dनà¥\81हà¥\8bसà¥\8d",
        "changeemail-header": "खाताको इमेल ठेगाना परिवर्तन गर्नुहोस",
        "changeemail-no-info": "यस पृष्ठमा सिधै जानको लागि प्रवेश गर्नु पर्ने हुन्छ ।",
        "changeemail-oldemail": "हालको इमेल-ठेगाना:",
        "publishpage": "पृष्ठ प्रकाशित गर्ने",
        "publishchanges": "परिवर्तनहरू प्रकाशित गर्ने",
        "savearticle-start": "पृष्ठ संग्रह गर्ने…",
+       "savechanges-start": "परिवर्तनहरू सङ्ग्रह गर्नुहोस्",
+       "publishpage-start": "पृष्ठ प्रकाशित...",
+       "publishchanges-start": "परिवर्तनहरू प्रकाशित...",
        "preview": "पूर्वावलोकन",
        "showpreview": "पूर्वालोकन देखाउनुहोस्",
        "showdiff": "परिवर्तन देखाउनुहोस्",
        "postedit-confirmation-created": "पृष्ठ सिर्जना गरियो ।",
        "postedit-confirmation-restored": "पृष्ठ पूर्वरूपमा फर्कायो ।",
        "postedit-confirmation-saved": "तपाईंको सम्पादन संग्रह गरिएको छ ।",
+       "postedit-confirmation-published": "तपाईँको सम्पादन प्रकाशित गरियो।",
        "edit-already-exists": "नयाँ पृष्ठ बनाउन सकिएन ।\nयो पहिले देखि नै रहेको छ।",
        "defaultmessagetext": "डिफल्ट सन्देश पाठ",
        "content-failed-to-parse": "$1 को लागि $2 सामग्रीलाई पार्स गर्न विफल, त्रुटि: $3",
        "mergehistory-empty": "कुनै पनि पुनरावलोकनहरू जोड्न मिल्दैन ।",
        "mergehistory-done": "$3 {{PLURAL:$3|संस्करण|संस्करणहरू}}  $1बाट सफलतापूर्वक [[:$2]]मा थपियो ।",
        "mergehistory-fail": "इतिहास जोड्न सकिएन कृपया पृष्ठको नाम र समयमान जाँच गर्नुहोस्।",
+       "mergehistory-fail-invalid-source": "स्रोत पृष्ठ अमान्य छ।",
+       "mergehistory-fail-invalid-dest": "लक्ष्य पृष्ठ अमान्य छ।",
        "mergehistory-fail-toobig": "इतिहास समाहित गर्न सम्भव छैन किनभने अवतरण सिमा $1 भन्दा बढी {{PLURAL:$1|अवतरण|अवतरणहरू}} लाई स्थानान्तरित गर्नु पर्छ।",
        "mergehistory-no-source": "स्रोत पृष्ठ $1 अस्तित्वमा छैन ।",
        "mergehistory-no-destination": "गन्तव्य पृष्ठ $1 अस्तित्वमा छैन ।",
        "diff-multi-manyusers": "($2 {{PLURAL:$2|भन्दा अधिक प्रयोगकर्ता|भन्दा अधिक प्रयोगकर्ताहरू}}द्वारा {{PLURAL:$1|एउटा मध्यवर्ती संशोधन|$1 मध्यवर्ती संशोधनहरू}} नदेखाइएको)",
        "difference-missing-revision": "यस अन्तर {{PLURAL:$2|को एक अवतरण|को $2 अवतरण}} ($1)  {{PLURAL:$2|भेटिएन|खोज्न सकिएन}}।\n\nयो सामान्य रूपमा एउटा हताइएको पृष्ठको अवतरणहरूमा अन्तर खोज्दा हुन्छ । अधिक जानकारी [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} हटाइएको लग]मा हेर्न सकिन्छ।",
        "searchresults": "खोज नतिजाहरू",
+       "search-filter-title-prefix-reset": "सबै पृष्ठहरू खोजी गर्नुहोस्",
        "searchresults-title": " \"$1\"को लागि खोज नतिजाहरू",
        "titlematches": "पृष्ठ शिर्षक मिल्छ",
        "textmatches": "पृष्ठ पाठ मिल्छ",
        "userrights-user-editname": "प्रयोगकर्ता नाम दिनुहोस् :",
        "editusergroup": "प्रयोगकर्ता समूह सम्पादन गर्नुहोस्",
        "editinguser": "प्रयोगकर्ता '''[[User:$1|$1]]''' $2 को अधिकार परिवर्तन गर्ने\n{{GENDER:$1|प्रयोगकर्ता}}को प्रयोगकर्ता अधिकार परिवर्तन हुँदैछ <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "प्रयोगकर्ता समूह सम्पादन गर्नुहोस्",
+       "userrights-editusergroup": "{{GENDER:$1|प्रयोगकर्ता}} समूहहरू सम्पादन गर्नुहोस्",
        "userrights-viewusergroup": "{{GENDER:$1|प्रयोगकर्ता}} समूहहरू हेर्नुहोस्।",
-       "saveusergroups": "प्रयोगकर्ता समूहरू संग्रह गर्नुहोस्",
+       "saveusergroups": "{{GENDER:$1|प्रयोगकर्ता}} समूहहरू सङ्ग्रह गर्नुहोस्",
        "userrights-groupsmember": "को सदस्य:",
        "userrights-groupsmember-auto": "अंतर्निहित सदस्य:",
        "userrights-groups-help": "यो प्रयोगकर्ता भएको समूहलाई अदलबदल गर्न सक्नुहुन्छ:\n* बाकस चेक्ड(checked) हुनु्को अर्थ प्रयोगकर्ता त्यस समूहमा छ।\n* बाकस अनचेक्ड (unchecked) हुनु्को अर्थ प्रयोगकर्ता त्यस समूहमा छैन।\n*  *ले संकेत दिन्छ तपाईं त्यस समूहलाई हटाउन सक्नुहुन्न जब तपाईंले यसलाई जोड़िसक्नु भएकोछ अथवा अदला बदलि गर्नुभएकोछ।",
        "grant-group-file-interaction": "मिडियासँग अन्तरक्रिया गर्नुहोस्",
        "grant-group-watchlist-interaction": "तपाईंको दृष्टिसूचीसँग अन्तरक्रिया गर्नुहोस्",
        "grant-group-email": "इ-मेल पठाउनुहोस्",
-       "grant-createaccount": "खाता खोल्नुहोस्",
+       "grant-createaccount": "खाताहरू खोल्नुहोस्",
        "grant-createeditmovepage": "पृष्ठहरूमा परिवर्तन गर्नुहोस्",
        "grant-editmycssjs": "तपाईंको प्रयोगकर्ताकाे CSS/JavaScript सम्पादन गर्नुहोस्",
        "grant-editmyoptions": "तपाईंको प्रयोगकर्ता अभिरूचीहरूलाई सम्पादन गर्नुहोस्",
        "rcfilters-days-show-days": "$1 {{PLURAL:$1|दिन|दिनहरू}}",
        "rcfilters-days-show-hours": "$1 {{PLURAL:$1|घण्टा|घण्टाहरू}}",
        "rcfilters-savedqueries-setdefault": "पूर्वनिर्धारितको रुपमा सेट गर्नुहोस्",
-       "rcfilters-savedqueries-remove": "मà¥\87à¤\9fà¥\8dनà¥\87",
+       "rcfilters-savedqueries-remove": "मà¥\87à¤\9fà¥\8dनà¥\81हà¥\8bसà¥\8d",
        "rcfilters-savedqueries-new-name-label": "नाम",
        "rcfilters-savedqueries-cancel-label": "रद्द गर्नुहोस्",
        "rcfilters-show-new-changes": "नवीनतम परिवर्तनहरू हेर्नुहोस्",
        "rcfilters-filterlist-title": "फिल्टरहरू",
-       "rcfilters-highlightmenu-title": "रà¤\82à¤\97 à¤\9bनà¥\8dनà¥\81हाà¥\87स",
-       "rcfilters-filter-user-experience-level-registered-label": "दरà¥\8dता à¤\97रà¥\80एकाे",
+       "rcfilters-highlightmenu-title": "रà¤\99à¥\8dà¤\97 à¤\9bानà¥\8dनà¥\81हाà¥\87सà¥\8d",
+       "rcfilters-filter-user-experience-level-registered-label": "दरà¥\8dता à¤\97रिएकाे",
        "rcfilters-filter-user-experience-level-unregistered-label": "दर्ता नभएकाे",
        "rcfilters-filter-bots-label": "बोट",
        "rcfilters-filter-minor-label": "सामान्य सम्पादनहरू",
        "apisandbox-reset": "हटाउने",
        "apisandbox-retry": "पुनः प्रयास गर्नुहोस्",
        "apisandbox-examples": "उदाहरण",
-       "apisandbox-results": "परिणाम",
+       "apisandbox-results": "नतिà¤\9cाहरà¥\82",
        "apisandbox-request-url-label": "अनुरोध युआरयल:",
-       "apisandbox-request-time": "अनुरोधको समयावधी: $1",
+       "apisandbox-request-time": "अनुरोध समयावधी: {{PLURAL:$1|$1 मिसे}}",
        "apisandbox-continue-clear": "खाली गर्नुहोस्",
        "booksources": "किताबका श्रोतहरु",
        "booksources-search-legend": "किताबका श्रोतहरु खोज्ने",
index 7b13c9d..9720dae 100644 (file)
@@ -99,7 +99,8 @@
                        "Acamicamacaraca",
                        "DeRudySoulStorm",
                        "Railfail536",
-                       "Vlad5250"
+                       "Vlad5250",
+                       "CiaPan"
                ]
        },
        "tog-underline": "Podkreślenie linków:",
        "tooltip-t-emailuser": "Wyślij e‐mail do {{GENDER:$1|tego użytkownika|tej użytkowniczki}}",
        "tooltip-t-info": "Więcej informacji na temat tej strony",
        "tooltip-t-upload": "Prześlij pliki",
-       "tooltip-t-specialpages": "Lista wszystkich specjalnych stron",
+       "tooltip-t-specialpages": "Lista wszystkich stron specjalnych",
        "tooltip-t-print": "Wersja do wydruku",
        "tooltip-t-permalink": "Stały link do tej wersji strony",
        "tooltip-ca-nstab-main": "Zobacz stronę treści",
        "show-big-image-preview": "Rozmiar podglądu – $1.",
        "show-big-image-preview-differ": "Wielkość pliku podglądu $3 dla pliku $2: $1",
        "show-big-image-other": "{{PLURAL:$2|Inna rozdzielczość|Inne rozdzielczości}}: $1.",
-       "show-big-image-size": "$1 x $2 pikseli",
+       "show-big-image-size": "$1 × $2 pikseli",
        "file-info-gif-looped": "zapętlony",
        "file-info-gif-frames": "$1 {{PLURAL:$1|klatka|klatki|klatek}}",
        "file-info-png-looped": "zapętlony",
        "passwordpolicies-policy-maximalpasswordlength": "Hasło musi mieć mniej niż $1 {{PLURAL:$1|znak|znaki|znaków}}",
        "passwordpolicies-policy-passwordcannotbepopular": "Hasło nie może być {{PLURAL:$1|popularne|na liście $1 popularnych haseł}}",
        "passwordpolicies-policy-passwordnotinlargeblacklist": "Hasło nie może znajdować się na liście 100 000 najczęściej używanych haseł.",
+       "easydeflate-invaliddeflate": "Dostarczona zawartość nie jest poprawnie skompresowana",
        "unprotected-js": "Ze względów bezpieczeństwa kod JavaScript nie może zostać załadowany z niezabezpieczonych stron. Prosimy dodawać JavaScript w przestrzeni MediaWiki lub jako podstronę strony użytkownika."
 }
index 4af6002..2072ca4 100644 (file)
        "shown-title": "Mostrar $1 {{PLURAL:$1|resultado|resultados}} por página",
        "viewprevnext": "Ver ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "<strong>Há uma página com o nome \"[[:$1]]\" nesta wiki.</strong> {{PLURAL:$2|0=|Veja também os outros resultados da pesquisa encontrados.}}",
-       "searchmenu-new": "<strong>Criar a página \"[[:$1]]\" nesta wiki!</strong> {{PLURAL:$2|0=|Veja também a página encontrada com sua pesquisa.|Veja também os resultados da pesquisa encontrados.}}",
+       "searchmenu-new": "<strong>Crie a página “[[:$1]]” nesta wiki!</strong> {{PLURAL:$2|0=|Veja também a página encontrada com sua pesquisa.|Veja também os resultados da pesquisa encontrados.}}",
        "searchprofile-articles": "Páginas de conteúdo",
        "searchprofile-images": "Multimídia",
        "searchprofile-everything": "Tudo",
index 26fed94..393e920 100644 (file)
        "localtime": "Used as label in [[Special:Preferences#mw-prefsection-datetime|preferences]].",
        "timezoneuseserverdefault": "[[Special:Preferences]] > Date and time > Time zone\n\nThis option lets your time zone setting use the one that is used on the wiki (often UTC).\n\nParameters:\n* $1 - timezone name, or timezone offset (in \"%+03d:%02d\" format)",
        "timezoneuseoffset": "Used in \"Time zone\" listbox in [[Special:Preferences#mw-prefsection-datetime|preferences]], \"date and time\" tab.",
+       "timezone-useoffset-placeholder": "Used in \"Time zone\" text input field as placeholder in [[Special:Preferences#mw-prefsection-datetime|preferences]]",
        "servertime": "Used as label in [[Special:Preferences#mw-prefsection-datetime|preferences]].",
        "guesstimezone": "Option to fill in the timezone from the browser setting",
        "timezoneregion-africa": "Used in \"Time zone\" listbox in [[Special:Preferences#mw-prefsection-datetime|preferences]], \"date and time\" tab.\n{{Related|Timezoneregion}}",
index 119ba84..dabce01 100644 (file)
        "passwordtooshort": "Le password onne a essere almene {{PLURAL:$1|1 carattere|$1 carattere}}.",
        "passwordtoolong": "Le password non ge ponne essere cchiù longhe de {{PLURAL:$1|1 carattere}}.",
        "passwordtoopopular": "Password comuni non ge ponne essere ausate. Scacchie 'na password cchiù difficile da 'nduvenà.",
+       "passwordinlargeblacklist": "'A passuord mise ste jndr'à l'elenghe de le passuord ausate de cchiù. Pe piacere scacchie 'na passuord cchiù secure.",
        "password-name-match": "'A password toje adda essere diverse da 'u nome utende tue.",
        "password-login-forbidden": "L'ause de stu nome utende e passuord onne state vietate.",
        "mailmypassword": "Azzere 'a passuord",
        "booksources-search": "Cirche",
        "booksources-text": "Sotte stè 'na liste de collegaminde a otre site ca vennene libbre nuève e ausete e puà pure acchià cchiù 'mbormaziune sus a le libbre ca tu ste cirche:",
        "booksources-invalid-isbn": "L'ISBN ca è mise non ge pare ca ète corrette; verifiche ce è commesse quacche errore quanne ste cupiave quidde origginale.",
+       "magiclink-tracking-rfc": "Pàggene ca ausane le collegaminde maggece RFC",
+       "magiclink-tracking-pmid": "Pàggene ca ausane le collegaminde maggece PMID",
+       "magiclink-tracking-isbn": "Pàggene ca ausane le collegaminde maggece ISBN",
        "specialloguserlabel": "'Mblemendatore:",
        "speciallogtitlelabel": "Destinazione (titole o {{ns:user}}:nome de l'utende pe l'utende):",
        "log": "Archivije",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Vuè ccu live sta pàgene da chidde condrollate?",
        "confirm-rollback-button": "OK",
+       "confirm-mcrrestore-title": "Repristine 'a revisione",
        "confirm-mcrundo-title": "Annulle 'u cangiamende",
        "mcrundofailed": "Annullamende fallite",
        "semicolon-separator": ";&#32;",
        "tag-mw-contentmodelchange-description": "Cangiaminde ca [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel cangiane 'u modelle de le condenute] de 'na pàgene",
        "tag-mw-new-redirect": "Reindirizzamende nuève",
        "tag-mw-replace": "Sostituite",
+       "tag-mw-rollback": "Annulle",
        "tag-mw-undo": "Annulle",
        "tags-title": "Tag",
        "tags-intro": "Sta pàgene elenghe le tag ca 'u software pò marcà cu 'nu cangiamende e 'u lore significate.",
        "log-action-filter-newusers-create": "Ccrejazzione da 'utende senza nome",
        "log-action-filter-newusers-create2": "Ccrejazzione da 'utende reggistrate",
        "log-action-filter-newusers-autocreate": "Ccrejazione automateche",
+       "log-action-filter-protect-protect": "Protezzione",
+       "log-action-filter-protect-modify": "Cangiamende d'a protezzione",
+       "log-action-filter-protect-unprotect": "Sprotette",
+       "log-action-filter-protect-move_prot": "Protezzione spustate",
        "log-action-filter-rights-rights": "Cangiamende a màne",
        "log-action-filter-rights-autopromote": "Cangiamende automateche",
        "log-action-filter-suppress-event": "Soppressione de l'archivije",
index a51e986..0e75cfb 100644 (file)
        "right-block": "Блокировка редактирования другими участниками",
        "right-blockemail": "Блокировка на отправку электронной почты",
        "right-hideuser": "Запрет имени участника и его сокрытие",
-       "right-ipblock-exempt": "обход блокировок по IP, автоблокировок и блокировок диапазонов",
+       "right-ipblock-exempt": "Ð\9eбход блокировок по IP, автоблокировок и блокировок диапазонов",
        "right-unblockself": "Разблокирование себя самого",
        "right-protect": "Изменение уровня защиты страниц и правка каскадно защищённых страниц",
        "right-editprotected": "Правка страниц, защищённых как «{{int:protect-level-sysop}}»",
        "listgrouprights-members": "(список участников)",
        "listgrouprights-right-display": "<span class=\"listgrouprights-granted\">$1 (<code>$2</code>)</span>",
        "listgrouprights-right-revoked": "<span class=\"listgrouprights-revoked\">$1 (<code>$2</code>)</span>",
-       "listgrouprights-addgroup": "добавление в {{PLURAL:$2|1=группу|группы}}: $1",
-       "listgrouprights-removegroup": "исключение из {{PLURAL:$2|1=группы|групп}}: $1",
-       "listgrouprights-addgroup-all": "добавление во все группы",
-       "listgrouprights-removegroup-all": "исключение из всех групп",
+       "listgrouprights-addgroup": "Ð\94обавление в {{PLURAL:$2|1=группу|группы}}: $1",
+       "listgrouprights-removegroup": "Ð\98сключение из {{PLURAL:$2|1=группы|групп}}: $1",
+       "listgrouprights-addgroup-all": "Ð\94обавление во все группы",
+       "listgrouprights-removegroup-all": "Ð\98сключение из всех групп",
        "listgrouprights-addgroup-self": "добавление своей учётной записи в {{PLURAL:$2|1=группу|группы}}: $1",
-       "listgrouprights-removegroup-self": "исключение своей учётной записи из {{PLURAL:$2|1=группы|групп}}: $1",
+       "listgrouprights-removegroup-self": "Ð\98сключение своей учётной записи из {{PLURAL:$2|1=группы|групп}}: $1",
        "listgrouprights-addgroup-self-all": "Может добавлять все группы к своей учётной записи",
        "listgrouprights-removegroup-self-all": "может удалять все группы со своей учётной записи",
        "listgrouprights-namespaceprotection-header": "Ограничения пространства имён",
index 7c52923..1ec2744 100644 (file)
        "pool-errorunknown": "Непозната грешка",
        "pool-servererror": "Услуга бројача редова није доступна ($1).",
        "poolcounter-usage-error": "Грешка при употреби: $1",
-       "aboutsite": "О пројекту {{SITENAME}}",
-       "aboutpage": "Project:О_пројекту_{{SITENAME}}",
+       "aboutsite": "О {{GRAMMAR:датив|{{SITENAME}}}}",
+       "aboutpage": "Project:О_{{GRAMMAR:датив|{{SITENAME}}}}",
        "copyright": "Садржај је доступан под лиценцом $1 осим ако је другачије наведено.",
        "copyrightpage": "{{ns:project}}:Ауторска права",
        "currentevents": "Актуелности",
        "userlogout": "Одјава",
        "notloggedin": "Нисте пријављени",
        "userlogin-noaccount": "Немате налог?",
-       "userlogin-joinproject": "Придружите се пројекту {{SITENAME}}",
+       "userlogin-joinproject": "Придружите се {{GRAMMAR:датив|{{SITENAME}}}}",
        "createaccount": "Отварање налога",
        "userlogin-resetpassword-link": "Заборавили сте лозинку?",
        "userlogin-helplink2": "Помоћ при пријављивању",
index c7aec27..adeede7 100644 (file)
        "filehist-filesize": "Ukuran berkas",
        "filehist-comment": "Kamandang",
        "imagelinks": "Pamakéan berkas",
-       "linkstoimage": "Kaca ieu  {{PLURAL:$1|numbu|$1 numbu}} ka gambar ieu :",
-       "linkstoimage-more": "Leuwih ti $1 {{PLURAL:$1|kaca nutumbu|kaca nutumbu}} ka ieu berkas.\nBéréndélan di handap némbongkeun {{PLURAL:$1|tutumbu kaca kahiji|$1 tutumbu kaca kahiji}} ka ieu berkas hungkul.\n[[Special:WhatLinksHere/$2|Béréndélan lengkepna]] ogé aya.",
-       "nolinkstoimage": "Teu aya kaca anu nutumbu ka ieu berkas.",
+       "linkstoimage": "Ieu berkas dipaké ku {{PLURAL:$1|kaca|$1 kaca}} di handap:",
+       "linkstoimage-more": "Leuwih ti $1 {{PLURAL:$1|kaca|kaca}} nu maké ieu berkas.\nBéréndélan di handap némbongkeun {{PLURAL:$1|kaca kahiji|$1 kaca mimiti}} nu maké ieu berkas hungkul.\n[[Special:WhatLinksHere/$2|Béréndélan lengkepna]] ogé aya.",
+       "nolinkstoimage": "Euweuh kaca anu maké ieu berkas.",
        "morelinkstoimage": "Témbong [[Special:WhatLinksHere/$1|tutumbu lianna]] ka ieu berkas.",
        "linkstoimage-redirect": "$1 (pangalihan berkas) $2",
        "sharedupload": "Ieu berkas téh ti $1 jeung meureun dipaké ku proyék-proyék séjén.",
index 1c36714..5c0ad6c 100644 (file)
        "userlogin-createanother": "دوسرا کھاتہ تخلیق کریں",
        "createacct-emailrequired": "ای میل پتہ",
        "createacct-emailoptional": "برقی ڈاک پتا (اختیاری)",
-       "createacct-email-ph": "اپنا برقی پتہ لکھیں",
+       "createacct-email-ph": "اپنا برقی ڈاک پتا لکھیں",
        "createacct-another-email-ph": "برقی ڈاک پتا لکھیں",
        "createaccountmail": "عارضی پاسورڈ استعمال کریں اور اسے متعینہ برقی ڈاک پتہ پر ارسال کریں",
        "createaccountmail-help": "پاس ورڈ معلوم کیے بغیر کسی دوسرے شخص کا کھاتہ بنانے کے لیے اسے استعمال کیا جا سکتا ہے۔",
        "mailmypassword": "پاسورڈ تبدیل کریں",
        "passwordremindertitle": "نیا عارضی کلمۂ شناخت برائے {{SITENAME}}",
        "passwordremindertext": "(IP پتہ $1 سے) کسی (یا شاید آپ) نے {{SITENAME}} ($4)\nکے لیے نئے پاس ورڈ کی درخواست کی ہے۔ لہذا صارف \"$2\" کے لیے ایک عارضی پاس ورڈ \"$3\" بنا دیا گیا ہے۔\nاگر یہ اقدام بالارادہ تھا تو اب آپ لاگ ان ہونے کے بعد نیا پاس ورڈ رکھیں۔\nآپ کا درج بالا عارضی پاس ورڈ {{PLURAL:$5|ایک دِن|$5 دِنوں}} کے بعد ناکارہ ہوجائے گا۔\n\nاگر کسی اَور نے یہ درخواست کی ہے، یا آپ کو اپنا پاس ورڈ یاد آگیا ہے اور آپ اسے تبدیل نہیں کرنا چاہتے تو آپ یہ پیغام نظر انداز کرکے اپنے پرانے پاس ورڈ کا استعمال جاری رکھ سکتے ہیں۔",
-       "noemail": "صارف \"$1\" کیلئے کوئی برقی پتہ درج نہیں کیا گیا.",
-       "noemailcreate": "صحیح برقی پتہ مہیّا کریں",
+       "noemail": "صارف \"$1\" کا کوئی برقی ڈاک پتا درج نہیں کیا گیا۔",
+       "noemailcreate": "صحیح برقی ڈاک پتا فراہم کریں۔",
        "passwordsent": "ایک نیا کلمۂ شناخت \"$1\" کے نام سے بننے والی برقی ڈاک کے پتے کیلیے بھیج دیا گیا ہے۔\nجب وہ موصول ہو جاۓ تو براہ کرم اسکے ذریعے دوبارہ داخل ہوں۔",
        "blocked-mailpassword": "آپ کے آئی پی پتے کی ترمیم کاری پر پابندی لگا دی گئی ہے۔ غلط استعمال سے بچنے کے لیے اس آئی پی پتے سے پاس ورڈ کی بازیابی کی اجازت منسوخ کر دی گئی ہے۔",
-       "eauthentsent": "ایک تصدیقی برقی خط نامزد کیے گئے برقی پتہ پر ارسال کردیا گیا ہے۔\nآپ کو موصول ہوئے برقی خط میں ہدایات پر عمل کرکے اس بات کی توثیق کرلیں کہ مذکورہ برقی پتہ آپ کا ہی ہے۔",
+       "eauthentsent": "ایک تصدیقی برقی خط درج کردہ برقی ڈاک پتے پر ارسال کردیا گیا ہے۔\nآپ کو موصول شدہ برقی خط میں موجود ہدایات پر عمل کرکے اس بات کی توثیق کرلیں کہ مذکورہ برقی ڈاک پتا آپ کا ہی ہے۔",
        "throttled-mailpassword": "گزشتہ {{PLURAL:$1|گھنٹے|$1 گھنٹوں}} کے دوران پہلے سے ہی پاسورڈ کی تبدیلی کے لیے برقی خط بھیجا گيا ہے۔\nناجائز استعمال کے سدّباب کے لیے، {{PLURAL:$1|گھنٹہ|$1 گھنٹوں}} کے دوران صرف ایک برقی خط بھیجا جا سکتا ہے۔",
        "mailerror": "مسلہ دوران ترسیل خط:$1",
        "acct_creation_throttle_hit": "آپکی آئی پی کے ذریعے اِس ویکی پر آنے والے صارفین نے پچھلے $2 میں {{PLURAL:$1|1 کھاتہ بنایا ہے|$1 کھاتے بنائے ہیں}} جو اس مدت کے لیے کافی ہیں۔\nلہٰذا آپ کی آئی پی استعمال کرنے والے صارفین اِس وقت مزید کھاتے نہیں بنا سکتے۔",
        "emailauthenticated": "آپ کے برقی ڈاک پتہ کی تصدیق مورخہ $2 بوقت $3 بجے ہوئی۔",
-       "emailnotauthenticated": "آپ کے برقی پتہ کی ابھی تصدیق نہیں ہوئی ہے۔\nدرج ذیل میں سے کسی بھی چیز کیلئے آپ کے برقی پتہ پر برقی ڈاک ارسال نہیں کی جائے گی۔",
+       "emailnotauthenticated": "آپ کے برقی ڈاک پتے کی ابھی تصدیق نہیں ہوئی ہے۔\nدرج ذیل میں سے کسی بھی چیز کے لیے آپ کے برقی ڈاک پتے پر برقی ڈاک ارسال نہیں کی جائے گی۔",
        "noemailprefs": "اِن خصائص کو کام میں لانے کیلئے اپنے ترجیحات میں برقی ڈاک کا پتہ متعین کیجئے.",
-       "emailconfirmlink": "اپنے برقی پتہ کی تصدیق کیجئے",
-       "invalidemailaddress": "برقی پتہ قبول نہیں کیا جاسکتا کیونکہ یہ غلط شکل میں ہے.\nبراہِ کرم! ایک برقی پتہ صحیح شکل میں درج کیجئے یا جگہ کو خالی چھوڑ دیجئے.",
-       "cannotchangeemail": "کھاتے کا برقی پتہ اس ویکی سے پر رہتے ہوئے نہیں تبدیل کیا جا سکتا۔",
+       "emailconfirmlink": "اپنے برقی ڈاک پتے کی تصدیق کریں",
+       "invalidemailaddress": "برقی ڈاک پتا قبول نہیں کیا جاسکتا کیونکہ یہ غلط شکل میں ہے۔\nبراہِ کرم اپنا برقی ڈاک پتا صحیح شکل میں درج کریں یا اس جگہ کو خالی چھوڑ دیں۔",
+       "cannotchangeemail": "اس ویکی پر کھاتے کا برقی ڈاک پتا تبدیل کیا جا سکتا۔",
        "emaildisabled": "اس سائٹ سے برقی خط نہیں بھیجے جاسکتے",
        "accountcreated": "تخلیقِ کھاتہ",
        "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|تبادلۂ خیال]]) کا صارف کھاتہ بن چکا ہے۔",
        "createaccount-title": "کھاتہ سازی برائے {{SITENAME}}",
-       "createaccount-text": "کسی نے {{SITENAME}} ($4) پر «$2» کے نام سے اور \"$3\" پاسورڈ کے ساتھ آپ کا برقی پتہ استعمال کرتے ہوئے کھاتہ بنایا ہے۔\nآپ کو چاہیے کہ ابھی لاگ ان ہو کر اپنا پاسورڈ تبدیل کر دیں۔\n\nاگر یہ کھاتہ غلطی سے بنا ہے، تو آپ یہ پیغام نظر انداز کر دیں۔",
+       "createaccount-text": "کسی نے {{SITENAME}} ($4) پر «$2» کے نام سے اور \"$3\" پاس ورڈ کے ساتھ آپ کا برقی ڈاک پتا استعمال کرتے ہوئے کھاتہ بنایا ہے۔\nچنانچہ آپ ابھی لاگ ان ہو کر اپنا پاس ورڈ تبدیل کر دیں۔\n\nاگر یہ کھاتہ غلطی سے بنا ہے، تو آپ اس پیغام کو نظر انداز کر سکتے ہیں۔",
        "login-throttled": "آپ نے حال ہی میں متعدد مرتبہ لاگ ان ہونے کی کوشش کی ہے۔\nدوبارہ کوشش کرنے سے پہلے $1 انتظار فرمائیے۔",
        "login-abort-generic": "لاگ ان ناکام - منسوخ شد",
        "login-migrated-generic": "آپ کا کھاتہ منتقل کر دیا گیا، اب اس ویکی پر آپ کا صارف نام موجود نہیں۔",
        "subject-preview": "عنوان/شہ سرخی کی نمائش:",
        "previewerrortext": "آپ کی تبدیلیوں کی نمائش دکھانے کے دوران میں کوئی نقص واقع ہو گیا ہے۔",
        "blockedtitle": "صارف مسدود ہے",
-       "blockedtext": "<strong>آپ کے صارف نام یا آئی پی پتہ پر پابندی لگائی جا چکی ہے۔</strong>\n\n$1 نے پابندی عائد کی اور یہ وجہ درج کی: <em>$2</em>\n\n* پابندی کی ابتدا : $8\n* پابندی کا اختتام : $6\n* ممنوع صارف: $7\n\nآپ $1 یا کسی دوسرے [[{{MediaWiki:Grouppage-sysop}}|منتظم]] سے رابطہ کر کے اس پابندی پر گفت و شنید کر سکتے ہیں۔\nواضح رہے کہ آپ «{{int:emailuser}}» کی سہولت اُس وقت تک استعمال نہیں کر سکتے جب تک آپ اپنے [[Special:Preferences|کھاتہ کی ترجیحات]] میں درست برقی پتا درج نہ کریں اور آپ کو اِسے استعمال کرنے سے روک نہ دیا گیا ہو۔\nآپ کا موجودہ آئی پی پتہ $3 ہے اور پابندی کا شناختی نمبر #$5 ہے۔\nاگر آپ پابندی سے متعلق کہیں استفسار کریں تو براہِ مہربانی اس میں درج بالا تمام تفصیلات شامل کریں۔",
-       "autoblockedtext": "آپ کے آئی پی پتے پر خودکار طور پر پابندی لگا دی گئی ہے کیونکہ اسے ایک ایسے صارف نے استعمال کیا تھا جس پر $1 نے پابندی لگا رکھی ہے۔\nپابندی کی وجہ یہ درج کی گئی:\n\n:<em>$2</em>\n\n*پابندی کی ابتدا: $8\n*پابندی کا اختتام: $6\n*ممنوع صارف: $7\n\nآپ $1 سے یا دوسرے [[{{MediaWiki:Grouppage-sysop}}|منتظمین]] سے رابطہ کر کے اس پابندی پر گفت و شنید کر سکتے ہیں۔\n\nیاد رکھیں کہ «{{int:emailuser}}» کی خاصیت اُس وقت تک استعمال نہیں کرسکتے جب تک آپ اپنے [[Special:Preferences|کھاتے کی ترجیحات]] میں صحیح برقی پتہ درج نہ کریں اور آپ کو اِسے استعمال کرنے سے روک نہ دیا گیا ہو۔\n\nآپ کا موجودہ آئی پی پتہ $3 ہے، اور پابندی کی شناخت #$5 ہے۔\nبراہِ مہربانی کسی بھی قسم کے استفسار میں درج بالا تمام تفصیلات شامل کریں۔",
+       "blockedtext": "<strong>آپ کے صارف نام یا آئی پی پتہ پر پابندی لگائی جا چکی ہے۔</strong>\n\n$1 نے پابندی عائد کی اور یہ وجہ درج کی: <em>$2</em>\n\n* پابندی کی ابتدا : $8\n* پابندی کا اختتام : $6\n* ممنوع صارف: $7\n\nآپ $1 یا کسی دوسرے [[{{MediaWiki:Grouppage-sysop}}|منتظم]] سے رابطہ کر کے اس پابندی پر گفت و شنید کر سکتے ہیں۔\nواضح رہے کہ آپ «{{int:emailuser}}» کی سہولت اُس وقت تک استعمال نہیں کر سکتے جب تک آپ اپنے [[Special:Preferences|کھاتہ کی ترجیحات]] میں درست برقی ڈاک پتا درج نہ کریں اور آپ کو اِسے استعمال کرنے سے روک نہ دیا گیا ہو۔\nآپ کا موجودہ آئی پی پتہ $3 ہے اور پابندی کا شناختی نمبر #$5 ہے۔\nاگر آپ پابندی سے متعلق کہیں استفسار کریں تو براہِ مہربانی اس میں درج بالا تمام تفصیلات شامل کریں۔",
+       "autoblockedtext": "آپ کے آئی پی پتے پر خودکار طور پر پابندی لگا دی گئی ہے کیونکہ اسے ایک ایسے صارف نے استعمال کیا تھا جس پر $1 نے پابندی لگا رکھی ہے۔\nپابندی کی وجہ یہ درج کی گئی:\n\n:<em>$2</em>\n\n*پابندی کی ابتدا: $8\n*پابندی کا اختتام: $6\n*ممنوع صارف: $7\n\nآپ $1 سے یا دیگر [[{{MediaWiki:Grouppage-sysop}}|منتظمین]] سے رابطہ کر کے اس پابندی پر گفت و شنید کر سکتے ہیں۔\n\nیاد رکھیں کہ آپ «{{int:emailuser}}» کی خاصیت اُس وقت تک استعمال نہیں کرسکتے جب تک آپ اپنے [[Special:Preferences|کھاتے کی ترجیحات]] میں صحیح برقی ڈاک پتا درج نہ کریں اور آپ کو اِسے استعمال کرنے سے روک نہ دیا گیا ہو۔\n\nآپ کا موجودہ آئی پی پتہ $3 ہے اور پابندی کا شناختی نمبر #$5 ہے۔\nبراہِ مہربانی کسی بھی قسم کے استفسار میں درج بالا تمام تفصیلات ضرور شامل کریں۔",
        "systemblockedtext": "آپ کے صارف نام یا آئی پی پتے پر میڈیاویکی کی جانب سے خودکار طریقے سے پابندی لگا دی گئی ہے۔\nاور وجہ یہ درج کی گئی ہے کہ:\n<em>$2</em>\n\n*پابندی کی ابتدا: $8\n*پابندی کا اختتام: $6\n*ممنوع صارف: $7\n\nآپ کا موجودہ آئی پی پتہ $3 ہے۔\nبراہِ مہربانی کسی بھی قسم کے استفسار میں درج بالا تمام تفصیلات شامل کریں۔",
        "blockednoreason": "کوئی وجہ نہیں دی گئی",
        "whitelistedittext": "ترمیم کیلئے $1 ضروری ہے.",
-       "confirmedittext": "صفحات میں ترمیم کرنے سے پہلے آپ اپنے برقی پتہ کی تصدیق کریں.\nبرائے مہربانی! اپنی [[Special:Preferences|ترجیحات]] کے ذریعے اپنا برقی پتہ کا تعیّن اور تصدیق کیجئے.",
+       "confirmedittext": "صفحات میں ترمیم کرنے سے پہلے آپ اپنے برقی ڈاک پتے کی تصدیق کریں۔\nبراہ مہربانی کھاتے کی [[Special:Preferences|ترجیحات]] میں اپنا برقی ڈاک پتا درج اور اس کی تصدیق کریں۔",
        "nosuchsectiontitle": "قطعہ نہیں ملا",
        "nosuchsectiontext": "آپ نے ایسے قطعہ میں ترمیم کی کوشش کی ہے جو کہ موجود نہیں.\nہوسکتا ہے کہ جب آپ صفحہ ملاحظہ فرمارہے تھے اُسی اثناء مذکورہ قطعہ کو منتقل یا حذف کردیا گیا ہو.",
        "loginreqtitle": "داخلہ / اندراج لازم",
        "prefs-misc": "دیگر",
        "prefs-resetpass": "پاس ورڈ تبدیل کریں",
        "prefs-changeemail": "برقی ڈاک پتا تبدیل یا حذف کریں",
-       "prefs-setemail": "برقی پتہ دیں",
+       "prefs-setemail": "برقی ڈاک پتا درج کریں",
        "prefs-email": "برقی خط کے اختیارات",
        "prefs-rendering": "ظاہریت",
        "saveprefs": "محفوظ",
        "emailuser-title-notarget": "ای میل صارف",
        "emailpagetext": "درج ذیل فارم کے ذریعہ آپ اس {{GENDER:$1|صارف}} کو برقی پیغام بھیج سکتے ہیں۔ جو برقی ڈاک پتا آپ نے [[Special:Preferences|اپنی ترجیحات]] میں دیا ہے وہ یہاں \"از\" کے طور پر نظر آئے گا، تاکہ وصول کنندہ براہ راست آپ کو جواب دے سکے۔",
        "defemailsubject": "{{SITENAME}} سے برقی خط",
-       "usermaildisabled": "صارف برقی پتہ غیر فعال ہے",
+       "usermaildisabled": "صارف کا برقی ڈاک پتا غیر فعال ہے",
        "usermaildisabledtext": "آپ اس ویکی پر رہتے ہوئے دوسرے صارف کو برقی خط ارسال نہيں کر سکتے",
-       "noemailtitle": "کوئی برقی پتہ نہیں ہے",
+       "noemailtitle": "کوئی برقی ڈاک پتا نہیں ہے",
        "noemailtext": "اس صارف نے کوئی درست برقی ڈاک پتا نہیں دیا ہے۔",
        "nowikiemailtext": "اس صارف نے دیگر صارفین سے برقی خط وصول نہ کرنے کا فیصلہ کیا ہے۔",
        "emailnotarget": "وصول کنندہ موجود نہیں یا صارف نام نادرست ہے۔",
        "exif-urgency-other": "صارف کی وضاحت کردہ ترجیح ($1)",
        "namespacesall": "تمام",
        "monthsall": "تمام",
-       "confirmemail": "اپنے برقی پتہ کی تصدیق کریں",
+       "confirmemail": "اپنے برقی ڈاک پتے کی تصدیق کریں",
        "confirmemail_noemail": "آپ نے [[Special:Preferences|اپنی ترجیحات]] میں درست برقی ڈاک پتا نہیں دیا ہے۔",
        "confirmemail_text": "{{SITENAME}} میں موجود برقی خط کی سہولتوں کو استعمال کرنے کے لیے آپ کے برقی ڈاک پتے کی تصدیق ضروری ہے۔\nاپنے پتے پر تصدیقی ڈاک روانہ کرنے کے لیے ذیل میں موجود بٹن پر کلک کریں۔\nموصولہ برقی خط میں آپ کو کوڈ پر مشتمل ایک ربط نظر آئے گا۔\nچنانچہ اپنے بڑقی ڈاک پتے کی تصدیق کے لیے اس ربط کو اپنے براؤزر میں کھولیں۔",
        "confirmemail_pending": "آپ کو تصدیقی کوڈ پہلے ہی روانہ کیا جا چکا ہے۔\nاگر آپ نے ابھی اپنا کھاتہ بنایا ہے تو نئے کوڈ کی درخواست دینے سے قبل اس کے موصول ہونے کا کچھ دیر انتظار کر لیں۔",
index 89e8e8d..2b82b70 100644 (file)
        "explainconflict": "在您開始編輯之後已有其他人儲存了此頁面。\n上方的文字框內顯示了目前頁面中的文字內容,\n您所變更的文字內容顯示在下方文字框中。\n您須要將您所變更的文字內容合併到已儲存的文字內容當中。\n若您直接點選 \"$1\" <strong>只有</strong> 上方文字框中的內容會被儲存。",
        "yourtext": "您的文字",
        "storedversion": "已儲存修訂",
-       "editingold": "<strong>警告:您目前正編輯頁面的舊修訂版本。</strong>\n若您儲存,在此修訂之後變更的任何內容將會遺失。",
+       "editingold": "<strong>警告:您目前正編輯頁面的舊修訂版本。</strong>若您儲存,在此修訂之後變更的任何內容將會遺失。",
        "unicode-support-fail": "看起來您的瀏覽器不支援Unicode。需要Unicode才能編輯頁面,所以您的編輯無法儲存。",
        "yourdiff": "差異",
        "copyrightwarning": "請注意,所有於 {{SITENAME}} 所做的貢獻會依據 $2 授權條款發佈 (詳情請見 $1)。\n若您不希望您的著作被任意修改與散佈,請勿在此發表文章。<br />\n您同時向我們保証在此的著作內容是您自行撰寫,或是取自不受版權保護的公開領域或自由資源。\n<strong>請勿在未經授權的情況下發表文章!</strong>",
diff --git a/maintenance/archives/patch-drop-ct_tag.sql b/maintenance/archives/patch-drop-ct_tag.sql
new file mode 100644 (file)
index 0000000..2f5881a
--- /dev/null
@@ -0,0 +1,10 @@
+-- T185355
+ALTER TABLE /*_*/change_tag MODIFY ct_tag_id int unsigned NOT NULL;
+
+DROP INDEX /*i*/change_tag_rc_tag_nonuniq ON /*_*/change_tag;
+DROP INDEX /*i*/change_tag_log_tag_nonuniq ON /*_*/change_tag;
+DROP INDEX /*i*/change_tag_rev_tag_nonuniq ON /*_*/change_tag;
+DROP INDEX /*i*/change_tag_tag_id ON /*_*/change_tag;
+
+ALTER TABLE /*_*/change_tag DROP COLUMN ct_tag;
+
diff --git a/maintenance/mssql/archives/patch-drop-ct_tag.sql b/maintenance/mssql/archives/patch-drop-ct_tag.sql
new file mode 100644 (file)
index 0000000..5498a1c
--- /dev/null
@@ -0,0 +1,22 @@
+-- T185355
+ALTER TABLE /*_*/change_tag ALTER COLUMN ct_tag INTEGER NOT NULL
+
+DECLARE @sql nvarchar(max),
+       @id sysname;--
+
+SET @sql = 'ALTER TABLE /*_*/change_tag DROP CONSTRAINT ';--
+
+SELECT @id = df.name
+FROM sys.default_constraints df
+JOIN sys.columns c
+       ON c.object_id = df.parent_object_id
+       AND c.column_id = df.parent_column_id
+WHERE
+       df.parent_object_id = OBJECT_ID('/*_*/change_tag')
+       AND c.name = 'ct_tag';--
+
+SET @sql = @sql + @id;--
+
+EXEC sp_executesql @sql;--
+
+ALTER TABLE /*_*/change_tag DROP COLUMN ct_tag;
index ec2f1fa..fd2fae7 100644 (file)
@@ -1398,24 +1398,17 @@ CREATE TABLE /*_*/change_tag (
   ct_log_id int NULL REFERENCES /*_*/logging(log_id),
   -- REVID for the change
   ct_rev_id int NULL REFERENCES /*_*/revision(rev_id),
-  -- Tag applied
-  ct_tag nvarchar(255) NOT NULL default '',
   -- Parameters for the tag, presently unused
   ct_params nvarchar(max) NULL,
   -- Foreign key to change_tag_def row
-  ct_tag_id int NULL CONSTRAINT ctd_tag_id__fk FOREIGN KEY REFERENCES /*_*/change_tag_def(ctd_id)
+  ct_tag_id int NOT NULL CONSTRAINT ctd_tag_id__fk FOREIGN KEY REFERENCES /*_*/change_tag_def(ctd_id)
 );
 
-CREATE INDEX /*i*/change_tag_rc_tag_nonuniq ON /*_*/change_tag (ct_rc_id,ct_tag);
-CREATE INDEX /*i*/change_tag_log_tag_nonuniq ON /*_*/change_tag (ct_log_id,ct_tag);
-CREATE INDEX /*i*/change_tag_rev_tag_nonuniq ON /*_*/change_tag (ct_rev_id,ct_tag);
-
 CREATE UNIQUE INDEX /*i*/change_tag_rc_tag_id ON /*_*/change_tag (ct_rc_id,ct_tag_id);
 CREATE UNIQUE INDEX /*i*/change_tag_log_tag_id ON /*_*/change_tag (ct_log_id,ct_tag_id);
 CREATE UNIQUE INDEX /*i*/change_tag_rev_tag_id ON /*_*/change_tag (ct_rev_id,ct_tag_id);
 
 -- Covering index, so we can pull all the info only out of the index.
-CREATE INDEX /*i*/change_tag_tag_id ON /*_*/change_tag (ct_tag,ct_rc_id,ct_rev_id,ct_log_id);
 CREATE INDEX /*i*/change_tag_tag_id_id ON /*_*/change_tag (ct_tag_id,ct_rc_id,ct_rev_id,ct_log_id);
 
 -- Rollup table to pull a LIST of tags simply without ugly GROUP_CONCAT
diff --git a/maintenance/oracle/archives/patch-drop-ct_tag.sql b/maintenance/oracle/archives/patch-drop-ct_tag.sql
new file mode 100644 (file)
index 0000000..4c5d128
--- /dev/null
@@ -0,0 +1,9 @@
+-- T185355
+ALTER TABLE &mw_prefix.change_tag MODIFY &mw_prefix.ct_tag_id NUMBER NOT NULL;
+
+DROP INDEX &mw_prefix.change_tag_i03;
+DROP INDEX &mw_prefix.change_tag_i04;
+DROP INDEX &mw_prefix.change_tag_i05;
+DROP INDEX &mw_prefix.change_tag_i01;
+
+ALTER TABLE &mw_prefix.change_tag DROP COLUMN &mw_prefix.ct_tag;
index 1ccaabf..4c36fe1 100644 (file)
@@ -935,21 +935,15 @@ CREATE TABLE &mw_prefix.change_tag (
   ct_rc_id NUMBER NULL,
   ct_log_id NUMBER NULL,
   ct_rev_id NUMBER NULL,
-  ct_tag VARCHAR2(255) DEFAULT '///invalid///' NOT NULL,
   ct_params BLOB NULL,
-  ct_tag_id NUMBER NULL
+  ct_tag_id NUMBER NOT NULL
 );
 ALTER TABLE &mw_prefix.change_tag ADD CONSTRAINT &mw_prefix.change_tag_pk PRIMARY KEY (ct_id);
 
-CREATE INDEX &mw_prefix.change_tag_i03 ON &mw_prefix.change_tag (ct_rc_id,ct_tag);
-CREATE INDEX &mw_prefix.change_tag_i04 ON &mw_prefix.change_tag (ct_log_id,ct_tag);
-CREATE INDEX &mw_prefix.change_tag_i05 ON &mw_prefix.change_tag (ct_rev_id,ct_tag);
-
 CREATE UNIQUE INDEX &mw_prefix.change_tag_u04 ON &mw_prefix.change_tag (ct_rc_id,ct_tag_id);
 CREATE UNIQUE INDEX &mw_prefix.change_tag_u05 ON &mw_prefix.change_tag (ct_log_id,ct_tag_id);
 CREATE UNIQUE INDEX &mw_prefix.change_tag_u06 ON &mw_prefix.change_tag (ct_rev_id,ct_tag_id);
 
-CREATE INDEX &mw_prefix.change_tag_i01 ON &mw_prefix.change_tag (ct_tag,ct_rc_id,ct_rev_id,ct_log_id);
 CREATE INDEX &mw_prefix.change_tag_i02 ON &mw_prefix.change_tag (ct_tag_id,ct_rc_id,ct_rev_id,ct_log_id);
 
 CREATE TABLE &mw_prefix.tag_summary (
index 7bec25a..9594137 100644 (file)
@@ -42,16 +42,6 @@ class PopulateChangeTagDef extends LoggedUpdateMaintenance {
                $this->addOption( 'set-user-tags-only', 'Only update ctd_user_defined from valid_tag table' );
        }
 
-       public function execute() {
-               global $wgChangeTagsSchemaMigrationStage;
-               if ( $wgChangeTagsSchemaMigrationStage === MIGRATION_OLD ) {
-                       // Return "success", but don't flag it as done so the next run will retry
-                       $this->output( '... Not run, $wgChangeTagsSchemaMigrationStage === MIGRATION_OLD' . "\n" );
-                       return true;
-               }
-               return parent::execute();
-       }
-
        protected function doDBUpdates() {
                $this->lbFactory = MediaWiki\MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
                $this->setBatchSize( $this->getOption( 'batch-size', $this->getBatchSize() ) );
diff --git a/maintenance/postgres/archives/patch-drop-ct_tag.sql b/maintenance/postgres/archives/patch-drop-ct_tag.sql
new file mode 100644 (file)
index 0000000..cbef6c9
--- /dev/null
@@ -0,0 +1,10 @@
+-- T185355
+ALTER TABLE /*_*/change_tag ALTER COLUMN ct_tag_id SET NOT NULL;
+
+DROP INDEX /*i*/change_tag_rc_tag_nonuniq;
+DROP INDEX /*i*/change_tag_log_tag_nonuniq;
+DROP INDEX /*i*/change_tag_rev_tag_nonuniq;
+DROP INDEX /*i*/change_tag_tag_id;
+
+ALTER TABLE /*_*/change_tag DROP COLUMN ct_tag;
+
index 96a0617..4f636ae 100644 (file)
@@ -804,21 +804,15 @@ CREATE TABLE change_tag (
   ct_rc_id   INTEGER      NULL,
   ct_log_id  INTEGER      NULL,
   ct_rev_id  INTEGER      NULL,
-  ct_tag     TEXT     NOT NULL DEFAULT '',
   ct_params  TEXT         NULL,
-  ct_tag_id  INTEGER      NULL
+  ct_tag_id  INTEGER  NOT NULL
 );
 ALTER SEQUENCE change_tag_ct_id_seq OWNED BY change_tag.ct_id;
 
-CREATE INDEX change_tag_rc_tag_nonuniq ON change_tag(ct_rc_id,ct_tag);
-CREATE INDEX change_tag_log_tag_nonuniq ON change_tag(ct_log_id,ct_tag);
-CREATE INDEX change_tag_rev_tag_nonuniq ON change_tag(ct_rev_id,ct_tag);
-
 CREATE UNIQUE INDEX change_tag_rc_tag_id ON change_tag(ct_rc_id,ct_tag_id);
 CREATE UNIQUE INDEX change_tag_log_tag_id ON change_tag(ct_log_id,ct_tag_id);
 CREATE UNIQUE INDEX change_tag_rev_tag_id ON change_tag(ct_rev_id,ct_tag_id);
 
-CREATE INDEX change_tag_tag_id ON change_tag(ct_tag,ct_rc_id,ct_rev_id,ct_log_id);
 CREATE INDEX change_tag_tag_id_id ON change_tag(ct_tag_id,ct_rc_id,ct_rev_id,ct_log_id);
 
 CREATE SEQUENCE tag_summary_ts_id_seq;
index 1de2292..8350cfa 100644 (file)
@@ -204,61 +204,7 @@ CREATE INDEX /*i*/oi_actor_timestamp ON /*_*/oldimage (oi_actor,oi_timestamp);
 
 COMMIT;
 
-BEGIN;
-
-DROP TABLE IF EXISTS /*_*/filearchive_tmp;
-CREATE TABLE /*_*/filearchive_tmp (
-  fa_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
-  fa_name varchar(255) binary NOT NULL default '',
-  fa_archive_name varchar(255) binary default '',
-  fa_storage_group varbinary(16),
-  fa_storage_key varbinary(64) default '',
-  fa_deleted_user int,
-  fa_deleted_timestamp binary(14) default '',
-  fa_deleted_reason varbinary(767) default '',
-  fa_deleted_reason_id bigint unsigned NOT NULL DEFAULT 0,
-  fa_size int unsigned default 0,
-  fa_width int default 0,
-  fa_height int default 0,
-  fa_metadata mediumblob,
-  fa_bits int default 0,
-  fa_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D") default NULL,
-  fa_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart", "chemical") default "unknown",
-  fa_minor_mime varbinary(100) default "unknown",
-  fa_description varbinary(767) default '',
-  fa_description_id bigint unsigned NOT NULL DEFAULT 0,
-  fa_user int unsigned default 0,
-  fa_user_text varchar(255) binary DEFAULT '',
-  fa_actor bigint unsigned NOT NULL DEFAULT 0,
-  fa_timestamp binary(14) default '',
-  fa_deleted tinyint unsigned NOT NULL default 0,
-  fa_sha1 varbinary(32) NOT NULL default ''
-) /*$wgDBTableOptions*/;
-
-INSERT OR IGNORE INTO /*_*/filearchive_tmp (
-       fa_id, fa_name, fa_archive_name, fa_storage_group, fa_storage_key,
-       fa_deleted_user, fa_deleted_timestamp, fa_deleted_reason, fa_size,
-       fa_width, fa_height, fa_metadata, fa_bits, fa_media_type, fa_major_mime,
-       fa_minor_mime, fa_description, fa_user, fa_user_text, fa_timestamp,
-       fa_deleted, fa_sha1)
-  SELECT
-       fa_id, fa_name, fa_archive_name, fa_storage_group, fa_storage_key,
-       fa_deleted_user, fa_deleted_timestamp, fa_deleted_reason, fa_size,
-       fa_width, fa_height, fa_metadata, fa_bits, fa_media_type, fa_major_mime,
-       fa_minor_mime, fa_description, fa_user, fa_user_text, fa_timestamp,
-       fa_deleted, fa_sha1
-  FROM /*_*/filearchive;
-
-DROP TABLE /*_*/filearchive;
-ALTER TABLE /*_*/filearchive_tmp RENAME TO /*_*/filearchive;
-CREATE INDEX /*i*/fa_name ON /*_*/filearchive (fa_name, fa_timestamp);
-CREATE INDEX /*i*/fa_storage_group ON /*_*/filearchive (fa_storage_group, fa_storage_key);
-CREATE INDEX /*i*/fa_deleted_timestamp ON /*_*/filearchive (fa_deleted_timestamp);
-CREATE INDEX /*i*/fa_user_timestamp ON /*_*/filearchive (fa_user_text,fa_timestamp);
-CREATE INDEX /*i*/fa_sha1 ON /*_*/filearchive (fa_sha1(10));
-CREATE INDEX /*i*/fa_actor_timestamp ON /*_*/filearchive (fa_actor,fa_timestamp);
-
-COMMIT;
+-- filearchive is done in patch-filearchive-fa_actor.sql
 
 BEGIN;
 
index 197ced3..d74c3a6 100644 (file)
@@ -250,59 +250,7 @@ CREATE INDEX /*i*/oi_sha1 ON /*_*/oldimage (oi_sha1(10));
 
 COMMIT;
 
-BEGIN;
-
-DROP TABLE IF EXISTS /*_*/filearchive_tmp;
-CREATE TABLE /*_*/filearchive_tmp (
-  fa_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
-  fa_name varchar(255) binary NOT NULL default '',
-  fa_archive_name varchar(255) binary default '',
-  fa_storage_group varbinary(16),
-  fa_storage_key varbinary(64) default '',
-  fa_deleted_user int,
-  fa_deleted_timestamp binary(14) default '',
-  fa_deleted_reason varbinary(767) default '',
-  fa_deleted_reason_id bigint unsigned NOT NULL DEFAULT 0,
-  fa_size int unsigned default 0,
-  fa_width int default 0,
-  fa_height int default 0,
-  fa_metadata mediumblob,
-  fa_bits int default 0,
-  fa_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D") default NULL,
-  fa_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart", "chemical") default "unknown",
-  fa_minor_mime varbinary(100) default "unknown",
-  fa_description varbinary(767) default '',
-  fa_description_id bigint unsigned NOT NULL DEFAULT 0,
-  fa_user int unsigned default 0,
-  fa_user_text varchar(255) binary,
-  fa_timestamp binary(14) default '',
-  fa_deleted tinyint unsigned NOT NULL default 0,
-  fa_sha1 varbinary(32) NOT NULL default ''
-) /*$wgDBTableOptions*/;
-
-INSERT OR IGNORE INTO /*_*/filearchive_tmp (
-       fa_id, fa_name, fa_archive_name, fa_storage_group, fa_storage_key,
-       fa_deleted_user, fa_deleted_timestamp, fa_deleted_reason, fa_size,
-       fa_width, fa_height, fa_metadata, fa_bits, fa_media_type, fa_major_mime,
-       fa_minor_mime, fa_description, fa_user, fa_user_text, fa_timestamp,
-       fa_deleted, fa_sha1)
-  SELECT
-       fa_id, fa_name, fa_archive_name, fa_storage_group, fa_storage_key,
-       fa_deleted_user, fa_deleted_timestamp, fa_deleted_reason, fa_size,
-       fa_width, fa_height, fa_metadata, fa_bits, fa_media_type, fa_major_mime,
-       fa_minor_mime, fa_description, fa_user, fa_user_text, fa_timestamp,
-       fa_deleted, fa_sha1
-  FROM /*_*/filearchive;
-
-DROP TABLE /*_*/filearchive;
-ALTER TABLE /*_*/filearchive_tmp RENAME TO /*_*/filearchive;
-CREATE INDEX /*i*/fa_name ON /*_*/filearchive (fa_name, fa_timestamp);
-CREATE INDEX /*i*/fa_storage_group ON /*_*/filearchive (fa_storage_group, fa_storage_key);
-CREATE INDEX /*i*/fa_deleted_timestamp ON /*_*/filearchive (fa_deleted_timestamp);
-CREATE INDEX /*i*/fa_user_timestamp ON /*_*/filearchive (fa_user_text,fa_timestamp);
-CREATE INDEX /*i*/fa_sha1 ON /*_*/filearchive (fa_sha1(10));
-
-COMMIT;
+-- filearchive is done in patch-filearchive-fa_description_id.sql
 
 BEGIN;
 
diff --git a/maintenance/sqlite/archives/patch-drop-ct_tag.sql b/maintenance/sqlite/archives/patch-drop-ct_tag.sql
new file mode 100644 (file)
index 0000000..d5fd77f
--- /dev/null
@@ -0,0 +1,23 @@
+-- T185355
+
+CREATE TABLE /*_*/change_tag_tmp (
+  ct_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
+  ct_rc_id int NULL,
+  ct_log_id int unsigned NULL,
+  ct_rev_id int unsigned NULL,
+  ct_params blob NULL,
+  ct_tag_id int unsigned NOT NULL
+) /*$wgDBTableOptions*/;
+
+INSERT INTO /*_*/change_tag_tmp
+       SELECT ct_id, ct_rc_id, ct_log_id, ct_rev_id, ct_params, ct_tag_id
+               FROM /*_*/change_tag;
+
+DROP TABLE /*_*/change_tag;
+
+ALTER TABLE /*_*/change_tag_tmp RENAME TO /*_*/change_tag;
+
+CREATE UNIQUE INDEX /*i*/change_tag_rc_tag_id ON /*_*/change_tag (ct_rc_id,ct_tag_id);
+CREATE UNIQUE INDEX /*i*/change_tag_log_tag_id ON /*_*/change_tag (ct_log_id,ct_tag_id);
+CREATE UNIQUE INDEX /*i*/change_tag_rev_tag_id ON /*_*/change_tag (ct_rev_id,ct_tag_id);
+CREATE INDEX /*i*/change_tag_tag_id_id ON /*_*/change_tag (ct_tag_id,ct_rc_id,ct_rev_id,ct_log_id);
diff --git a/maintenance/sqlite/archives/patch-filearchive-fa_actor.sql b/maintenance/sqlite/archives/patch-filearchive-fa_actor.sql
new file mode 100644 (file)
index 0000000..179c29c
--- /dev/null
@@ -0,0 +1,61 @@
+--
+-- patch-filearchive-fa_actor.sql
+--
+-- Split from patch-actor-table.sql to work around SQLite unconditionally running
+-- patch-add-3d.sql on a fresh install, which wipes out fa_actor.
+
+BEGIN;
+
+DROP TABLE IF EXISTS /*_*/filearchive_tmp;
+CREATE TABLE /*_*/filearchive_tmp (
+  fa_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
+  fa_name varchar(255) binary NOT NULL default '',
+  fa_archive_name varchar(255) binary default '',
+  fa_storage_group varbinary(16),
+  fa_storage_key varbinary(64) default '',
+  fa_deleted_user int,
+  fa_deleted_timestamp binary(14) default '',
+  fa_deleted_reason varbinary(767) default '',
+  fa_deleted_reason_id bigint unsigned NOT NULL DEFAULT 0,
+  fa_size int unsigned default 0,
+  fa_width int default 0,
+  fa_height int default 0,
+  fa_metadata mediumblob,
+  fa_bits int default 0,
+  fa_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D") default NULL,
+  fa_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart", "chemical") default "unknown",
+  fa_minor_mime varbinary(100) default "unknown",
+  fa_description varbinary(767) default '',
+  fa_description_id bigint unsigned NOT NULL DEFAULT 0,
+  fa_user int unsigned default 0,
+  fa_user_text varchar(255) binary DEFAULT '',
+  fa_actor bigint unsigned NOT NULL DEFAULT 0,
+  fa_timestamp binary(14) default '',
+  fa_deleted tinyint unsigned NOT NULL default 0,
+  fa_sha1 varbinary(32) NOT NULL default ''
+) /*$wgDBTableOptions*/;
+
+INSERT OR IGNORE INTO /*_*/filearchive_tmp (
+       fa_id, fa_name, fa_archive_name, fa_storage_group, fa_storage_key,
+       fa_deleted_user, fa_deleted_timestamp, fa_deleted_reason, fa_size,
+       fa_width, fa_height, fa_metadata, fa_bits, fa_media_type, fa_major_mime,
+       fa_minor_mime, fa_description, fa_user, fa_user_text, fa_timestamp,
+       fa_deleted, fa_sha1)
+  SELECT
+       fa_id, fa_name, fa_archive_name, fa_storage_group, fa_storage_key,
+       fa_deleted_user, fa_deleted_timestamp, fa_deleted_reason, fa_size,
+       fa_width, fa_height, fa_metadata, fa_bits, fa_media_type, fa_major_mime,
+       fa_minor_mime, fa_description, fa_user, fa_user_text, fa_timestamp,
+       fa_deleted, fa_sha1
+  FROM /*_*/filearchive;
+
+DROP TABLE /*_*/filearchive;
+ALTER TABLE /*_*/filearchive_tmp RENAME TO /*_*/filearchive;
+CREATE INDEX /*i*/fa_name ON /*_*/filearchive (fa_name, fa_timestamp);
+CREATE INDEX /*i*/fa_storage_group ON /*_*/filearchive (fa_storage_group, fa_storage_key);
+CREATE INDEX /*i*/fa_deleted_timestamp ON /*_*/filearchive (fa_deleted_timestamp);
+CREATE INDEX /*i*/fa_user_timestamp ON /*_*/filearchive (fa_user_text,fa_timestamp);
+CREATE INDEX /*i*/fa_sha1 ON /*_*/filearchive (fa_sha1(10));
+CREATE INDEX /*i*/fa_actor_timestamp ON /*_*/filearchive (fa_actor,fa_timestamp);
+
+COMMIT;
diff --git a/maintenance/sqlite/archives/patch-filearchive-fa_description_id.sql b/maintenance/sqlite/archives/patch-filearchive-fa_description_id.sql
new file mode 100644 (file)
index 0000000..c5361ed
--- /dev/null
@@ -0,0 +1,60 @@
+--
+-- patch-filearchive-fa_description_id.sql
+--
+-- Split from patch-comment-table.sql to work around SQLite unconditionally running
+-- patch-add-3d.sql on a fresh install, which wipes out fa_description_id and
+-- fa_deleted_reason_id.
+
+BEGIN;
+
+DROP TABLE IF EXISTS /*_*/filearchive_tmp;
+CREATE TABLE /*_*/filearchive_tmp (
+  fa_id int NOT NULL PRIMARY KEY AUTO_INCREMENT,
+  fa_name varchar(255) binary NOT NULL default '',
+  fa_archive_name varchar(255) binary default '',
+  fa_storage_group varbinary(16),
+  fa_storage_key varbinary(64) default '',
+  fa_deleted_user int,
+  fa_deleted_timestamp binary(14) default '',
+  fa_deleted_reason varbinary(767) default '',
+  fa_deleted_reason_id bigint unsigned NOT NULL DEFAULT 0,
+  fa_size int unsigned default 0,
+  fa_width int default 0,
+  fa_height int default 0,
+  fa_metadata mediumblob,
+  fa_bits int default 0,
+  fa_media_type ENUM("UNKNOWN", "BITMAP", "DRAWING", "AUDIO", "VIDEO", "MULTIMEDIA", "OFFICE", "TEXT", "EXECUTABLE", "ARCHIVE", "3D") default NULL,
+  fa_major_mime ENUM("unknown", "application", "audio", "image", "text", "video", "message", "model", "multipart", "chemical") default "unknown",
+  fa_minor_mime varbinary(100) default "unknown",
+  fa_description varbinary(767) default '',
+  fa_description_id bigint unsigned NOT NULL DEFAULT 0,
+  fa_user int unsigned default 0,
+  fa_user_text varchar(255) binary,
+  fa_timestamp binary(14) default '',
+  fa_deleted tinyint unsigned NOT NULL default 0,
+  fa_sha1 varbinary(32) NOT NULL default ''
+) /*$wgDBTableOptions*/;
+
+INSERT OR IGNORE INTO /*_*/filearchive_tmp (
+       fa_id, fa_name, fa_archive_name, fa_storage_group, fa_storage_key,
+       fa_deleted_user, fa_deleted_timestamp, fa_deleted_reason, fa_size,
+       fa_width, fa_height, fa_metadata, fa_bits, fa_media_type, fa_major_mime,
+       fa_minor_mime, fa_description, fa_user, fa_user_text, fa_timestamp,
+       fa_deleted, fa_sha1)
+  SELECT
+       fa_id, fa_name, fa_archive_name, fa_storage_group, fa_storage_key,
+       fa_deleted_user, fa_deleted_timestamp, fa_deleted_reason, fa_size,
+       fa_width, fa_height, fa_metadata, fa_bits, fa_media_type, fa_major_mime,
+       fa_minor_mime, fa_description, fa_user, fa_user_text, fa_timestamp,
+       fa_deleted, fa_sha1
+  FROM /*_*/filearchive;
+
+DROP TABLE /*_*/filearchive;
+ALTER TABLE /*_*/filearchive_tmp RENAME TO /*_*/filearchive;
+CREATE INDEX /*i*/fa_name ON /*_*/filearchive (fa_name, fa_timestamp);
+CREATE INDEX /*i*/fa_storage_group ON /*_*/filearchive (fa_storage_group, fa_storage_key);
+CREATE INDEX /*i*/fa_deleted_timestamp ON /*_*/filearchive (fa_deleted_timestamp);
+CREATE INDEX /*i*/fa_user_timestamp ON /*_*/filearchive (fa_user_text,fa_timestamp);
+CREATE INDEX /*i*/fa_sha1 ON /*_*/filearchive (fa_sha1(10));
+
+COMMIT;
index 3c8b598..72db8c3 100644 (file)
@@ -1846,23 +1846,17 @@ CREATE TABLE /*_*/change_tag (
   ct_log_id int unsigned NULL,
   -- REVID for the change
   ct_rev_id int unsigned NULL,
-  -- Tag applied, this will go away and be replaced with ct_tag_id
-  ct_tag varchar(255) NOT NULL default '',
   -- Parameters for the tag; used by some extensions
   ct_params blob NULL,
-  -- Foreign key to change_tag_def row, this will be "NOT NULL" once populated
-  ct_tag_id int unsigned NULL
+  -- Foreign key to change_tag_def row
+  ct_tag_id int unsigned NOT NULL
 ) /*$wgDBTableOptions*/;
 
-CREATE INDEX /*i*/change_tag_rc_tag_nonuniq ON /*_*/change_tag (ct_rc_id,ct_tag);
-CREATE INDEX /*i*/change_tag_log_tag_nonuniq ON /*_*/change_tag (ct_log_id,ct_tag);
-CREATE INDEX /*i*/change_tag_rev_tag_nonuniq ON /*_*/change_tag (ct_rev_id,ct_tag);
 
 CREATE UNIQUE INDEX /*i*/change_tag_rc_tag_id ON /*_*/change_tag (ct_rc_id,ct_tag_id);
 CREATE UNIQUE INDEX /*i*/change_tag_log_tag_id ON /*_*/change_tag (ct_log_id,ct_tag_id);
 CREATE UNIQUE INDEX /*i*/change_tag_rev_tag_id ON /*_*/change_tag (ct_rev_id,ct_tag_id);
 -- Covering index, so we can pull all the info only out of the index.
-CREATE INDEX /*i*/change_tag_tag_id ON /*_*/change_tag (ct_tag,ct_rc_id,ct_rev_id,ct_log_id);
 CREATE INDEX /*i*/change_tag_tag_id_id ON /*_*/change_tag (ct_tag_id,ct_rc_id,ct_rev_id,ct_log_id);
 
 -- Rollup table to pull a LIST of tags simply without ugly GROUP_CONCAT
index 2468c71..1b2574d 100644 (file)
@@ -10,7 +10,6 @@
 .config-block {
        margin-top: 2em;
        display: block;
-
 }
 
 .config-block-label {
index ac26a53..e3379ca 100644 (file)
@@ -27,8 +27,8 @@
     "karma-qunit": "2.1.0",
     "postcss-less": "2.0.0",
     "qunit": "2.6.2",
-    "stylelint": "9.2.0",
-    "stylelint-config-wikimedia": "0.4.3",
+    "stylelint": "9.6.0",
+    "stylelint-config-wikimedia": "0.5.0",
     "wdio-junit-reporter": "0.2.0",
     "wdio-mediawiki": "file:tests/selenium/wdio-mediawiki",
     "wdio-mocha-framework": "0.5.13",
index 9036dd3..ea60702 100644 (file)
@@ -4,9 +4,10 @@
        z-index: 100000;
        cursor: default;
 }
+
 .tipsy-inner {
        padding: 5px 8px 4px 8px;
-       /*background-color: #e8f2f8;*/
+       /* background-color: #e8f2f8; */
        background-color: #fff;
        border: solid 1px #a7d7f9;
        color: #000;
@@ -20,6 +21,7 @@
        filter: progid:DXImageTransform.Microsoft.DropShadow(OffX=0, OffY=2, Strength=6, Direction=90, Color='#cccccc');
        */
 }
+
 .tipsy-arrow {
        position: absolute;
        /* @embed */
        width: 11px;
        height: 6px;
 }
-/* @noflip */ .tipsy-n .tipsy-arrow {
+
+/* @noflip */
+.tipsy-n .tipsy-arrow {
        top: 0;
        left: 50%;
        margin-left: -5px;
 }
-/* @noflip */ .tipsy-nw .tipsy-arrow {
+
+/* @noflip */
+.tipsy-nw .tipsy-arrow {
        top: 0;
        left: 10px;
 }
-/* @noflip */ .tipsy-ne .tipsy-arrow {
+
+/* @noflip */
+.tipsy-ne .tipsy-arrow {
        top: 0;
        right: 10px;
 }
-/* @noflip */ .tipsy-s .tipsy-arrow {
+
+/* @noflip */
+.tipsy-s .tipsy-arrow {
        bottom: 0;
        left: 50%;
        margin-left: -5px;
        background-position: bottom left;
 }
-/* @noflip */ .tipsy-sw .tipsy-arrow {
+
+/* @noflip */
+.tipsy-sw .tipsy-arrow {
        bottom: 0;
        left: 10px;
        background-position: bottom left;
 }
-/* @noflip */ .tipsy-se .tipsy-arrow {
+
+/* @noflip */
+.tipsy-se .tipsy-arrow {
        bottom: 0;
        right: 10px;
        background-position: bottom left;
 }
-/* @noflip */ .tipsy-e .tipsy-arrow {
+
+/* @noflip */
+.tipsy-e .tipsy-arrow {
        top: 50%;
        margin-top: -5px;
        right: 0;
@@ -64,7 +80,9 @@
        height: 11px;
        background-position: top right;
 }
-/* @noflip */ .tipsy-w .tipsy-arrow {
+
+/* @noflip */
+.tipsy-w .tipsy-arrow {
        top: 50%;
        margin-top: -5px;
        left: 0;
index fc52d51..bc37943 100644 (file)
        -ms-user-select: none;
        user-select: none;
 }
+
 .mw-collapsible-toggle-default:before {
        content: '[';
 }
+
 .mw-collapsible-toggle-default:after {
        content: ']';
 }
@@ -24,7 +26,7 @@
        cursor: pointer;
 }
 
-/* collapse links in captions should be inline */
+/* Collapse links in captions should be inline */
 caption .mw-collapsible-toggle,
 .mw-content-ltr caption .mw-collapsible-toggle,
 .mw-content-rtl caption .mw-collapsible-toggle,
index ea5b6dd..1ab91a9 100644 (file)
@@ -25,7 +25,6 @@
 @exclude: ~'.mw-made-collapsible';
 
 .client-js {
-
        ol.mw-collapsible:before,
        ul.mw-collapsible:before,
        .mw-collapsible-toggle-li {
@@ -76,8 +75,7 @@
                // Avoid FOUC/reflows on collapsed elements by making sure they are opened by default (T42812)
                > p,
                > table,
-               // Manual:Collapsible_elements/Demo/Simple#Collapsed_by_default
-               > thead + tbody,
+               > thead + tbody, // 'https://www.mediawiki.org/wiki/Manual:Collapsible_elements/Demo/Simple#Collapsed_by_default'
                tr:not( :first-child ),
                .mw-collapsible-content {
                        display: none;
index a481074..abdee12 100644 (file)
@@ -3,11 +3,13 @@
 .mw-category {
        .column-count(3);
        .column-width(24em);
+
        .mw-category-group {
                ul {
                        margin-top: 0;
                        margin-bottom: 0;
                }
+
                li {
                        .column-break-inside-avoid;
                }
index d3e4950..7528fdb 100644 (file)
@@ -97,9 +97,11 @@ div.apihelp-linktrail {
 .api-main-links {
        text-align: center;
 }
+
 .api-main-links ul:before {
        content: '[';
 }
+
 .api-main-links ul:after {
        content: ']';
 }
index ac33b84..92e1d04 100644 (file)
        margin-bottom: 1em;
 }
 
-/* Overwriting OOUI is no fun */
+/* Overwriting OOUI */
 .mw-feedbackDialog-feedback-form .oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-header {
        min-width: 4.2em;
        width: 20%;
 }
+
 .mw-feedbackDialog-feedback-form .oo-ui-fieldLayout.oo-ui-labelElement.oo-ui-fieldLayout-align-left > .oo-ui-fieldLayout-body > .oo-ui-fieldLayout-field {
        width: 80%;
 }
index 2663d87..e25a92f 100644 (file)
@@ -6,22 +6,26 @@
 .hlist dt:after {
        content: ':';
 }
+
 .hlist dd:after,
 .hlist li:after {
        content: ' ·';
        font-weight: bold;
 }
+
 .hlist dd:last-child:after,
 .hlist dt:last-child:after,
 .hlist li:last-child:after {
        content: none;
 }
+
 /* For IE8 */
 .hlist dd.hlist-last-child:after,
 .hlist dt.hlist-last-child:after,
 .hlist li.hlist-last-child:after {
        content: none;
 }
+
 /* Add parentheses around nested lists */
 .hlist dd dd:first-child:before,
 .hlist dd dt:first-child:before,
@@ -35,6 +39,7 @@
        content: '(';
        font-weight: normal;
 }
+
 .hlist dd dd:last-child:after,
 .hlist dd dt:last-child:after,
 .hlist dd li:last-child:after,
@@ -47,6 +52,7 @@
        content: ')';
        font-weight: normal;
 }
+
 /* For IE8 */
 .hlist dd dd.hlist-last-child:after,
 .hlist dd dt.hlist-last-child:after,
        content: ')';
        font-weight: normal;
 }
+
 /* Put ordinals in front of ordered list items */
 .hlist ol {
        counter-reset: list-item;
 }
+
 .hlist ol > li {
        counter-increment: list-item;
 }
+
 .hlist ol > li:before {
        content: counter( list-item ) ' ';
 }
+
 .hlist dd ol > li:first-child:before,
 .hlist dt ol > li:first-child:before,
 .hlist li ol > li:first-child:before {
index 3feb9a1..8f1d563 100644 (file)
@@ -78,9 +78,9 @@
        }
 }
 
-// Flatlist styling for PHP widgets...
+// Flatlist styling for PHP (`.oo-ui-fieldLayout-align-inline`) &
+// JS (`.oo-ui-radioOptionWidget, .oo-ui-checkboxMultioptionWidget`) widgets
 .mw-htmlform-flatlist .oo-ui-fieldLayout-align-inline,
-// ...and for JS widgets
 .mw-htmlform-flatlist .oo-ui-radioOptionWidget,
 .mw-htmlform-flatlist .oo-ui-checkboxMultioptionWidget {
        display: inline-block;
index 1c69a75..d943219 100644 (file)
@@ -47,7 +47,6 @@ tr.mw-htmlform-vertical-label td.mw-label {
        margin-left: 4px;
 }
 
-/* stylelint-disable indentation */
 .mw-icon-question:lang( ar ),
 .mw-icon-question:lang( fa ),
 .mw-icon-question:lang( ur ) {
index 7e7821e..fe5647f 100644 (file)
@@ -54,7 +54,7 @@
 }
 
 .hyphens( @value: auto ) {
-       & when ( @value = auto ){
+       & when ( @value = auto ) {
                // Legacy `word-wrap`; IE 6-11, Edge 12+, Firefox 3.5+, Chrome 4+, Safari 3.1+,
                //   Opera 11.5+, iOS 3.2+, Android 2.1+
                // `overflow-wrap` is W3 standard, but it doesn't seem as if browser vendors
@@ -92,7 +92,6 @@
 // and remaining parameters are additional transitions."
 .transition-transform( ... ) {
        -webkit-backface-visibility: hidden; // Older Webkit browsers: Promote element to a composite layer & involve the GPU
-
        -webkit-transition: -webkit-transform @arguments; // Safari 3.1-8, iOS 3.2-8.4, Android 2.1-4.4.4
        -moz-transition: -moz-transform @arguments; // Firefox 4-15 for `-moz-transition`
        transition: transform @arguments; // Chrome 36+, Firefox 16+, IE 10+, Safari 9+, Opera 12.1+, iOS 9.2+, Android 36+
        -webkit-box-flex: @grow; // iOS 6-, Safari 3.1-6
        -moz-box-flex: @grow; // Firefox 21-
        width: @width; // Fallback for flex-basis
-
        -ms-flex: @grow @shrink @width; // IE 10
        flex: @grow @shrink @width;
-
        -webkit-box-ordinal-group: @order; // iOS 6-, Safari 3.1-6
        -moz-box-ordinal-group: @order; // Firefox 21-
        -ms-flex-order: @order; // IE 10
index 64d6b3d..ccc9564 100644 (file)
@@ -7,6 +7,7 @@
        from {
                .transform-rotate( 0deg );
        }
+
        to {
                .transform-rotate( 360deg );
        }
index a56be76..c36b8d8 100644 (file)
@@ -17,7 +17,6 @@
        background-color: #fff;
        /* Click handler in mediawiki.notification.js */
        cursor: pointer;
-
        opacity: 0;
        -webkit-transform: translateX( 35px );
        transform: translateX( 35px );
index 047c933..f7a3f0d 100644 (file)
@@ -56,4 +56,3 @@ ul.mw-gallery-packed-hover li.gallerybox.mw-gallery-focused div.gallerytextwrapp
        white-space: normal;
        overflow: visible;
 }
-
index 9101fba..689f322 100644 (file)
@@ -24,7 +24,6 @@
        // On the watchlist, reserve a bit more
        .mw-special-Watchlist .rcfilters-head {
                min-height: @rcfilters-wl-head-min-height;
-
        }
 
        .mw-rcfilters-collapsed {
@@ -79,7 +78,6 @@
                        .cloptions {
                                display: none;
                        }
-
                }
        }
 
                        .animation-delay( 0s );
                }
        }
+
        body:not( .mw-rcfilters-ui-initialized ) .rcfilters-spinner {
                display: block;
                // When initializing, display the spinner on top of the area where the UI will appear
                margin-top: -( @rcfilters-head-min-height + @rcfilters-head-margin-bottom ) / 1.5;
        }
+
        body.mw-rcfilters-ui-loading .rcfilters-spinner {
                display: block;
                // When loading new results, display the spinner on top of the results area
        100% {
                -webkit-transform: scale( 0.625 );
        }
+
        20% { // equals 320ms
                opacity: 0.87;
                -webkit-transform: scale( 1 );
        100% {
                -moz-transform: scale( 0.625 );
        }
+
        20% {
                opacity: 0.87;
                -moz-transform: scale( 1 );
        100% {
                transform: scale( 0.625 );
        }
+
        20% { // equals 320ms
                opacity: 0.87;
                transform: scale( 1 );
index 516a79b..96a791f 100644 (file)
@@ -41,7 +41,6 @@ div.mw-rcfilters-ui-highlights {
                                        .mw-rcfilters-circle-color( @highlight-bluedot, true, @highlight-bluedot );
                                }
                        }
-
                }
 
                // Watchlist unseen highlighted fixes
index 16f110a..87f257b 100644 (file)
@@ -6,6 +6,7 @@
        60% {
                border-top-color: @colorProgressive;
        }
+
        100% {
                border-top-color: @colorGray12;
        }
index 93fae1e..d74f4d0 100644 (file)
                        &-c1 {
                                .mw-rcfilters-circle-color( @highlight-c1 );
                        }
+
                        &-c2 {
                                .mw-rcfilters-circle-color( @highlight-c2 );
                        }
+
                        &-c3 {
                                .mw-rcfilters-circle-color( @highlight-c3 );
                        }
+
                        &-c4 {
                                .mw-rcfilters-circle-color( @highlight-c4 );
                        }
+
                        &-c5 {
                                .mw-rcfilters-circle-color( @highlight-c5 );
                        }
index aa285e6..d67739d 100644 (file)
@@ -78,6 +78,7 @@
                                padding: 0.6em 0; // Same top padding as the handle
                                flex: 0 0 auto;
                        }
+
                        &-queryName {
                                flex: 1 1 auto;
                                padding: 0.6em 0; // Same top padding as the handle
index e6003c1..949980d 100644 (file)
@@ -12,7 +12,6 @@
        &-bottom {
                .flex-display;
                .flex;
-
                margin-top: 1em;
        }
 }
index deecd67..4fa5183 100644 (file)
@@ -50,6 +50,7 @@
                                        background-color: @highlight-none;
                                }
                        }
+
                        &-c1 {
                                .mw-rcfilters-circle-color( @highlight-c1, false );
                                border-color: @highlight-c1;
@@ -60,6 +61,7 @@
                                        background-color: @highlight-c1;
                                }
                        }
+
                        &-c2 {
                                .mw-rcfilters-circle-color( @highlight-c2, true );
                                border-color: @highlight-c2;
@@ -70,6 +72,7 @@
                                        background-color: @highlight-c2;
                                }
                        }
+
                        &-c3 {
                                .mw-rcfilters-circle-color( @highlight-c3, true );
                                border-color: @highlight-c3;
@@ -80,6 +83,7 @@
                                        background-color: @highlight-c3;
                                }
                        }
+
                        &-c4 {
                                .mw-rcfilters-circle-color( @highlight-c4, true );
                                border-color: @highlight-c4;
@@ -90,6 +94,7 @@
                                        background-color: @highlight-c4;
                                }
                        }
+
                        &-c5 {
                                .mw-rcfilters-circle-color( @highlight-c5, true );
                                border-color: @highlight-c5;
index 61872bd..5c3c0df 100644 (file)
@@ -14,9 +14,8 @@
                border-top: 4px solid @colorGray12;
        }
 
-       // Don't show border for first namespace
+       // Don't show border for first namespace & hide for every 'talk' option in second selector
        &-view-default + &-view-namespaces,
-       // Hide for every 'talk' option
        &-view-namespaces&.mw-rcfilters-ui-itemMenuOptionWidget-identifier-subject + &-view-namespaces.mw-rcfilters-ui-itemMenuOptionWidget-identifier-talk {
                border-top: 0;
        }
@@ -40,6 +39,7 @@
                        font-size: 1.15em;
                        color: @colorGray2;
                }
+
                &-desc {
                        color: @colorGray5;
                        white-space: normal;
index f210a44..e593966 100644 (file)
                .transform( scale( 0 ) );
                opacity: 1;
        }
+
        50% {
                .transform( scale( 1.5 ) );
                opacity: 0.8;
        }
+
        80%,
        100% {
                opacity: 0;
index 824485f..31a5f54 100644 (file)
@@ -16,6 +16,7 @@
                .oo-ui-labelElement-label {
                        color: @colorGray7;
                }
+
                .oo-ui-buttonWidget {
                        opacity: @muted-opacity;
                }
index 2957080..3104a69 100644 (file)
@@ -34,7 +34,6 @@
        /* IE7 and earlier */
        zoom: 1;
        *display: inline; /* stylelint-disable declaration-block-no-duplicate-properties */
-
        padding: 7px;
 }
 
index 3f33837..8b2657d 100644 (file)
@@ -120,6 +120,7 @@ figure[ typeof~='mw:Audio/Frame' ] {
                /* @noflip */
                margin: 0.5em 1.4em 1.3em 0;
        }
+
        &.mw-halign-right {
                /* @noflip */
                margin: 0.5em 0 1.3em 1.4em;
@@ -198,6 +199,7 @@ figure[ typeof*='mw:Audio/Thumb' ] {
                display: inline-block;
                height: 100%;
        }
+
        > * {
                vertical-align: middle;
                display: inline-block;
@@ -213,24 +215,31 @@ figure[ typeof*='mw:Audio/Thumb' ] {
                .mw-valign-middle > & {
                        vertical-align: middle;
                }
+
                .mw-valign-baseline > & {
                        vertical-align: baseline;
                }
+
                .mw-valign-sub > & {
                        vertical-align: sub;
                }
+
                .mw-valign-super > & {
                        vertical-align: super;
                }
+
                .mw-valign-top > & {
                        vertical-align: top;
                }
+
                .mw-valign-text-top > & {
                        vertical-align: text-top;
                }
+
                .mw-valign-bottom > & {
                        vertical-align: bottom;
                }
+
                .mw-valign-text-bottom > & {
                        vertical-align: text-bottom;
                }
index 301024d..db9265a 100644 (file)
@@ -53,10 +53,12 @@ a.mw-selflink {
        font-weight: bold;
        text-decoration: inherit;
 }
+
 a.mw-selflink:hover {
        cursor: inherit;
        text-decoration: inherit;
 }
+
 a.mw-selflink:active,
 a.mw-selflink:visited {
        color: inherit;
index c013994..c319294 100644 (file)
@@ -1,5 +1,6 @@
 .mw-block-page-restrictions {
        margin-left: 2em;
+
        .oo-ui-widget {
                max-width: 48em;
        }
index c87a8a1..db33f4a 100644 (file)
@@ -75,6 +75,7 @@
        &:before {
                content: '@{msg-parentheses-start}';
        }
+
        &:after {
                content: '@{msg-parentheses-end}';
        }
index 5869303..37d3a16 100644 (file)
@@ -17,6 +17,7 @@
 #preferences > fieldset table {
        width: 100%;
 }
+
 #preferences > fieldset table.mw-htmlform-matrix {
        width: auto;
 }
index 7265399..81c8dc9 100644 (file)
@@ -1,11 +1,10 @@
-/* interwiki search results */
-/*==========================*/
+/* Interwiki search results */
+/* ======================== */
 
 @import 'mediawiki.ui/variables.less';
 @import 'mediawiki.mixins';
 
 .mw-searchresults-has-iw {
-
        .iw-headline {
                font-weight: bold;
        }
        }
 
        .iw-result__title {
-               font-size: 108%; /* matching regular search title */
+               font-size: 108%; /* Matching regular search title */
        }
 
        .iw-result:after,
-       .iw-result__content:after { /* clearfix */
+       .iw-result__content:after { /* Clearfix */
                visibility: hidden;
                display: block;
                font-size: 0;
 
        .iw-result__footer {
                float: right;
-               font-size: 97%; /* matching main search result font-size */
+               font-size: 97%; /* Matching main search result font-size */
                margin-top: 0.5em;
        }
+
        .iw-result__footer a {
                vertical-align: middle;
                font-style: italic;
@@ -54,7 +54,7 @@
                padding-right: 1em;
        }
 
-       /* image search result */
+       /* Image search result */
        .iw-result__mini-gallery {
                position: relative;
                float: left;
@@ -64,7 +64,7 @@
                padding: 0.25rem;
        }
 
-       /* second and third images are small */
+       /* Second and third images are small */
        .iw-result__mini-gallery:nth-child( 2 ),
        .iw-result__mini-gallery:nth-child( 3 ) { /* stylelint-disable-line indentation */
                width: 50%;
@@ -82,7 +82,7 @@
                background-position: center center;
        }
 
-       /* image gallery text */
+       /* Image gallery text */
        .iw-result__mini-gallery__image > .iw-result__mini-gallery__caption {
                visibility: hidden;
                position: absolute;
                visibility: visible;
        }
 
-       /* tablet and up */
-
+       /* Tablet and up */
        @media only screen and ( min-width: @width-breakpoint-tablet ) {
-
                #mw-interwiki-results {
                        width: 30%;
-                       display: inline-block; /* used to align interwiki sidebar with the top of the main search results */
-                       margin-left: 8%; /* since inline-block causes whitespace issues, this is 8 instead of 10% */
+                       display: inline-block; /* Used to align interwiki sidebar with the top of the main search results */
+                       margin-left: 8%; /* Since inline-block causes whitespace issues, this is 8 instead of 10% */
                }
+
                .mw-search-createlink,
                .mw-search-nonefound,
                .mw-search-results,
index 59a15a9..1179f90 100644 (file)
 .searchresult {
        display: inline !ie;
 }
+
 .searchresults {
        margin: 1em 0 1em 0.4em;
 }
+
 /* needs extra specificity to override `.mw-body p` selector */
 .mw-body .mw-search-nonefound {
        margin: 0;
 .mw-search-visualclear {
        clear: both;
 }
+
 .mw-search-results li {
        padding-bottom: 1.2em;
        list-style: none;
        list-style-image: none;
 }
+
 .mw-search-results li a {
        font-size: 108%;
 }
+
 .mw-search-result-data {
        color: #008000;
        font-size: 97%;
 }
+
 .mw-search-profile-tabs {
        background-color: #f8f9fa;
        margin-top: 1em;
        border: 1px solid #c8ccd1;
        border-radius: 2px;
 }
+
 .search-types {
        float: left;
        padding-left: 0.25em;
 }
+
 .search-types ul {
        margin: 0;
        padding: 0;
        list-style: none;
 }
+
 .search-types li {
        float: left;
        margin: 0;
        padding: 0;
 }
+
 .search-types a {
        display: block;
        padding: 0.5em;
 }
+
 .search-types .current a {
        color: #222;
        cursor: default;
 }
+
 .search-types .current a:hover {
        text-decoration: none;
 }
+
 .results-info {
        float: right;
        padding: 0.5em;
        color: #54595d;
        font-size: 95%;
 }
+
 #mw-search-top-table div.oo-ui-actionFieldLayout {
        float: left;
        width: 100%;
 }
 
 /* Advanced options menu */
-/*==========================*/
+/* ===================== */
 
 #mw-searchoptions {
        /* Support: Firefox, needs `clear: both` on `fieldset` when zoom level > 100%, see T176499 */
        border: 1px solid #c8ccd1;
        border-radius: 0 0 2px 2px;
 }
+
 #mw-searchoptions legend {
        display: none;
 }
+
 #mw-searchoptions h4 {
        padding: 0;
        margin: 0;
        float: left;
 }
+
 #mw-searchoptions table {
        float: left;
        margin-right: 3em;
        border-collapse: collapse;
 }
+
 #mw-searchoptions table td {
        padding: 0 1em 0 0;
        white-space: nowrap;
 }
+
 #mw-searchoptions .divider {
        clear: both;
        border-bottom: 1px solid #eaecf0;
        padding-top: 0.5em;
        margin-bottom: 0.5em;
 }
+
 #mw-search-menu {
        padding-left: 6em;
        font-size: 85%;
 #mw-search-interwiki li {
        font-size: 95%;
 }
+
 .mw-search-interwiki-more {
        float: right;
        font-size: 90%;
 }
+
 #mw-search-interwiki-caption {
        text-align: center;
        font-weight: bold;
        font-size: 95%;
 }
+
 .mw-search-interwiki-project {
        font-size: 97%;
        text-align: left;
index aad784e..e55c785 100644 (file)
@@ -1,9 +1,11 @@
 #mw-search-togglebox {
        float: right;
 }
+
 #mw-search-togglebox label {
        margin-right: 0.25em;
 }
+
 #mw-search-togglebox input {
        margin-left: 0.25em;
 }
index fe013bc..97a986e 100644 (file)
        background-color: #f8f9fa;
        color: #36c;
 }
+
 #mw-createaccount-join:hover {
        background-color: #fff;
        border-color: #859ecc;
        box-shadow: none;
 }
+
 #mw-createaccount-join:active {
        background-color: #eff3fa;
        color: #2a4b8d;
        border-color: #2a4b8d;
 }
+
 #mw-createaccount-join:focus {
        border-color: #36c;
        box-shadow: inset 0 0 0 1px #36c;
index 0404c45..35cdee7 100644 (file)
@@ -68,6 +68,7 @@
 .mw-uctop {
        font-weight: bold;
 }
+
 .mw-contributions-form select {
        vertical-align: middle;
 }
@@ -92,6 +93,7 @@
 .mw-listgrouprights-table tr {
        vertical-align: top;
 }
+
 .listgrouprights-revoked {
        text-decoration: line-through;
 }
        white-space: nowrap;
        font-size: 90%;
 }
+
 .mw-protectedpages-unknown {
        color: #72777d;
        font-size: 90%;
index 1ffdf70..14ad695 100644 (file)
@@ -14,6 +14,7 @@
 .mw-userrights-disabled {
        color: #72777d;
 }
+
 .mw-userrights-groups * td,
 .mw-userrights-groups * th {
        padding-right: 1.5em;
index 4de2451..a9e4b78 100644 (file)
@@ -67,6 +67,7 @@ Styleguide 6.2.1.
        &:hover {
                color: @mainColor;
        }
+
        &:focus,
        &:active {
                color: darken( @mainColor, @colorDarkenPercentage );
index 18ac318..09bf9ca 100644 (file)
@@ -36,7 +36,6 @@
 // Styleguide 5.1.
 .mw-ui-vform {
        .box-sizing( border-box );
-
        width: @defaultFormWidth;
 
        // MW currently doesn't use the type attribute everywhere on inputs.
                display: block;
                margin-top: 5px;
        }
-
 }
 
 // --------------------------------------------------------------------------
index 461de2f..1600493 100644 (file)
@@ -47,7 +47,6 @@
                @marginIcon: 2 * @iconGutterWidth;
                @width: @iconSize + @marginIcon;
                @sizeIconLarge: ( @iconSize * 1.75) + @marginIcon;
-
                text-indent: -999px;
                overflow: hidden;
                width: @width;
index 55d15b1..53c911b 100644 (file)
        vertical-align: middle;
 
        // Normalize & style placeholder text, see T139034
-       /* stylelint-disable indentation */
        .mixin-placeholder( {
                color: @colorGray7;
                opacity: 1;
        } );
-       /* stylelint-enable indentation */
 
        // Firefox: Remove red outline when `required` attribute set and invalid content.
        // See https://developer.mozilla.org/en-US/docs/Web/CSS/:invalid
index e2264c6..0bcded9 100644 (file)
@@ -29,6 +29,7 @@ Styleguide 6.1.
        &.mw-ui-progressive {
                color: @colorProgressive;
        }
+
        &.mw-ui-destructive {
                color: @colorDestructive;
        }
index e7afff8..5e4df47 100644 (file)
@@ -50,6 +50,7 @@
                                margin-left: 0;
                        }
                }
+
                .mw-widgets-datetime-calendarWidget-next {
                        float: right;
                }
index 1035786..253784e 100644 (file)
        // 7x7 grid
        width: @calendarWidth / 7;
        line-height: @calendarHeight / 7;
+
        // Don't overlap the hacked-up fake box-shadow border we get when focussed
        &:nth-child( 7n ) {
                width: @calendarWidth / 7 - 0.2em;
                margin-right: 0.2em;
        }
+
        &:nth-child( 7n+1 ) {
                width: @calendarWidth / 7 - 0.2em;
                margin-left: 0.2em;
        }
+
        &:nth-child( 42 ) ~ & {
                line-height: @calendarHeight / 7 - 0.2em;
                margin-bottom: 0.2em;
        // 2x6 grid
        width: @calendarWidth / 2;
        line-height: @calendarHeight / 6;
+
        // Don't overlap the hacked-up fake box-shadow border we get when focussed
        &:nth-child( 2n ) {
                width: @calendarWidth / 2 - 0.2em;
                margin-right: 0.2em;
        }
+
        &:nth-child( 2n+1 ) {
                width: @calendarWidth / 2 - 0.2em;
                margin-left: 0.2em;
        }
+
        &:nth-child( 10 ) ~ & {
                line-height: @calendarHeight / 6 - 0.2em;
                margin-bottom: 0.2em;
        // 5x4 grid
        width: @calendarWidth / 5;
        line-height: @calendarHeight / 4;
+
        // Don't overlap the hacked-up fake box-shadow border we get when focussed
        &:nth-child( 5n ) {
                width: @calendarWidth / 5 - 0.2em;
                margin-right: 0.2em;
        }
+
        &:nth-child( 5n+1 ) {
                width: @calendarWidth / 5 - 0.2em;
                margin-left: 0.2em;
        }
+
        &:nth-child( 15 ) ~ & {
                line-height: @calendarHeight / 4 - 0.2em;
                margin-bottom: 0.2em;
index 8be1e86..b7f58a6 100644 (file)
@@ -48,6 +48,7 @@
                > .mw-widgets-stashedFileWidget-fileName {
                        float: left;
                }
+
                > .mw-widgets-stashedFileWidget-fileType {
                        color: #72777d;
                        float: right;
index 5540c64..e52d0cd 100644 (file)
                                        width: 3.75em;
                                        height: 3.75em;
                                        left: 0;
+
                                        &:not( .mw-widget-titleOptionWidget-hasImage ) {
                                                background-color: #c8ccd1;
                                                opacity: 0.4;
                                        }
+
                                        &.mw-widget-titleOptionWidget-hasImage {
                                                border: 0;
                                                background-size: cover;
index 0d6a439..fcd5016 100644 (file)
@@ -78,7 +78,7 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
                $this->setMwGlobals( [
                        'wgMultiContentRevisionSchemaMigrationStage' => $this->getMcrMigrationStage(),
                        'wgContentHandlerUseDB' => $this->getContentHandlerUseDB(),
-                       'wgCommentTableSchemaMigrationStage' => MIGRATION_OLD,
+                       'wgCommentTableSchemaMigrationStage' => MIGRATION_NEW,
                        'wgActorTableSchemaMigrationStage' => SCHEMA_COMPAT_OLD,
                ] );
 
index e5e5551..cfff088 100644 (file)
@@ -90,7 +90,7 @@ abstract class RevisionDbTestBase extends MediaWikiTestCase {
                $this->setMwGlobals( [
                        'wgMultiContentRevisionSchemaMigrationStage' => $this->getMcrMigrationStage(),
                        'wgContentHandlerUseDB' => $this->getContentHandlerUseDB(),
-                       'wgCommentTableSchemaMigrationStage' => MIGRATION_OLD,
+                       'wgCommentTableSchemaMigrationStage' => MIGRATION_NEW,
                        'wgActorTableSchemaMigrationStage' => SCHEMA_COMPAT_OLD,
                ] );
 
index c053104..04f0793 100644 (file)
@@ -281,10 +281,14 @@ class RevisionTest extends MediaWikiTestCase {
         * @covers \MediaWiki\Revision\RevisionStore::newMutableRevisionFromArray
         */
        public function testConstructFromRowWithBadPageId() {
-               $this->setMwGlobals( 'wgCommentTableSchemaMigrationStage', MIGRATION_OLD );
+               $this->setMwGlobals( 'wgCommentTableSchemaMigrationStage', MIGRATION_NEW );
                $this->overrideMwServices();
                Wikimedia\suppressWarnings();
-               $rev = new Revision( (object)[ 'rev_page' => 77777777 ] );
+               $rev = new Revision( (object)[
+                       'rev_page' => 77777777,
+                       'rev_comment_text' => '',
+                       'rev_comment_data' => null,
+               ] );
                $this->assertSame( 77777777, $rev->getPage() );
                Wikimedia\restoreWarnings();
        }
@@ -597,7 +601,7 @@ class RevisionTest extends MediaWikiTestCase {
         * @covers Revision::loadFromTitle
         */
        public function testLoadFromTitle() {
-               $this->setMwGlobals( 'wgCommentTableSchemaMigrationStage', MIGRATION_OLD );
+               $this->setMwGlobals( 'wgCommentTableSchemaMigrationStage', MIGRATION_NEW );
                $this->setMwGlobals( 'wgActorTableSchemaMigrationStage', SCHEMA_COMPAT_OLD );
                $this->overrideMwServices();
                $title = $this->getMockTitle();
@@ -634,7 +638,10 @@ class RevisionTest extends MediaWikiTestCase {
                $db->expects( $this->once() )
                        ->method( 'selectRow' )
                        ->with(
-                               $this->equalTo( [ 'revision', 'page', 'user' ] ),
+                               $this->equalTo( [
+                                       'revision', 'page', 'user',
+                                       'temp_rev_comment' => 'revision_comment_temp', 'comment_rev_comment' => 'comment',
+                               ] ),
                                // We don't really care about the fields are they come from the selectField methods
                                $this->isType( 'array' ),
                                $this->equalTo( $conditions ),
index 563d5e3..9898e53 100644 (file)
@@ -116,24 +116,6 @@ class ApiBlockTest extends ApiTestCase {
        }
 
        public function testBlockWithTag() {
-               $this->setMwGlobals( 'wgChangeTagsSchemaMigrationStage', MIGRATION_WRITE_BOTH );
-               ChangeTags::defineTag( 'custom tag' );
-
-               $this->doBlock( [ 'tags' => 'custom tag' ] );
-
-               $dbw = wfGetDB( DB_MASTER );
-               $this->assertSame( 1, (int)$dbw->selectField(
-                       [ 'change_tag', 'logging' ],
-                       'COUNT(*)',
-                       [ 'log_type' => 'block', 'ct_tag' => 'custom tag' ],
-                       __METHOD__,
-                       [],
-                       [ 'change_tag' => [ 'INNER JOIN', 'ct_log_id = log_id' ] ]
-               ) );
-       }
-
-       public function testBlockWithTagNewBackend() {
-               $this->setMwGlobals( 'wgChangeTagsSchemaMigrationStage', MIGRATION_NEW );
                ChangeTags::defineTag( 'custom tag' );
 
                $this->doBlock( [ 'tags' => 'custom tag' ] );
index f2db1b2..fc546ff 100644 (file)
@@ -74,37 +74,6 @@ class ApiDeleteTest extends ApiTestCase {
        }
 
        public function testDeleteWithTag() {
-               $this->setMwGlobals( 'wgChangeTagsSchemaMigrationStage', MIGRATION_WRITE_BOTH );
-               $name = 'Help:' . ucfirst( __FUNCTION__ );
-
-               ChangeTags::defineTag( 'custom tag' );
-
-               $this->editPage( $name, 'Some text' );
-
-               $this->doApiRequestWithToken( [
-                       'action' => 'delete',
-                       'title' => $name,
-                       'tags' => 'custom tag',
-               ] );
-
-               $this->assertFalse( Title::newFromText( $name )->exists() );
-
-               $dbw = wfGetDB( DB_MASTER );
-               $this->assertSame( 'custom tag', $dbw->selectField(
-                       [ 'change_tag', 'logging' ],
-                       'ct_tag',
-                       [
-                               'log_namespace' => NS_HELP,
-                               'log_title' => ucfirst( __FUNCTION__ ),
-                       ],
-                       __METHOD__,
-                       [],
-                       [ 'change_tag' => [ 'INNER JOIN', 'ct_log_id = log_id' ] ]
-               ) );
-       }
-
-       public function testDeleteWithTagNewBackend() {
-               $this->setMwGlobals( 'wgChangeTagsSchemaMigrationStage', MIGRATION_NEW );
                $name = 'Help:' . ucfirst( __FUNCTION__ );
 
                ChangeTags::defineTag( 'custom tag' );
index 847316a..2161093 100644 (file)
@@ -1332,25 +1332,6 @@ class ApiEditPageTest extends ApiTestCase {
        }
 
        public function testEditWithTag() {
-               $this->setMwGlobals( 'wgChangeTagsSchemaMigrationStage', MIGRATION_WRITE_BOTH );
-               $name = 'Help:' . ucfirst( __FUNCTION__ );
-
-               ChangeTags::defineTag( 'custom tag' );
-
-               $revId = $this->doApiRequestWithToken( [
-                       'action' => 'edit',
-                       'title' => $name,
-                       'text' => 'Some text',
-                       'tags' => 'custom tag',
-               ] )[0]['edit']['newrevid'];
-
-               $dbw = wfGetDB( DB_MASTER );
-               $this->assertSame( 'custom tag', $dbw->selectField(
-                       'change_tag', 'ct_tag', [ 'ct_rev_id' => $revId ], __METHOD__ ) );
-       }
-
-       public function testEditWithTagNewBackend() {
-               $this->setMwGlobals( 'wgChangeTagsSchemaMigrationStage', MIGRATION_NEW );
                $name = 'Help:' . ucfirst( __FUNCTION__ );
 
                ChangeTags::defineTag( 'custom tag' );
index 24744df..6ebd835 100644 (file)
@@ -114,26 +114,7 @@ class ApiUnblockTest extends ApiTestCase {
                $this->doUnblock( [ 'user' => $this->blocker->getName() ] );
        }
 
-       // XXX These three tests copy-pasted from ApiBlockTest.php
-       public function testUnblockWithTag() {
-               $this->setMwGlobals( 'wgChangeTagsSchemaMigrationStage', MIGRATION_WRITE_BOTH );
-               ChangeTags::defineTag( 'custom tag' );
-
-               $this->doUnblock( [ 'tags' => 'custom tag' ] );
-
-               $dbw = wfGetDB( DB_MASTER );
-               $this->assertSame( 1, (int)$dbw->selectField(
-                       [ 'change_tag', 'logging' ],
-                       'COUNT(*)',
-                       [ 'log_type' => 'block', 'ct_tag' => 'custom tag' ],
-                       __METHOD__,
-                       [],
-                       [ 'change_tag' => [ 'INNER JOIN', 'ct_log_id = log_id' ] ]
-               ) );
-       }
-
        public function testUnblockWithTagNewBackend() {
-               $this->setMwGlobals( 'wgChangeTagsSchemaMigrationStage', MIGRATION_NEW );
                ChangeTags::defineTag( 'custom tag' );
 
                $this->doUnblock( [ 'tags' => 'custom tag' ] );
index 2534ad3..8cc0217 100644 (file)
@@ -188,31 +188,6 @@ class ApiUserrightsTest extends ApiTestCase {
        }
 
        public function testWithTag() {
-               $this->setMwGlobals( 'wgChangeTagsSchemaMigrationStage', MIGRATION_WRITE_BOTH );
-               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 testWithTagNewBackend() {
-               $this->setMwGlobals( 'wgChangeTagsSchemaMigrationStage', MIGRATION_NEW );
                ChangeTags::defineTag( 'custom tag' );
 
                $user = $this->getMutableTestUser()->getUser();
index cb9dd41..8265af8 100644 (file)
@@ -331,74 +331,10 @@ class ChangeTagsTest extends MediaWikiTestCase {
                $this->assertEquals( $expected, $actual );
        }
 
-       public function testUpdateTagsMigrationOld() {
-               $this->setMwGlobals( 'wgChangeTagsSchemaMigrationStage', MIGRATION_OLD );
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->delete( 'change_tag', '*' );
-               $dbw->delete( 'change_tag_def', '*' );
-
-               $rcId = 123;
-               ChangeTags::updateTags( [ 'tag1', 'tag2' ], [], $rcId );
-
-               $dbr = wfGetDB( DB_REPLICA );
-
-               $res = $dbr->select( 'change_tag_def', [ 'ctd_name', 'ctd_id', 'ctd_count' ], '' );
-               $this->assertEquals( [], iterator_to_array( $res, false ) );
-
-               $expected2 = [
-                       (object)[
-                               'ct_tag' => 'tag1',
-                               'ct_tag_id' => null,
-                               'ct_rc_id' => 123
-                       ],
-                       (object)[
-                               'ct_tag' => 'tag2',
-                               'ct_tag_id' => null,
-                               'ct_rc_id' => 123
-                       ],
-               ];
-               $res2 = $dbr->select( 'change_tag', [ 'ct_tag', 'ct_tag_id', 'ct_rc_id' ], '' );
-               $this->assertEquals( $expected2, iterator_to_array( $res2, false ) );
-
-               $rcId = 124;
-               ChangeTags::updateTags( [ 'tag1', 'tag3' ], [], $rcId );
-
-               $dbr = wfGetDB( DB_REPLICA );
-
-               $res = $dbr->select( 'change_tag_def', [ 'ctd_name', 'ctd_id', 'ctd_count' ], '' );
-               $this->assertEquals( [], iterator_to_array( $res, false ) );
-
-               $expected2 = [
-                       (object)[
-                               'ct_tag' => 'tag1',
-                               'ct_tag_id' => null,
-                               'ct_rc_id' => 123
-                       ],
-                       (object)[
-                               'ct_tag' => 'tag2',
-                               'ct_tag_id' => null,
-                               'ct_rc_id' => 123
-                       ],
-                       (object)[
-                               'ct_tag' => 'tag1',
-                               'ct_tag_id' => null,
-                               'ct_rc_id' => 124
-                       ],
-                       (object)[
-                               'ct_tag' => 'tag3',
-                               'ct_tag_id' => null,
-                               'ct_rc_id' => 124
-                       ],
-               ];
-               $res2 = $dbr->select( 'change_tag', [ 'ct_tag', 'ct_tag_id', 'ct_rc_id' ], '' );
-               $this->assertEquals( $expected2, iterator_to_array( $res2, false ) );
-       }
-
-       public function testUpdateTagsMigrationWriteBoth() {
+       public function testUpdateTags() {
                // FIXME: fails under postgres
                $this->markTestSkippedIfDbType( 'postgres' );
 
-               $this->setMwGlobals( 'wgChangeTagsSchemaMigrationStage', MIGRATION_WRITE_BOTH );
                $dbw = wfGetDB( DB_MASTER );
                $dbw->delete( 'change_tag', '*' );
                $dbw->delete( 'change_tag_def', '*' );
@@ -425,17 +361,15 @@ class ChangeTagsTest extends MediaWikiTestCase {
 
                $expected2 = [
                        (object)[
-                               'ct_tag' => 'tag1',
                                'ct_tag_id' => 1,
                                'ct_rc_id' => 123
                        ],
                        (object)[
-                               'ct_tag' => 'tag2',
                                'ct_tag_id' => 2,
                                'ct_rc_id' => 123
                        ],
                ];
-               $res2 = $dbr->select( 'change_tag', [ 'ct_tag', 'ct_tag_id', 'ct_rc_id' ], '' );
+               $res2 = $dbr->select( 'change_tag', [ 'ct_tag_id', 'ct_rc_id' ], '' );
                $this->assertEquals( $expected2, iterator_to_array( $res2, false ) );
 
                $rcId = 124;
@@ -467,59 +401,27 @@ class ChangeTagsTest extends MediaWikiTestCase {
 
                $expected2 = [
                        (object)[
-                               'ct_tag' => 'tag1',
                                'ct_tag_id' => 1,
                                'ct_rc_id' => 123
                        ],
                        (object)[
-                               'ct_tag' => 'tag2',
                                'ct_tag_id' => 2,
                                'ct_rc_id' => 123
                        ],
                        (object)[
-                               'ct_tag' => 'tag1',
                                'ct_tag_id' => 1,
                                'ct_rc_id' => 124
                        ],
                        (object)[
-                               'ct_tag' => 'tag3',
                                'ct_tag_id' => 3,
                                'ct_rc_id' => 124
                        ],
                ];
-               $res2 = $dbr->select( 'change_tag', [ 'ct_tag', 'ct_tag_id', 'ct_rc_id' ], '' );
-               $this->assertEquals( $expected2, iterator_to_array( $res2, false ) );
-       }
-
-       public function testDeleteTagsMigrationOld() {
-               $this->setMwGlobals( 'wgChangeTagsSchemaMigrationStage', MIGRATION_OLD );
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->delete( 'change_tag', '*' );
-               $dbw->delete( 'change_tag_def', '*' );
-
-               $rcId = 123;
-               ChangeTags::updateTags( [ 'tag1', 'tag2' ], [], $rcId );
-
-               ChangeTags::updateTags( [], [ 'tag2' ], $rcId );
-
-               $dbr = wfGetDB( DB_REPLICA );
-
-               $res = $dbr->select( 'change_tag_def', [ 'ctd_name', 'ctd_id', 'ctd_count' ], '' );
-               $this->assertEquals( [], iterator_to_array( $res, false ) );
-
-               $expected2 = [
-                       (object)[
-                               'ct_tag' => 'tag1',
-                               'ct_tag_id' => null,
-                               'ct_rc_id' => 123
-                       ]
-               ];
-               $res2 = $dbr->select( 'change_tag', [ 'ct_tag', 'ct_tag_id', 'ct_rc_id' ], '' );
+               $res2 = $dbr->select( 'change_tag', [ 'ct_tag_id', 'ct_rc_id' ], '' );
                $this->assertEquals( $expected2, iterator_to_array( $res2, false ) );
        }
 
-       public function testDeleteTagsMigrationWriteBoth() {
-               $this->setMwGlobals( 'wgChangeTagsSchemaMigrationStage', MIGRATION_WRITE_BOTH );
+       public function testDeleteTags() {
                $dbw = wfGetDB( DB_MASTER );
                $dbw->delete( 'change_tag', '*' );
                $dbw->delete( 'change_tag_def', '*' );
@@ -544,54 +446,15 @@ class ChangeTagsTest extends MediaWikiTestCase {
 
                $expected2 = [
                        (object)[
-                               'ct_tag' => 'tag1',
                                'ct_tag_id' => 1,
                                'ct_rc_id' => 123
                        ]
                ];
-               $res2 = $dbr->select( 'change_tag', [ 'ct_tag', 'ct_tag_id', 'ct_rc_id' ], '' );
+               $res2 = $dbr->select( 'change_tag', [ 'ct_tag_id', 'ct_rc_id' ], '' );
                $this->assertEquals( $expected2, iterator_to_array( $res2, false ) );
        }
 
-       public function testTagUsageStatisticsOldBackend() {
-               $this->setMwGlobals( 'wgChangeTagsSchemaMigrationStage', MIGRATION_OLD );
-               $this->setMwGlobals( 'wgTagStatisticsNewTable', false );
-
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->delete( 'change_tag', '*' );
-               $dbw->delete( 'change_tag_def', '*' );
-
-               $rcId = 123;
-               ChangeTags::updateTags( [ 'tag1', 'tag2' ], [], $rcId );
-
-               $rcId = 124;
-               ChangeTags::updateTags( [ 'tag1' ], [], $rcId );
-
-               $this->assertEquals( [ 'tag1' => 2, 'tag2' => 1 ], ChangeTags::tagUsageStatistics() );
-       }
-
-       public function testTagUsageStatisticsNewMigrationOldBackedn() {
-               $this->setMwGlobals( 'wgChangeTagsSchemaMigrationStage', MIGRATION_WRITE_BOTH );
-               $this->setMwGlobals( 'wgTagStatisticsNewTable', false );
-
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->delete( 'change_tag', '*' );
-               $dbw->delete( 'change_tag_def', '*' );
-               MediaWikiServices::getInstance()->resetServiceForTesting( 'NameTableStoreFactory' );
-
-               $rcId = 123;
-               ChangeTags::updateTags( [ 'tag1', 'tag2' ], [], $rcId );
-
-               $rcId = 124;
-               ChangeTags::updateTags( [ 'tag1' ], [], $rcId );
-
-               $this->assertEquals( [ 'tag1' => 2, 'tag2' => 1 ], ChangeTags::tagUsageStatistics() );
-       }
-
-       public function testTagUsageStatisticsNewBackend() {
-               $this->setMwGlobals( 'wgChangeTagsSchemaMigrationStage', MIGRATION_WRITE_BOTH );
-               $this->setMwGlobals( 'wgTagStatisticsNewTable', true );
-
+       public function testTagUsageStatistics() {
                $dbw = wfGetDB( DB_MASTER );
                $dbw->delete( 'change_tag', '*' );
                $dbw->delete( 'change_tag_def', '*' );
@@ -606,57 +469,7 @@ class ChangeTagsTest extends MediaWikiTestCase {
                $this->assertEquals( [ 'tag1' => 2, 'tag2' => 1 ], ChangeTags::tagUsageStatistics() );
        }
 
-       public function testListExplicitlyDefinedTagsOld() {
-               $this->setMwGlobals( 'wgChangeTagsSchemaMigrationStage', MIGRATION_OLD );
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->delete( 'change_tag', '*' );
-               $dbw->delete( 'change_tag_def', '*' );
-               $dbw->delete( 'valid_tag', '*' );
-
-               $rcId = 123;
-               ChangeTags::updateTags( [ 'tag1', 'tag2' ], [], $rcId );
-               ChangeTags::defineTag( 'tag2' );
-
-               $this->assertEquals( [ 'tag2' ], ChangeTags::listExplicitlyDefinedTags() );
-               $dbr = wfGetDB( DB_REPLICA );
-               $res = $dbr->select( 'change_tag_def', [ 'ctd_name', 'ctd_user_defined' ], '' );
-               $this->assertEquals( [], iterator_to_array( $res, false ) );
-
-               $this->assertEquals( [ 'tag2' ], $dbr->selectFieldValues( 'valid_tag', 'vt_tag', '' ) );
-       }
-
-       public function testListExplicitlyDefinedTagsWriteBoth() {
-               $this->setMwGlobals( 'wgChangeTagsSchemaMigrationStage', MIGRATION_WRITE_BOTH );
-               $dbw = wfGetDB( DB_MASTER );
-               $dbw->delete( 'change_tag', '*' );
-               $dbw->delete( 'change_tag_def', '*' );
-               $dbw->delete( 'valid_tag', '*' );
-
-               $rcId = 123;
-               ChangeTags::updateTags( [ 'tag1', 'tag2' ], [], $rcId );
-               ChangeTags::defineTag( 'tag2' );
-
-               $this->assertEquals( [ 'tag2' ], ChangeTags::listExplicitlyDefinedTags() );
-               $dbr = wfGetDB( DB_REPLICA );
-
-               $expected = [
-                       (object)[
-                               'ctd_name' => 'tag1',
-                               'ctd_user_defined' => 0
-                       ],
-                       (object)[
-                               'ctd_name' => 'tag2',
-                               'ctd_user_defined' => 1
-                       ],
-               ];
-               $res = $dbr->select( 'change_tag_def', [ 'ctd_name', 'ctd_user_defined' ], '' );
-               $this->assertEquals( $expected, iterator_to_array( $res, false ) );
-
-               $this->assertEquals( [ 'tag2' ], $dbr->selectFieldValues( 'valid_tag', 'vt_tag', '' ) );
-       }
-
-       public function testListExplicitlyDefinedTagsNew() {
-               $this->setMwGlobals( 'wgChangeTagsSchemaMigrationStage', MIGRATION_NEW );
+       public function testListExplicitlyDefinedTags() {
                $dbw = wfGetDB( DB_MASTER );
                $dbw->delete( 'change_tag', '*' );
                $dbw->delete( 'change_tag_def', '*' );
index 1f73324..9f88cd7 100644 (file)
@@ -61,13 +61,16 @@ class CategoryMembershipChangeJobTest extends MediaWikiTestCase {
         * @return RecentChange|null
         */
        private function getCategorizeRecentChangeForRevId( $revId ) {
-               return RecentChange::newFromConds(
+               $rc = RecentChange::newFromConds(
                        [
                                'rc_type' => RC_CATEGORIZE,
                                'rc_this_oldid' => $revId,
                        ],
                        __METHOD__
                );
+
+               $this->assertNotNull( $rc, 'rev__id = ' . $revId );
+               return $rc;
        }
 
        public function testRun_normalCategoryAddedAndRemoved() {
index 1e16097..ba4b2e2 100644 (file)
@@ -52,7 +52,7 @@ class PageArchiveMcrTest extends PageArchiveTestBase {
                                'ar_page_id' => strval( $this->ipRev->getPageId() ),
                                'ar_comment_text' => 'just a test',
                                'ar_comment_data' => null,
-                               'ar_comment_cid' => null,
+                               'ar_comment_cid' => '2',
                                'ts_tags' => null,
                                'ar_id' => '2',
                                'ar_namespace' => '0',
@@ -72,7 +72,7 @@ class PageArchiveMcrTest extends PageArchiveTestBase {
                                'ar_page_id' => strval( $this->firstRev->getPageId() ),
                                'ar_comment_text' => 'testing',
                                'ar_comment_data' => null,
-                               'ar_comment_cid' => null,
+                               'ar_comment_cid' => '1',
                                'ts_tags' => null,
                                'ar_id' => '1',
                                'ar_namespace' => '0',
index 4df4ee1..f8d4ef9 100644 (file)
@@ -54,7 +54,7 @@ class PageArchivePreMcrTest extends PageArchiveTestBase {
                                'ar_page_id' => strval( $this->ipRev->getPageId() ),
                                'ar_comment_text' => 'just a test',
                                'ar_comment_data' => null,
-                               'ar_comment_cid' => null,
+                               'ar_comment_cid' => '2',
                                'ar_content_format' => null,
                                'ar_content_model' => null,
                                'ts_tags' => null,
@@ -79,7 +79,7 @@ class PageArchivePreMcrTest extends PageArchiveTestBase {
                                'ar_page_id' => strval( $this->firstRev->getPageId() ),
                                'ar_comment_text' => 'testing',
                                'ar_comment_data' => null,
-                               'ar_comment_cid' => null,
+                               'ar_comment_cid' => '1',
                                'ar_content_format' => null,
                                'ar_content_model' => null,
                                'ts_tags' => null,
index ade8efd..26b6b52 100644 (file)
@@ -43,12 +43,14 @@ abstract class PageArchiveTestBase extends MediaWikiTestCase {
                        [
                                'page',
                                'revision',
+                               'revision_comment_temp',
                                'ip_changes',
                                'text',
                                'archive',
                                'recentchanges',
                                'logging',
                                'page_props',
+                               'comment',
                        ]
                );
        }
@@ -80,7 +82,7 @@ abstract class PageArchiveTestBase extends MediaWikiTestCase {
 
                $this->tablesUsed += $this->getMcrTablesToReset();
 
-               $this->setMwGlobals( 'wgCommentTableSchemaMigrationStage', MIGRATION_OLD );
+               $this->setMwGlobals( 'wgCommentTableSchemaMigrationStage', MIGRATION_NEW );
                $this->setMwGlobals( 'wgActorTableSchemaMigrationStage', SCHEMA_COMPAT_OLD );
                $this->setMwGlobals( 'wgContentHandlerUseDB', $this->getContentHandlerUseDB() );
                $this->setMwGlobals(
index fee4583..439bd38 100644 (file)
@@ -463,12 +463,13 @@ abstract class WikiPageDbTestBase extends MediaWikiLangTestCase {
                );
                $logId = $status->getValue();
                $actorQuery = ActorMigration::newMigration()->getJoin( 'log_user' );
+               $commentQuery = MediaWikiServices::getInstance()->getCommentStore()->getJoin( 'log_comment' );
                $this->assertSelect(
-                       [ 'logging' ] + $actorQuery['tables'], /* table */
+                       [ 'logging' ] + $actorQuery['tables'] + $commentQuery['tables'], /* table */
                        [
                                'log_type',
                                'log_action',
-                               'log_comment',
+                               'log_comment' => $commentQuery['fields']['log_comment_text'],
                                'log_user' => $actorQuery['fields']['log_user'],
                                'log_user_text' => $actorQuery['fields']['log_user_text'],
                                'log_namespace',
@@ -485,7 +486,7 @@ abstract class WikiPageDbTestBase extends MediaWikiLangTestCase {
                                $page->getTitle()->getDBkey(),
                        ] ],
                        [],
-                       $actorQuery['joins']
+                       $actorQuery['joins'] + $commentQuery['joins']
                );
        }
 
@@ -512,12 +513,13 @@ abstract class WikiPageDbTestBase extends MediaWikiLangTestCase {
                );
                $logId = $status->getValue();
                $actorQuery = ActorMigration::newMigration()->getJoin( 'log_user' );
+               $commentQuery = MediaWikiServices::getInstance()->getCommentStore()->getJoin( 'log_comment' );
                $this->assertSelect(
-                       [ 'logging' ] + $actorQuery['tables'], /* table */
+                       [ 'logging' ] + $actorQuery['tables'] + $commentQuery['tables'], /* table */
                        [
                                'log_type',
                                'log_action',
-                               'log_comment',
+                               'log_comment' => $commentQuery['fields']['log_comment_text'],
                                'log_user' => $actorQuery['fields']['log_user'],
                                'log_user_text' => $actorQuery['fields']['log_user_text'],
                                'log_namespace',
@@ -534,7 +536,7 @@ abstract class WikiPageDbTestBase extends MediaWikiLangTestCase {
                                $page->getTitle()->getDBkey(),
                        ] ],
                        [],
-                       $actorQuery['joins']
+                       $actorQuery['joins'] + $commentQuery['joins']
                );
        }
 
@@ -563,12 +565,13 @@ abstract class WikiPageDbTestBase extends MediaWikiLangTestCase {
                );
                $logId = $status->getValue();
                $actorQuery = ActorMigration::newMigration()->getJoin( 'log_user' );
+               $commentQuery = MediaWikiServices::getInstance()->getCommentStore()->getJoin( 'log_comment' );
                $this->assertSelect(
-                       [ 'logging' ] + $actorQuery['tables'], /* table */
+                       [ 'logging' ] + $actorQuery['tables'] + $commentQuery['tables'], /* table */
                        [
                                'log_type',
                                'log_action',
-                               'log_comment',
+                               'log_comment' => $commentQuery['fields']['log_comment_text'],
                                'log_user' => $actorQuery['fields']['log_user'],
                                'log_user_text' => $actorQuery['fields']['log_user_text'],
                                'log_namespace',
@@ -585,7 +588,7 @@ abstract class WikiPageDbTestBase extends MediaWikiLangTestCase {
                                $page->getTitle()->getDBkey(),
                        ] ],
                        [],
-                       $actorQuery['joins']
+                       $actorQuery['joins'] + $commentQuery['joins']
                );
 
                $this->assertNull(
@@ -2266,10 +2269,11 @@ more stuff
                // Make sure the log entry looks good
                // log_params is not checked here
                $actorQuery = ActorMigration::newMigration()->getJoin( 'log_user' );
+               $commentQuery = MediaWikiServices::getInstance()->getCommentStore()->getJoin( 'log_comment' );
                $this->assertSelect(
-                       [ 'logging' ] + $actorQuery['tables'],
+                       [ 'logging' ] + $actorQuery['tables'] + $commentQuery['tables'],
                        [
-                               'log_comment',
+                               'log_comment' => $commentQuery['fields']['log_comment_text'],
                                'log_user' => $actorQuery['fields']['log_user'],
                                'log_user_text' => $actorQuery['fields']['log_user_text'],
                                'log_namespace',
@@ -2284,7 +2288,7 @@ more stuff
                                $page->getTitle()->getDBkey(),
                        ] ],
                        [],
-                       $actorQuery['joins']
+                       $actorQuery['joins'] + $commentQuery['joins']
                );
        }
 
diff --git a/tests/phpunit/maintenance/populateChangeTagDefTest.php b/tests/phpunit/maintenance/populateChangeTagDefTest.php
deleted file mode 100644 (file)
index 8a88f19..0000000
+++ /dev/null
@@ -1,287 +0,0 @@
-<?php
-
-namespace MediaWiki\Tests\Maintenance;
-
-use PopulateChangeTagDef;
-
-/**
- * @group Database
- * @covers PopulateChangeTagDef
- */
-class PopulateChangeTagDefTest extends MaintenanceBaseTestCase {
-
-       public function getMaintenanceClass() {
-               return PopulateChangeTagDef::class;
-       }
-
-       public function setUp() {
-               parent::setUp();
-               $this->tablesUsed = [ 'change_tag', 'change_tag_def', 'updatelog' ];
-
-               $this->cleanChangeTagTables();
-               $this->insertChangeTagData();
-       }
-
-       private function cleanChangeTagTables() {
-               wfGetDB( DB_MASTER )->delete( 'change_tag', '*' );
-               wfGetDB( DB_MASTER )->delete( 'change_tag_def', '*' );
-               wfGetDB( DB_MASTER )->delete( 'updatelog', '*' );
-       }
-
-       private function insertChangeTagData() {
-               $changeTags = [];
-
-               $changeTags[] = [
-                       'ct_rc_id' => 1234,
-                       'ct_tag' => 'One Tag',
-               ];
-
-               $changeTags[] = [
-                       'ct_rc_id' => 1235,
-                       'ct_tag' => 'Two Tags',
-               ];
-
-               $changeTags[] = [
-                       'ct_log_id' => 1236,
-                       'ct_tag' => 'Two Tags',
-               ];
-
-               $changeTags[] = [
-                       'ct_rev_id' => 1237,
-                       'ct_tag' => 'Three Tags',
-               ];
-
-               $changeTags[] = [
-                       'ct_rc_id' => 1238,
-                       'ct_tag' => 'Three Tags',
-               ];
-
-               $changeTags[] = [
-                       'ct_log_id' => 1239,
-                       'ct_tag' => 'Three Tags',
-               ];
-
-               wfGetDB( DB_MASTER )->insert( 'change_tag', $changeTags );
-       }
-
-       public function testRun() {
-               $this->setMwGlobals( 'wgChangeTagsSchemaMigrationStage', MIGRATION_WRITE_BOTH );
-               $this->maintenance->loadWithArgv( [ '--sleep', '0' ] );
-
-               $this->maintenance->execute();
-
-               $changeTagDefRows = [
-                       (object)[
-                               'ctd_name' => 'One Tag',
-                               'ctd_count' => 1,
-                       ],
-                       (object)[
-                               'ctd_name' => 'Two Tags',
-                               'ctd_count' => 2,
-                       ],
-                       (object)[
-                               'ctd_name' => 'Three Tags',
-                               'ctd_count' => 3,
-                       ],
-               ];
-
-               $actualChangeTagDefs = wfGetDB( DB_REPLICA )->select(
-                       [ 'change_tag_def' ],
-                       [ 'ctd_name', 'ctd_count' ],
-                       [],
-                       __METHOD__,
-                       [ 'ORDER BY' => 'ctd_count' ]
-               );
-
-               $this->assertEquals( $changeTagDefRows, iterator_to_array( $actualChangeTagDefs, false ) );
-
-               // Check if change_tag is also backpopulated
-               $actualChangeTags = wfGetDB( DB_REPLICA )->select(
-                       [ 'change_tag', 'change_tag_def' ],
-                       [ 'ct_tag', 'ct_tag_id', 'ctd_count' ],
-                       [],
-                       __METHOD__,
-                       [],
-                       [ 'change_tag_def' => [ 'LEFT JOIN', 'ct_tag_id=ctd_id' ] ]
-               );
-               $mapping = [
-                       'One Tag' => 1,
-                       'Two Tags' => 2,
-                       'Three Tags' => 3
-               ];
-               foreach ( $actualChangeTags as $row ) {
-                       $this->assertNotNull( $row->ct_tag_id );
-                       $this->assertEquals( $row->ctd_count, $mapping[$row->ct_tag] );
-               }
-       }
-
-       public function testRunUpdateHitCountMigrationNew() {
-               $this->setMwGlobals( 'wgChangeTagsSchemaMigrationStage', MIGRATION_NEW );
-               $changeTagDefBadRows = [
-                       [
-                               'ctd_name' => 'One Tag',
-                               'ctd_user_defined' => 0,
-                               'ctd_count' => 50,
-                       ],
-                       [
-                               'ctd_name' => 'Two Tags',
-                               'ctd_user_defined' => 0,
-                               'ctd_count' => 4,
-                       ],
-                       [
-                               'ctd_name' => 'Three Tags',
-                               'ctd_user_defined' => 0,
-                               'ctd_count' => 3,
-                       ],
-               ];
-               wfGetDB( DB_MASTER )->insert(
-                       'change_tag_def',
-                       $changeTagDefBadRows
-               );
-
-               $mapping = [
-                       'One Tag' => 1,
-                       'Two Tags' => 2,
-                       'Three Tags' => 3
-               ];
-               foreach ( $mapping as $tagName => $tagId ) {
-                       wfGetDB( DB_MASTER )->update(
-                               'change_tag',
-                               [ 'ct_tag_id' => $tagId ],
-                               [ 'ct_tag' => $tagName ]
-                       );
-               }
-
-               $this->maintenance->loadWithArgv( [ '--sleep', '0' ] );
-
-               $this->maintenance->execute();
-
-               $changeTagDefRows = [
-                       (object)[
-                               'ctd_name' => 'One Tag',
-                               'ctd_count' => 1,
-                       ],
-                       (object)[
-                               'ctd_name' => 'Two Tags',
-                               'ctd_count' => 2,
-                       ],
-                       (object)[
-                               'ctd_name' => 'Three Tags',
-                               'ctd_count' => 3,
-                       ],
-               ];
-
-               $actualChangeTagDefs = wfGetDB( DB_REPLICA )->select(
-                       [ 'change_tag_def' ],
-                       [ 'ctd_name', 'ctd_count' ],
-                       [],
-                       __METHOD__,
-                       [ 'ORDER BY' => 'ctd_count' ]
-               );
-
-               $this->assertEquals( $changeTagDefRows, iterator_to_array( $actualChangeTagDefs, false ) );
-       }
-
-       public function testRunUpdateHitCountMigrationWriteBoth() {
-               $this->setMwGlobals( 'wgChangeTagsSchemaMigrationStage', MIGRATION_WRITE_BOTH );
-               $changeTagDefBadRows = [
-                       [
-                               'ctd_name' => 'One Tag',
-                               'ctd_user_defined' => 0,
-                               'ctd_count' => 50,
-                       ],
-                       [
-                               'ctd_name' => 'Two Tags',
-                               'ctd_user_defined' => 0,
-                               'ctd_count' => 4,
-                       ],
-                       [
-                               'ctd_name' => 'Three Tags',
-                               'ctd_user_defined' => 0,
-                               'ctd_count' => 3,
-                       ],
-               ];
-               wfGetDB( DB_MASTER )->insert(
-                       'change_tag_def',
-                       $changeTagDefBadRows
-               );
-
-               $this->maintenance->loadWithArgv( [ '--sleep', '0' ] );
-
-               $this->maintenance->execute();
-
-               $changeTagDefRows = [
-                       (object)[
-                               'ctd_name' => 'One Tag',
-                               'ctd_count' => 1,
-                       ],
-                       (object)[
-                               'ctd_name' => 'Two Tags',
-                               'ctd_count' => 2,
-                       ],
-                       (object)[
-                               'ctd_name' => 'Three Tags',
-                               'ctd_count' => 3,
-                       ],
-               ];
-
-               $actualChangeTagDefs = wfGetDB( DB_REPLICA )->select(
-                       [ 'change_tag_def' ],
-                       [ 'ctd_name', 'ctd_count' ],
-                       [],
-                       __METHOD__,
-                       [ 'ORDER BY' => 'ctd_count' ]
-               );
-
-               $this->assertEquals( $changeTagDefRows, iterator_to_array( $actualChangeTagDefs, false ) );
-       }
-
-       public function testDryRunMigrationNew() {
-               $this->setMwGlobals( 'wgChangeTagsSchemaMigrationStage', MIGRATION_NEW );
-               $this->maintenance->loadWithArgv( [ '--dry-run', '--sleep', '0' ] );
-
-               $this->maintenance->execute();
-
-               $actualChangeTagDefs = wfGetDB( DB_REPLICA )->select(
-                       [ 'change_tag_def' ],
-                       [ 'ctd_id', 'ctd_name' ]
-               );
-
-               $this->assertEquals( [], iterator_to_array( $actualChangeTagDefs, false ) );
-
-               $actualChangeTags = wfGetDB( DB_REPLICA )->select(
-                       [ 'change_tag' ],
-                       [ 'ct_tag_id', 'ct_tag' ]
-               );
-
-               foreach ( $actualChangeTags as $row ) {
-                       $this->assertNull( $row->ct_tag_id );
-                       $this->assertNotNull( $row->ct_tag );
-               }
-       }
-
-       public function testDryRunMigrationWriteBoth() {
-               $this->setMwGlobals( 'wgChangeTagsSchemaMigrationStage', MIGRATION_WRITE_BOTH );
-               $this->maintenance->loadWithArgv( [ '--dry-run', '--sleep', '0' ] );
-
-               $this->maintenance->execute();
-
-               $actualChangeTagDefs = wfGetDB( DB_REPLICA )->select(
-                       [ 'change_tag_def' ],
-                       [ 'ctd_id', 'ctd_name' ]
-               );
-
-               $this->assertEquals( [], iterator_to_array( $actualChangeTagDefs, false ) );
-
-               $actualChangeTags = wfGetDB( DB_REPLICA )->select(
-                       [ 'change_tag' ],
-                       [ 'ct_tag_id', 'ct_tag' ]
-               );
-
-               foreach ( $actualChangeTags as $row ) {
-                       $this->assertNull( $row->ct_tag_id );
-                       $this->assertNotNull( $row->ct_tag );
-               }
-       }
-
-}
index afeb4a5..3f3cc2c 100644 (file)
 
                mw.config.values.wgExtraSignatureNamespaces = [];
                assert.strictEqual( mw.Title.wantSignaturesNamespace( 0 ), false, 'Main namespace has no signatures' );
-               assert.strictEqual( mw.Title.wantSignaturesNamespace( 1 ), true, 'Talk namespace no signatures' );
+               assert.strictEqual( mw.Title.wantSignaturesNamespace( 1 ), true, 'Talk namespace has signatures' );
                assert.strictEqual( mw.Title.wantSignaturesNamespace( 2 ), false, 'NS2 has no signatures' );
                assert.strictEqual( mw.Title.wantSignaturesNamespace( 3 ), true, 'NS3 has signatures' );