Merge "User: Avoid deprecated Linker::link()"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 28 Jun 2017 12:49:55 +0000 (12:49 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 28 Jun 2017 12:49:55 +0000 (12:49 +0000)
243 files changed:
autoload.php
includes/Defines.php
includes/EventRelayerGroup.php
includes/MediaWikiServices.php
includes/PageProps.php
includes/ServiceWiring.php
includes/WatchedItemQueryService.php
includes/WatchedItemStore.php
includes/Xml.php
includes/api/ApiAMCreateAccount.php
includes/api/ApiAuthManagerHelper.php
includes/api/ApiChangeAuthenticationData.php
includes/api/ApiCheckToken.php
includes/api/ApiClientLogin.php
includes/api/ApiHelp.php
includes/api/ApiHelpParamValueMessage.php
includes/api/ApiLinkAccount.php
includes/api/ApiOpenSearch.php
includes/api/ApiQueryAllDeletedRevisions.php
includes/api/ApiQueryAllRevisions.php
includes/api/ApiQueryAuthManagerInfo.php
includes/api/ApiQueryBacklinksprop.php
includes/api/ApiQueryContributors.php
includes/api/ApiQueryDeletedRevisions.php
includes/api/ApiQueryInfo.php
includes/api/ApiQueryPagePropNames.php
includes/api/ApiQueryPagesWithProp.php
includes/api/ApiQueryPrefixSearch.php
includes/api/ApiQueryTokens.php
includes/api/ApiQueryUsers.php
includes/api/ApiRemoveAuthenticationData.php
includes/api/ApiResetPassword.php
includes/api/ApiRevisionDelete.php
includes/api/ApiSerializable.php
includes/api/ApiSetNotificationTimestamp.php
includes/api/ApiStashEdit.php
includes/api/i18n/fr.json
includes/api/i18n/pl.json
includes/cache/BacklinkCache.php
includes/changes/EnhancedChangesList.php
includes/config/EtcdConfig.php
includes/db/CloneDatabase.php
includes/debug/logger/LegacyLogger.php
includes/debug/logger/LegacySpi.php
includes/debug/logger/LoggerFactory.php
includes/debug/logger/MonologSpi.php
includes/debug/logger/NullSpi.php
includes/debug/logger/Spi.php
includes/debug/logger/monolog/LegacyFormatter.php
includes/debug/logger/monolog/LegacyHandler.php
includes/debug/logger/monolog/LineFormatter.php
includes/debug/logger/monolog/SyslogHandler.php
includes/debug/logger/monolog/WikiProcessor.php
includes/deferred/SearchUpdate.php
includes/diff/DifferenceEngine.php
includes/exception/MWExceptionRenderer.php
includes/externalstore/ExternalStoreMedium.php
includes/filebackend/FileBackendGroup.php
includes/filebackend/filejournal/DBFileJournal.php
includes/filebackend/lockmanager/LockManagerGroup.php
includes/filerepo/FileBackendDBRepoWrapper.php
includes/filerepo/ForeignDBViaLBRepo.php
includes/filerepo/LocalRepo.php
includes/filerepo/file/LocalFile.php
includes/htmlform/HTMLFormElement.php
includes/htmlform/fields/HTMLUsersMultiselectField.php
includes/installer/DatabaseInstaller.php
includes/installer/Installer.php
includes/jobqueue/JobQueue.php
includes/jobqueue/JobQueueDB.php
includes/jobqueue/JobQueueFederated.php
includes/jobqueue/JobQueueGroup.php
includes/jobqueue/JobQueueMemory.php
includes/jobqueue/JobQueueRedis.php
includes/jobqueue/aggregator/JobQueueAggregator.php
includes/jobqueue/aggregator/JobQueueAggregatorRedis.php
includes/jobqueue/jobs/ActivityUpdateJob.php
includes/jobqueue/jobs/RecentChangesUpdateJob.php
includes/jobqueue/utils/BacklinkJobUtils.php
includes/libs/CSSMin.php
includes/libs/HashRing.php
includes/libs/IP.php
includes/libs/MappedIterator.php
includes/libs/MultiHttpClient.php
includes/libs/ObjectFactory.php
includes/libs/XhprofData.php
includes/libs/eventrelayer/EventRelayer.php
includes/libs/eventrelayer/EventRelayerNull.php
includes/libs/filebackend/FSFileBackend.php
includes/libs/filebackend/FileBackend.php
includes/libs/filebackend/FileBackendMultiWrite.php
includes/libs/filebackend/FileBackendStore.php
includes/libs/filebackend/FileOpBatch.php
includes/libs/filebackend/MemoryFileBackend.php
includes/libs/filebackend/SwiftFileBackend.php
includes/libs/filebackend/filejournal/FileJournal.php
includes/libs/filebackend/fileop/CopyFileOp.php
includes/libs/filebackend/fileop/CreateFileOp.php
includes/libs/filebackend/fileop/DeleteFileOp.php
includes/libs/filebackend/fileop/DescribeFileOp.php
includes/libs/filebackend/fileop/FileOp.php
includes/libs/filebackend/fileop/MoveFileOp.php
includes/libs/filebackend/fileop/NullFileOp.php
includes/libs/filebackend/fileop/StoreFileOp.php
includes/libs/lockmanager/LockManager.php
includes/libs/lockmanager/NullLockManager.php
includes/libs/lockmanager/ScopedLock.php
includes/libs/objectcache/BagOStuff.php
includes/libs/objectcache/ReplicatedBagOStuff.php
includes/libs/objectcache/WANObjectCache.php
includes/libs/objectcache/WANObjectCacheReaper.php
includes/libs/rdbms/TransactionProfiler.php
includes/libs/rdbms/database/Database.php
includes/libs/rdbms/database/DatabaseMysqlBase.php
includes/libs/rdbms/database/DatabaseSqlite.php
includes/libs/rdbms/database/resultwrapper/FakeResultWrapper.php
includes/libs/rdbms/exception/DBTransactionError.php
includes/libs/rdbms/lbfactory/LBFactory.php
includes/libs/rdbms/loadbalancer/ILoadBalancer.php
includes/libs/rdbms/loadbalancer/LoadBalancer.php
includes/libs/redis/RedisConnRef.php
includes/libs/redis/RedisConnectionPool.php
includes/libs/stats/SamplingStatsdClient.php
includes/libs/virtualrest/VirtualRESTServiceClient.php
includes/linkeddata/PageDataRequestHandler.php
includes/logging/LogEventsList.php
includes/logging/LogPager.php
includes/logging/RightsLogFormatter.php
includes/page/WikiPage.php
includes/pager/RangeChronologicalPager.php
includes/parser/Parser.php
includes/parser/ParserCache.php
includes/parser/ParserOptions.php
includes/poolcounter/PoolCounterRedis.php
includes/profiler/ProfilerSectionOnly.php
includes/profiler/ProfilerXhprof.php
includes/profiler/SectionProfiler.php
includes/registration/ExtensionProcessor.php
includes/registration/ExtensionRegistry.php
includes/resourceloader/ResourceLoaderJqueryMsgModule.php
includes/search/SearchEngine.php
includes/search/SearchMySQL.php
includes/search/SearchOracle.php
includes/search/SearchSqlite.php
includes/search/SearchSuggestionSet.php
includes/session/MetadataMergeException.php
includes/skins/SkinApi.php
includes/skins/SkinApiTemplate.php
includes/specialpage/SpecialPage.php
includes/specials/SpecialActiveusers.php
includes/specials/SpecialBotPasswords.php
includes/specials/SpecialChangeContentModel.php
includes/specials/SpecialLog.php
includes/specials/SpecialMovepage.php
includes/specials/SpecialPagesWithProp.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialRunJobs.php
includes/specials/SpecialUserrights.php
includes/specials/SpecialVersion.php
includes/specials/pagers/ActiveUsersPager.php
includes/tidy/Balancer.php
includes/upload/UploadBase.php
includes/user/User.php
includes/utils/BatchRowUpdate.php
includes/utils/UIDGenerator.php
includes/utils/ZipDirectoryReader.php
languages/ConverterRule.php
languages/FakeConverter.php
languages/LanguageConverter.php
languages/i18n/be-tarask.json
languages/i18n/bho.json
languages/i18n/ckb.json
languages/i18n/en.json
languages/i18n/fr.json
languages/i18n/frr.json
languages/i18n/hr.json
languages/i18n/lij.json
languages/i18n/lv.json
languages/i18n/nn.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/tcy.json
maintenance/CodeCleanerGlobalsPass.inc
maintenance/benchmarks/Benchmarker.php
maintenance/benchmarks/benchmarkJSMinPlus.php [new file with mode: 0644]
maintenance/deleteArchivedFiles.php
maintenance/deleteArchivedRevisions.php
maintenance/eraseArchivedFile.php
maintenance/findMissingFiles.php
maintenance/findOrphanedFiles.php
maintenance/jsparse.php
maintenance/manageJobs.php
maintenance/refreshFileHeaders.php
maintenance/validateRegistrationFile.php
phpcs.xml
resources/Resources.php
resources/src/mediawiki.action/mediawiki.action.edit.js
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js
resources/src/mediawiki.rcfilters/styles/mw.rcfilters.ui.FilterTagMultiselectWidget.less
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuHeaderWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterTagMultiselectWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FormWrapperWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.MenuSelectWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.js
resources/src/mediawiki.special/mediawiki.special.changeslist.legend.js
resources/src/mediawiki.special/mediawiki.special.movePage.js
resources/src/mediawiki.widgets.visibleByteLimit/mediawiki.widgets.visibleByteLimit.js [new file with mode: 0644]
tests/parser/ParserTestRunner.php
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/data/resourceloader/script-comment.js [new file with mode: 0644]
tests/phpunit/data/resourceloader/script-nosemi.js [new file with mode: 0644]
tests/phpunit/includes/GlobalFunctions/wfArrayFilterTest.php
tests/phpunit/includes/LinkerTest.php
tests/phpunit/includes/MediaWikiServicesTest.php
tests/phpunit/includes/Services/ServiceContainerTest.php
tests/phpunit/includes/Services/TestWiring1.php
tests/phpunit/includes/Services/TestWiring2.php
tests/phpunit/includes/TestLogger.php
tests/phpunit/includes/WatchedItemQueryServiceUnitTest.php
tests/phpunit/includes/WatchedItemStoreUnitTest.php
tests/phpunit/includes/api/ApiPageSetTest.php
tests/phpunit/includes/api/ApiQueryWatchlistIntegrationTest.php
tests/phpunit/includes/api/RandomImageGenerator.php
tests/phpunit/includes/config/ConfigFactoryTest.php
tests/phpunit/includes/content/ContentHandlerTest.php
tests/phpunit/includes/db/DatabaseMysqlBaseTest.php
tests/phpunit/includes/jobqueue/JobTest.php
tests/phpunit/includes/libs/DeferredStringifierTest.php
tests/phpunit/includes/libs/ObjectFactoryTest.php
tests/phpunit/includes/libs/XhprofDataTest.php
tests/phpunit/includes/libs/XmlTypeCheckTest.php
tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php
tests/phpunit/includes/libs/rdbms/TransactionProfilerTest.php [new file with mode: 0644]
tests/phpunit/includes/parser/ParserOptionsTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderFileModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderModuleTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderTest.php
tests/phpunit/includes/search/SearchEnginePrefixTest.php
tests/phpunit/includes/search/SearchEngineTest.php
tests/phpunit/includes/search/SearchSuggestionSetTest.php
tests/phpunit/includes/site/CachingSiteStoreTest.php
tests/phpunit/includes/specials/SpecialSearchTest.php
tests/phpunit/includes/utils/BatchRowUpdateTest.php

index 293bf6a..2560bdb 100644 (file)
@@ -192,6 +192,7 @@ $wgAutoloadLocalClasses = [
        'BenchmarkCSSMin' => __DIR__ . '/maintenance/benchmarks/benchmarkCSSMin.php',
        'BenchmarkDeleteTruncate' => __DIR__ . '/maintenance/benchmarks/bench_delete_truncate.php',
        'BenchmarkHooks' => __DIR__ . '/maintenance/benchmarks/benchmarkHooks.php',
+       'BenchmarkJSMinPlus' => __DIR__ . '/maintenance/benchmarks/benchmarkJSMinPlus.php',
        'BenchmarkParse' => __DIR__ . '/maintenance/benchmarks/benchmarkParse.php',
        'BenchmarkPurge' => __DIR__ . '/maintenance/benchmarks/benchmarkPurge.php',
        'BenchmarkTidy' => __DIR__ . '/maintenance/benchmarks/benchmarkTidy.php',
index 6bc70ed..8ac84e5 100644 (file)
@@ -267,3 +267,28 @@ define( 'CONTENT_FORMAT_XML', 'application/xml' );
  */
 define( 'SHELL_MAX_ARG_STRLEN', '100000' );
 /**@}*/
+
+/**@{
+ * Schema change migration flags.
+ *
+ * Used as values of a feature flag for an orderly transition from an old
+ * schema to a new schema.
+ *
+ * - MIGRATION_OLD: Only read and write the old schema. The new schema need not
+ *   even exist. This is used from when the patch is merged until the schema
+ *   change is actually applied to the database.
+ * - MIGRATION_WRITE_BOTH: Write both the old and new schema. Read the new
+ *   schema preferentially, falling back to the old. This is used while the
+ *   change is being tested, allowing easy roll-back to the old schema.
+ * - MIGRATION_WRITE_NEW: Write only the new schema. Read the new schema
+ *   preferentially, falling back to the old. This is used while running the
+ *   maintenance script to migrate existing entries in the old schema to the
+ *   new schema.
+ * - MIGRATION_NEW: Only read and write the new schema. The old schema (and the
+ *   feature flag) may now be removed.
+ */
+define( 'MIGRATION_OLD', 0 );
+define( 'MIGRATION_WRITE_BOTH', 1 );
+define( 'MIGRATION_WRITE_NEW', 2 );
+define( 'MIGRATION_NEW', 3 );
+/**@}*/
index 9360693..18b1cd3 100644 (file)
@@ -1,10 +1,28 @@
 <?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
 use MediaWiki\MediaWikiServices;
 
 /**
  * Factory class for spawning EventRelayer objects using configuration
  *
- * @author Aaron Schulz
  * @since 1.27
  */
 class EventRelayerGroup {
index b63c769..6161ee7 100644 (file)
@@ -377,7 +377,7 @@ class MediaWikiServices extends ServiceContainer {
                parent::__construct();
 
                // Register the given Config object as the bootstrap config service.
-               $this->defineService( 'BootstrapConfig', function() use ( $config ) {
+               $this->defineService( 'BootstrapConfig', function () use ( $config ) {
                        return $config;
                } );
        }
index 382d089..dac756e 100644 (file)
@@ -55,7 +55,7 @@ class PageProps {
                }
                $previousValue = self::$instance;
                self::$instance = $store;
-               return new ScopedCallback( function() use ( $previousValue ) {
+               return new ScopedCallback( function () use ( $previousValue ) {
                        self::$instance = $previousValue;
                } );
        }
index 6afabed..2dfcc42 100644 (file)
@@ -43,7 +43,7 @@ use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\MediaWikiServices;
 
 return [
-       'DBLoadBalancerFactory' => function( MediaWikiServices $services ) {
+       'DBLoadBalancerFactory' => function ( MediaWikiServices $services ) {
                $mainConfig = $services->getMainConfig();
 
                $lbConf = MWLBFactory::applyDefaultConfig(
@@ -56,12 +56,12 @@ return [
                return new $class( $lbConf );
        },
 
-       'DBLoadBalancer' => function( MediaWikiServices $services ) {
+       'DBLoadBalancer' => function ( MediaWikiServices $services ) {
                // just return the default LB from the DBLoadBalancerFactory service
                return $services->getDBLoadBalancerFactory()->getMainLB();
        },
 
-       'SiteStore' => function( MediaWikiServices $services ) {
+       'SiteStore' => function ( MediaWikiServices $services ) {
                $rawSiteStore = new DBSiteStore( $services->getDBLoadBalancer() );
 
                // TODO: replace wfGetCache with a CacheFactory service.
@@ -71,7 +71,7 @@ return [
                return new CachingSiteStore( $rawSiteStore, $cache );
        },
 
-       'SiteLookup' => function( MediaWikiServices $services ) {
+       'SiteLookup' => function ( MediaWikiServices $services ) {
                $cacheFile = $services->getMainConfig()->get( 'SitesCacheFile' );
 
                if ( $cacheFile !== false ) {
@@ -82,7 +82,7 @@ return [
                }
        },
 
-       'ConfigFactory' => function( MediaWikiServices $services ) {
+       'ConfigFactory' => function ( MediaWikiServices $services ) {
                // Use the bootstrap config to initialize the ConfigFactory.
                $registry = $services->getBootstrapConfig()->get( 'ConfigRegistry' );
                $factory = new ConfigFactory();
@@ -93,12 +93,12 @@ return [
                return $factory;
        },
 
-       'MainConfig' => function( MediaWikiServices $services ) {
+       'MainConfig' => function ( MediaWikiServices $services ) {
                // Use the 'main' config from the ConfigFactory service.
                return $services->getConfigFactory()->makeConfig( 'main' );
        },
 
-       'InterwikiLookup' => function( MediaWikiServices $services ) {
+       'InterwikiLookup' => function ( MediaWikiServices $services ) {
                global $wgContLang; // TODO: manage $wgContLang as a service
                $config = $services->getMainConfig();
                return new ClassicInterwikiLookup(
@@ -111,26 +111,26 @@ return [
                );
        },
 
-       'StatsdDataFactory' => function( MediaWikiServices $services ) {
+       'StatsdDataFactory' => function ( MediaWikiServices $services ) {
                return new BufferingStatsdDataFactory(
                        rtrim( $services->getMainConfig()->get( 'StatsdMetricPrefix' ), '.' )
                );
        },
 
-       'EventRelayerGroup' => function( MediaWikiServices $services ) {
+       'EventRelayerGroup' => function ( MediaWikiServices $services ) {
                return new EventRelayerGroup( $services->getMainConfig()->get( 'EventRelayerConfig' ) );
        },
 
-       'SearchEngineFactory' => function( MediaWikiServices $services ) {
+       'SearchEngineFactory' => function ( MediaWikiServices $services ) {
                return new SearchEngineFactory( $services->getSearchEngineConfig() );
        },
 
-       'SearchEngineConfig' => function( MediaWikiServices $services ) {
+       'SearchEngineConfig' => function ( MediaWikiServices $services ) {
                global $wgContLang;
                return new SearchEngineConfig( $services->getMainConfig(), $wgContLang );
        },
 
-       'SkinFactory' => function( MediaWikiServices $services ) {
+       'SkinFactory' => function ( MediaWikiServices $services ) {
                $factory = new SkinFactory();
 
                $names = $services->getMainConfig()->get( 'ValidSkinNames' );
@@ -153,7 +153,7 @@ return [
                return $factory;
        },
 
-       'WatchedItemStore' => function( MediaWikiServices $services ) {
+       'WatchedItemStore' => function ( MediaWikiServices $services ) {
                $store = new WatchedItemStore(
                        $services->getDBLoadBalancer(),
                        new HashBagOStuff( [ 'maxKeys' => 100 ] ),
@@ -163,11 +163,11 @@ return [
                return $store;
        },
 
-       'WatchedItemQueryService' => function( MediaWikiServices $services ) {
+       'WatchedItemQueryService' => function ( MediaWikiServices $services ) {
                return new WatchedItemQueryService( $services->getDBLoadBalancer() );
        },
 
-       'CryptRand' => function( MediaWikiServices $services ) {
+       'CryptRand' => function ( MediaWikiServices $services ) {
                $secretKey = $services->getMainConfig()->get( 'SecretKey' );
                return new CryptRand(
                        [
@@ -178,7 +178,7 @@ return [
                                // for a little more variance
                                'wfWikiID',
                                // If we have a secret key set then throw it into the state as well
-                               function() use ( $secretKey ) {
+                               function () use ( $secretKey ) {
                                        return $secretKey ?: '';
                                }
                        ],
@@ -192,7 +192,7 @@ return [
                );
        },
 
-       'CryptHKDF' => function( MediaWikiServices $services ) {
+       'CryptHKDF' => function ( MediaWikiServices $services ) {
                $config = $services->getMainConfig();
 
                $secret = $config->get( 'HKDFSecret' ) ?: $config->get( 'SecretKey' );
@@ -215,13 +215,13 @@ return [
                );
        },
 
-       'MediaHandlerFactory' => function( MediaWikiServices $services ) {
+       'MediaHandlerFactory' => function ( MediaWikiServices $services ) {
                return new MediaHandlerFactory(
                        $services->getMainConfig()->get( 'MediaHandlers' )
                );
        },
 
-       'MimeAnalyzer' => function( MediaWikiServices $services ) {
+       'MimeAnalyzer' => function ( MediaWikiServices $services ) {
                $logger = LoggerFactory::getInstance( 'Mime' );
                $mainConfig = $services->getMainConfig();
                $params = [
@@ -274,7 +274,7 @@ return [
                return new MimeMagic( $params );
        },
 
-       'ProxyLookup' => function( MediaWikiServices $services ) {
+       'ProxyLookup' => function ( MediaWikiServices $services ) {
                $mainConfig = $services->getMainConfig();
                return new ProxyLookup(
                        $mainConfig->get( 'SquidServers' ),
@@ -282,26 +282,26 @@ return [
                );
        },
 
-       'Parser' => function( MediaWikiServices $services ) {
+       'Parser' => function ( MediaWikiServices $services ) {
                $conf = $services->getMainConfig()->get( 'ParserConf' );
                return ObjectFactory::constructClassInstance( $conf['class'], [ $conf ] );
        },
 
-       'LinkCache' => function( MediaWikiServices $services ) {
+       'LinkCache' => function ( MediaWikiServices $services ) {
                return new LinkCache(
                        $services->getTitleFormatter(),
                        $services->getMainWANObjectCache()
                );
        },
 
-       'LinkRendererFactory' => function( MediaWikiServices $services ) {
+       'LinkRendererFactory' => function ( MediaWikiServices $services ) {
                return new LinkRendererFactory(
                        $services->getTitleFormatter(),
                        $services->getLinkCache()
                );
        },
 
-       'LinkRenderer' => function( MediaWikiServices $services ) {
+       'LinkRenderer' => function ( MediaWikiServices $services ) {
                global $wgUser;
 
                if ( defined( 'MW_NO_SESSION' ) ) {
@@ -311,11 +311,11 @@ return [
                }
        },
 
-       'GenderCache' => function( MediaWikiServices $services ) {
+       'GenderCache' => function ( MediaWikiServices $services ) {
                return new GenderCache();
        },
 
-       '_MediaWikiTitleCodec' => function( MediaWikiServices $services ) {
+       '_MediaWikiTitleCodec' => function ( MediaWikiServices $services ) {
                global $wgContLang;
 
                return new MediaWikiTitleCodec(
@@ -325,15 +325,15 @@ return [
                );
        },
 
-       'TitleFormatter' => function( MediaWikiServices $services ) {
+       'TitleFormatter' => function ( MediaWikiServices $services ) {
                return $services->getService( '_MediaWikiTitleCodec' );
        },
 
-       'TitleParser' => function( MediaWikiServices $services ) {
+       'TitleParser' => function ( MediaWikiServices $services ) {
                return $services->getService( '_MediaWikiTitleCodec' );
        },
 
-       'MainObjectStash' => function( MediaWikiServices $services ) {
+       'MainObjectStash' => function ( MediaWikiServices $services ) {
                $mainConfig = $services->getMainConfig();
 
                $id = $mainConfig->get( 'MainStash' );
@@ -345,7 +345,7 @@ return [
                return \ObjectCache::newFromParams( $mainConfig->get( 'ObjectCaches' )[$id] );
        },
 
-       'MainWANObjectCache' => function( MediaWikiServices $services ) {
+       'MainWANObjectCache' => function ( MediaWikiServices $services ) {
                $mainConfig = $services->getMainConfig();
 
                $id = $mainConfig->get( 'MainWANCache' );
@@ -365,7 +365,7 @@ return [
                return \ObjectCache::newWANCacheFromParams( $params );
        },
 
-       'LocalServerObjectCache' => function( MediaWikiServices $services ) {
+       'LocalServerObjectCache' => function ( MediaWikiServices $services ) {
                $mainConfig = $services->getMainConfig();
 
                if ( function_exists( 'apc_fetch' ) ) {
@@ -388,7 +388,7 @@ return [
                return \ObjectCache::newFromParams( $mainConfig->get( 'ObjectCaches' )[$id] );
        },
 
-       'VirtualRESTServiceClient' => function( MediaWikiServices $services ) {
+       'VirtualRESTServiceClient' => function ( MediaWikiServices $services ) {
                $config = $services->getMainConfig()->get( 'VirtualRestConfig' );
 
                $vrsClient = new VirtualRESTServiceClient( new MultiHttpClient( [] ) );
@@ -406,11 +406,11 @@ return [
                return $vrsClient;
        },
 
-       'ConfiguredReadOnlyMode' => function( MediaWikiServices $services ) {
+       'ConfiguredReadOnlyMode' => function ( MediaWikiServices $services ) {
                return new ConfiguredReadOnlyMode( $services->getMainConfig() );
        },
 
-       'ReadOnlyMode' => function( MediaWikiServices $services ) {
+       'ReadOnlyMode' => function ( MediaWikiServices $services ) {
                return new ReadOnlyMode(
                        $services->getConfiguredReadOnlyMode(),
                        $services->getDBLoadBalancer()
index 22d5439..1fafb24 100644 (file)
@@ -313,7 +313,7 @@ class WatchedItemQueryService {
                $allFields = get_object_vars( $row );
                $rcKeys = array_filter(
                        array_keys( $allFields ),
-                       function( $key ) {
+                       function ( $key ) {
                                return substr( $key, 0, 3 ) === 'rc_';
                        }
                );
index 06f93c6..69a9df2 100644 (file)
@@ -104,7 +104,7 @@ class WatchedItemStore implements StatsdAwareInterface {
                }
                $previousValue = $this->deferredUpdatesAddCallableUpdateCallback;
                $this->deferredUpdatesAddCallableUpdateCallback = $callback;
-               return new ScopedCallback( function() use ( $previousValue ) {
+               return new ScopedCallback( function () use ( $previousValue ) {
                        $this->deferredUpdatesAddCallableUpdateCallback = $previousValue;
                } );
        }
@@ -127,7 +127,7 @@ class WatchedItemStore implements StatsdAwareInterface {
                }
                $previousValue = $this->revisionGetTimestampFromIdCallback;
                $this->revisionGetTimestampFromIdCallback = $callback;
-               return new ScopedCallback( function() use ( $previousValue ) {
+               return new ScopedCallback( function () use ( $previousValue ) {
                        $this->revisionGetTimestampFromIdCallback = $previousValue;
                } );
        }
@@ -821,7 +821,7 @@ class WatchedItemStore implements StatsdAwareInterface {
                // Calls DeferredUpdates::addCallableUpdate in normal operation
                call_user_func(
                        $this->deferredUpdatesAddCallableUpdateCallback,
-                       function() use ( $job ) {
+                       function () use ( $job ) {
                                $job->run();
                        }
                );
index 8289b81..d016433 100644 (file)
@@ -826,4 +826,3 @@ class Xml {
                return $s;
        }
 }
-
index b8bd511..72a36d7 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Copyright © 2016 Brad Jorsch <bjorsch@wikimedia.org>
+ * Copyright © 2016 Wikimedia Foundation and contributors
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 8862cc7..3a9fb73 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Copyright © 2016 Brad Jorsch <bjorsch@wikimedia.org>
+ * Copyright © 2016 Wikimedia Foundation and contributors
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 35c4e56..d4a26ad 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Copyright © 2016 Brad Jorsch <bjorsch@wikimedia.org>
+ * Copyright © 2016 Wikimedia Foundation and contributors
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 480915e..e1be8ef 100644 (file)
@@ -2,7 +2,7 @@
 /**
  * Created on Jan 29, 2015
  *
- * Copyright © 2015 Brad Jorsch bjorsch@wikimedia.org
+ * Copyright © 2015 Wikimedia Foundation and contributors
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 0d512b3..65dea93 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Copyright © 2016 Brad Jorsch <bjorsch@wikimedia.org>
+ * Copyright © 2016 Wikimedia Foundation and contributors
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 3fd29ae..12e778b 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Aug 29, 2014
  *
- * Copyright © 2014 Brad Jorsch <bjorsch@wikimedia.org>
+ * Copyright © 2014 Wikimedia Foundation and contributors
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index ebe4e26..162b7cd 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Dec 22, 2014
  *
- * Copyright © 2014 Brad Jorsch <bjorsch@wikimedia.org>
+ * Copyright © 2014 Wikimedia Foundation and contributors
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index f5c5dee..9553f29 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Copyright © 2016 Brad Jorsch <bjorsch@wikimedia.org>
+ * Copyright © 2016 Wikimedia Foundation and contributors
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 9eb5793..419fd14 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Copyright © 2006 Yuri Astrakhan "<Firstname><Lastname>@gmail.com"
  * Copyright © 2008 Brion Vibber <brion@wikimedia.org>
- * Copyright © 2014 Brad Jorsch <bjorsch@wikimedia.org>
+ * Copyright © 2014 Wikimedia Foundation and contributors
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 5682cc2..b22bb1f 100644 (file)
@@ -2,7 +2,7 @@
 /**
  * Created on Oct 3, 2014
  *
- * Copyright © 2014 Brad Jorsch "bjorsch@wikimedia.org"
+ * Copyright © 2014 Wikimedia Foundation and contributors
  *
  * Heavily based on ApiQueryDeletedrevs,
  * Copyright © 2007 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
index 20746c9..8f7d6eb 100644 (file)
@@ -2,7 +2,7 @@
 /**
  * Created on Sep 27, 2015
  *
- * Copyright © 2015 Brad Jorsch "bjorsch@wikimedia.org"
+ * Copyright © 2015 Wikimedia Foundation and contributors
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index c775942..d23d898 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Copyright © 2016 Brad Jorsch <bjorsch@wikimedia.org>
+ * Copyright © 2016 Wikimedia Foundation and contributors
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 00cbcd9..1db15f8 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Aug 19, 2014
  *
- * Copyright © 2014 Brad Jorsch <bjorsch@wikimedia.org>
+ * Copyright © 2014 Wikimedia Foundation and contributors
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 693d954..f802d9e 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on Nov 14, 2013
  *
- * Copyright © 2013 Brad Jorsch
+ * Copyright © 2013 Wikimedia Foundation and contributors
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 90fd695..8e4752e 100644 (file)
@@ -2,7 +2,7 @@
 /**
  * Created on Oct 3, 2014
  *
- * Copyright © 2014 Brad Jorsch "bjorsch@wikimedia.org"
+ * Copyright © 2014 Wikimedia Foundation and contributors
  *
  * Heavily based on ApiQueryDeletedrevs,
  * Copyright © 2007 Roan Kattouw "<Firstname>.<Lastname>@gmail.com"
index c2cdfe4..6b8f98c 100644 (file)
@@ -766,7 +766,7 @@ class ApiQueryInfo extends ApiQueryBase {
                if ( $this->fld_watched ) {
                        foreach ( $timestamps as $namespaceId => $dbKeys ) {
                                $this->watched[$namespaceId] = array_map(
-                                       function( $x ) {
+                                       function ( $x ) {
                                                return $x !== false;
                                        },
                                        $dbKeys
@@ -847,7 +847,7 @@ class ApiQueryInfo extends ApiQueryBase {
                                $timestamps[$row->page_namespace][$row->page_title] = $revTimestamp - $age;
                        }
                        $titlesWithThresholds = array_map(
-                               function( LinkTarget $target ) use ( $timestamps ) {
+                               function ( LinkTarget $target ) use ( $timestamps ) {
                                        return [
                                                $target, $timestamps[$target->getNamespace()][$target->getDBkey()]
                                        ];
@@ -860,7 +860,7 @@ class ApiQueryInfo extends ApiQueryBase {
                        $titlesWithThresholds = array_merge(
                                $titlesWithThresholds,
                                array_map(
-                                       function( LinkTarget $target ) {
+                                       function ( LinkTarget $target ) {
                                                return [ $target, null ];
                                        },
                                        $this->missing
index ff97668..2d56983 100644 (file)
@@ -2,7 +2,7 @@
 /**
  * Created on January 21, 2013
  *
- * Copyright © 2013 Brad Jorsch <bjorsch@wikimedia.org>
+ * Copyright © 2013 Wikimedia Foundation and contributors
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -21,7 +21,6 @@
  *
  * @file
  * @since 1.21
- * @author Brad Jorsch
  */
 
 /**
index e90356d..97f79b6 100644 (file)
@@ -2,7 +2,7 @@
 /**
  * Created on December 31, 2012
  *
- * Copyright © 2012 Brad Jorsch <bjorsch@wikimedia.org>
+ * Copyright © 2012 Wikimedia Foundation and contributors
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -21,7 +21,6 @@
  *
  * @file
  * @since 1.21
- * @author Brad Jorsch
  */
 
 /**
index 5606f3c..2fbc518 100644 (file)
@@ -54,7 +54,7 @@ class ApiQueryPrefixSearch extends ApiQueryGeneratorBase {
                $titles = $searchEngine->extractTitles( $searchEngine->completionSearchWithVariants( $search ) );
 
                if ( $resultPageSet ) {
-                       $resultPageSet->setRedirectMergePolicy( function( array $current, array $new ) {
+                       $resultPageSet->setRedirectMergePolicy( function ( array $current, array $new ) {
                                if ( !isset( $current['index'] ) || $new['index'] < $current['index'] ) {
                                        $current['index'] = $new['index'];
                                }
index 85205c8..0e46fd0 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Created on August 8, 2014
  *
- * Copyright © 2014 Brad Jorsch bjorsch@wikimedia.org
+ * Copyright © 2014 Wikimedia Foundation and contributors
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index a5d06c8..5b094cd 100644 (file)
@@ -214,7 +214,7 @@ class ApiQueryUsers extends ApiQueryBase {
                                }
 
                                if ( isset( $this->prop['groupmemberships'] ) ) {
-                                       $data[$key]['groupmemberships'] = array_map( function( $ugm ) {
+                                       $data[$key]['groupmemberships'] = array_map( function ( $ugm ) {
                                                return [
                                                        'group' => $ugm->getGroup(),
                                                        'expiry' => ApiResult::formatExpiry( $ugm->getExpiry() ),
index 661b50c..e18484b 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Copyright © 2016 Brad Jorsch <bjorsch@wikimedia.org>
+ * Copyright © 2016 Wikimedia Foundation and contributors
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index a4b51b5..7783826 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * Copyright © 2016 Brad Jorsch <bjorsch@wikimedia.org>
+ * Copyright © 2016 Wikimedia Foundation and contributors
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 4580aa2..9d71a7d 100644 (file)
@@ -2,7 +2,7 @@
 /**
  * Created on Jun 25, 2013
  *
- * Copyright © 2013 Brad Jorsch <bjorsch@wikimedia.org>
+ * Copyright © 2013 Wikimedia Foundation and contributors
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 70e93a6..a41f655 100644 (file)
@@ -2,7 +2,7 @@
 /**
  * Created on Feb 25, 2015
  *
- * Copyright © 2015 Brad Jorsch "bjorsch@wikimedia.org"
+ * Copyright © 2015 Wikimedia Foundation and contributors
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 1fc8fc2..663416e 100644 (file)
@@ -5,7 +5,7 @@
  *
  * Created on Jun 18, 2012
  *
- * Copyright © 2012 Brad Jorsch
+ * Copyright © 2012 Wikimedia Foundation and contributors
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 37ee3e7..c7a00c6 100644 (file)
@@ -16,7 +16,6 @@
  * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
- * @author Aaron Schulz
  */
 
 use MediaWiki\Logger\LoggerFactory;
index bf0f8e5..8eda106 100644 (file)
                        "Yasten",
                        "Trial",
                        "Pols12",
-                       "The RedBurn"
+                       "The RedBurn",
+                       "Umherirrender"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:Special:MyLanguage/API:Main_page|Documentation]]\n* [[mw:Special:MyLanguage/API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Liste de diffusion]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annonces de l’API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bogues et demandes]\n</div>\n<strong>État :</strong> Toutes les fonctionnalités affichées sur cette page devraient fonctionner, mais l’API est encore en cours de développement et peut changer à tout moment. Inscrivez-vous à [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la liste de diffusion mediawiki-api-announce] pour être informé des mises à jour.\n\n<strong>Requêtes erronées :</strong> Si des requêtes erronées sont envoyées à l’API, un entête HTTP sera renvoyé avec la clé « MediaWiki-API-Error ». La valeur de cet entête et le code d’erreur renvoyé prendront la même valeur. Pour plus d’information, voyez [[mw:Special:MyLanguage/API:Errors_and_warnings|API: Errors and warnings]].\n\n<strong>Test :</strong> Pour faciliter le test des requêtes de l’API, voyez [[Special:ApiSandbox]].",
        "apihelp-main-param-action": "Quelle action effectuer.",
        "apihelp-main-param-format": "Le format de sortie.",
        "apihelp-main-param-maxlag": "La latence maximale peut être utilisée quand MédiaWiki est installé sur un cluster de base de données répliqué. Pour éviter des actions provoquant un supplément de latence de réplication de site, ce paramètre peut faire attendre le client jusqu’à ce que la latence de réplication soit inférieure à une valeur spécifiée. En cas de latence excessive, le code d’erreur <samp>maxlag</samp> est renvoyé avec un message tel que <samp>Attente de $host : $lag secondes de délai</samp>.<br />Voyez [[mw:Special:MyLanguage/Manual:Maxlag_parameter|Manuel: Maxlag parameter]] pour plus d’information.",
@@ -46,7 +46,7 @@
        "apihelp-main-param-errorformat": "Format à utiliser pour la sortie du texte d’avertissement et d’erreur.\n; plaintext: Wikitexte avec balises HTML supprimées et les entités remplacées.\n; wikitext: wikitexte non analysé.\n; html: HTML.\n; raw: Clé de message et paramètres.\n; none: Aucune sortie de texte, uniquement les codes erreur.\n; bc: Format utilisé avant MédiaWiki 1.29. <var>errorlang</var> et <var>errorsuselocal</var> sont ignorés.",
        "apihelp-main-param-errorlang": "Langue à utiliser pour les avertissements et les erreurs. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> avec <kbd>siprop=languages</kbd> renvoyant une liste de codes de langue, ou spécifier <kbd>content</kbd> pour utiliser la langue du contenu de ce wiki, ou spécifier <kbd>uselang</kbd> pour utiliser la même valeur que le paramètre <var>uselang</var>.",
        "apihelp-main-param-errorsuselocal": "S’il est fourni, les textes d’erreur utiliseront des messages adaptés à la langue dans l’espace de noms {{ns:MediaWiki}}.",
-       "apihelp-block-description": "Bloquer un utilisateur.",
+       "apihelp-block-summary": "Bloquer un utilisateur.",
        "apihelp-block-param-user": "Nom d’utilisateur, adresse IP ou plage d’adresses IP que vous voulez bloquer. Ne peut pas être utilisé en même temps que <var>$1userid</var>",
        "apihelp-block-param-userid": "ID d'utilisateur à bloquer. Ne peut pas être utilisé avec <var>$1user</var>.",
        "apihelp-block-param-expiry": "Durée d’expiration. Peut être relative (par ex. <kbd>5 months</kbd> ou <kbd>2 weeks</kbd>) ou absolue (par ex. <kbd>2014-09-18T12:34:56Z</kbd>). Si elle est mise à <kbd>infinite</kbd>, <kbd>indefinite</kbd> ou <kbd>never</kbd>, le blocage n’expirera jamais.",
        "apihelp-block-param-tags": "Modifier les balises à appliquer à l’entrée du journal des blocages.",
        "apihelp-block-example-ip-simple": "Bloquer l’adresse IP <kbd>192.0.2.5</kbd> pour trois jours avec le motif <kbd>Premier avertissement</kbd>.",
        "apihelp-block-example-user-complex": "Bloquer indéfiniment l’utilisateur <kbd>Vandal</kbd> avec le motif <kbd>Vandalism</kbd>, et empêcher la création de nouveau compte et l'envoi de courriel.",
-       "apihelp-changeauthenticationdata-description": "Modifier les données d’authentification pour l’utilisateur actuel.",
+       "apihelp-changeauthenticationdata-summary": "Modifier les données d’authentification pour l’utilisateur actuel.",
        "apihelp-changeauthenticationdata-example-password": "Tentative de modification du mot de passe de l’utilisateur actuel en <kbd>ExempleMotDePasse</kbd>.",
-       "apihelp-checktoken-description": "Vérifier la validité d'un jeton de <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
+       "apihelp-checktoken-summary": "Vérifier la validité d'un jeton de <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
        "apihelp-checktoken-param-type": "Type de jeton testé",
        "apihelp-checktoken-param-token": "Jeton à tester.",
        "apihelp-checktoken-param-maxtokenage": "Temps maximum autorisé pour l'utilisation du jeton, en secondes",
        "apihelp-checktoken-example-simple": "Tester la validité d'un jeton de <kbd>csrf</kbd>.",
-       "apihelp-clearhasmsg-description": "Efface le drapeau <code>hasmsg</code> pour l’utilisateur courant.",
+       "apihelp-clearhasmsg-summary": "Efface le drapeau <code>hasmsg</code> pour l’utilisateur courant.",
        "apihelp-clearhasmsg-example-1": "Effacer le drapeau <code>hasmsg</code> pour l’utilisateur courant",
-       "apihelp-clientlogin-description": "Se connecter au wiki en utilisant le flux interactif.",
+       "apihelp-clientlogin-summary": "Se connecter au wiki en utilisant le flux interactif.",
        "apihelp-clientlogin-example-login": "Commencer le processus de connexion au wiki en tant qu’utilisateur <kbd>Exemple</kbd> avec le mot de passe <kbd>ExempleMotDePasse</kbd>.",
        "apihelp-clientlogin-example-login2": "Continuer la connexion après une réponse de l’<samp>IHM</samp> pour l’authentification à deux facteurs, en fournissant un <var>OATHToken</var> valant <kbd>987654</kbd>.",
-       "apihelp-compare-description": "Obtenir la différence entre 2 pages.\n\nVous devez passer un numéro de révision, un titre de page, ou un ID de page, à la fois pour « from » et « to ».",
        "apihelp-compare-param-fromtitle": "Premier titre à comparer.",
        "apihelp-compare-param-fromid": "ID de la première page à comparer.",
        "apihelp-compare-param-fromrev": "Première révision à comparer.",
        "apihelp-compare-paramvalue-prop-parsedcomment": "Le commentaire analysé des révisions 'depuis' et 'vers'.",
        "apihelp-compare-paramvalue-prop-size": "La taille des révisions 'depuis' et 'vers'.",
        "apihelp-compare-example-1": "Créer une différence entre les révisions 1 et 2",
-       "apihelp-createaccount-description": "Créer un nouveau compte utilisateur.",
+       "apihelp-createaccount-summary": "Créer un nouveau compte utilisateur.",
        "apihelp-createaccount-param-preservestate": "Si <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> a retourné true pour <samp>hasprimarypreservedstate</samp>, les demandes marquées comme <samp>primary-required</samp> doivent être omises. Si elle a retourné une valeur non vide pour <samp>preservedusername</samp>, ce nom d'utilisateur doit être utilisé pour le paramètre <var>username</var>.",
        "apihelp-createaccount-example-create": "Commencer le processus de création d’un utilisateur <kbd>Exemple</kbd> avec le mot de passe <kbd>ExempleMotDePasse</kbd>.",
        "apihelp-createaccount-param-name": "Nom d’utilisateur.",
        "apihelp-createaccount-param-language": "Code de langue à mettre par défaut pour l’utilisateur (facultatif, par défaut langue du contenu).",
        "apihelp-createaccount-example-pass": "Créer l’utilisateur <kbd>testuser</kbd> avec le mot de passe <kbd>test123</kbd>.",
        "apihelp-createaccount-example-mail": "Créer l’utilisateur <kbd>testmailuser</kbd> et envoyer par courriel un mot de passe généré aléatoirement.",
-       "apihelp-cspreport-description": "Utilisé par les navigateurs pour signaler les violations de la politique de confidentialité du contenu. Ce module ne devrait jamais être utilisé, sauf quand il est utilisé automatiquement par un navigateur web compatible avec CSP.",
+       "apihelp-cspreport-summary": "Utilisé par les navigateurs pour signaler les violations de la politique de confidentialité du contenu. Ce module ne devrait jamais être utilisé, sauf quand il est utilisé automatiquement par un navigateur web compatible avec CSP.",
        "apihelp-cspreport-param-reportonly": "Marquer comme étant un rapport d’une politique de surveillance, et non une politique exigée",
        "apihelp-cspreport-param-source": "Ce qui a généré l’entête CSP qui a déclenché ce rapport",
-       "apihelp-delete-description": "Supprimer une page.",
+       "apihelp-delete-summary": "Supprimer une page.",
        "apihelp-delete-param-title": "Titre de la page que vous voulez supprimer. Impossible à utiliser avec <var>$1pageid</var>.",
        "apihelp-delete-param-pageid": "ID de la page que vous voulez supprimer. Impossible à utiliser avec <var>$1title</var>.",
        "apihelp-delete-param-reason": "Motif de suppression. Si non défini, un motif généré automatiquement sera utilisé.",
        "apihelp-delete-param-oldimage": "Le nom de l’ancienne image à supprimer tel que fourni par [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]].",
        "apihelp-delete-example-simple": "Supprimer <kbd>Main Page</kbd>.",
        "apihelp-delete-example-reason": "Supprimer <kbd>Main Page</kbd> avec le motif <kbd>Preparing for move</kbd>.",
-       "apihelp-disabled-description": "Ce module a été désactivé.",
-       "apihelp-edit-description": "Créer et modifier les pages.",
+       "apihelp-disabled-summary": "Ce module a été désactivé.",
+       "apihelp-edit-summary": "Créer et modifier les pages.",
        "apihelp-edit-param-title": "Titre de la page que vous voulez modifier. Impossible de l’utiliser avec <var>$1pageid</var>.",
        "apihelp-edit-param-pageid": "ID de la page que vous voulez modifier. Impossible à utiliser avec <var>$1title</var>.",
        "apihelp-edit-param-section": "Numéro de section. <kbd>0</kbd> pour la section de tête, <kbd>new</kbd> pour une nouvelle section.",
        "apihelp-edit-example-edit": "Modifier une page",
        "apihelp-edit-example-prepend": "Préfixer une page par <kbd>_&#95;NOTOC_&#95;</kbd>.",
        "apihelp-edit-example-undo": "Annuler les révisions 13579 à 13585 avec résumé automatique.",
-       "apihelp-emailuser-description": "Envoyer un courriel à un utilisateur.",
+       "apihelp-emailuser-summary": "Envoyer un courriel à un utilisateur.",
        "apihelp-emailuser-param-target": "Utilisateur à qui envoyer le courriel.",
        "apihelp-emailuser-param-subject": "Entête du sujet.",
        "apihelp-emailuser-param-text": "Corps du courriel.",
        "apihelp-emailuser-param-ccme": "M’envoyer une copie de ce courriel.",
        "apihelp-emailuser-example-email": "Envoyer un courriel à l’utilisateur <kbd>WikiSysop</kbd> avec le texte <kbd>Content</kbd>.",
-       "apihelp-expandtemplates-description": "Développe tous les modèles avec du wikitexte.",
+       "apihelp-expandtemplates-summary": "Développe tous les modèles avec du wikitexte.",
        "apihelp-expandtemplates-param-title": "Titre de la page.",
        "apihelp-expandtemplates-param-text": "Wikitexte à convertir.",
        "apihelp-expandtemplates-param-revid": "ID de révision, pour <nowiki>{{REVISIONID}}</nowiki> et les variables semblables.",
        "apihelp-expandtemplates-param-includecomments": "S’il faut inclure les commentaires HTML dans la sortie.",
        "apihelp-expandtemplates-param-generatexml": "Générer l’arbre d’analyse XML (remplacé par $1prop=parsetree).",
        "apihelp-expandtemplates-example-simple": "Développe le wikitexte <kbd><nowiki>{{Project:Sandbox}}</nowiki></kbd>.",
-       "apihelp-feedcontributions-description": "Renvoie le fil des contributions d’un utilisateur.",
+       "apihelp-feedcontributions-summary": "Renvoie le fil des contributions d’un utilisateur.",
        "apihelp-feedcontributions-param-feedformat": "Le format du flux.",
        "apihelp-feedcontributions-param-user": "Pour quels utilisateurs récupérer les contributions.",
        "apihelp-feedcontributions-param-namespace": "Par quels espaces de nom filtrer les contributions.",
        "apihelp-feedcontributions-param-hideminor": "Masquer les modifications mineures.",
        "apihelp-feedcontributions-param-showsizediff": "Afficher la différence de taille entre les révisions.",
        "apihelp-feedcontributions-example-simple": "Renvoyer les contributions de l'utilisateur <kbd>Exemple</kbd>.",
-       "apihelp-feedrecentchanges-description": "Renvoie un fil de modifications récentes.",
+       "apihelp-feedrecentchanges-summary": "Renvoie un fil de modifications récentes.",
        "apihelp-feedrecentchanges-param-feedformat": "Le format du flux.",
        "apihelp-feedrecentchanges-param-namespace": "Espace de noms auquel limiter les résultats.",
        "apihelp-feedrecentchanges-param-invert": "Tous les espaces de noms sauf celui sélectionné.",
        "apihelp-feedrecentchanges-param-categories_any": "Afficher plutôt uniquement les modifications sur les pages dans n’importe laquelle de ces catégories.",
        "apihelp-feedrecentchanges-example-simple": "Afficher les modifications récentes",
        "apihelp-feedrecentchanges-example-30days": "Afficher les modifications récentes sur 30 jours",
-       "apihelp-feedwatchlist-description": "Renvoie un flux de liste de suivi.",
+       "apihelp-feedwatchlist-summary": "Renvoie un flux de liste de suivi.",
        "apihelp-feedwatchlist-param-feedformat": "Le format du flux.",
        "apihelp-feedwatchlist-param-hours": "Lister les pages modifiées lors de ce nombre d’heures depuis maintenant.",
        "apihelp-feedwatchlist-param-linktosections": "Lier directement vers les sections modifées si possible.",
        "apihelp-feedwatchlist-example-default": "Afficher le flux de la liste de suivi",
        "apihelp-feedwatchlist-example-all6hrs": "Afficher toutes les modifications sur les pages suivies dans les dernières 6 heures",
-       "apihelp-filerevert-description": "Rétablir un fichier dans une ancienne version.",
+       "apihelp-filerevert-summary": "Rétablir un fichier dans une ancienne version.",
        "apihelp-filerevert-param-filename": "Nom de fichier cible, sans le préfixe File:.",
        "apihelp-filerevert-param-comment": "Téléverser le commentaire.",
        "apihelp-filerevert-param-archivename": "Nom d’archive de la révision à rétablir.",
        "apihelp-filerevert-example-revert": "Rétablir <kbd>Wiki.png</kbd> dans la version du <kbd>2011-03-05T15:27:40Z</kbd>.",
-       "apihelp-help-description": "Afficher l’aide pour les modules spécifiés.",
+       "apihelp-help-summary": "Afficher l’aide pour les modules spécifiés.",
        "apihelp-help-param-modules": "Modules pour lesquels afficher l’aide (valeurs des paramètres <var>action</var> et <var>format</var>, ou <kbd>main</kbd>). Les sous-modules peuvent être spécifiés avec un <kbd>+</kbd>.",
        "apihelp-help-param-submodules": "Inclure l’aide pour les sous-modules du module nommé.",
        "apihelp-help-param-recursivesubmodules": "Inclure l’aide pour les sous-modules de façon récursive.",
        "apihelp-help-example-recursive": "Toute l’aide sur une page.",
        "apihelp-help-example-help": "Aide pour le module d’aide lui-même.",
        "apihelp-help-example-query": "Aide pour deux sous-modules de recherche.",
-       "apihelp-imagerotate-description": "Faire pivoter une ou plusieurs images.",
+       "apihelp-imagerotate-summary": "Faire pivoter une ou plusieurs images.",
        "apihelp-imagerotate-param-rotation": "Degrés de rotation de l’image dans le sens des aiguilles d’une montre.",
        "apihelp-imagerotate-param-tags": "Balises à appliquer à l’entrée dans le journal de téléversement.",
        "apihelp-imagerotate-example-simple": "Faire pivoter <kbd>File:Example.png</kbd> de <kbd>90</kbd> degrés.",
        "apihelp-imagerotate-example-generator": "Faire pivoter toutes les images de <kbd>Category:Flip</kbd> de <kbd>180</kbd> degrés.",
-       "apihelp-import-description": "Importer une page depuis un autre wiki, ou depuis un fichier XML.\n\nNoter que le POST HTTP doit être effectué comme un import de fichier (c’est-à-dire en utilisant multipart/form-data) lors de l’envoi d’un fichier pour le paramètre <var>xml</var>.",
        "apihelp-import-param-summary": "Résumé de l’importation de l’entrée de journal.",
        "apihelp-import-param-xml": "Fichier XML téléversé.",
        "apihelp-import-param-interwikisource": "Pour les importations interwiki : wiki depuis lequel importer.",
        "apihelp-import-param-rootpage": "Importer comme une sous-page de cette page. Impossible à utiliser avec <var>$1namespace</var>.",
        "apihelp-import-param-tags": "Modifier les balises à appliquer à l'entrée du journal d'importation et à la version zéro des pages importées.",
        "apihelp-import-example-import": "Importer [[meta:Help:ParserFunctions]] vers l’espace de noms 100 avec tout l’historique.",
-       "apihelp-linkaccount-description": "Lier un compte d’un fournisseur tiers à l’utilisateur actuel.",
+       "apihelp-linkaccount-summary": "Lier un compte d’un fournisseur tiers à l’utilisateur actuel.",
        "apihelp-linkaccount-example-link": "Commencer le processus de liaison d’un compte depuis <kbd>Exemple</kbd>.",
-       "apihelp-login-description": "Se connecter et obtenir les témoins d’authentification.\n\nCette action ne devrait être utilisée qu’en lien avec [[Special:BotPasswords]] ; l’utiliser pour la connexion du compte principal est désuet et peut échouer sans avertissement. Pour se connecter sans problème au compte principal, utiliser <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
-       "apihelp-login-description-nobotpasswords": "Se connecter et obtenir les témoins d’authentification.\n\nCette action est désuète et peut échouer sans prévenir. Pour se connecter sans problème, utiliser <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+       "apihelp-login-summary": "Reconnecte et récupère les témoins (cookies) d'authentification.",
        "apihelp-login-param-name": "Nom d’utilisateur.",
        "apihelp-login-param-password": "Mot de passe.",
        "apihelp-login-param-domain": "Domaine (facultatif).",
        "apihelp-login-param-token": "Jeton de connexion obtenu à la première requête.",
        "apihelp-login-example-gettoken": "Récupérer un jeton de connexion",
        "apihelp-login-example-login": "Se connecter",
-       "apihelp-logout-description": "Se déconnecter et effacer les données de session.",
+       "apihelp-logout-summary": "Se déconnecter et effacer les données de session.",
        "apihelp-logout-example-logout": "Déconnecter l’utilisateur actuel.",
-       "apihelp-managetags-description": "Effectuer des tâches de gestion relatives à la modification des balises.",
+       "apihelp-managetags-summary": "Effectuer des tâches de gestion relatives à la modification des balises.",
        "apihelp-managetags-param-operation": "Quelle opération effectuer :\n;create:Créer une nouvelle balise de modification pour un usage manuel.\n;delete:Supprimer une balise de modification de la base de données, y compris la suppression de la marque de toutes les révisions, entrées de modification récente et entrées de journal dans lesquelles elle serait utilisée.\n;activate:Activer une balise de modification, permettant aux utilisateurs de l’appliquer manuellement.\n;deactivate:Désactiver une balise de modification, empêchant les utilisateurs de l’appliquer manuellement.",
        "apihelp-managetags-param-tag": "Balise à créer, supprimer, activer ou désactiver. Pour la création de balise, elle ne doit pas exister. Pour la suppression de balise, elle doit exister. Pour l’activation de balise, elle doit exister et ne pas être utilisée par une extension. Pour la désactivation de balise, elle doit être actuellement active et définie manuellement.",
        "apihelp-managetags-param-reason": "Un motif facultatif pour créer, supprimer, activer ou désactiver la balise.",
        "apihelp-managetags-example-delete": "Supprimer la balise <kbd>vandlaism</kbd> avec le motif <kbd>Misspelt</kbd>",
        "apihelp-managetags-example-activate": "Activer une balise nommée <kbd>spam</kbd> avec le motif <kbd>For use in edit patrolling</kbd>",
        "apihelp-managetags-example-deactivate": "Désactiver une balise nommée <kbd>spam</kbd> avec le motif <kbd>No longer required</kbd>",
-       "apihelp-mergehistory-description": "Fusionner les historiques des pages.",
+       "apihelp-mergehistory-summary": "Fusionner les historiques des pages.",
        "apihelp-mergehistory-param-from": "Titre de la page depuis laquelle l’historique sera fusionné. Impossible à utiliser avec <var>$1fromid</var>.",
        "apihelp-mergehistory-param-fromid": "ID de la page depuis laquelle l’historique sera fusionné. Impossible à utiliser avec <var>$1from</var>.",
        "apihelp-mergehistory-param-to": "Titre de la page vers laquelle l’historique sera fusionné. Impossible à utiliser avec <var>$1toid</var>.",
        "apihelp-mergehistory-param-reason": "Raison pour fusionner l’historique.",
        "apihelp-mergehistory-example-merge": "Fusionner l’historique complet de  <kbd>AnciennePage</kbd> dans <kbd>NouvellePage</kbd>.",
        "apihelp-mergehistory-example-merge-timestamp": "Fusionner les révisions de la page <kbd>AnciennePage</kbd> jusqu’au <kbd>2015-12-31T04:37:41Z</kbd> dans <kbd>NouvellePage</kbd>.",
-       "apihelp-move-description": "Déplacer une page.",
+       "apihelp-move-summary": "Déplacer une page.",
        "apihelp-move-param-from": "Titre de la page à renommer. Impossible de l’utiliser avec <var>$1fromid</var>.",
        "apihelp-move-param-fromid": "ID de la page à renommer. Impossible à utiliser avec <var>$1from</var>.",
        "apihelp-move-param-to": "Nouveau titre de la page.",
        "apihelp-move-param-ignorewarnings": "Ignorer tous les avertissements.",
        "apihelp-move-param-tags": "Modifier les balises à appliquer à l'entrée du journal des renommages et à la version zéro de la page de destination.",
        "apihelp-move-example-move": "Renommer <kbd>Badtitle</kbd> en <kbd>Goodtitle</kbd> sans garder de redirection.",
-       "apihelp-opensearch-description": "Rechercher dans le wiki en utilisant le protocole OpenSearch.",
+       "apihelp-opensearch-summary": "Rechercher dans le wiki en utilisant le protocole OpenSearch.",
        "apihelp-opensearch-param-search": "Chaîne de caractères cherchée.",
        "apihelp-opensearch-param-limit": "Nombre maximal de résultats à renvoyer.",
        "apihelp-opensearch-param-namespace": "Espaces de nom à rechercher.",
        "apihelp-opensearch-param-format": "Le format de sortie.",
        "apihelp-opensearch-param-warningsaserror": "Si des avertissements apparaissent avec <kbd>format=json</kbd>, renvoyer une erreur d’API au lieu de les ignorer.",
        "apihelp-opensearch-example-te": "Trouver les pages commençant par <kbd>Te</kbd>.",
-       "apihelp-options-description": "Modifier les préférences de l’utilisateur courant.\n\nSeules les options enregistrées dans le cœur ou dans l’une des extensions installées, ou les options avec des clés préfixées par <code>userjs-</code> (devant être utilisées dans les scripts utilisateur), peuvent être définies.",
+       "apihelp-options-summary": "Modifier les préférences de l'utilisateur courant.",
        "apihelp-options-param-reset": "Réinitialise les préférences avec les valeurs par défaut du site.",
        "apihelp-options-param-resetkinds": "Liste des types d’option à réinitialiser quand l’option <var>$1reset</var> est définie.",
        "apihelp-options-param-change": "Liste des modifications, au format nom=valeur (par ex. skin=vector). Si aucune valeur n’est fournie (pas même un signe égal), par ex., nomoption|autreoption|…, l’option sera réinitialisée à sa valeur par défaut. Pour toute valeur passée contenant une barre verticale (<kbd>|</kbd>), utiliser le [[Special:ApiHelp/main#main/datatypes|séparateur alternatif de valeur multiple]] pour que l'opération soit correcte.",
        "apihelp-options-example-reset": "Réinitialiser toutes les préférences",
        "apihelp-options-example-change": "Modifier les préférences <kbd>skin</kbd> et <kbd>hideminor</kbd>.",
        "apihelp-options-example-complex": "Réinitialiser toutes les préférences, puis définir <kbd>skin</kbd> et <kbd>nickname</kbd>.",
-       "apihelp-paraminfo-description": "Obtenir des informations sur les modules de l’API.",
+       "apihelp-paraminfo-summary": "Obtenir des informations sur les modules de l’API.",
        "apihelp-paraminfo-param-modules": "Liste des noms de module (valeurs des paramètres <var>action</var> et <var>format</var>, ou <kbd>main</kbd>). Peut spécifier des sous-modules avec un <kbd>+</kbd>, ou tous les sous-modules avec <kbd>+*</kbd>, ou tous les sous-modules récursivement avec <kbd>+**</kbd>.",
        "apihelp-paraminfo-param-helpformat": "Format des chaînes d’aide.",
        "apihelp-paraminfo-param-querymodules": "Liste des noms des modules de requête (valeur des paramètres <var>prop</var>, <var>meta</var> ou <var>list</var>). Utiliser <kbd>$1modules=query+foo</kbd> au lieu de <kbd>$1querymodules=foo</kbd>.",
        "apihelp-paraminfo-param-formatmodules": "Liste des noms de module de mise en forme (valeur du paramètre <var>format</var>). Utiliser plutôt <var>$1modules</var>.",
        "apihelp-paraminfo-example-1": "Afficher les informations pour <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd>, <kbd>[[Special:ApiHelp/jsonfm|format=jsonfm]]</kbd>, <kbd>[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd> et <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd>.",
        "apihelp-paraminfo-example-2": "Afficher les informations pour tous les sous-modules de <kbd>[[Special:ApiHelp/query|action=query]]</kbd>.",
-       "apihelp-parse-description": "Analyse le contenu et renvoie le résultat de l’analyseur.\n\nVoyez les différents modules prop de <kbd>[[Special:ApiHelp/query|action=query]]</kbd> pour avoir de l’information sur la version actuelle d’une page.\n\nIl y a plusieurs moyens de spécifier le texte à analyser :\n# Spécifier une page ou une révision, en utilisant <var>$1page</var>, <var>$1pageid</var> ou <var>$1oldid</var>.\n# Spécifier explicitement un contenu, en utilisant <var>$1text</var>, <var>$1title</var> et <var>$1contentmodel</var>\n# Spécifier uniquement un résumé à analyser. <var>$1prop</var> doit recevoir une valeur vide.",
        "apihelp-parse-param-title": "Titre de la page à laquelle appartient le texte. Si omis, <var>$1contentmodel</var> doit être spécifié, et [[API]] sera utilisé comme titre.",
        "apihelp-parse-param-text": "Texte à analyser. utiliser <var>$1title</var> ou <var>$1contentmodel</var> pour contrôler le modèle de contenu.",
        "apihelp-parse-param-summary": "Résumé à analyser.",
        "apihelp-parse-example-text": "Analyser le wikitexte.",
        "apihelp-parse-example-texttitle": "Analyser du wikitexte, en spécifiant le titre de la page.",
        "apihelp-parse-example-summary": "Analyser un résumé.",
-       "apihelp-patrol-description": "Patrouiller une page ou une révision.",
+       "apihelp-patrol-summary": "Patrouiller une page ou une révision.",
        "apihelp-patrol-param-rcid": "ID de modification récente à patrouiller.",
        "apihelp-patrol-param-revid": "ID de révision à patrouiller.",
        "apihelp-patrol-param-tags": "Modifier les balises à appliquer à l’entrée dans le journal de surveillance.",
        "apihelp-patrol-example-rcid": "Patrouiller une modification récente",
        "apihelp-patrol-example-revid": "Patrouiller une révision",
-       "apihelp-protect-description": "Modifier le niveau de protection d’une page.",
+       "apihelp-protect-summary": "Modifier le niveau de protection d’une page.",
        "apihelp-protect-param-title": "Titre de la page à (dé)protéger. Impossible à utiliser avec $1pageid.",
        "apihelp-protect-param-pageid": "ID de la page à (dé)protéger. Impossible à utiliser avec $1title.",
        "apihelp-protect-param-protections": "Liste des niveaux de protection, au format <kbd>action=niveau</kbd> (par exemple  <kbd>edit=sysop</kbd>). Un niveau de <kbd>tout</kbd>, indique que tout le monde est autorisé à faire l'action, c'est à dire aucune restriction.\n\n<strong>NOTE :<strong> Toutes les actions non listées auront leur restrictions supprimées.",
        "apihelp-protect-example-protect": "Protéger une page",
        "apihelp-protect-example-unprotect": "Enlever la protection d’une page en mettant les restrictions à <kbd>all</kbd> (c'est à dire tout le monde est autorisé à faire l'action).",
        "apihelp-protect-example-unprotect2": "Enlever la protection de la page en ne mettant aucune restriction",
-       "apihelp-purge-description": "Vider le cache des titres fournis.",
+       "apihelp-purge-summary": "Vider le cache des titres fournis.",
        "apihelp-purge-param-forcelinkupdate": "Mettre à jour les tables de liens.",
        "apihelp-purge-param-forcerecursivelinkupdate": "Mettre à jour la table des liens, et mettre à jour les tables de liens pour toute page qui utilise cette page comme modèle",
        "apihelp-purge-example-simple": "Purger les pages <kbd>Main Page</kbd> et <kbd>API</kbd>.",
        "apihelp-purge-example-generator": "Purger les 10 premières pages de l’espace de noms principal",
-       "apihelp-query-description": "Extraire des données de et sur MediaWiki.\n\nToutes les modifications de données devront d’abord utiliser une requête pour obtenir un jeton, afin d’éviter les abus de la part de sites malveillants.",
        "apihelp-query-param-prop": "Quelles propriétés obtenir pour les pages demandées.",
        "apihelp-query-param-list": "Quelles listes obtenir.",
        "apihelp-query-param-meta": "Quelles métadonnées obtenir.",
        "apihelp-query-param-rawcontinue": "Renvoyer les données <samp>query-continue</samp> brutes pour continuer.",
        "apihelp-query-example-revisions": "Récupérer [[Special:ApiHelp/query+siteinfo|l’info du site]] et [[Special:ApiHelp/query+revisions|les révisions]] de <kbd>Main Page</kbd>.",
        "apihelp-query-example-allpages": "Récupérer les révisions des pages commençant par <kbd>API/</kbd>.",
-       "apihelp-query+allcategories-description": "Énumérer toutes les catégories.",
+       "apihelp-query+allcategories-summary": "Énumérer toutes les catégories.",
        "apihelp-query+allcategories-param-from": "La catégorie depuis laquelle démarrer l’énumération.",
        "apihelp-query+allcategories-param-to": "La catégorie à laquelle terminer l’énumération.",
        "apihelp-query+allcategories-param-prefix": "Rechercher tous les titres de catégorie qui commencent avec cette valeur.",
        "apihelp-query+allcategories-paramvalue-prop-hidden": "Marque les catégories qui sont masquées avec <code>_&#95;HIDDENCAT_&#95;</code>.",
        "apihelp-query+allcategories-example-size": "Lister les catégories avec l’information sur le nombre de pages dans chacune",
        "apihelp-query+allcategories-example-generator": "Récupérer l’information sur la page de catégorie elle-même pour les catégories commençant par <kbd>List</kbd>.",
-       "apihelp-query+alldeletedrevisions-description": "Lister toutes les révisions supprimées par un utilisateur ou dans un espace de noms.",
+       "apihelp-query+alldeletedrevisions-summary": "Lister toutes les révisions supprimées par un utilisateur ou dans un espace de noms.",
        "apihelp-query+alldeletedrevisions-paraminfo-useronly": "Utilisable uniquement avec <var>$3user</var>.",
        "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "Impossible à utiliser avec <var>$3user</var>.",
        "apihelp-query+alldeletedrevisions-param-start": "L’horodatage auquel démarrer l’énumération.",
        "apihelp-query+alldeletedrevisions-param-generatetitles": "Utilisé comme générateur, générer des titres plutôt que des IDs de révision.",
        "apihelp-query+alldeletedrevisions-example-user": "Lister les 50 dernières contributions supprimées par l'utilisateur <kbd>Example</kbd>.",
        "apihelp-query+alldeletedrevisions-example-ns-main": "Lister les 50 premières révisions supprimées dans l’espace de noms principal.",
-       "apihelp-query+allfileusages-description": "Lister toutes les utilisations de fichiers, y compris ceux n’existant pas.",
+       "apihelp-query+allfileusages-summary": "Lister toutes les utilisations de fichiers, y compris ceux n’existant pas.",
        "apihelp-query+allfileusages-param-from": "Le titre du fichier depuis lequel commencer l’énumération.",
        "apihelp-query+allfileusages-param-to": "Le titre du fichier auquel arrêter l’énumération.",
        "apihelp-query+allfileusages-param-prefix": "Rechercher tous les fichiers dont le titre commence par cette valeur.",
        "apihelp-query+allfileusages-example-unique": "Lister les titres de fichier uniques.",
        "apihelp-query+allfileusages-example-unique-generator": "Obtient tous les titres de fichier, en marquant les manquants.",
        "apihelp-query+allfileusages-example-generator": "Obtient les pages contenant les fichiers.",
-       "apihelp-query+allimages-description": "Énumérer toutes les images séquentiellement.",
+       "apihelp-query+allimages-summary": "Énumérer toutes les images séquentiellement.",
        "apihelp-query+allimages-param-sort": "Propriété par laquelle trier.",
        "apihelp-query+allimages-param-dir": "L'ordre dans laquel lister.",
        "apihelp-query+allimages-param-from": "Le titre de l’image depuis laquelle démarrer l’énumération. Ne peut être utilisé qu’avec $1sort=name.",
        "apihelp-query+allimages-example-recent": "Afficher une liste de fichiers récemment téléversés, semblable à [[Special:NewFiles]].",
        "apihelp-query+allimages-example-mimetypes": "Afficher une liste de fichiers avec le type MIME <kbd>image/png</kbd> ou <kbd>image/gif</kbd>",
        "apihelp-query+allimages-example-generator": "Afficher l’information sur 4 fichiers commençant par la lettre <kbd>T</kbd>.",
-       "apihelp-query+alllinks-description": "Énumérer tous les liens pointant vers un espace de noms donné.",
+       "apihelp-query+alllinks-summary": "Énumérer tous les liens pointant vers un espace de noms donné.",
        "apihelp-query+alllinks-param-from": "Le titre du lien auquel démarrer l’énumération.",
        "apihelp-query+alllinks-param-to": "Le titre du lien auquel arrêter l’énumération.",
        "apihelp-query+alllinks-param-prefix": "Rechercher tous les titres liés commençant par cette valeur.",
        "apihelp-query+alllinks-example-unique": "Lister les titres liés uniques",
        "apihelp-query+alllinks-example-unique-generator": "Obtient tous les titres liés, en marquant les manquants",
        "apihelp-query+alllinks-example-generator": "Obtient les pages contenant les liens",
-       "apihelp-query+allmessages-description": "Renvoyer les messages depuis ce site.",
+       "apihelp-query+allmessages-summary": "Renvoyer les messages depuis ce site.",
        "apihelp-query+allmessages-param-messages": "Quels messages sortir. <kbd>*</kbd> (par défaut) signifie tous les messages.",
        "apihelp-query+allmessages-param-prop": "Quelles propriétés obtenir.",
        "apihelp-query+allmessages-param-enableparser": "Positionner pour activer l’analyseur, traitera en avance le wikitexte du message (substitution des mots magiques, gestion des modèles, etc.).",
        "apihelp-query+allmessages-param-prefix": "Renvoyer les messages avec ce préfixe.",
        "apihelp-query+allmessages-example-ipb": "Afficher les messages commençant par <kbd>ipb-</kbd>.",
        "apihelp-query+allmessages-example-de": "Afficher les messages <kbd>august</kbd> et <kbd>mainpage</kbd> en allemand.",
-       "apihelp-query+allpages-description": "Énumérer toutes les pages séquentiellement dans un espace de noms donné.",
+       "apihelp-query+allpages-summary": "Énumérer toutes les pages séquentiellement dans un espace de noms donné.",
        "apihelp-query+allpages-param-from": "Le titre de la page depuis lequel commencer l’énumération.",
        "apihelp-query+allpages-param-to": "Le titre de la page auquel stopper l’énumération.",
        "apihelp-query+allpages-param-prefix": "Rechercher tous les titres de page qui commencent par cette valeur.",
        "apihelp-query+allpages-example-B": "Afficher une liste des pages commençant par la lettre <kbd>B</kbd>.",
        "apihelp-query+allpages-example-generator": "Afficher l’information sur 4 pages commençant par la lettre <kbd>T</kbd>.",
        "apihelp-query+allpages-example-generator-revisions": "Afficher le contenu des 2 premières pages hors redirections commençant par <kbd>Re</kbd>.",
-       "apihelp-query+allredirects-description": "Lister toutes les redirections vers un espace de noms.",
+       "apihelp-query+allredirects-summary": "Lister toutes les redirections vers un espace de noms.",
        "apihelp-query+allredirects-param-from": "Le titre de la redirection auquel démarrer l’énumération.",
        "apihelp-query+allredirects-param-to": "Le titre de la redirection auquel arrêter l’énumération.",
        "apihelp-query+allredirects-param-prefix": "Rechercher toutes les pages cible commençant par cette valeur.",
        "apihelp-query+allredirects-example-unique": "Lister les pages cible unique",
        "apihelp-query+allredirects-example-unique-generator": "Obtient toutes les pages cible, en marquant les manquantes",
        "apihelp-query+allredirects-example-generator": "Obtient les pages contenant les redirections",
-       "apihelp-query+allrevisions-description": "Lister toutes les révisions.",
+       "apihelp-query+allrevisions-summary": "Lister toutes les révisions.",
        "apihelp-query+allrevisions-param-start": "L’horodatage auquel démarrer l’énumération.",
        "apihelp-query+allrevisions-param-end": "L’horodatage auquel arrêter l’énumération.",
        "apihelp-query+allrevisions-param-user": "Lister uniquement les révisions faites par cet utilisateur.",
        "apihelp-query+allrevisions-param-generatetitles": "Utilisé comme générateur, génère des titres plutôt que des IDs de révision.",
        "apihelp-query+allrevisions-example-user": "Lister les 50 dernières contributions de l’utilisateur <kbd>Example</kbd>.",
        "apihelp-query+allrevisions-example-ns-main": "Lister les 50 premières révisions dans l’espace de noms principal.",
-       "apihelp-query+mystashedfiles-description": "Obtenir une liste des fichiers dans le cache de téléversement de l’utilisateur actuel",
+       "apihelp-query+mystashedfiles-summary": "Obtenir une liste des fichiers dans le cache de téléversement de l’utilisateur actuel",
        "apihelp-query+mystashedfiles-param-prop": "Quelles propriétés récupérer pour les fichiers.",
        "apihelp-query+mystashedfiles-paramvalue-prop-size": "Récupérer la taille du fichier et les dimensions de l’image.",
        "apihelp-query+mystashedfiles-paramvalue-prop-type": "Récupérer le type MIME du fichier et son type de média.",
        "apihelp-query+mystashedfiles-param-limit": "Combien de fichiers obtenir.",
        "apihelp-query+mystashedfiles-example-simple": "Obtenir la clé du fichier, sa taille, et la taille en pixels des fichiers dans le cache de téléversement de l’utilisateur actuel.",
-       "apihelp-query+alltransclusions-description": "Lister toutes les transclusions (pages intégrées en utilisant &#123;&#123;x&#125;&#125;), y compris les inexistantes.",
+       "apihelp-query+alltransclusions-summary": "Lister toutes les transclusions (pages intégrées en utilisant &#123;&#123;x&#125;&#125;), y compris les inexistantes.",
        "apihelp-query+alltransclusions-param-from": "Le titre de la transclusion depuis lequel commencer l’énumération.",
        "apihelp-query+alltransclusions-param-to": "Le titre de la transclusion auquel arrêter l’énumération.",
        "apihelp-query+alltransclusions-param-prefix": "Rechercher tous les titres inclus qui commencent par cette valeur.",
        "apihelp-query+alltransclusions-example-unique": "Lister les titres inclus uniques",
        "apihelp-query+alltransclusions-example-unique-generator": "Obtient tous les titres inclus, en marquant les manquants.",
        "apihelp-query+alltransclusions-example-generator": "Obtient les pages contenant les transclusions.",
-       "apihelp-query+allusers-description": "Énumérer tous les utilisateurs enregistrés.",
+       "apihelp-query+allusers-summary": "Énumérer tous les utilisateurs enregistrés.",
        "apihelp-query+allusers-param-from": "Le nom d’utilisateur auquel démarrer l’énumération.",
        "apihelp-query+allusers-param-to": "Le nom d’utilisateur auquel stopper l’énumération.",
        "apihelp-query+allusers-param-prefix": "Rechercher tous les utilisateurs commençant par cette valeur.",
        "apihelp-query+allusers-param-activeusers": "Lister uniquement les utilisateurs actifs durant {{PLURAL:$1|le dernier jour|les $1 derniers jours}}.",
        "apihelp-query+allusers-param-attachedwiki": "Avec <kbd>$1prop=centralids</kbd>, indiquer aussi si l’utilisateur est attaché avec le wiki identifié par cet ID.",
        "apihelp-query+allusers-example-Y": "Lister les utilisateurs en commençant à <kbd>Y</kbd>.",
-       "apihelp-query+authmanagerinfo-description": "Récupérer les informations concernant l’état d’authentification actuel.",
+       "apihelp-query+authmanagerinfo-summary": "Récupérer les informations concernant l’état d’authentification actuel.",
        "apihelp-query+authmanagerinfo-param-securitysensitiveoperation": "Tester si l’état d’authentification actuel de l’utilisateur est suffisant pour l’opération spécifiée comme sensible du point de vue sécurité.",
        "apihelp-query+authmanagerinfo-param-requestsfor": "Récupérer les informations sur les requêtes d’authentification nécessaires pour l’action d’authentification spécifiée.",
        "apihelp-query+authmanagerinfo-example-login": "Récupérer les requêtes qui peuvent être utilisées en commençant une connexion.",
        "apihelp-query+authmanagerinfo-example-login-merged": "Récupérer les requêtes qui peuvent être utilisées au début de la connexion, avec les champs de formulaire intégrés.",
        "apihelp-query+authmanagerinfo-example-securitysensitiveoperation": "Tester si l’authentification est suffisante pour l’action <kbd>foo</kbd>.",
-       "apihelp-query+backlinks-description": "Trouver toutes les pages qui ont un lien vers la page donnée.",
+       "apihelp-query+backlinks-summary": "Trouver toutes les pages qui ont un lien vers la page donnée.",
        "apihelp-query+backlinks-param-title": "Titre à rechercher. Impossible à utiliser avec <var>$1pageid</var>.",
        "apihelp-query+backlinks-param-pageid": "ID de la page à chercher. Impossible à utiliser avec <var>$1title</var>.",
        "apihelp-query+backlinks-param-namespace": "L’espace de noms à énumérer.",
        "apihelp-query+backlinks-param-redirect": "Si le lien vers une page est une redirection, trouver également toutes les pages qui ont un lien vers cette redirection. La limite maximale est divisée par deux.",
        "apihelp-query+backlinks-example-simple": "Afficher les liens vers <kbd>Main page</kbd>.",
        "apihelp-query+backlinks-example-generator": "Obtenir des informations sur les pages ayant un lien vers <kbd>Main page</kbd>.",
-       "apihelp-query+blocks-description": "Lister tous les utilisateurs et les adresses IP bloqués.",
+       "apihelp-query+blocks-summary": "Lister tous les utilisateurs et les adresses IP bloqués.",
        "apihelp-query+blocks-param-start": "L’horodatage auquel démarrer l’énumération.",
        "apihelp-query+blocks-param-end": "L’horodatage auquel arrêter l’énumération.",
        "apihelp-query+blocks-param-ids": "Liste des IDs de bloc à lister (facultatif).",
        "apihelp-query+blocks-param-show": "Afficher uniquement les éléments correspondant à ces critères.\nPar exemple, pour voir uniquement les blocages infinis sur les adresses IP, mettre <kbd>$1show=ip|!temp</kbd>.",
        "apihelp-query+blocks-example-simple": "Lister les blocages",
        "apihelp-query+blocks-example-users": "Lister les blocages des utilisateurs <kbd>Alice</kbd> et <kbd>Bob</kbd>.",
-       "apihelp-query+categories-description": "Lister toutes les catégories auxquelles les pages appartiennent.",
+       "apihelp-query+categories-summary": "Lister toutes les catégories auxquelles les pages appartiennent.",
        "apihelp-query+categories-param-prop": "Quelles propriétés supplémentaires obtenir de chaque catégorie :",
        "apihelp-query+categories-paramvalue-prop-sortkey": "Ajoute la clé de tri (chaîne hexadécimale) et son préfixe (partie lisible) de la catégorie.",
        "apihelp-query+categories-paramvalue-prop-timestamp": "Ajoute l’horodatage de l’ajout de la catégorie.",
        "apihelp-query+categories-param-dir": "La direction dans laquelle lister.",
        "apihelp-query+categories-example-simple": "Obtenir une liste des catégories auxquelles appartient la page <kbd>Albert Einstein</kbd>.",
        "apihelp-query+categories-example-generator": "Obtenir des informations sur toutes les catégories utilisées dans la page <kbd>Albert Einstein</kbd>.",
-       "apihelp-query+categoryinfo-description": "Renvoie les informations sur les catégories données.",
+       "apihelp-query+categoryinfo-summary": "Renvoie les informations sur les catégories données.",
        "apihelp-query+categoryinfo-example-simple": "Obtenir des informations sur <kbd>Category:Foo</kbd> et <kbd>Category:Bar</kbd>.",
-       "apihelp-query+categorymembers-description": "Lister toutes les pages d’une catégorie donnée.",
+       "apihelp-query+categorymembers-summary": "Lister toutes les pages d’une catégorie donnée.",
        "apihelp-query+categorymembers-param-title": "Quelle catégorie énumérer (obligatoire). Doit comprendre le préfixe <kbd>{{ns:category}}:</kbd>. Impossible à utiliser avec <var>$1pageid</var>.",
        "apihelp-query+categorymembers-param-pageid": "ID de la page de la catégorie à énumérer. Impossible à utiliser avec <var>$1title</var>.",
        "apihelp-query+categorymembers-param-prop": "Quelles informations inclure :",
        "apihelp-query+categorymembers-param-endsortkey": "Utiliser plutôt $1endhexsortkey.",
        "apihelp-query+categorymembers-example-simple": "Obtenir les 10 premières pages de <kbd>Category:Physics</kbd>.",
        "apihelp-query+categorymembers-example-generator": "Obtenir l’information sur les 10 premières pages de <kbd>Category:Physics</kbd>.",
-       "apihelp-query+contributors-description": "Obtenir la liste des contributeurs connectés et le nombre de contributeurs anonymes d’une page.",
+       "apihelp-query+contributors-summary": "Obtenir la liste des contributeurs connectés et le nombre de contributeurs anonymes d’une page.",
        "apihelp-query+contributors-param-group": "Inclut uniquement les utilisateurs dans les groupes donnés. N'inclut pas les groupes implicites ou auto-promus comme *, user ou autoconfirmed.",
        "apihelp-query+contributors-param-excludegroup": "Exclure les utilisateurs des groupes donnés. Ne pas inclure les groupes implicites ou auto-promus comme *, user ou autoconfirmed.",
        "apihelp-query+contributors-param-rights": "Inclure uniquement les utilisateurs ayant les droits donnés. Ne pas inclure les droits accordés par les groupes implicites ou auto-promus comme *, user ou autoconfirmed.",
        "apihelp-query+contributors-param-excluderights": "Exclure les utilisateurs ayant les droits donnés. Ne pas inclure les droits accordés par les groupes implicites ou auto-promus comme *, user ou autoconfirmed.",
        "apihelp-query+contributors-param-limit": "Combien de contributeurs renvoyer.",
        "apihelp-query+contributors-example-simple": "Afficher les contributeurs dans la <kbd>Main Page</kbd>.",
-       "apihelp-query+deletedrevisions-description": "Obtenir des informations sur la révision supprimée.\n\nPeut être utilisé de différentes manières :\n# Obtenir les révisions supprimées pour un ensemble de pages, en donnant les titres ou les ids de page. Ordonné par titre  et horodatage.\n# Obtenir des données sur un ensemble de révisions supprimées en donnant leurs IDs et leurs ids de révision. Ordonné par ID de révision.",
        "apihelp-query+deletedrevisions-param-start": "L’horodatage auquel démarrer l’énumération. Ignoré lors du traitement d’une liste d’IDs de révisions.",
        "apihelp-query+deletedrevisions-param-end": "L’horodatage auquel arrêter l’énumération. Ignoré lors du traitement d’une liste d’IDs de révisions.",
        "apihelp-query+deletedrevisions-param-tag": "Lister uniquement les révisions marquées par cette balise.",
        "apihelp-query+deletedrevisions-param-excludeuser": "Ne pas lister les révisions faites par cet utilisateur.",
        "apihelp-query+deletedrevisions-example-titles": "Lister les révisions supprimées des pages <kbd>Main Page</kbd> et <kbd>Talk:Main Page</kbd>, avec leur contenu.",
        "apihelp-query+deletedrevisions-example-revids": "Lister les informations pour la révision supprimée <kbd>123456</kbd>.",
-       "apihelp-query+deletedrevs-description": "Lister les révisions supprimées.\n\nOpère selon trois modes :\n# Lister les révisions supprimées pour les titres donnés, triées par horodatage.\n# Lister les contributions supprimées pour l’utilisateur donné, triées par horodatage (pas de titres spécifiés).\n# Lister toutes les révisions supprimées dans l’espace de noms donné, triées par titre et horodatage (aucun titre spécifié, $1user non positionné).\n\nCertains paramètres ne s’appliquent qu’à certains modes et sont ignorés dans les autres.",
+       "apihelp-query+deletedrevs-summary": "Afficher les versions supprimées.",
        "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|Mode|Modes}} : $2",
        "apihelp-query+deletedrevs-param-start": "L’horodatage auquel démarrer l’énumération.",
        "apihelp-query+deletedrevs-param-end": "L’horodatage auquel arrêter l’énumération.",
        "apihelp-query+deletedrevs-example-mode2": "Lister les 50 dernières contributions de <kbd>Bob</kbd> supprimées (mode 2).",
        "apihelp-query+deletedrevs-example-mode3-main": "Lister les 50 premières révisions supprimées dans l’espace de noms principal (mode 3)",
        "apihelp-query+deletedrevs-example-mode3-talk": "Lister les 50 premières pages supprimées dans l’espace de noms {{ns:talk}} (mode 3).",
-       "apihelp-query+disabled-description": "Ce module de requête a été désactivé.",
-       "apihelp-query+duplicatefiles-description": "Lister d’après leurs valeurs de hachage, tous les fichiers qui sont des doublons de fichiers donnés.",
+       "apihelp-query+disabled-summary": "Ce module de requête a été désactivé.",
+       "apihelp-query+duplicatefiles-summary": "Lister d’après leurs valeurs de hachage, tous les fichiers qui sont des doublons de fichiers donnés.",
        "apihelp-query+duplicatefiles-param-limit": "Combien de fichiers dupliqués à renvoyer.",
        "apihelp-query+duplicatefiles-param-dir": "La direction dans laquelle lister.",
        "apihelp-query+duplicatefiles-param-localonly": "Rechercher les fichiers uniquement dans le référentiel local.",
        "apihelp-query+duplicatefiles-example-simple": "Rechercher les doublons de [[:File:Albert Einstein Head.jpg]].",
        "apihelp-query+duplicatefiles-example-generated": "Rechercher les doublons de tous les fichiers",
-       "apihelp-query+embeddedin-description": "Trouver toutes les pages qui incluent (par transclusion) le titre donné.",
+       "apihelp-query+embeddedin-summary": "Trouver toutes les pages qui incluent (par transclusion) le titre donné.",
        "apihelp-query+embeddedin-param-title": "Titre à rechercher. Impossible à utiliser avec $1pageid.",
        "apihelp-query+embeddedin-param-pageid": "ID de la page à rechercher. Impossible à utiliser avec $1title.",
        "apihelp-query+embeddedin-param-namespace": "L’espace de noms à énumérer.",
        "apihelp-query+embeddedin-param-limit": "Combien de pages renvoyer au total.",
        "apihelp-query+embeddedin-example-simple": "Afficher les pages incluant <kbd>Template:Stub</kbd>.",
        "apihelp-query+embeddedin-example-generator": "Obtenir des informations sur les pages incluant <kbd>Template:Stub</kbd>.",
-       "apihelp-query+extlinks-description": "Renvoyer toutes les URLs externes (non interwikis) des pages données.",
        "apihelp-query+extlinks-param-limit": "Combien de liens renvoyer.",
        "apihelp-query+extlinks-param-protocol": "Protocole de l’URL. Si vide et <var>$1query</var> est positionné, le protocole est <kbd>http</kbd>. Laisser à la fois ceci et <var>$1query</var> vides pour lister tous les liens externes.",
        "apihelp-query+extlinks-param-query": "Rechercher une chaîne sans protocole. Utile pour vérifier si une certaine page contient une certaine URL externe.",
        "apihelp-query+extlinks-param-expandurl": "Étendre les URLs relatives au protocole avec le protocole canonique.",
        "apihelp-query+extlinks-example-simple": "Obtenir une liste des liens externes de <kbd>Main Page</kbd>.",
-       "apihelp-query+exturlusage-description": "Énumérer les pages contenant une URL donnée.",
+       "apihelp-query+exturlusage-summary": "Énumérer les pages contenant une URL donnée.",
        "apihelp-query+exturlusage-param-prop": "Quelles informations inclure :",
        "apihelp-query+exturlusage-paramvalue-prop-ids": "Ajoute l’ID de la page.",
        "apihelp-query+exturlusage-paramvalue-prop-title": "Ajoute le titre et l’ID de l’espace de noms de la page.",
        "apihelp-query+exturlusage-param-limit": "Combien de pages renvoyer.",
        "apihelp-query+exturlusage-param-expandurl": "Étendre les URLs relatives au protocole avec le protocole canonique.",
        "apihelp-query+exturlusage-example-simple": "Afficher les pages avec un lien vers <kbd>http://www.mediawiki.org</kbd>.",
-       "apihelp-query+filearchive-description": "Énumérer séquentiellement tous les fichiers supprimés.",
+       "apihelp-query+filearchive-summary": "Énumérer séquentiellement tous les fichiers supprimés.",
        "apihelp-query+filearchive-param-from": "Le titre de l’image auquel démarrer l’énumération.",
        "apihelp-query+filearchive-param-to": "Le titre de l’image auquel arrêter l’énumération.",
        "apihelp-query+filearchive-param-prefix": "Rechercher tous les titres d’image qui commencent par cette valeur.",
        "apihelp-query+filearchive-paramvalue-prop-bitdepth": "Ajoute la profondeur de bit de la version.",
        "apihelp-query+filearchive-paramvalue-prop-archivename": "Ajoute le nom de fichier de la version d’archive pour les versions autres que la dernière.",
        "apihelp-query+filearchive-example-simple": "Afficher une liste de tous les fichiers supprimés",
-       "apihelp-query+filerepoinfo-description": "Renvoyer les méta-informations sur les référentiels d’images configurés dans le wiki.",
+       "apihelp-query+filerepoinfo-summary": "Renvoyer les méta-informations sur les référentiels d’images configurés dans le wiki.",
        "apihelp-query+filerepoinfo-param-prop": "Quelles propriétés du référentiel récupérer (il peut y en avoir plus de disponibles sur certains wikis) :\n;apiurl:URL de l’API du référentiel - utile pour obtenir les infos de l’image depuis l’hôte.\n;name:La clé du référentiel - utilisé par ex. dans les valeurs de retour de <var>[[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> et [[Special:ApiHelp/query+imageinfo|imageinfo]].\n;displayname:Le nom lisible du wiki référentiel.\n;rooturl:URL racine des chemins d’image.\n;local:Si ce référentiel est le référentiel local ou non.",
        "apihelp-query+filerepoinfo-example-simple": "Obtenir des informations sur les référentiels de fichier.",
-       "apihelp-query+fileusage-description": "Trouver toutes les pages qui utilisent les fichiers donnés.",
+       "apihelp-query+fileusage-summary": "Trouver toutes les pages qui utilisent les fichiers donnés.",
        "apihelp-query+fileusage-param-prop": "Quelles propriétés obtenir :",
        "apihelp-query+fileusage-paramvalue-prop-pageid": "ID de chaque page.",
        "apihelp-query+fileusage-paramvalue-prop-title": "Titre de chaque page.",
        "apihelp-query+fileusage-param-show": "Afficher uniquement les éléments qui correspondent à ces critères :\n;redirect:Afficher uniquement les redirections.\n;!redirect:Afficher uniquement les non-redirections.",
        "apihelp-query+fileusage-example-simple": "Obtenir une liste des pages utilisant [[:File:Example.jpg]]",
        "apihelp-query+fileusage-example-generator": "Obtenir l’information sur les pages utilisant [[:File:Example.jpg]]",
-       "apihelp-query+imageinfo-description": "Renvoyer l’information de fichier et l’historique de téléversement.",
+       "apihelp-query+imageinfo-summary": "Renvoyer l’information de fichier et l’historique de téléversement.",
        "apihelp-query+imageinfo-param-prop": "Quelle information obtenir du fichier :",
        "apihelp-query+imageinfo-paramvalue-prop-timestamp": "Ajoute l’horodatage à la version téléversée.",
        "apihelp-query+imageinfo-paramvalue-prop-user": "Ajoute l’utilisateur qui a téléversé chaque version du fichier.",
        "apihelp-query+imageinfo-param-localonly": "Rechercher les fichiers uniquement dans le référentiel local.",
        "apihelp-query+imageinfo-example-simple": "Analyser les informations sur la version actuelle de [[:File:Albert Einstein Head.jpg]].",
        "apihelp-query+imageinfo-example-dated": "Analyser les informations sur les versions de [[:File:Test.jpg]] depuis 2008.",
-       "apihelp-query+images-description": "Renvoie tous les fichiers contenus dans les pages fournies.",
+       "apihelp-query+images-summary": "Renvoie tous les fichiers contenus dans les pages fournies.",
        "apihelp-query+images-param-limit": "Combien de fichiers renvoyer.",
        "apihelp-query+images-param-images": "Lister uniquement ces fichiers. Utile pour vérifier si une page donnée contient un fichier donné.",
        "apihelp-query+images-param-dir": "La direction dans laquelle lister.",
        "apihelp-query+images-example-simple": "Obtenir une liste des fichiers utilisés dans [[Main Page]]",
        "apihelp-query+images-example-generator": "Obtenir des informations sur tous les fichiers utilisés dans [[Main Page]]",
-       "apihelp-query+imageusage-description": "Trouver toutes les pages qui utilisent le titre de l’image donné.",
+       "apihelp-query+imageusage-summary": "Trouver toutes les pages qui utilisent le titre de l’image donné.",
        "apihelp-query+imageusage-param-title": "Titre à rechercher. Impossible à utiliser avec $1pageid.",
        "apihelp-query+imageusage-param-pageid": "ID de la page à rechercher. Impossible à utiliser avec $1title.",
        "apihelp-query+imageusage-param-namespace": "L’espace de noms à énumérer.",
        "apihelp-query+imageusage-param-redirect": "Si le lien vers une page est une redirection, trouver toutes les pages qui ont aussi un lien vers cette redirection. La limite maximale est divisée par deux.",
        "apihelp-query+imageusage-example-simple": "Afficher les pages utilisant [[:File:Albert Einstein Head.jpg]]",
        "apihelp-query+imageusage-example-generator": "Obtenir des informations sur les pages utilisant [[:File:Albert Einstein Head.jpg]]",
-       "apihelp-query+info-description": "Obtenir les informations de base sur la page.",
+       "apihelp-query+info-summary": "Obtenir les informations de base sur la page.",
        "apihelp-query+info-param-prop": "Quelles propriétés supplémentaires récupérer :",
        "apihelp-query+info-paramvalue-prop-protection": "Lister le niveau de protection de chaque page.",
        "apihelp-query+info-paramvalue-prop-talkid": "L’ID de la page de discussion de chaque page qui n’est pas de discussion.",
        "apihelp-query+info-param-token": "Utiliser plutôt [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
        "apihelp-query+info-example-simple": "Obtenir des informations sur la page <kbd>Main Page</kbd>.",
        "apihelp-query+info-example-protection": "Obtenir des informations générales et de protection sur la page <kbd>Main Page</kbd>.",
-       "apihelp-query+iwbacklinks-description": "Trouver toutes les pages qui ont un lien vers le lien interwiki indiqué.\n\nPeut être utilisé pour trouver tous les liens avec un préfixe, ou tous les liens vers un titre (avec un préfixe donné). Sans paramètre, équivaut à « tous les liens interwiki ».",
        "apihelp-query+iwbacklinks-param-prefix": "Préfixe pour l’interwiki.",
        "apihelp-query+iwbacklinks-param-title": "Lien interwiki à rechercher. Doit être utilisé avec <var>$1blprefix</var>.",
        "apihelp-query+iwbacklinks-param-limit": "Combien de pages renvoyer.",
        "apihelp-query+iwbacklinks-param-dir": "La direction dans laquelle lister.",
        "apihelp-query+iwbacklinks-example-simple": "Obtenir les pages qui ont un lien vers [[wikibooks:Test]].",
        "apihelp-query+iwbacklinks-example-generator": "Obtenir des informations sur les pages qui ont un lien vers [[wikibooks:Test]].",
-       "apihelp-query+iwlinks-description": "Renvoie tous les liens interwiki des pages indiquées.",
+       "apihelp-query+iwlinks-summary": "Renvoie tous les liens interwiki des pages indiquées.",
        "apihelp-query+iwlinks-param-url": "S'il faut obtenir l’URL complète (impossible à utiliser avec $1prop).",
        "apihelp-query+iwlinks-param-prop": "Quelles propriétés supplémentaires obtenir pour chaque lien interlangue :",
        "apihelp-query+iwlinks-paramvalue-prop-url": "Ajoute l’URL complète.",
        "apihelp-query+iwlinks-param-title": "Lien interwiki à rechercher. Doit être utilisé avec <var>$1prefix</var>.",
        "apihelp-query+iwlinks-param-dir": "La direction dans laquelle lister.",
        "apihelp-query+iwlinks-example-simple": "Obtenir les liens interwiki de la page <kbd>Main Page</kbd>.",
-       "apihelp-query+langbacklinks-description": "Trouver toutes les pages qui ont un lien vers le lien de langue indiqué.\n\nPeut être utilisé pour trouver tous les liens avec un code de langue, ou tous les liens vers un titre (avec une langue donnée). N’utiliser aucun paramètre revient à « tous les liens de langue ».\n\nNotez que cela peut ne pas prendre en compte les liens de langue ajoutés par les extensions.",
        "apihelp-query+langbacklinks-param-lang": "Langue pour le lien de langue.",
        "apihelp-query+langbacklinks-param-title": "Lien interlangue à rechercher. Doit être utilisé avec $1lang.",
        "apihelp-query+langbacklinks-param-limit": "Combien de pages renvoyer au total.",
        "apihelp-query+langbacklinks-param-dir": "La direction dans laquelle lister.",
        "apihelp-query+langbacklinks-example-simple": "Obtenir les pages ayant un lien vers [[:fr:Test]].",
        "apihelp-query+langbacklinks-example-generator": "Obtenir des informations sur les pages ayant un lien vers [[:fr:Test]].",
-       "apihelp-query+langlinks-description": "Renvoie tous les liens interlangue des pages fournies.",
+       "apihelp-query+langlinks-summary": "Renvoie tous les liens interlangue des pages fournies.",
        "apihelp-query+langlinks-param-limit": "Combien de liens interlangue renvoyer.",
        "apihelp-query+langlinks-param-url": "S’il faut récupérer l’URL complète (impossible à utiliser avec <var>$1prop</var>).",
        "apihelp-query+langlinks-param-prop": "Quelles propriétés supplémentaires obtenir pour chaque lien interlangue :",
        "apihelp-query+langlinks-param-dir": "La direction dans laquelle lister.",
        "apihelp-query+langlinks-param-inlanguagecode": "Code de langue pour les noms de langue localisés.",
        "apihelp-query+langlinks-example-simple": "Obtenir les liens interlangue de la page <kbd>Main Page</kbd>.",
-       "apihelp-query+links-description": "Renvoie tous les liens des pages fournies.",
+       "apihelp-query+links-summary": "Renvoie tous les liens des pages fournies.",
        "apihelp-query+links-param-namespace": "Afficher les liens uniquement dans ces espaces de noms.",
        "apihelp-query+links-param-limit": "Combien de liens renvoyer.",
        "apihelp-query+links-param-titles": "Lister uniquement les liens vers ces titres. Utile pour vérifier si une certaine page a un lien vers un titre donné.",
        "apihelp-query+links-example-simple": "Obtenir les liens de la page <kbd>Main Page</kbd>",
        "apihelp-query+links-example-generator": "Obtenir des informations sur tous les liens de page dans <kbd>Main Page</kbd>.",
        "apihelp-query+links-example-namespaces": "Obtenir les liens de la page <kbd>Main Page</kbd> dans les espaces de nom {{ns:user}} et {{ns:template}}.",
-       "apihelp-query+linkshere-description": "Trouver toutes les pages ayant un lien vers les pages données.",
+       "apihelp-query+linkshere-summary": "Trouver toutes les pages ayant un lien vers les pages données.",
        "apihelp-query+linkshere-param-prop": "Quelles propriétés obtenir :",
        "apihelp-query+linkshere-paramvalue-prop-pageid": "ID de chaque page.",
        "apihelp-query+linkshere-paramvalue-prop-title": "Titre de chaque page.",
        "apihelp-query+linkshere-param-show": "Afficher uniquement les éléments qui correspondent à ces critères :\n;redirect:Afficher uniquement les redirections.\n;!redirect:Afficher uniquement les non-redirections.",
        "apihelp-query+linkshere-example-simple": "Obtenir une liste des pages liées à  [[Main Page]]",
        "apihelp-query+linkshere-example-generator": "Obtenir des informations sur les pages liées à [[Main Page]]",
-       "apihelp-query+logevents-description": "Obtenir des événements des journaux.",
+       "apihelp-query+logevents-summary": "Récupère les événements à partir des journaux.",
        "apihelp-query+logevents-param-prop": "Quelles propriétés obtenir :",
        "apihelp-query+logevents-paramvalue-prop-ids": "Ajoute l’ID de l’événement.",
        "apihelp-query+logevents-paramvalue-prop-title": "Ajoute le titre de la page pour l’événement enregistré.",
        "apihelp-query+logevents-param-tag": "Lister seulement les entrées ayant cette balise.",
        "apihelp-query+logevents-param-limit": "Combien d'entrées renvoyer au total.",
        "apihelp-query+logevents-example-simple": "Liste les entrées de journal récentes.",
-       "apihelp-query+pagepropnames-description": "Lister les noms de toutes les propriétés de page utilisées sur le wiki.",
+       "apihelp-query+pagepropnames-summary": "Lister les noms de toutes les propriétés de page utilisées sur le wiki.",
        "apihelp-query+pagepropnames-param-limit": "Le nombre maximal de noms à renvoyer.",
        "apihelp-query+pagepropnames-example-simple": "Obtenir les 10 premiers noms de propriété.",
-       "apihelp-query+pageprops-description": "Obtenir diverses propriétés de page définies dans le contenu de la page.",
+       "apihelp-query+pageprops-summary": "Obtenir diverses propriétés de page définies dans le contenu de la page.",
        "apihelp-query+pageprops-param-prop": "Lister uniquement ces propriétés de page (<kbd>[[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]]</kbd> renvoie les noms de propriété de page utilisés). Utile pour vérifier si des pages utilisent une certaine propriété de page.",
        "apihelp-query+pageprops-example-simple": "Obtenir les propriétés des pages <kbd>Main Page</kbd> et <kbd>MediaWiki</kbd>.",
-       "apihelp-query+pageswithprop-description": "Lister toutes les pages utilisant une propriété de page donnée.",
+       "apihelp-query+pageswithprop-summary": "Lister toutes les pages utilisant une propriété de page donnée.",
        "apihelp-query+pageswithprop-param-propname": "Propriété de page pour laquelle énumérer les pages (<kbd>[[Special:ApiHelp/query+pagepropnames|action=query&list=pagepropnames]]</kbd> renvoie les noms de propriété de page utilisés).",
        "apihelp-query+pageswithprop-param-prop": "Quelles informations inclure :",
        "apihelp-query+pageswithprop-paramvalue-prop-ids": "Ajoute l’ID de la page.",
        "apihelp-query+pageswithprop-param-dir": "Dans quelle direction trier.",
        "apihelp-query+pageswithprop-example-simple": "Lister les 10 premières pages en utilisant <code>&#123;&#123;DISPLAYTITLE:&#125;&#125;</code>.",
        "apihelp-query+pageswithprop-example-generator": "Obtenir des informations supplémentaires sur les 10 premières pages utilisant <code>_&#95;NOTOC_&#95;</code>.",
-       "apihelp-query+prefixsearch-description": "Effectuer une recherche de préfixe sur les titres de page.\n\nMalgré les similarités dans le nom, ce module n’est pas destiné à être l’équivalent de [[Special:PrefixIndex]] ; pour cela, voyez <kbd>[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd> avec le paramètre <kbd>apprefix</kbd>. Le but de ce module est similaire à <kbd>[[Special:ApiHelp/opensearch|action=opensearch]]</kbd> : prendre l’entrée utilisateur et fournir les meilleurs titres s’en approchant. Selon le serveur du moteur de recherche, cela peut inclure corriger des fautes de frappe, éviter des redirections, ou d’autres heuristiques.",
        "apihelp-query+prefixsearch-param-search": "Chaîne de recherche.",
        "apihelp-query+prefixsearch-param-namespace": "Espaces de noms à rechercher.",
        "apihelp-query+prefixsearch-param-limit": "Nombre maximal de résultats à renvoyer.",
        "apihelp-query+prefixsearch-param-offset": "Nombre de résultats à sauter.",
        "apihelp-query+prefixsearch-example-simple": "Rechercher les titres de page commençant par <kbd>meaning</kbd>.",
        "apihelp-query+prefixsearch-param-profile": "Rechercher le profil à utiliser.",
-       "apihelp-query+protectedtitles-description": "Lister tous les titres protégés en création.",
+       "apihelp-query+protectedtitles-summary": "Lister tous les titres protégés en création.",
        "apihelp-query+protectedtitles-param-namespace": "Lister uniquement les titres dans ces espaces de nom.",
        "apihelp-query+protectedtitles-param-level": "Lister uniquement les titres avec ces niveaux de protection.",
        "apihelp-query+protectedtitles-param-limit": "Combien de pages renvoyer au total.",
        "apihelp-query+protectedtitles-paramvalue-prop-level": "Ajoute le niveau de protection.",
        "apihelp-query+protectedtitles-example-simple": "Lister les titres protégés",
        "apihelp-query+protectedtitles-example-generator": "Trouver les liens vers les titres protégés dans l’espace de noms principal.",
-       "apihelp-query+querypage-description": "Obtenir une liste fournie par une page spéciale basée sur QueryPage.",
+       "apihelp-query+querypage-summary": "Obtenir une liste fournie par une page spéciale basée sur QueryPage.",
        "apihelp-query+querypage-param-page": "Le nom de la page spéciale. Notez que ce nom est sensible à la casse.",
        "apihelp-query+querypage-param-limit": "Nombre de résultats à renvoyer.",
        "apihelp-query+querypage-example-ancientpages": "Renvoyer les résultats de [[Special:Ancientpages]].",
-       "apihelp-query+random-description": "Obtenir un ensemble de pages au hasard.\n\nLes pages sont listées dans un ordre prédéterminé, seul le point de départ est aléatoire. Par exemple, cela signifie que si la première page dans la liste est <samp>Accueil</samp>, la seconde sera <em>toujours</em> <samp>Liste des singes de fiction</samp>, la troisième <samp>Liste de personnes figurant sur les timbres de Vanuatu</samp>, etc.",
+       "apihelp-query+random-summary": "Récupèrer un ensemble de pages au hasard.",
        "apihelp-query+random-param-namespace": "Renvoyer seulement des pages de ces espaces de noms.",
        "apihelp-query+random-param-limit": "Limiter le nombre de pages aléatoires renvoyées.",
        "apihelp-query+random-param-redirect": "Utilisez <kbd>$1filterredir=redirects</kbd> au lieu de ce paramètre.",
        "apihelp-query+random-param-filterredir": "Comment filtrer les redirections.",
        "apihelp-query+random-example-simple": "Obtenir deux pages aléatoires de l’espace de noms principal.",
        "apihelp-query+random-example-generator": "Renvoyer les informations de la page sur deux pages au hasard de l’espace de noms principal.",
-       "apihelp-query+recentchanges-description": "Énumérer les modifications récentes.",
+       "apihelp-query+recentchanges-summary": "Énumérer les modifications récentes.",
        "apihelp-query+recentchanges-param-start": "L’horodatage auquel démarrer l’énumération.",
        "apihelp-query+recentchanges-param-end": "L’horodatage auquel arrêter l’énumération.",
        "apihelp-query+recentchanges-param-namespace": "Filtrer les modifications uniquement sur ces espaces de noms.",
        "apihelp-query+recentchanges-param-generaterevisions": "Utilisé comme générateur, générer des IDs de révision plutôt que des titres.\nLes entrées de modification récentes sans IDs de révision associé (par ex. la plupart des entrées de journaux) ne généreront rien.",
        "apihelp-query+recentchanges-example-simple": "Lister les modifications récentes",
        "apihelp-query+recentchanges-example-generator": "Obtenir l’information de page sur les modifications récentes non patrouillées",
-       "apihelp-query+redirects-description": "Renvoie toutes les redirections vers les pages données.",
+       "apihelp-query+redirects-summary": "Renvoie toutes les redirections vers les pages données.",
        "apihelp-query+redirects-param-prop": "Quelles propriétés récupérer :",
        "apihelp-query+redirects-paramvalue-prop-pageid": "ID de page de chaque redirection.",
        "apihelp-query+redirects-paramvalue-prop-title": "Titre de chaque redirection.",
        "apihelp-query+redirects-param-show": "Afficher uniquement les éléments correspondant à ces critères :\n;fragment:Afficher uniquement les redirections avec un fragment.\n;!fragment:Afficher uniquement les redirections sans fragment.",
        "apihelp-query+redirects-example-simple": "Obtenir une liste des redirections vers [[Main Page]]",
        "apihelp-query+redirects-example-generator": "Obtenir des informations sur toutes les redirections vers [[Main Page]]",
-       "apihelp-query+revisions-description": "Obtenir des informations sur la révision.\n\nPeut être utilisé de différentes manières :\n# Obtenir des données sur un ensemble de pages (dernière révision), en mettant les titres ou les ids de page.\n# Obtenir les révisions d’une page donnée, en utilisant les titres ou les ids de page avec rvstart, rvend ou rvlimit.\n# Obtenir des données sur un ensemble de révisions en donnant leurs IDs avec revids.",
+       "apihelp-query+revisions-summary": "Récupèrer les informations de relecture.",
        "apihelp-query+revisions-paraminfo-singlepageonly": "Utilisable uniquement avec une seule page (mode #2).",
        "apihelp-query+revisions-param-startid": "Commencer l'énumération à partir de la date de cette revue. La revue doit exister, mais ne concerne pas forcément cette page.",
        "apihelp-query+revisions-param-endid": "Arrêter l’énumération à la date de cette revue. La revue doit exister mais ne concerne pas forcément cette page.",
        "apihelp-query+revisions+base-param-difftotext": "Texte auquel comparer chaque révision. Compare uniquement un nombre limité de révisions. Écrase <var>$1diffto</var>. Si <var>$1section</var> est positionné, seule cette section sera comparée avec ce texte.",
        "apihelp-query+revisions+base-param-difftotextpst": "Effectuer une transformation avant enregistrement sur le texte avant de le comparer. Valide uniquement quand c’est utilisé avec <var>$1difftotext</var>.",
        "apihelp-query+revisions+base-param-contentformat": "Format de sérialisation utilisé pour <var>$1difftotext</var> et attendu pour la sortie du contenu.",
-       "apihelp-query+search-description": "Effectuer une recherche en texte intégral.",
+       "apihelp-query+search-summary": "Effectuer une recherche en texte intégral.",
        "apihelp-query+search-param-search": "Rechercher les titres de page ou le contenu correspondant à cette valeur. Vous pouvez utiliser la chaîne de recherche pour invoquer des fonctionnalités de recherche spéciales, selon ce que le serveur de recherche du wiki implémente.",
        "apihelp-query+search-param-namespace": "Rechercher uniquement dans ces espaces de noms.",
        "apihelp-query+search-param-what": "Quel type de recherche effectuer.",
        "apihelp-query+search-example-simple": "Rechercher <kbd>meaning</kbd>.",
        "apihelp-query+search-example-text": "Rechercher des textes pour <kbd>meaning</kbd>.",
        "apihelp-query+search-example-generator": "Obtenir les informations sur les pages renvoyées par une recherche de <kbd>meaning</kbd>.",
-       "apihelp-query+siteinfo-description": "Renvoyer les informations générales sur le site.",
+       "apihelp-query+siteinfo-summary": "Renvoyer les informations générales sur le site.",
        "apihelp-query+siteinfo-param-prop": "Quelles informations obtenir :",
        "apihelp-query+siteinfo-paramvalue-prop-general": "Information globale du système.",
        "apihelp-query+siteinfo-paramvalue-prop-namespaces": "Liste des espaces de noms déclarés avec leur nom canonique.",
        "apihelp-query+siteinfo-example-simple": "Extraire les informations du site.",
        "apihelp-query+siteinfo-example-interwiki": "Extraire une liste des préfixes interwiki locaux.",
        "apihelp-query+siteinfo-example-replag": "Vérifier la latence de réplication actuelle.",
-       "apihelp-query+stashimageinfo-description": "Renvoie les informations de fichier des fichiers mis en réserve.",
+       "apihelp-query+stashimageinfo-summary": "Renvoie les informations de fichier des fichiers mis en réserve.",
        "apihelp-query+stashimageinfo-param-filekey": "Clé qui identifie un téléversement précédent qui a été temporairement mis en réserve.",
        "apihelp-query+stashimageinfo-param-sessionkey": "Alias pour $1filekey, pour la compatibilité ascendante.",
        "apihelp-query+stashimageinfo-example-simple": "Renvoie les informations sur un fichier mis en réserve.",
        "apihelp-query+stashimageinfo-example-params": "Renvoie les vignettes pour deux fichiers mis de côté.",
-       "apihelp-query+tags-description": "Lister les balises de modification.",
+       "apihelp-query+tags-summary": "Lister les balises de modification.",
        "apihelp-query+tags-param-limit": "Le nombre maximal de balises à lister.",
        "apihelp-query+tags-param-prop": "Quelles propriétés récupérer :",
        "apihelp-query+tags-paramvalue-prop-name": "Ajoute le nom de la balise.",
        "apihelp-query+tags-paramvalue-prop-source": "Retourne les sources de la balise, ce qui comprend <samp>extension</samp> pour les balises définies par une extension et <samp>manual</samp> pour les balises pouvant être appliquées manuellement par les utilisateurs.",
        "apihelp-query+tags-paramvalue-prop-active": "Si la balise est encore appliquée.",
        "apihelp-query+tags-example-simple": "Lister les balises disponibles.",
-       "apihelp-query+templates-description": "Renvoie toutes les pages incluses dans les pages fournies.",
+       "apihelp-query+templates-summary": "Renvoie toutes les pages incluses dans les pages fournies.",
        "apihelp-query+templates-param-namespace": "Afficher les modèles uniquement dans ces espaces de noms.",
        "apihelp-query+templates-param-limit": "Combien de modèles renvoyer.",
        "apihelp-query+templates-param-templates": "Lister uniquement ces modèles. Utile pour vérifier si une certaine page utilise un modèle donné.",
        "apihelp-query+templates-example-simple": "Obtenir les modèles utilisés sur la page <kbd>Main Page</kbd>.",
        "apihelp-query+templates-example-generator": "Obtenir des informations sur les pages modèle utilisé sur <kbd>Main Page</kbd>.",
        "apihelp-query+templates-example-namespaces": "Obtenir les pages des espaces de noms {{ns:user}} et {{ns:template}} qui sont inclues dans la page <kdb>Main Page<kdb>.",
-       "apihelp-query+tokens-description": "Récupère les jetons pour les actions de modification de données.",
+       "apihelp-query+tokens-summary": "Récupère les jetons pour les actions de modification de données.",
        "apihelp-query+tokens-param-type": "Types de jeton à demander.",
        "apihelp-query+tokens-example-simple": "Récupérer un jeton csrf (par défaut).",
        "apihelp-query+tokens-example-types": "Récupérer un jeton de suivi et un de patrouille.",
-       "apihelp-query+transcludedin-description": "Trouver toutes les pages qui incluent les pages données.",
+       "apihelp-query+transcludedin-summary": "Trouver toutes les pages qui incluent les pages données.",
        "apihelp-query+transcludedin-param-prop": "Quelles propriétés obtenir :",
        "apihelp-query+transcludedin-paramvalue-prop-pageid": "ID de page de chaque page.",
        "apihelp-query+transcludedin-paramvalue-prop-title": "Titre de chaque page.",
        "apihelp-query+transcludedin-param-show": "Afficher uniquement les éléments qui correspondent à ces critères:\n;redirect:Afficher uniquement les redirections.\n;!redirect:Afficher uniquement les non-redirections.",
        "apihelp-query+transcludedin-example-simple": "Obtenir une liste des pages incluant <kbd>Main Page</kbd>.",
        "apihelp-query+transcludedin-example-generator": "Obtenir des informations sur les pages incluant <kbd>Main Page</kbd>.",
-       "apihelp-query+usercontribs-description": "Obtenir toutes les modifications d'un utilisateur.",
+       "apihelp-query+usercontribs-summary": "Obtenir toutes les modifications d'un utilisateur.",
        "apihelp-query+usercontribs-param-limit": "Le nombre maximal de contributions à renvoyer.",
        "apihelp-query+usercontribs-param-start": "L’horodatage auquel démarrer le retour.",
        "apihelp-query+usercontribs-param-end": "L’horodatage auquel arrêter le retour.",
        "apihelp-query+usercontribs-param-toponly": "Lister uniquement les modifications de la dernière révision.",
        "apihelp-query+usercontribs-example-user": "Afficher les contributions de l'utilisateur <kbd>Exemple</kbd>.",
        "apihelp-query+usercontribs-example-ipprefix": "Afficher les contributions de toutes les adresses IP avec le préfixe <kbd>192.0.2.</kbd>.",
-       "apihelp-query+userinfo-description": "Obtenir des informations sur l’utilisateur courant.",
+       "apihelp-query+userinfo-summary": "Obtenir des informations sur l’utilisateur courant.",
        "apihelp-query+userinfo-param-prop": "Quelles informations inclure :",
        "apihelp-query+userinfo-paramvalue-prop-blockinfo": "Marque si l’utilisateur actuel est bloqué, par qui, et pour quelle raison.",
        "apihelp-query+userinfo-paramvalue-prop-hasmsg": "Ajoute une balise <samp>messages</samp> si l’utilisateur actuel a des messages en cours.",
        "apihelp-query+userinfo-param-attachedwiki": "Avec <kbd>$1prop=centralids</kbd>, indiquer si l’utilisateur est attaché au wiki identifié par cet ID.",
        "apihelp-query+userinfo-example-simple": "Obtenir des informations sur l’utilisateur actuel.",
        "apihelp-query+userinfo-example-data": "Obtenir des informations supplémentaires sur l’utilisateur actuel.",
-       "apihelp-query+users-description": "Obtenir des informations sur une liste d’utilisateurs",
+       "apihelp-query+users-summary": "Obtenir des informations sur une liste d’utilisateurs",
        "apihelp-query+users-param-prop": "Quelles informations inclure :",
        "apihelp-query+users-paramvalue-prop-blockinfo": "Marque si l’utilisateur est bloqué, par qui, et pour quelle raison.",
        "apihelp-query+users-paramvalue-prop-groups": "Liste tous les groupes auxquels appartient chaque utilisateur.",
        "apihelp-query+users-param-userids": "Une liste d’ID utilisateur pour lesquels obtenir des informations.",
        "apihelp-query+users-param-token": "Utiliser <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd> à la place.",
        "apihelp-query+users-example-simple": "Renvoyer des informations pour l'utilisateur <kbd>Example</kbd>.",
-       "apihelp-query+watchlist-description": "Obtenir les modifications récentes des pages de la liste de suivi de l’utilisateur actuel.",
+       "apihelp-query+watchlist-summary": "Obtenir les modifications récentes des pages de la liste de suivi de l’utilisateur actuel.",
        "apihelp-query+watchlist-param-allrev": "Inclure les multiples révisions de la même page dans l’intervalle de temps fourni.",
        "apihelp-query+watchlist-param-start": "L’horodatage auquel démarrer l’énumération.",
        "apihelp-query+watchlist-param-end": "L’horodatage auquel arrêter l’énumération.",
        "apihelp-query+watchlist-example-generator": "Chercher l’information de la page sur les pages récemment modifiées de la liste de suivi de l’utilisateur actuel",
        "apihelp-query+watchlist-example-generator-rev": "Chercher l’information de la révision pour les modifications récentes des pages de la liste de suivi de l’utilisateur actuel.",
        "apihelp-query+watchlist-example-wlowner": "Lister la révision de tête des pages récemment modifiées de la liste de suivi de l'utilisateur <kbd>Exemple</kbd>.",
-       "apihelp-query+watchlistraw-description": "Obtenir toutes les pages de la liste de suivi de l’utilisateur actuel.",
+       "apihelp-query+watchlistraw-summary": "Obtenir toutes les pages de la liste de suivi de l’utilisateur actuel.",
        "apihelp-query+watchlistraw-param-namespace": "Lister uniquement les pages dans les espaces de noms fournis.",
        "apihelp-query+watchlistraw-param-limit": "Combien de résultats renvoyer au total par requête.",
        "apihelp-query+watchlistraw-param-prop": "Quelles propriétés supplémentaires obtenir :",
        "apihelp-query+watchlistraw-param-totitle": "Terminer l'énumération avec ce Titre (inclure le préfixe d'espace de noms) :",
        "apihelp-query+watchlistraw-example-simple": "Lister les pages dans la liste de suivi de l’utilisateur actuel.",
        "apihelp-query+watchlistraw-example-generator": "Chercher l’information sur les pages de la liste de suivi de l’utilisateur actuel.",
-       "apihelp-removeauthenticationdata-description": "Supprimer les données d’authentification pour l’utilisateur actuel.",
+       "apihelp-removeauthenticationdata-summary": "Supprimer les données d’authentification pour l’utilisateur actuel.",
        "apihelp-removeauthenticationdata-example-simple": "Tentative de suppression des données de l’utilisateur pour <kbd>FooAuthenticationRequest</kbd>.",
-       "apihelp-resetpassword-description": "Envoyer un courriel de réinitialisation du mot de passe à un utilisateur.",
-       "apihelp-resetpassword-description-noroutes": "Aucun chemin pour réinitialiser le mot de passe n’est disponible.\n\nActiver les chemins dans <var>[[mw:Special:MyLanguage/Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var> pour utiliser ce module.",
+       "apihelp-resetpassword-summary": "Envoyer un courriel de réinitialisation du mot de passe à un utilisateur.",
        "apihelp-resetpassword-param-user": "Utilisateur ayant été réinitialisé.",
        "apihelp-resetpassword-param-email": "Adresse courriel de l’utilisateur ayant été réinitialisé.",
        "apihelp-resetpassword-example-user": "Envoyer un courriel de réinitialisation du mot de passe à l’utilisateur <kbd>Exemple</kbd>.",
        "apihelp-resetpassword-example-email": "Envoyer un courriel pour la réinitialisation de mot de passe à tous les utilisateurs avec l’adresse <kbd>user@example.com</kbd>.",
-       "apihelp-revisiondelete-description": "Supprimer et rétablir des révisions.",
+       "apihelp-revisiondelete-summary": "Supprimer et rétablir des révisions.",
        "apihelp-revisiondelete-param-type": "Type de suppression de révision en cours de traitement.",
        "apihelp-revisiondelete-param-target": "Titre de page pour la suppression de révision, s’il est nécessaire pour le type.",
        "apihelp-revisiondelete-param-ids": "Identifiants pour les révisions à supprimer.",
        "apihelp-revisiondelete-param-tags": "Balises à appliquer à l’entrée dans le journal de suppression.",
        "apihelp-revisiondelete-example-revision": "Masquer le contenu de la révision <kbd>12345</kbd> de la page <kbd>Main Page</kbd>.",
        "apihelp-revisiondelete-example-log": "Masquer toutes les données de l’entrée de journal <kbd>67890</kbd> avec le motif <kbd>Violation de Biographie de Personne Vivante</kbd>.",
-       "apihelp-rollback-description": "Annuler la dernière modification de la page.\n\nSi le dernier utilisateur à avoir modifié la page a fait plusieurs modifications sur une ligne, elles seront toutes annulées.",
+       "apihelp-rollback-summary": "Annuler les dernières modifications de la page.",
        "apihelp-rollback-param-title": "Titre de la page à restaurer. Impossible à utiliser avec <var>$1pageid</var>.",
        "apihelp-rollback-param-pageid": "ID de la page à restaurer. Impossible à utiliser avec <var>$1title</var>.",
        "apihelp-rollback-param-tags": "Balises à appliquer à la révocation.",
        "apihelp-rollback-param-watchlist": "Ajouter ou supprimer la page de la liste de suivi de l’utilisateur actuel sans condition, utiliser les préférences ou ne pas modifier le suivi.",
        "apihelp-rollback-example-simple": "Annuler les dernières modifications à <kbd>Main Page</kbd> par l’utilisateur <kbd>Example</kbd>.",
        "apihelp-rollback-example-summary": "Annuler les dernières modifications de la page <kbd>Main Page</kbd> par l’utilisateur à l’adresse IP <kbd>192.0.2.5</kbd> avec le résumé <kbd>Annulation de vandalisme<kbd>, et marquer ces modifications et l’annulation comme modifications de robots.",
-       "apihelp-rsd-description": "Exporter un schéma RSD (Découverte Très Simple).",
+       "apihelp-rsd-summary": "Exporter un schéma RSD (Découverte Très Simple).",
        "apihelp-rsd-example-simple": "Exporter le schéma RSD",
-       "apihelp-setnotificationtimestamp-description": "Mettre à jour l’horodatage de notification pour les pages suivies.\n\nCela affecte la mise en évidence des pages modifiées dans la liste de suivi et l’historique, et l’envoi de courriel quand la préférence « {{int:tog-enotifwatchlistpages}} » est activée.",
        "apihelp-setnotificationtimestamp-param-entirewatchlist": "Travailler sur toutes les pages suivies.",
        "apihelp-setnotificationtimestamp-param-timestamp": "Horodatage auquel dater la notification.",
        "apihelp-setnotificationtimestamp-param-torevid": "Révision pour laquelle fixer l’horodatage de notification (une page uniquement).",
        "apihelp-setnotificationtimestamp-example-page": "Réinitialiser l’état de notification pour la <kbd>Page principale<kbd>.",
        "apihelp-setnotificationtimestamp-example-pagetimestamp": "Fixer l’horodatage de notification pour <kbd>Page principale</kbd> afin que toutes les modifications depuis le 1 janvier 2012 soient non vues",
        "apihelp-setnotificationtimestamp-example-allpages": "Réinitialiser l’état de notification sur les pages dans l’espace de noms <kbd>{{ns:user}}</kbd>.",
-       "apihelp-setpagelanguage-description": "Modifier la langue d’une page.",
-       "apihelp-setpagelanguage-description-disabled": "Il n’est pas possible de modifier la langue d’une page sur ce wiki.\n\nActiver <var>[[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var> pour utiliser cette action.",
+       "apihelp-setpagelanguage-summary": "Modifier la langue d’une page.",
+       "apihelp-setpagelanguage-extended-description-disabled": "Il n’est pas possible de modifier la langue d’une page sur ce wiki.\n\nActiver <var>[[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var> pour utiliser cette action.",
        "apihelp-setpagelanguage-param-title": "Titre de la page dont vous souhaitez modifier la langue. Ne peut pas être utilisé avec <var>$1pageid</var>.",
        "apihelp-setpagelanguage-param-pageid": "Identifiant (ID) de la page dont vous souhaitez modifier la langue. Ne peut être utilisé avec <var>$1title</var>.",
        "apihelp-setpagelanguage-param-lang": "Code de langue vers lequel la page doit être changée. Utiliser <kbd>defaut</kbd> pour réinitialiser la page sur la langue par défaut du contenu du wiki.",
        "apihelp-setpagelanguage-param-tags": "Modifier les balises à appliquer à l'entrée du journal résultant de cette action.",
        "apihelp-setpagelanguage-example-language": "Changer la langue de la <kbd>page principale</kbd> en basque.",
        "apihelp-setpagelanguage-example-default": "Remplacer la langue de la page ayant l'ID 123 par la langue par défaut du contenu du wiki.",
-       "apihelp-stashedit-description": "Préparer une modification dans le cache partagé.\n\nCeci a pour but d’être utilisé via AJAX depuis le formulaire d’édition pour améliorer la performance de la sauvegarde de la page.",
+       "apihelp-stashedit-summary": "Préparer des modifications dans le cache partagé.",
        "apihelp-stashedit-param-title": "Titre de la page en cours de modification.",
        "apihelp-stashedit-param-section": "Numéro de section. <kbd>0</kbd> pour la section du haut, <kbd>new</kbd> pour une nouvelle section.",
        "apihelp-stashedit-param-sectiontitle": "Le titre pour une nouvelle section.",
        "apihelp-stashedit-param-contentformat": "Format de sérialisation de contenu utilisé pour le texte saisi.",
        "apihelp-stashedit-param-baserevid": "ID de révision de la révision de base.",
        "apihelp-stashedit-param-summary": "Résumé du changement",
-       "apihelp-tag-description": "Ajouter ou enlever des balises de modification aux révisions ou ou aux entrées de journal individuelles.",
+       "apihelp-tag-summary": "Ajouter ou enlever des balises de modification aux révisions ou ou aux entrées de journal individuelles.",
        "apihelp-tag-param-rcid": "Un ou plus IDs de modification récente à partir desquels ajouter ou supprimer la balise.",
        "apihelp-tag-param-revid": "Un ou plusieurs IDs de révision à partir desquels ajouter ou supprimer la balise.",
        "apihelp-tag-param-logid": "Un ou plusieurs IDs d’entrée de journal à partir desquels ajouter ou supprimer la balise.",
        "apihelp-tag-param-tags": "Balises à appliquer à l’entrée de journal qui sera créée en résultat de cette action.",
        "apihelp-tag-example-rev": "Ajoute la balise <kbd>vandalism</kbd> à partir de l’ID de révision 123 sans indiquer de motif",
        "apihelp-tag-example-log": "Supprimer la balise <kbd>spam</kbd> à partir de l’ID d’entrée de journal 123 avec le motif <kbd>Wrongly applied</kbd>",
-       "apihelp-tokens-description": "Obtenir les jetons pour les actions modifiant les données.\n\nCe module est désuet, remplacé par [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
+       "apihelp-tokens-summary": "Obtenir des jetons pour des actions de modification des données.",
        "apihelp-tokens-param-type": "Types de jeton à demander.",
        "apihelp-tokens-example-edit": "Récupérer un jeton de modification (par défaut).",
        "apihelp-tokens-example-emailmove": "Récupérer un jeton de courriel et un jeton de déplacement.",
-       "apihelp-unblock-description": "Débloquer un utilisateur.",
+       "apihelp-unblock-summary": "Débloquer un utilisateur.",
        "apihelp-unblock-param-id": "ID du blocage à lever (obtenu via <kbd>list=blocks</kbd>). Impossible à utiliser avec <var>$1user</var> ou <var>$1userid</var>.",
        "apihelp-unblock-param-user": "Nom d’utilisateur, adresse IP ou plage d’adresses IP à débloquer. Impossible à utiliser en même temps que <var>$1id</var> ou <var>$1userid</var>.",
        "apihelp-unblock-param-userid": "ID de l'utilisateur à débloquer. Ne peut être utilisé avec <var>$1id</var> ou <var>$1user</var>.",
        "apihelp-unblock-param-tags": "Modifier les balises à appliquer à l’entrée dans le journal de blocage.",
        "apihelp-unblock-example-id": "Lever le blocage d’ID #<kbd>105</kbd>.",
        "apihelp-unblock-example-user": "Débloquer l’utilisateur <kbd>Bob</kbd> avec le motif <kbd>Désolé Bob</kbd>.",
-       "apihelp-undelete-description": "Restaurer les révisions d’une page supprimée.\n\nUne liste des révisions supprimées (avec les horodatages) peut être récupérée via [[Special:ApiHelp/query+deletedrevisions|prop=deletedrevisions]], et une liste d’IDs de fichier supprimé peut être récupérée via [[Special:ApiHelp/query+filearchive|list=filearchive]].",
+       "apihelp-undelete-summary": "Restituer les versions d'une page supprimée.",
        "apihelp-undelete-param-title": "Titre de la page à restaurer.",
        "apihelp-undelete-param-reason": "Motif de restauration.",
        "apihelp-undelete-param-tags": "Modifier les balises à appliquer à l’entrée dans le journal de suppression.",
        "apihelp-undelete-param-watchlist": "Ajouter ou supprimer la page de la liste de suivi de l’utilisateur actuel sans condition, utiliser les préférences ou ne pas modifier le suivi.",
        "apihelp-undelete-example-page": "Annuler la suppression de la page <kbd>Main Page</kbd>.",
        "apihelp-undelete-example-revisions": "Annuler la suppression de deux révisions de la page <kbd>Main Page</kbd>.",
-       "apihelp-unlinkaccount-description": "Supprimer un compte tiers lié de l’utilisateur actuel.",
+       "apihelp-unlinkaccount-summary": "Supprimer un compte tiers lié de l’utilisateur actuel.",
        "apihelp-unlinkaccount-example-simple": "Essayer de supprimer le lien de l’utilisateur actuel pour le fournisseur associé avec <kbd>FooAuthenticationRequest</kbd>.",
-       "apihelp-upload-description": "Téléverser un fichier, ou obtenir l’état des téléversements en cours.\n\nPlusieurs méthodes sont disponibles :\n* Téléverser directement le contenu du fichier, en utilisant le paramètre <var>$1file</var>.\n* Téléverser le fichier par morceaux, en utilisant les paramètres <var>$1filesize</var>, <var>$1chunk</var>, and <var>$1offset</var>.\n* Pour que le serveur MédiaWiki cherche un fichier depuis une URL, utilisez le paramètre <var>$1url</var>.\n* Terminer un téléversement précédent qui a échoué à cause d’avertissements, en utilisant le paramètre <var>$1filekey</var>.\nNoter que le POST HTTP doit être fait comme un téléversement de fichier (par ex. en utilisant <code>multipart/form-data</code>) en envoyant le <code>multipart/form-data</code>.",
        "apihelp-upload-param-filename": "Nom de fichier cible.",
        "apihelp-upload-param-comment": "Téléverser le commentaire. Utilisé aussi comme texte de la page initiale pour les nouveaux fichiers si <var>$1text</var> n’est pas spécifié.",
        "apihelp-upload-param-tags": "Modifier les balises à appliquer à l’entrée du journal de téléversement et à la révision de la page du fichier.",
        "apihelp-upload-param-checkstatus": "Récupérer uniquement l’état de téléversement pour la clé de fichier donnée.",
        "apihelp-upload-example-url": "Téléverser depuis une URL",
        "apihelp-upload-example-filekey": "Terminer un téléversement qui a échoué à cause d’avertissements",
-       "apihelp-userrights-description": "Modifier l’appartenance d’un utilisateur à un groupe.",
+       "apihelp-userrights-summary": "Modifier l’appartenance d’un utilisateur à un groupe.",
        "apihelp-userrights-param-user": "Nom d’utilisateur.",
        "apihelp-userrights-param-userid": "ID de l’utilisateur.",
        "apihelp-userrights-param-add": "Ajouter l’utilisateur à ces groupes, ou s’ils sont déjà membres, mettre à jour la date d’expiration de leur appartenance à ce groupe.",
        "apihelp-userrights-example-user": "Ajouter l’utilisateur <kbd>FooBot</kbd> au groupe <kbd>bot</kbd><!-- {{int:group-bot}} ? -->, et le supprimer des groupes <kbd>sysop</kbd> et <kbd>bureaucrat</kbd>.",
        "apihelp-userrights-example-userid": "Ajouter l’utilisateur d’ID <kbd>123</kbd> au groupe <kbd>robot</kbd>, et le supprimer des groupes <kbd>sysop</kbd> et <kbd>bureaucrate</kbd>.",
        "apihelp-userrights-example-expiry": "Ajouter l'utilisateur <kbd>SometimeSysop</kbd> au groupe <kbd>sysop</kbd> pour 1 mois.",
-       "apihelp-validatepassword-description": "Valider un mot de passe en suivant les règles des mots de passe du wiki.\n\nLa validation est <samp>Good</samp> si le mot de passe est acceptable, <samp>Change</samp> s'il peut être utilisé pour se connecter et doit être changé, ou  <samp>Invalid</samp> s'il n'est pas utilisable.",
+       "apihelp-validatepassword-summary": "Valider un mot de passe conformément aux règles concernant les mots de passe du wiki.",
        "apihelp-validatepassword-param-password": "Mot de passe à valider.",
        "apihelp-validatepassword-param-user": "Nom de l'utilisateur, pour tester la création de compte. L'utilisateur ne doit pas déja exister.",
        "apihelp-validatepassword-param-email": "Adresse courriel, pour tester la création de compte.",
        "apihelp-validatepassword-param-realname": "Vrai nom, pour tester la création de compte.",
        "apihelp-validatepassword-example-1": "Valider le mot de passe <kbd>foobar</kbd> pour l'utilisateur actuel.",
        "apihelp-validatepassword-example-2": "Valider le mot de passe <kbd>qwerty</kbd> pour la création de l'utilisateur <kbd>Example</kbd>.",
-       "apihelp-watch-description": "Ajouter ou supprimer des pages de la liste de suivi de l’utilisateur actuel.",
+       "apihelp-watch-summary": "Ajouter ou supprimer des pages de la liste de suivi de l’utilisateur actuel.",
        "apihelp-watch-param-title": "La page à (ne plus) suivre. Utiliser plutôt <var>$1titles</var>.",
        "apihelp-watch-param-unwatch": "Si défini, la page ne sera plus suivie plutôt que suivie.",
        "apihelp-watch-example-watch": "Suivre la page <kbd>Main Page</kbd>.",
        "apihelp-watch-example-generator": "Suivre les quelques premières pages de l’espace de nom principal",
        "apihelp-format-example-generic": "Renvoyer le résultat de la requête dans le format $1.",
        "apihelp-format-param-wrappedhtml": "Renvoyer le HTML avec une jolie mise en forme et les modules ResourceLoader associés comme un objet JSON.",
-       "apihelp-json-description": "Extraire les données au format JSON.",
+       "apihelp-json-summary": "Extraire les données au format JSON.",
        "apihelp-json-param-callback": "Si spécifié, inclut la sortie dans l’appel d’une fonction fournie. Pour plus de sûreté, toutes les données spécifiques à l’utilisateur seront restreintes.",
        "apihelp-json-param-utf8": "Si spécifié, encode la plupart (mais pas tous) des caractères non ASCII en URF-8 au lieu de les remplacer par leur séquence d’échappement hexadécimale. Valeur par défaut quand <var>formatversion</var> ne vaut pas <kbd>1</kbd>.",
        "apihelp-json-param-ascii": "Si spécifié, encode toutes ses séquences d’échappement non ASCII utilisant l’hexadécimal. Valeur par défaut quand <var>formatversion</var> vaut <kbd>1</kbd>.",
        "apihelp-json-param-formatversion": "Mise en forme de sortie :\n;1:Format rétro-compatible (booléens de style XML, clés <samp>*</samp> pour les nœuds de contenu, etc.).\n;2:Format moderne expérimental. Des détails peuvent changer !\n;latest:Utilise le dernier format (actuellement <kbd>2</kbd>), peut changer sans avertissement.",
-       "apihelp-jsonfm-description": "Extraire les données au format JSON (affiché proprement en HTML).",
-       "apihelp-none-description": "Ne rien extraire.",
-       "apihelp-php-description": "Extraire les données au format sérialisé de PHP.",
+       "apihelp-jsonfm-summary": "Extraire les données au format JSON (affiché proprement en HTML).",
+       "apihelp-none-summary": "Ne rien extraire.",
+       "apihelp-php-summary": "Extraire les données au format sérialisé de PHP.",
        "apihelp-php-param-formatversion": "Mise en forme de la sortie :\n;1:Format rétro-compatible (bool&ens de style XML, clés <samp>*</samp> pour les nœuds de contenu, etc.).\n;2:Format moderne expérimental. Des détails peuvent changer !\n;latest:Utilise le dernier format (actuellement <kbd>2</kbd>), peut changer sans avertissement.",
-       "apihelp-phpfm-description": "Extraire les données au format sérialisé de PHP (affiché proprement en HTML).",
-       "apihelp-rawfm-description": "Extraire les données, y compris les éléments de débogage, au format JSON (affiché proprement en HTML).",
-       "apihelp-xml-description": "Extraire les données au format XML.",
+       "apihelp-phpfm-summary": "Extraire les données au format sérialisé de PHP (affiché proprement en HTML).",
+       "apihelp-rawfm-summary": "Extraire les données, y compris les éléments de débogage, au format JSON (affiché proprement en HTML).",
+       "apihelp-xml-summary": "Extraire les données au format XML.",
        "apihelp-xml-param-xslt": "Si spécifié, ajoute la page nommée comme une feuille de style XSL. La valeur doit être un titre dans l’espace de noms {{ns:MediaWiki}} se terminant par <code>.xsl</code>.",
        "apihelp-xml-param-includexmlnamespace": "Si spécifié, ajoute un espace de noms XML.",
-       "apihelp-xmlfm-description": "Extraire les données au format XML (affiché proprement en HTML).",
+       "apihelp-xmlfm-summary": "Extraire les données au format XML (affiché proprement en HTML).",
        "api-format-title": "Résultat de l’API de MediaWiki",
        "api-format-prettyprint-header": "Voici la représentation HTML du format $1. HTML est utile pour le débogage, mais inapproprié pour être utilisé dans une application.\n\nSpécifiez le paramètre <var>format</var> pour modifier le format de sortie. Pour voir la représentation non HTML du format $1, mettez <kbd>format=$2</kbd>.\n\nVoyez la [[mw:Special:MyLanguage/API|documentation complète]], ou l’[[Special:ApiHelp/main|aide de l’API]] pour plus d’information.",
        "api-format-prettyprint-header-only-html": "Ceci est une représentation HTML à des fins de débogage, et n’est pas approprié pour une utilisation applicative.\n\nVoir la [[mw:Special:MyLanguage/API|documentation complète]], ou l’[[Special:ApiHelp/main|aide de l’API]] pour plus d’information.",
        "api-help-title": "Aide de l’API de MediaWiki",
        "api-help-lead": "Ceci est une page d’aide de l’API de MediaWiki générée automatiquement.\n\nDocumentation et exemples : https://www.mediawiki.org/wiki/API",
        "api-help-main-header": "Module principal",
+       "api-help-undocumented-module": "Aucune documentation pour le module $1.",
        "api-help-flag-deprecated": "Ce module est désuet.",
        "api-help-flag-internal": "<strong>Ce module est interne ou instable.</strong> Son fonctionnement peut être modifié sans préavis.",
        "api-help-flag-readrights": "Ce module nécessite des droits de lecture.",
index 3f5d531..f4659be 100644 (file)
        "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-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+categories-param-limit": "Liczba kategorii do zwrócenia.",
        "apihelp-query+categoryinfo-summary": "Zwraca informacje o danych kategoriach.",
        "api-help-title": "Pomoc MediaWiki API",
        "api-help-lead": "To jest automatycznie wygenerowana strona dokumentacji MediaWiki API.\nDokumentacja i przykłady: https://www.mediawiki.org/wiki/API",
        "api-help-main-header": "Moduł główny",
+       "api-help-undocumented-module": "Brak dokumentacji dla modułu $1.",
        "api-help-flag-deprecated": "Ten moduł jest przestarzały.",
        "api-help-flag-internal": "<strong>Ten moduł jest wewnętrzny lub niestabilny.</strong> Jego działanie może się zmienić bez uprzedzenia.",
        "api-help-flag-readrights": "Ten moduł wymaga praw odczytu.",
index 3ee6330..11f3c2b 100644 (file)
@@ -20,7 +20,6 @@
  *
  * @file
  * @author Tim Starling
- * @author Aaron Schulz
  * @copyright © 2009, Tim Starling, Domas Mituzas
  * @copyright © 2010, Max Sem
  * @copyright © 2011, Antoine Musso
index cbbbfeb..64d4aa7 100644 (file)
@@ -685,7 +685,7 @@ class EnhancedChangesList extends ChangesList {
                }
                $attribs = $data['attribs'];
                unset( $data['attribs'] );
-               $attribs = wfArrayFilterByKey( $attribs, function( $key ) {
+               $attribs = wfArrayFilterByKey( $attribs, function ( $key ) {
                        return $key === 'class' || Sanitizer::isReservedDataAttribute( $key );
                } );
 
index ae3df49..c57eba7 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Copyright 2017
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
@@ -18,7 +16,6 @@
  * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
- * @author Aaron Schulz
  */
 
 use Psr\Log\LoggerAwareInterface;
index 809b660..6d18444 100644 (file)
@@ -93,8 +93,10 @@ class CloneDatabase {
                        self::changePrefix( $this->newTablePrefix );
                        $newTableName = $this->db->tableName( $tbl, 'raw' );
 
+                       // Postgres: Temp tables are automatically deleted upon end of session
+                       //           Same Temp table name hides existing table for current session
                        if ( $this->dropCurrentTables
-                               && !in_array( $this->db->getType(), [ 'postgres', 'oracle' ] )
+                               && !in_array( $this->db->getType(), [ 'oracle' ] )
                        ) {
                                if ( $oldTableName === $newTableName ) {
                                        // Last ditch check to avoid data loss
index baf4637..6359509 100644 (file)
@@ -43,8 +43,7 @@ use UDPTransport;
  *
  * @see \MediaWiki\Logger\LoggerFactory
  * @since 1.25
- * @author Bryan Davis <bd808@wikimedia.org>
- * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
+ * @copyright © 2014 Wikimedia Foundation and contributors
  */
 class LegacyLogger extends AbstractLogger {
 
index 4cf8313..8e750ca 100644 (file)
@@ -32,8 +32,7 @@ namespace MediaWiki\Logger;
  *
  * @see \MediaWiki\Logger\LoggerFactory
  * @since 1.25
- * @author Bryan Davis <bd808@wikimedia.org>
- * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
+ * @copyright © 2014 Wikimedia Foundation and contributors
  */
 class LegacySpi implements Spi {
 
index ce92dbd..c183ff1 100644 (file)
@@ -40,8 +40,7 @@ use ObjectFactory;
  *
  * @see \MediaWiki\Logger\Spi
  * @since 1.25
- * @author Bryan Davis <bd808@wikimedia.org>
- * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
+ * @copyright © 2014 Wikimedia Foundation and contributors
  */
 class LoggerFactory {
 
index f44ff1c..197b269 100644 (file)
@@ -110,8 +110,7 @@ use ObjectFactory;
  *
  * @see https://github.com/Seldaek/monolog
  * @since 1.25
- * @author Bryan Davis <bd808@wikimedia.org>
- * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
+ * @copyright © 2014 Wikimedia Foundation and contributors
  */
 class MonologSpi implements Spi {
 
index 82308d0..4862157 100644 (file)
@@ -34,8 +34,7 @@ use Psr\Log\NullLogger;
  *
  * @see \MediaWiki\Logger\LoggerFactory
  * @since 1.25
- * @author Bryan Davis <bd808@wikimedia.org>
- * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
+ * @copyright © 2014 Wikimedia Foundation and contributors
  */
 class NullSpi implements Spi {
 
index 044789f..8e0875f 100644 (file)
@@ -31,8 +31,7 @@ namespace MediaWiki\Logger;
  *
  * @see \MediaWiki\Logger\LoggerFactory
  * @since 1.25
- * @author Bryan Davis <bd808@wikimedia.org>
- * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
+ * @copyright © 2014 Wikimedia Foundation and contributors
  */
 interface Spi {
 
index 9ec15cb..92624a0 100644 (file)
@@ -29,8 +29,7 @@ use Monolog\Formatter\NormalizerFormatter;
  * delegating the formatting to \MediaWiki\Logger\LegacyLogger.
  *
  * @since 1.25
- * @author Bryan Davis <bd808@wikimedia.org>
- * @copyright © 2013 Bryan Davis and Wikimedia Foundation.
+ * @copyright © 2013 Wikimedia Foundation and contributors
  * @see \MediaWiki\Logger\LegacyLogger
  */
 class LegacyFormatter extends NormalizerFormatter {
index d40414c..58fca8e 100644 (file)
@@ -44,8 +44,7 @@ use UnexpectedValueException;
  * replacement for \Monolog\Handler\StreamHandler.
  *
  * @since 1.25
- * @author Bryan Davis <bd808@wikimedia.org>
- * @copyright © 2013 Bryan Davis and Wikimedia Foundation.
+ * @copyright © 2013 Wikimedia Foundation and contributors
  */
 class LegacyHandler extends AbstractProcessingHandler {
 
index 0ad9b15..5a7ddb1 100644 (file)
@@ -37,8 +37,7 @@ use MWExceptionHandler;
  * will be used to redact the trace information.
  *
  * @since 1.26
- * @author Bryan Davis <bd808@wikimedia.org>
- * @copyright © 2015 Bryan Davis and Wikimedia Foundation.
+ * @copyright © 2015 Wikimedia Foundation and contributors
  */
 class LineFormatter extends MonologLineFormatter {
 
index 104ee58..780ea94 100644 (file)
@@ -43,8 +43,7 @@ use Monolog\Logger;
  * default Logstash syslog input handler.
  *
  * @since 1.25
- * @author Bryan Davis <bd808@wikimedia.org>
- * @copyright © 2015 Bryan Davis and Wikimedia Foundation.
+ * @copyright © 2015 Wikimedia Foundation and contributors
  */
 class SyslogHandler extends SyslogUdpHandler {
 
index ad939a0..5e32887 100644 (file)
@@ -25,8 +25,7 @@ namespace MediaWiki\Logger\Monolog;
  * wiki / request ID, and MediaWiki version.
  *
  * @since 1.25
- * @author Bryan Davis <bd808@wikimedia.org>
- * @copyright © 2013 Bryan Davis and Wikimedia Foundation.
+ * @copyright © 2013 Wikimedia Foundation and contributors
  */
 class WikiProcessor {
 
index b9a259b..c94ae2a 100644 (file)
@@ -124,7 +124,7 @@ class SearchUpdate implements DeferrableUpdate {
                # Language-specific strip/conversion
                $text = $wgContLang->normalizeForSearch( $text );
                $se = $se ?: MediaWikiServices::getInstance()->newSearchEngine();
-               $lc = $se->legalSearchChars() . '&#;';
+               $lc = $se->legalSearchCharsForUpdate() . '&#;';
 
                $text = preg_replace( "/<\\/?\\s*[A-Za-z][^>]*?>/",
                        ' ', $wgContLang->lc( " " . $text . " " ) ); # Strip HTML markup
@@ -207,7 +207,7 @@ class SearchUpdate implements DeferrableUpdate {
                $ns = $this->title->getNamespace();
                $title = $this->title->getText();
 
-               $lc = $search->legalSearchChars() . '&#;';
+               $lc = $search->legalSearchCharsForUpdate() . '&#;';
                $t = $wgContLang->normalizeForSearch( $title );
                $t = preg_replace( "/[^{$lc}]+/", ' ', $t );
                $t = $wgContLang->lc( $t );
index b0ab244..0b58cc1 100644 (file)
@@ -847,7 +847,7 @@ class DifferenceEngine extends ContextSource {
         * @return bool|string
         */
        public function generateTextDiffBody( $otext, $ntext ) {
-               $diff = function() use ( $otext, $ntext ) {
+               $diff = function () use ( $otext, $ntext ) {
                        $time = microtime( true );
 
                        $result = $this->textDiff( $otext, $ntext );
@@ -867,7 +867,7 @@ class DifferenceEngine extends ContextSource {
                 * @param Status $status
                 * @throws FatalError
                 */
-               $error = function( $status ) {
+               $error = function ( $status ) {
                        throw new FatalError( $status->getWikiText() );
                };
 
index 5162a1f..579b6ca 100644 (file)
@@ -16,7 +16,6 @@
  * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
- * @author Aaron Schulz
  */
 
 use Wikimedia\Rdbms\DBConnectionError;
index 260ee17..6cfa083 100644 (file)
@@ -19,7 +19,6 @@
  *
  * @file
  * @ingroup ExternalStorage
- * @author Aaron Schulz
  */
 
 /**
index e65a594..5d0da6d 100644 (file)
@@ -19,7 +19,6 @@
  *
  * @file
  * @ingroup FileBackend
- * @author Aaron Schulz
  */
 use \MediaWiki\Logger\LoggerFactory;
 use MediaWiki\MediaWikiServices;
index aa97c9a..42b36ff 100644 (file)
@@ -19,7 +19,6 @@
  *
  * @file
  * @ingroup FileJournal
- * @author Aaron Schulz
  */
 
 use MediaWiki\MediaWikiServices;
index 1e66e6e..e6f992c 100644 (file)
@@ -27,7 +27,6 @@ use MediaWiki\Logger\LoggerFactory;
  * Class to handle file lock manager registration
  *
  * @ingroup LockManager
- * @author Aaron Schulz
  * @since 1.19
  */
 class LockManagerGroup {
index 2394704..c37a942 100644 (file)
@@ -20,7 +20,6 @@
  * @file
  * @ingroup FileRepo
  * @ingroup FileBackend
- * @author Aaron Schulz
  */
 
 use Wikimedia\Rdbms\DBConnRef;
index f83fd1c..bcd253f 100644 (file)
@@ -73,7 +73,7 @@ class ForeignDBViaLBRepo extends LocalRepo {
         * @return Closure
         */
        protected function getDBFactory() {
-               return function( $index ) {
+               return function ( $index ) {
                        return wfGetLB( $this->wiki )->getConnectionRef( $index, [], $this->wiki );
                };
        }
index d91ab24..20d51c2 100644 (file)
@@ -483,7 +483,7 @@ class LocalRepo extends FileRepo {
         * @return Closure
         */
        protected function getDBFactory() {
-               return function( $index ) {
+               return function ( $index ) {
                        return wfGetDB( $index );
                };
        }
index e1c2546..a412250 100644 (file)
@@ -593,7 +593,7 @@ class LocalFile extends File {
                if ( $upgrade ) {
                        $this->upgrading = true;
                        // Defer updates unless in auto-commit CLI mode
-                       DeferredUpdates::addCallableUpdate( function() {
+                       DeferredUpdates::addCallableUpdate( function () {
                                $this->upgrading = false; // avoid duplicate updates
                                try {
                                        $this->upgradeRow();
index 089213c..10db90c 100644 (file)
@@ -26,7 +26,7 @@ trait HTMLFormElement {
                        // And it's not needed anymore after infusing, so we don't put it in JS config at all.
                        $this->setAttributes( [ 'data-mw-modules' => implode( ',', $this->modules ) ] );
                }
-               $this->registerConfigCallback( function( &$config ) {
+               $this->registerConfigCallback( function ( &$config ) {
                        if ( $this->hideIf !== null ) {
                                $config['hideIf'] = $this->hideIf;
                        }
index 8829f66..53d1d06 100644 (file)
@@ -23,7 +23,7 @@ class HTMLUsersMultiselectField extends HTMLUserTextField {
 
                $usersArray = explode( "\n", $request->getText( $this->mName ) );
                // Remove empty lines
-               $usersArray = array_values( array_filter( $usersArray, function( $username ) {
+               $usersArray = array_values( array_filter( $usersArray, function ( $username ) {
                        return trim( $username ) !== '';
                } ) );
                return $usersArray;
index 6113573..6c56b3d 100644 (file)
@@ -336,7 +336,7 @@ abstract class DatabaseInstaller {
                $services = \MediaWiki\MediaWikiServices::getInstance();
 
                $connection = $status->value;
-               $services->redefineService( 'DBLoadBalancerFactory', function() use ( $connection ) {
+               $services->redefineService( 'DBLoadBalancerFactory', function () use ( $connection ) {
                        return LBFactorySingle::newFromConnection( $connection );
                } );
        }
index 7028224..168d7ed 100644 (file)
@@ -384,7 +384,7 @@ abstract class Installer {
 
                // make sure we use the installer config as the main config
                $configRegistry = $baseConfig->get( 'ConfigRegistry' );
-               $configRegistry['main'] = function() use ( $installerConfig ) {
+               $configRegistry['main'] = function () use ( $installerConfig ) {
                        return $installerConfig;
                };
 
index 9701dd9..d20a233 100644 (file)
@@ -19,7 +19,6 @@
  *
  * @file
  * @defgroup JobQueue JobQueue
- * @author Aaron Schulz
  */
 use MediaWiki\MediaWikiServices;
 
index 9b9928d..cefe74d 100644 (file)
@@ -18,7 +18,6 @@
  * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
- * @author Aaron Schulz
  */
 use Wikimedia\Rdbms\IDatabase;
 use Wikimedia\Rdbms\DBConnRef;
index bd832db..7fdd617 100644 (file)
@@ -18,7 +18,6 @@
  * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
- * @author Aaron Schulz
  */
 
 /**
index 5d5ea26..ef0ecb3 100644 (file)
@@ -18,7 +18,6 @@
  * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
- * @author Aaron Schulz
  */
 
 /**
index 2866c7f..649e2af 100644 (file)
@@ -18,7 +18,6 @@
  * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
- * @author Aaron Schulz
  */
 
 /**
index eb91680..7dad014 100644 (file)
@@ -18,7 +18,6 @@
  * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
- * @author Aaron Schulz
  */
 use Psr\Log\LoggerInterface;
 
index 4169974..7ce2c74 100644 (file)
@@ -18,7 +18,6 @@
  * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
- * @author Aaron Schulz
  */
 
 /**
index d9457c6..db07086 100644 (file)
@@ -18,7 +18,6 @@
  * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
- * @author Aaron Schulz
  */
 use Psr\Log\LoggerInterface;
 
index 6357967..da4ec23 100644 (file)
@@ -16,7 +16,6 @@
  * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
- * @author Aaron Schulz
  * @ingroup JobQueue
  */
 
index eb367af..ca57d62 100644 (file)
@@ -16,7 +16,6 @@
  * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
- * @author Aaron Schulz
  * @ingroup JobQueue
  */
 use MediaWiki\MediaWikiServices;
index 1c12a1c..76f8d6d 100644 (file)
@@ -19,7 +19,6 @@
  *
  * @file
  * @ingroup JobQueue
- * @author Aaron Schulz
  */
 
 /**
index c504f35..ea0f1b7 100644 (file)
@@ -356,7 +356,7 @@ class CSSMin {
 
                // Re-insert comments
                $pattern = '/' . CSSMin::PLACEHOLDER . '(\d+)x/';
-               $source = preg_replace_callback( $pattern, function( $match ) use ( &$comments ) {
+               $source = preg_replace_callback( $pattern, function ( $match ) use ( &$comments ) {
                        return $comments[ $match[1] ];
                }, $source );
 
index 4ddb813..a4aabcd 100644 (file)
@@ -18,7 +18,6 @@
  * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
- * @author Aaron Schulz
  */
 
 /**
@@ -179,7 +178,7 @@ class HashRing {
                if ( $this->liveRing === null || $this->ejectionNextExpiry <= $now ) {
                        $this->ejectionExpiries = array_filter(
                                $this->ejectionExpiries,
-                               function( $expiry ) use ( $now ) {
+                               function ( $expiry ) use ( $now ) {
                                        return ( $expiry > $now );
                                }
                        );
index a6aa0a3..e8b0e6a 100644 (file)
@@ -18,7 +18,7 @@
  * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
- * @author Antoine Musso "<hashar at free dot fr>", Aaron Schulz
+ * @author Antoine Musso "<hashar at free dot fr>"
  */
 
 use IPSet\IPSet;
index 73ffb14..d60af34 100644 (file)
@@ -18,7 +18,6 @@
  * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
- * @author Aaron Schulz
  */
 
 /**
index e9922b9..9d6b734 100644 (file)
@@ -43,7 +43,6 @@ use Psr\Log\NullLogger;
  *                  - relayResponseHeaders : write out header via header()
  * Request maps can use integer index 0 instead of 'method' and 1 instead of 'url'.
  *
- * @author Aaron Schulz
  * @since 1.23
  */
 class MultiHttpClient implements LoggerAwareInterface {
index c96a8a1..6c47c3c 100644 (file)
@@ -21,8 +21,7 @@
 /**
  * Construct objects from configuration instructions.
  *
- * @author Bryan Davis <bd808@wikimedia.org>
- * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
+ * @copyright © 2014 Wikimedia Foundation and contributors
  */
 class ObjectFactory {
 
index c6da432..2383d2a 100644 (file)
@@ -25,8 +25,7 @@ use RunningStat\RunningStat;
  * <https://github.com/phacility/xhprof>. XHProf can be installed as a PECL
  * package for use with PHP5 (Zend PHP) and is built-in to HHVM 3.3.0.
  *
- * @author Bryan Davis <bd808@wikimedia.org>
- * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
+ * @copyright © 2014 Wikimedia Foundation and contributors
  * @since 1.28
  */
 class XhprofData {
index 304f6c1..0cc9b3d 100644 (file)
@@ -16,7 +16,6 @@
  * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
- * @author Aaron Schulz
  */
 use Psr\Log\LoggerInterface;
 use Psr\Log\LoggerAwareInterface;
index b8ec55f..d933dd4 100644 (file)
@@ -16,7 +16,6 @@
  * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
- * @author Aaron Schulz
  */
 
 /**
index 4f0805b..30548ef 100644 (file)
@@ -19,7 +19,6 @@
  *
  * @file
  * @ingroup FileBackend
- * @author Aaron Schulz
  */
 use Wikimedia\Timestamp\ConvertibleTimestamp;
 
index 15f13b9..6f51081 100644 (file)
@@ -26,7 +26,6 @@
  *
  * @file
  * @ingroup FileBackend
- * @author Aaron Schulz
  */
 use Psr\Log\LoggerAwareInterface;
 use Psr\Log\LoggerInterface;
index 53bce33..f8ca7e5 100644 (file)
@@ -19,7 +19,6 @@
  *
  * @file
  * @ingroup FileBackend
- * @author Aaron Schulz
  */
 
 /**
@@ -196,7 +195,7 @@ class FileBackendMultiWrite extends FileBackend {
                                if ( $this->asyncWrites && !$this->hasVolatileSources( $ops ) ) {
                                        // Bind $scopeLock to the callback to preserve locks
                                        DeferredUpdates::addCallableUpdate(
-                                               function() use ( $backend, $realOps, $opts, $scopeLock, $relevantPaths ) {
+                                               function () use ( $backend, $realOps, $opts, $scopeLock, $relevantPaths ) {
                                                        wfDebugLog( 'FileOperationReplication',
                                                                "'{$backend->getName()}' async replication; paths: " .
                                                                FormatJson::encode( $relevantPaths ) );
@@ -508,7 +507,7 @@ class FileBackendMultiWrite extends FileBackend {
                        $realOps = $this->substOpBatchPaths( $ops, $backend );
                        if ( $this->asyncWrites && !$this->hasVolatileSources( $ops ) ) {
                                DeferredUpdates::addCallableUpdate(
-                                       function() use ( $backend, $realOps ) {
+                                       function () use ( $backend, $realOps ) {
                                                $backend->doQuickOperations( $realOps );
                                        }
                                );
@@ -562,7 +561,7 @@ class FileBackendMultiWrite extends FileBackend {
                        $realParams = $this->substOpPaths( $params, $backend );
                        if ( $this->asyncWrites ) {
                                DeferredUpdates::addCallableUpdate(
-                                       function() use ( $backend, $method, $realParams ) {
+                                       function () use ( $backend, $method, $realParams ) {
                                                $backend->$method( $realParams );
                                        }
                                );
index 039bd42..9bfdbe8 100644 (file)
@@ -19,7 +19,6 @@
  *
  * @file
  * @ingroup FileBackend
- * @author Aaron Schulz
  */
 use Wikimedia\Timestamp\ConvertibleTimestamp;
 
index 71b5c7d..2324098 100644 (file)
@@ -19,7 +19,6 @@
  *
  * @file
  * @ingroup FileBackend
- * @author Aaron Schulz
  */
 
 /**
index 44fe2cb..0341a2a 100644 (file)
@@ -19,7 +19,6 @@
  *
  * @file
  * @ingroup FileBackend
- * @author Aaron Schulz
  */
 
 /**
index 029f94c..044e976 100644 (file)
@@ -20,7 +20,6 @@
  * @file
  * @ingroup FileBackend
  * @author Russ Nelson
- * @author Aaron Schulz
  */
 
 /**
index e3b8c51..527de6a 100644 (file)
@@ -19,7 +19,6 @@
  *
  * @file
  * @ingroup FileBackend
- * @author Aaron Schulz
  */
 
 /**
index 120ca2b..f45b055 100644 (file)
@@ -17,7 +17,6 @@
  *
  * @file
  * @ingroup FileBackend
- * @author Aaron Schulz
  */
 
 /**
index 79af194..30578fa 100644 (file)
@@ -19,7 +19,6 @@
  *
  * @file
  * @ingroup FileBackend
- * @author Aaron Schulz
  */
 use Psr\Log\LoggerInterface;
 
index fee3f4a..55dca51 100644 (file)
@@ -19,7 +19,6 @@
  *
  * @file
  * @ingroup FileBackend
- * @author Aaron Schulz
  */
 
 /**
index ed23e81..9121759 100644 (file)
@@ -19,7 +19,6 @@
  *
  * @file
  * @ingroup FileBackend
- * @author Aaron Schulz
  */
 
 /**
index b97b410..bba762f 100644 (file)
@@ -19,7 +19,6 @@
  *
  * @file
  * @ingroup FileBackend
- * @author Aaron Schulz
  */
 
 /**
index c629e7d..a6257bf 100644 (file)
@@ -26,7 +26,6 @@ use Wikimedia\WaitConditionLoop;
  *
  * @file
  * @ingroup LockManager
- * @author Aaron Schulz
  */
 
 /**
index 5ad558f..b83462c 100644 (file)
@@ -19,7 +19,6 @@
  *
  * @file
  * @ingroup LockManager
- * @author Aaron Schulz
  */
 
 /**
index ac8bee8..e10606a 100644 (file)
@@ -19,7 +19,6 @@
  *
  * @file
  * @ingroup LockManager
- * @author Aaron Schulz
  */
 
 /**
index 77c4259..7cd678b 100644 (file)
@@ -475,7 +475,7 @@ abstract class BagOStuff implements IExpiringStore, LoggerAwareInterface {
 
                $lSince = microtime( true ); // lock timestamp
 
-               return new ScopedCallback( function() use ( $key, $lSince, $expiry ) {
+               return new ScopedCallback( function () use ( $key, $lSince, $expiry ) {
                        $latency = .050; // latency skew (err towards keeping lock present)
                        $age = ( microtime( true ) - $lSince + $latency );
                        if ( ( $age + $latency ) >= $expiry ) {
index 0842e04..ff7e91a 100644 (file)
@@ -17,7 +17,6 @@
  *
  * @file
  * @ingroup Cache
- * @author Aaron Schulz
  */
 
 use Psr\Log\LoggerAwareInterface;
index 956a3a9..1696c59 100644 (file)
@@ -17,7 +17,6 @@
  *
  * @file
  * @ingroup Cache
- * @author Aaron Schulz
  */
 
 use Psr\Log\LoggerAwareInterface;
index 823e0dc..256f744 100644 (file)
@@ -19,7 +19,6 @@
  *
  * @file
  * @ingroup Profiler
- * @author Aaron Schulz
  */
 
 namespace Wikimedia\Rdbms;
@@ -156,11 +155,13 @@ class TransactionProfiler implements LoggerAwareInterface {
         */
        public function recordConnection( $server, $db, $isMaster ) {
                // Report when too many connections happen...
-               if ( $this->hits['conns']++ == $this->expect['conns'] ) {
-                       $this->reportExpectationViolated( 'conns', "[connect to $server ($db)]" );
+               if ( $this->hits['conns']++ >= $this->expect['conns'] ) {
+                       $this->reportExpectationViolated(
+                               'conns', "[connect to $server ($db)]", $this->hits['conns'] );
                }
-               if ( $isMaster && $this->hits['masterConns']++ == $this->expect['masterConns'] ) {
-                       $this->reportExpectationViolated( 'masterConns', "[connect to $server ($db)]" );
+               if ( $isMaster && $this->hits['masterConns']++ >= $this->expect['masterConns'] ) {
+                       $this->reportExpectationViolated(
+                               'masterConns', "[connect to $server ($db)]", $this->hits['masterConns'] );
                }
        }
 
@@ -211,11 +212,11 @@ class TransactionProfiler implements LoggerAwareInterface {
                }
 
                // Report when too many writes/queries happen...
-               if ( $this->hits['queries']++ == $this->expect['queries'] ) {
-                       $this->reportExpectationViolated( 'queries', $query );
+               if ( $this->hits['queries']++ >= $this->expect['queries'] ) {
+                       $this->reportExpectationViolated( 'queries', $query, $this->hits['queries'] );
                }
-               if ( $isWrite && $this->hits['writes']++ == $this->expect['writes'] ) {
-                       $this->reportExpectationViolated( 'writes', $query );
+               if ( $isWrite && $this->hits['writes']++ >= $this->expect['writes'] ) {
+                       $this->reportExpectationViolated( 'writes', $query, $this->hits['writes'] );
                }
                // Report slow queries...
                if ( !$isWrite && $elapsed > $this->expect['readQueryTime'] ) {
index afeffb3..559c28b 100644 (file)
@@ -1822,8 +1822,10 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
        }
 
        /**
-        * @param string $name Table name
-        * @return array (DB name, schema name, table prefix, table name)
+        * Get the table components needed for a query given the currently selected database
+        *
+        * @param string $name Table name in the form of db.schema.table, db.table, or table
+        * @return array (DB name or "" for default, schema name, table prefix, table name)
         */
        protected function qualifiedTableComponents( $name ) {
                # We reverse the explode so that database.table and table both output the correct table.
index e237ef4..8d19bc1 100644 (file)
@@ -527,25 +527,23 @@ abstract class DatabaseMysqlBase extends Database {
        }
 
        public function tableExists( $table, $fname = __METHOD__ ) {
-               $table = $this->tableName( $table, 'raw' );
-               if ( isset( $this->mSessionTempTables[$table] ) ) {
-                       return true; // already known to exist and won't show in SHOW TABLES anyway
-               }
-
                // Split database and table into proper variables as Database::tableName() returns
                // shared tables prefixed with their database, which do not work in SHOW TABLES statements
-               list( $database, $schema, $prefix, $table ) = $this->qualifiedTableComponents( $table );
+               list( $database, , $prefix, $table ) = $this->qualifiedTableComponents( $table );
+               $tableName = "{$prefix}{$table}";
 
-               $table = $prefix . $table;
+               if ( isset( $this->mSessionTempTables[$tableName] ) ) {
+                       return true; // already known to exist and won't show in SHOW TABLES anyway
+               }
 
                // We can't use buildLike() here, because it specifies an escape character
                // other than the backslash, which is the only one supported by SHOW TABLES
-               $encLike = $this->escapeLikeInternal( $table, '\\' );
+               $encLike = $this->escapeLikeInternal( $tableName, '\\' );
 
-               // If the database has been specified (such as for shared tables), add a FROM $database clause
+               // If the database has been specified (such as for shared tables), use "FROM"
                if ( $database !== '' ) {
-                       $database = $this->addIdentifierQuotes( $database );
-                       $query = "SHOW TABLES FROM $database LIKE '$encLike'";
+                       $encDatabase = $this->addIdentifierQuotes( $database );
+                       $query = "SHOW TABLES FROM $encDatabase LIKE '$encLike'";
                } else {
                        $query = "SHOW TABLES LIKE '$encLike'";
                }
index 60b6855..9242414 100644 (file)
@@ -1046,4 +1046,3 @@ class DatabaseSqlite extends Database {
 }
 
 class_alias( DatabaseSqlite::class, 'DatabaseSqlite' );
-
index fd79773..62a078c 100644 (file)
@@ -28,4 +28,3 @@ class DBTransactionError extends DBExpectedError {
 }
 
 class_alias( DBTransactionError::class, 'DBTransactionError' );
-
index 3567204..919f103 100644 (file)
@@ -530,7 +530,7 @@ abstract class LBFactory implements ILBFactory {
                        $prefix
                );
 
-               $this->forEachLB( function( ILoadBalancer $lb ) use ( $prefix ) {
+               $this->forEachLB( function ( ILoadBalancer $lb ) use ( $prefix ) {
                        $lb->setDomainPrefix( $prefix );
                } );
        }
index 79827a2..acb4dce 100644 (file)
@@ -19,7 +19,6 @@
  *
  * @file
  * @ingroup Database
- * @author Aaron Schulz
  */
 namespace Wikimedia\Rdbms;
 
index 0fc00a8..0b70010 100644 (file)
@@ -1257,7 +1257,7 @@ class LoadBalancer implements ILoadBalancer {
                                // This happens if onTransactionIdle() callbacks leave callbacks on *another* DB
                                // (which finished its callbacks already). Warn and recover in this case. Let the
                                // callbacks run in the final commitMasterChanges() in LBFactory::shutdown().
-                               $this->queryLogger->error( __METHOD__ . ": found writes/callbacks pending." );
+                               $this->queryLogger->info( __METHOD__ . ": found writes/callbacks pending." );
                                return;
                        } elseif ( $conn->trxLevel() ) {
                                // This happens for single-DB setups where DB_REPLICA uses the master DB,
index f2bb855..d330d3c 100644 (file)
@@ -16,7 +16,6 @@
  * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
- * @author Aaron Schulz
  */
 use Psr\Log\LoggerInterface;
 use Psr\Log\LoggerAwareInterface;
index e3fc1a6..99c2c3c 100644 (file)
@@ -19,7 +19,6 @@
  *
  * @file
  * @defgroup Redis Redis
- * @author Aaron Schulz
  */
 
 use Psr\Log\LoggerAwareInterface;
index a8af714..526f120 100644 (file)
@@ -55,7 +55,7 @@ class SamplingStatsdClient extends StatsdClient {
                        $samplingRates = [ '*' => $sampleRate ];
                }
                if ( $samplingRates ) {
-                       array_walk( $data, function( $item ) use ( $samplingRates ) {
+                       array_walk( $data, function ( $item ) use ( $samplingRates ) {
                                /** @var $item StatsdData */
                                foreach ( $samplingRates as $pattern => $rate ) {
                                        if ( fnmatch( $pattern, $item->getKey(), FNM_NOESCAPE ) ) {
index 1b7545a..e3b9376 100644 (file)
@@ -40,7 +40,6 @@
  *   - stream   : resource to stream the HTTP response body to
  * Request maps can use integer index 0 instead of 'method' and 1 instead of 'url'.
  *
- * @author Aaron Schulz
  * @since 1.23
  */
 class VirtualRESTServiceClient {
@@ -103,7 +102,7 @@ class VirtualRESTServiceClient {
         * @return array (prefix,VirtualRESTService) or (null,null) if none found
         */
        public function getMountAndService( $path ) {
-               $cmpFunc = function( $a, $b ) {
+               $cmpFunc = function ( $a, $b ) {
                        $al = substr_count( $a, '/' );
                        $bl = substr_count( $b, '/' );
                        if ( $al === $bl ) {
@@ -207,7 +206,7 @@ class VirtualRESTServiceClient {
                }
 
                // Function to get IDs that won't collide with keys in $armoredIndexMap
-               $idFunc = function() use ( &$curUniqueId ) {
+               $idFunc = function () use ( &$curUniqueId ) {
                        return $curUniqueId++;
                };
 
index d26b304..43cb44c 100644 (file)
@@ -38,7 +38,7 @@ class PageDataRequestHandler {
                $parts = explode( '/', $subPage, 2 );
                if ( $parts !== 2 ) {
                        $slot = $parts[0];
-                       if ( $slot === 'main' or $slot === '' ) {
+                       if ( $slot === 'main' || $slot === '' ) {
                                return true;
                        }
                }
index c5501cb..1463499 100644 (file)
@@ -2,7 +2,7 @@
 /**
  * Contain classes to list log entries
  *
- * Copyright © 2004 Brion Vibber <brion@pobox.com>, 2008 Aaron Schulz
+ * Copyright © 2004 Brion Vibber <brion@pobox.com>
  * https://www.mediawiki.org/
  *
  * This program is free software; you can redistribute it and/or modify
index e02b8a6..11dce31 100644 (file)
@@ -2,7 +2,7 @@
 /**
  * Contain classes to list log entries
  *
- * Copyright © 2004 Brion Vibber <brion@pobox.com>, 2008 Aaron Schulz
+ * Copyright © 2004 Brion Vibber <brion@pobox.com>
  * https://www.mediawiki.org/
  *
  * This program is free software; you can redistribute it and/or modify
index 791330c..4b4d19f 100644 (file)
@@ -176,7 +176,7 @@ class RightsLogFormatter extends LogFormatter {
                        $oldmetadata =& $params['oldmetadata'];
                        // unset old metadata entry to ensure metadata goes at the end of the params array
                        unset( $params['oldmetadata'] );
-                       $params['oldmetadata'] = array_map( function( $index ) use ( $params, $oldmetadata ) {
+                       $params['oldmetadata'] = array_map( function ( $index ) use ( $params, $oldmetadata ) {
                                $result = [ 'group' => $params['4:array:oldgroups'][$index] ];
                                if ( isset( $oldmetadata[$index] ) ) {
                                        $result += $oldmetadata[$index];
@@ -194,7 +194,7 @@ class RightsLogFormatter extends LogFormatter {
                        $newmetadata =& $params['newmetadata'];
                        // unset old metadata entry to ensure metadata goes at the end of the params array
                        unset( $params['newmetadata'] );
-                       $params['newmetadata'] = array_map( function( $index ) use ( $params, $newmetadata ) {
+                       $params['newmetadata'] = array_map( function ( $index ) use ( $params, $newmetadata ) {
                                $result = [ 'group' => $params['5:array:newgroups'][$index] ];
                                if ( isset( $newmetadata[$index] ) ) {
                                        $result += $newmetadata[$index];
index 0e23a88..5c7c7fe 100644 (file)
@@ -3334,7 +3334,7 @@ class WikiPage implements Page, IDBAccessObject {
                HTMLFileCache::clearFileCache( $title );
 
                $revid = $revision ? $revision->getId() : null;
-               DeferredUpdates::addCallableUpdate( function() use ( $title, $revid ) {
+               DeferredUpdates::addCallableUpdate( function () use ( $title, $revid ) {
                        InfoAction::invalidateCache( $title, $revid );
                } );
        }
index 901d576..d3cb566 100644 (file)
@@ -99,13 +99,6 @@ abstract class RangeChronologicalPager extends ReverseChronologicalPager {
         * @return array
         */
        protected function buildQueryInfo( $offset, $limit, $descending ) {
-               if ( count( $this->rangeConds ) > 0 ) {
-                       // If range conditions are set, $offset is not used.
-                       // However, if range conditions aren't set, (such as when using paging links)
-                       // use the provided offset to get the proper query.
-                       $offset = '';
-               }
-
                list( $tables, $fields, $conds, $fname, $options, $join_conds ) = parent::buildQueryInfo(
                        $offset,
                        $limit,
index c83198f..b0d0e5c 100644 (file)
@@ -6070,7 +6070,7 @@ class Parser {
                $e = new Exception;
                $this->mInParse = $e->getTraceAsString();
 
-               $recursiveCheck = new ScopedCallback( function() {
+               $recursiveCheck = new ScopedCallback( function () {
                        $this->mInParse = false;
                } );
 
index 1f0e19e..76a7e1e 100644 (file)
@@ -138,20 +138,6 @@ class ParserCache {
         * @return bool|mixed|string
         */
        public function getKey( $article, $popts, $useOutdated = true ) {
-               $dummy = null;
-               return $this->getKeyReal( $article, $popts, $useOutdated, $dummy );
-       }
-
-       /**
-        * Temporary internal function to allow accessing $usedOptions
-        * @todo Merge this back to self::getKey() when ParserOptions::optionsHashPre30() is removed
-        * @param WikiPage $article
-        * @param ParserOptions $popts
-        * @param bool $useOutdated (default true)
-        * @param array &$usedOptions Don't use this, it will go away soon
-        * @return bool|mixed|string
-        */
-       private function getKeyReal( $article, $popts, $useOutdated, &$usedOptions ) {
                global $wgCacheEpoch;
 
                if ( $popts instanceof User ) {
@@ -218,8 +204,7 @@ class ParserCache {
 
                $touched = $article->getTouched();
 
-               $usedOptions = null;
-               $parserOutputKey = $this->getKeyReal( $article, $popts, $useOutdated, $usedOptions );
+               $parserOutputKey = $this->getKey( $article, $popts, $useOutdated );
                if ( $parserOutputKey === false ) {
                        wfIncrStats( 'pcache.miss.absent' );
                        return false;
@@ -228,13 +213,6 @@ class ParserCache {
                $casToken = null;
                /** @var ParserOutput $value */
                $value = $this->mMemc->get( $parserOutputKey, $casToken, BagOStuff::READ_VERIFIED );
-               if ( !$value ) {
-                       $parserOutputKey = $this->getParserOutputKey(
-                               $article,
-                               $popts->optionsHashPre30( $usedOptions, $article->getTitle() )
-                       );
-                       $value = $this->mMemc->get( $parserOutputKey, $casToken, BagOStuff::READ_VERIFIED );
-               }
                if ( !$value ) {
                        wfDebug( "ParserOutput cache miss.\n" );
                        wfIncrStats( "pcache.miss.absent" );
@@ -327,13 +305,6 @@ class ParserCache {
                        // ...and its pointer
                        $this->mMemc->set( $this->getOptionsKey( $page ), $optionsKey, $expire );
 
-                       // Normally, when there was no key change, the above would have
-                       // overwritten the old entry. Delete that old entry to save disk
-                       // space.
-                       $oldParserOutputKey = $this->getParserOutputKey( $page,
-                               $popts->optionsHashPre30( $optionsKey->mUsedOptions, $page->getTitle() ) );
-                       $this->mMemc->delete( $oldParserOutputKey );
-
                        Hooks::run(
                                'ParserCacheSaveComplete',
                                [ $this, $parserOutput, $page->getTitle(), $popts, $revId ]
index 5be0321..4809917 100644 (file)
@@ -1269,8 +1269,7 @@ class ParserOptions {
                // Feb 2015 (instead the parser outputs a constant placeholder and post-parse
                // processing handles the option). But Wikibase forces it in $forOptions
                // and expects the cache key to still vary on it for T85252.
-               // @todo Deprecate and remove this behavior after optionsHashPre30() is
-               //  removed (Wikibase can use addExtraKey() or something instead).
+               // @deprecated since 1.30, Wikibase should use addExtraKey() or something instead.
                if ( in_array( 'editsection', $forOptions, true ) ) {
                        $options['editsection'] = $this->mEditSection;
                        $defaults['editsection'] = true;
@@ -1321,98 +1320,6 @@ class ParserOptions {
                return $confstr;
        }
 
-       /**
-        * Generate the hash used before MediaWiki 1.30
-        * @since 1.30
-        * @deprecated since 1.30. Do not use this unless you're ParserCache.
-        * @param array $forOptions
-        * @param Title $title Used to get the content language of the page (since r97636)
-        * @return string Page rendering hash
-        */
-       public function optionsHashPre30( $forOptions, $title = null ) {
-               global $wgRenderHashAppend;
-
-               // FIXME: Once the cache key is reorganized this argument
-               // can be dropped. It was used when the math extension was
-               // part of core.
-               $confstr = '*';
-
-               // Space assigned for the stubthreshold but unused
-               // since it disables the parser cache, its value will always
-               // be 0 when this function is called by parsercache.
-               if ( in_array( 'stubthreshold', $forOptions ) ) {
-                       $confstr .= '!' . $this->options['stubthreshold'];
-               } else {
-                       $confstr .= '!*';
-               }
-
-               if ( in_array( 'dateformat', $forOptions ) ) {
-                       $confstr .= '!' . $this->getDateFormat();
-               }
-
-               if ( in_array( 'numberheadings', $forOptions ) ) {
-                       $confstr .= '!' . ( $this->options['numberheadings'] ? '1' : '' );
-               } else {
-                       $confstr .= '!*';
-               }
-
-               if ( in_array( 'userlang', $forOptions ) ) {
-                       $confstr .= '!' . $this->options['userlang']->getCode();
-               } else {
-                       $confstr .= '!*';
-               }
-
-               if ( in_array( 'thumbsize', $forOptions ) ) {
-                       $confstr .= '!' . $this->options['thumbsize'];
-               } else {
-                       $confstr .= '!*';
-               }
-
-               // add in language specific options, if any
-               // @todo FIXME: This is just a way of retrieving the url/user preferred variant
-               if ( !is_null( $title ) ) {
-                       $confstr .= $title->getPageLanguage()->getExtraHashOptions();
-               } else {
-                       global $wgContLang;
-                       $confstr .= $wgContLang->getExtraHashOptions();
-               }
-
-               $confstr .= $wgRenderHashAppend;
-
-               // @note: as of Feb 2015, core never sets the editsection flag, since it uses
-               // <mw:editsection> tags to inject editsections on the fly. However, extensions
-               // may be using it by calling ParserOption::optionUsed resp. ParserOutput::registerOption
-               // directly. At least Wikibase does at this point in time.
-               if ( !in_array( 'editsection', $forOptions ) ) {
-                       $confstr .= '!*';
-               } elseif ( !$this->mEditSection ) {
-                       $confstr .= '!edit=0';
-               }
-
-               if ( $this->options['printable'] && in_array( 'printable', $forOptions ) ) {
-                       $confstr .= '!printable=1';
-               }
-
-               if ( $this->options['wrapclass'] !== 'mw-parser-output' &&
-                       in_array( 'wrapclass', $forOptions )
-               ) {
-                       $confstr .= '!wrapclass=' . $this->options['wrapclass'];
-               }
-
-               if ( $this->mExtraKey != '' ) {
-                       $confstr .= $this->mExtraKey;
-               }
-
-               // Give a chance for extensions to modify the hash, if they have
-               // extra options or other effects on the parser cache.
-               Hooks::run( 'PageRenderingHash', [ &$confstr, $this->getUser(), &$forOptions ] );
-
-               // Make it a valid memcached key fragment
-               $confstr = str_replace( ' ', '_', $confstr );
-
-               return $confstr;
-       }
-
        /**
         * Test whether these options are safe to cache
         * @since 1.30
index 5a15ddf..65ea833 100644 (file)
@@ -16,7 +16,6 @@
  * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
- * @author Aaron Schulz
  */
 use Psr\Log\LoggerInterface;
 
index 0ce8087..41260a8 100644 (file)
@@ -27,7 +27,6 @@
  * $wgProfiler['visible'] = true;
  * @endcode
  *
- * @author Aaron Schulz
  * @ingroup Profiler
  * @since 1.25
  */
@@ -73,7 +72,7 @@ class ProfilerSectionOnly extends Profiler {
         */
        protected function getFunctionReport() {
                $data = $this->getFunctionStats();
-               usort( $data, function( $a, $b ) {
+               usort( $data, function ( $a, $b ) {
                        if ( $a['real'] === $b['real'] ) {
                                return 0;
                        }
index 1bf4f54..09191ee 100644 (file)
@@ -47,8 +47,7 @@
  * a drop-in replacement for Xhprof. Just change the XHPROF_FLAGS_* constants
  * to TIDEWAYS_FLAGS_*.
  *
- * @author Bryan Davis <bd808@wikimedia.org>
- * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
+ * @copyright © 2014 Wikimedia Foundation and contributors
  * @ingroup Profiler
  * @see Xhprof
  * @see https://php.net/xhprof
@@ -201,7 +200,7 @@ class ProfilerXhprof extends Profiler {
         */
        protected function getFunctionReport() {
                $data = $this->getFunctionStats();
-               usort( $data, function( $a, $b ) {
+               usort( $data, function ( $a, $b ) {
                        if ( $a['real'] === $b['real'] ) {
                                return 0;
                        }
index 7e3c398..fdfb24d 100644 (file)
@@ -19,7 +19,6 @@
  *
  * @file
  * @ingroup Profiler
- * @author Aaron Schulz
  */
 use Wikimedia\ScopedCallback;
 
index 39a8a3d..ce262bd 100644 (file)
@@ -378,7 +378,7 @@ class ExtensionProcessor implements Processor {
 
        protected function extractExtensionMessagesFiles( $dir, array $info ) {
                if ( isset( $info['ExtensionMessagesFiles'] ) ) {
-                       $this->globals["wgExtensionMessagesFiles"] += array_map( function( $file ) use ( $dir ) {
+                       $this->globals["wgExtensionMessagesFiles"] += array_map( function ( $file ) use ( $dir ) {
                                return "$dir/$file";
                        }, $info['ExtensionMessagesFiles'] );
                }
index 0c5a67e..eac04a9 100644 (file)
@@ -400,7 +400,7 @@ class ExtensionRegistry {
        protected function processAutoLoader( $dir, array $info ) {
                if ( isset( $info['AutoloadClasses'] ) ) {
                        // Make paths absolute, relative to the JSON file
-                       return array_map( function( $file ) use ( $dir ) {
+                       return array_map( function ( $file ) use ( $dir ) {
                                return "$dir/$file";
                        }, $info['AutoloadClasses'] );
                } else {
index 4473bb2..7d05265 100644 (file)
@@ -206,7 +206,7 @@ abstract class SearchEngine {
        }
 
        /**
-        * Get chars legal for search.
+        * Get chars legal for search (at query time).
         * NOTE: usage as static is deprecated and preserved only as BC measure
         * @return string
         */
@@ -214,6 +214,16 @@ abstract class SearchEngine {
                return "A-Za-z_'.0-9\\x80-\\xFF\\-";
        }
 
+       /**
+        * Get chars legal for search (at index time).
+        *
+        * @since 1.30
+        * @return string
+        */
+       public function legalSearchCharsForUpdate() {
+               return static::legalSearchChars();
+       }
+
        /**
         * Set the maximum number of results to return
         * and how many to skip before returning the first.
@@ -236,7 +246,7 @@ abstract class SearchEngine {
                if ( $namespaces ) {
                        // Filter namespaces to only keep valid ones
                        $validNs = $this->searchableNamespaces();
-                       $namespaces = array_filter( $namespaces, function( $ns ) use( $validNs ) {
+                       $namespaces = array_filter( $namespaces, function ( $ns ) use( $validNs ) {
                                return $ns < 0 || isset( $validNs[$ns] );
                        } );
                } else {
@@ -464,7 +474,7 @@ abstract class SearchEngine {
                        }
                }
 
-               $ns = array_map( function( $space ) {
+               $ns = array_map( function ( $space ) {
                        return $space == NS_MEDIA ? NS_FILE : $space;
                }, $ns );
 
@@ -550,7 +560,7 @@ abstract class SearchEngine {
         * @return Title[]
         */
        public function extractTitles( SearchSuggestionSet $completionResults ) {
-               return $completionResults->map( function( SearchSuggestion $sugg ) {
+               return $completionResults->map( function ( SearchSuggestion $sugg ) {
                        return $sugg->getSuggestedTitle();
                } );
        }
@@ -564,14 +574,14 @@ abstract class SearchEngine {
        protected function processCompletionResults( $search, SearchSuggestionSet $suggestions ) {
                $search = trim( $search );
                // preload the titles with LinkBatch
-               $titles = $suggestions->map( function( SearchSuggestion $sugg ) {
+               $titles = $suggestions->map( function ( SearchSuggestion $sugg ) {
                        return $sugg->getSuggestedTitle();
                } );
                $lb = new LinkBatch( $titles );
                $lb->setCaller( __METHOD__ );
                $lb->execute();
 
-               $results = $suggestions->map( function( SearchSuggestion $sugg ) {
+               $results = $suggestions->map( function ( SearchSuggestion $sugg ) {
                        return $sugg->getSuggestedTitle()->getPrefixedText();
                } );
 
index 36cbbaa..2c7feeb 100644 (file)
@@ -149,8 +149,8 @@ class SearchMySQL extends SearchDatabase {
                return $regex;
        }
 
-       public static function legalSearchChars() {
-               return "\"*" . parent::legalSearchChars();
+       public function legalSearchCharsForUpdate() {
+               return "\"*" . parent::legalSearchCharsForUpdate();
        }
 
        /**
index c5a5ef1..2e6cb84 100644 (file)
@@ -266,7 +266,7 @@ class SearchOracle extends SearchDatabase {
                        [] );
        }
 
-       public static function legalSearchChars() {
-               return "\"" . parent::legalSearchChars();
+       public function legalSearchCharsForUpdate() {
+               return "\"" . parent::legalSearchCharsForUpdate();
        }
 }
index b40e1aa..5a8995d 100644 (file)
@@ -141,8 +141,8 @@ class SearchSqlite extends SearchDatabase {
                return $regex;
        }
 
-       public static function legalSearchChars() {
-               return "\"*" . parent::legalSearchChars();
+       public function legalSearchCharsForUpdate() {
+               return "\"*" . parent::legalSearchCharsForUpdate();
        }
 
        /**
index caad388..6d54dad 100644 (file)
@@ -180,7 +180,7 @@ class SearchSuggestionSet {
         */
        public static function fromTitles( array $titles ) {
                $score = count( $titles );
-               $suggestions = array_map( function( $title ) use ( &$score ) {
+               $suggestions = array_map( function ( $title ) use ( &$score ) {
                        return SearchSuggestion::fromTitle( $score--, $title );
                }, $titles );
                return new SearchSuggestionSet( $suggestions );
@@ -196,7 +196,7 @@ class SearchSuggestionSet {
         */
        public static function fromStrings( array $titles ) {
                $score = count( $titles );
-               $suggestions = array_map( function( $title ) use ( &$score ) {
+               $suggestions = array_map( function ( $title ) use ( &$score ) {
                        return SearchSuggestion::fromText( $score--, $title );
                }, $titles );
                return new SearchSuggestionSet( $suggestions );
index 882084d..074afe3 100644 (file)
@@ -29,8 +29,7 @@ use UnexpectedValueException;
  * Subclass of UnexpectedValueException that can be annotated with additional
  * data for debug logging.
  *
- * @author Bryan Davis <bd808@wikimedia.org>
- * @copyright © 2016 Bryan Davis and Wikimedia Foundation.
+ * @copyright © 2016 Wikimedia Foundation and contributors
  * @since 1.27
  */
 class MetadataMergeException extends UnexpectedValueException {
index 1145efd..6679098 100644 (file)
@@ -6,7 +6,7 @@
  *
  * Created on Sep 08, 2014
  *
- * Copyright © 2014 Brad Jorsch <bjorsch@wikimedia.org>
+ * Copyright © 2014 Wikimedia Foundation and contributors
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index f7d7cb2..d3e453a 100644 (file)
@@ -6,7 +6,7 @@
  *
  * Created on Sep 08, 2014
  *
- * Copyright © 2014 Brad Jorsch <bjorsch@wikimedia.org>
+ * Copyright © 2014 Wikimedia Foundation and contributors
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
index 9594952..67c14d8 100644 (file)
@@ -456,7 +456,7 @@ class SpecialPage implements MessageLocalizer {
                $searchEngine->setLimitOffset( $limit, $offset );
                $searchEngine->setNamespaces( [] );
                $result = $searchEngine->defaultPrefixSearch( $search );
-               return array_map( function( Title $t ) {
+               return array_map( function ( Title $t ) {
                        return $t->getPrefixedText();
                }, $result );
        }
index e7030c5..e7c9423 100644 (file)
@@ -2,8 +2,6 @@
 /**
  * Implements Special:Activeusers
  *
- * Copyright © 2008 Aaron Schulz
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
index 1dd78d7..dfdbb06 100644 (file)
@@ -123,7 +123,7 @@ class SpecialBotPasswords extends FormSpecialPage {
                                        $showGrants
                                ),
                                'default' => array_map(
-                                       function( $g ) {
+                                       function ( $g ) {
                                                return "grant-$g";
                                        },
                                        $this->botPassword->getGrants()
@@ -131,14 +131,14 @@ class SpecialBotPasswords extends FormSpecialPage {
                                'tooltips' => array_combine(
                                        array_map( 'MWGrants::getGrantsLink', $showGrants ),
                                        array_map(
-                                               function( $rights ) use ( $lang ) {
+                                               function ( $rights ) use ( $lang ) {
                                                        return $lang->semicolonList( array_map( 'User::getRightDescription', $rights ) );
                                                },
                                                array_intersect_key( MWGrants::getRightsByGrant(), array_flip( $showGrants ) )
                                        )
                                ),
                                'force-options-on' => array_map(
-                                       function( $g ) {
+                                       function ( $g ) {
                                                return "grant-$g";
                                        },
                                        MWGrants::getHiddenGrants()
index 8eaae4c..bee6a39 100644 (file)
@@ -115,7 +115,7 @@ class SpecialChangeContentModel extends FormSpecialPage {
                                'reason' => [
                                        'type' => 'text',
                                        'name' => 'reason',
-                                       'validation-callback' => function( $reason ) {
+                                       'validation-callback' => function ( $reason ) {
                                                $match = EditPage::matchSummarySpamRegex( $reason );
                                                if ( $match ) {
                                                        return $this->msg( 'spamprotectionmatch', $match )->parse();
index 195d08b..1710b39 100644 (file)
@@ -2,8 +2,6 @@
 /**
  * Implements Special:Log
  *
- * Copyright © 2008 Aaron Schulz
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
index a2b5be4..46d7cf7 100644 (file)
@@ -105,7 +105,7 @@ class MovePageForm extends UnlistedSpecialPage {
                $permErrors = $this->oldTitle->getUserPermissionsErrors( 'move', $user );
                if ( count( $permErrors ) ) {
                        // Auto-block user's IP if the account was "hard" blocked
-                       DeferredUpdates::addCallableUpdate( function() use ( $user ) {
+                       DeferredUpdates::addCallableUpdate( function () use ( $user ) {
                                $user->spreadAnyEditBlock();
                        } );
                        throw new PermissionsError( 'move', $permErrors );
index 37006d8..5878e1f 100644 (file)
@@ -20,7 +20,6 @@
  * @since 1.21
  * @file
  * @ingroup SpecialPage
- * @author Brad Jorsch
  */
 
 /**
index 5ec2064..75d104b 100644 (file)
@@ -521,6 +521,10 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
 
                $userShowHiddenCats = $this->getUser()->getBoolOption( 'showhiddencats' );
                $rclistOutput = $list->beginRecentChangesList();
+               if ( $this->isStructuredFilterUiEnabled() ) {
+                       $rclistOutput .= $this->makeLegend();
+               }
+
                foreach ( $rows as $obj ) {
                        if ( $limit == 0 ) {
                                break;
@@ -588,7 +592,9 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                $nondefaults = $opts->getChangedValues();
 
                $panel = [];
-               $panel[] = $this->makeLegend();
+               if ( !$this->isStructuredFilterUiEnabled() ) {
+                       $panel[] = $this->makeLegend();
+               }
                $panel[] = $this->optionsPanel( $defaults, $nondefaults, $numRows );
                $panel[] = '<hr />';
 
index 761610e..cb1e892 100644 (file)
@@ -19,7 +19,6 @@
  *
  * @file
  * @ingroup SpecialPage
- * @author Aaron Schulz
  */
 
 use MediaWiki\Logger\LoggerFactory;
index 002b47c..d0a0317 100644 (file)
@@ -344,7 +344,7 @@ class UserrightsPage extends SpecialPage {
                // UNLESS the user can only add this group (not remove it) and the expiry time
                // is being brought forward (T156784)
                $add = array_filter( $add,
-                       function( $group ) use ( $groups, $groupExpiries, $removable, $ugms ) {
+                       function ( $group ) use ( $groups, $groupExpiries, $removable, $ugms ) {
                                if ( isset( $groupExpiries[$group] ) &&
                                        !in_array( $group, $removable ) &&
                                        isset( $ugms[$group] ) &&
@@ -437,12 +437,12 @@ class UserrightsPage extends SpecialPage {
 
                // make sure $oldUGMs and $newUGMs are in the same order, and serialise
                // each UGM object to a simplified array
-               $oldUGMs = array_map( function( $group ) use ( $oldUGMs ) {
+               $oldUGMs = array_map( function ( $group ) use ( $oldUGMs ) {
                        return isset( $oldUGMs[$group] ) ?
                                self::serialiseUgmForLog( $oldUGMs[$group] ) :
                                null;
                }, $oldGroups );
-               $newUGMs = array_map( function( $group ) use ( $newUGMs ) {
+               $newUGMs = array_map( function ( $group ) use ( $newUGMs ) {
                        return isset( $newUGMs[$group] ) ?
                                self::serialiseUgmForLog( $newUGMs[$group] ) :
                                null;
index caa0e1f..30c4a0b 100644 (file)
@@ -511,7 +511,7 @@ class SpecialVersion extends SpecialPage {
                                // in their proper section
                                continue;
                        }
-                       $authors = array_map( function( $arr ) {
+                       $authors = array_map( function ( $arr ) {
                                // If a homepage is set, link to it
                                if ( isset( $arr['homepage'] ) ) {
                                        return "[{$arr['homepage']} {$arr['name']}]";
index e2f4d4b..0665e11 100644 (file)
@@ -1,7 +1,5 @@
 <?php
 /**
- * Copyright © 2008 Aaron Schulz
- *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
index 3467b49..b0c12e4 100644 (file)
@@ -1891,7 +1891,7 @@ class Balancer {
                        $bad = array_uintersect_assoc(
                                $this->allowedHtmlElements,
                                BalanceSets::$unsupportedSet[BalanceSets::HTML_NAMESPACE],
-                               function( $a, $b ) {
+                               function ( $a, $b ) {
                                        // Ignore the values (just intersect the keys) by saying
                                        // all values are equal to each other.
                                        return 0;
index 0868ce6..57bb22a 100644 (file)
@@ -1411,7 +1411,9 @@ abstract class UploadBase {
                        'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd',
                        'http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd',
                        'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-basic.dtd',
-                       'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd'
+                       'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd',
+                       // https://phabricator.wikimedia.org/T168856
+                       'http://www.w3.org/TR/2001/PR-SVG-20010719/DTD/svg10.dtd',
                ];
                if ( $type !== 'PUBLIC'
                        || !in_array( $systemId, $allowedDTDs )
index 86c88a9..a1119fa 100644 (file)
@@ -2506,7 +2506,7 @@ class User implements IDBAccessObject {
                        $cache->delete( $key, 1 );
                } else {
                        wfGetDB( DB_MASTER )->onTransactionPreCommitOrIdle(
-                               function() use ( $cache, $key ) {
+                               function () use ( $cache, $key ) {
                                        $cache->delete( $key );
                                },
                                __METHOD__
@@ -3698,7 +3698,7 @@ class User implements IDBAccessObject {
                        }
 
                        // Try to update the DB post-send and only if needed...
-                       DeferredUpdates::addCallableUpdate( function() use ( $title, $oldid ) {
+                       DeferredUpdates::addCallableUpdate( function () use ( $title, $oldid ) {
                                if ( !$this->getNewtalk() ) {
                                        return; // no notifications to clear
                                }
index 39b65c3..fc8bde9 100644 (file)
@@ -77,7 +77,7 @@ class BatchRowUpdate {
                $this->reader = $reader;
                $this->writer = $writer;
                $this->generator = $generator;
-               $this->output = function() {
+               $this->output = function () {
                }; // nop
        }
 
index c6d1a54..dd9f2d9 100644 (file)
@@ -18,7 +18,6 @@
  * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
- * @author Aaron Schulz
  */
 use Wikimedia\Assert\Assert;
 use MediaWiki\MediaWikiServices;
index dd67fa8..f0ace2c 100644 (file)
@@ -715,4 +715,3 @@ class ZipDirectoryReader {
                }
        }
 }
-
index 0d0d90d..e51a8ed 100644 (file)
@@ -230,7 +230,7 @@ class ConverterRule {
                        if ( $disp === false && array_key_exists( $variant, $unidtable ) ) {
                                $disp = array_values( $unidtable[$variant] )[0];
                        }
-                       // or display frist text under disable manual convert
+                       // or display first text under disable manual convert
                        if ( $disp === false && $this->mConverter->mManualLevel[$variant] == 'disable' ) {
                                if ( count( $bidtable ) > 0 ) {
                                        $disp = array_values( $bidtable )[0];
index 0cddc99..22377c2 100644 (file)
@@ -125,4 +125,12 @@ class FakeConverter {
 
        public function updateConversionTable( Title $title ) {
        }
+
+       /**
+        * Used by test suites which need to reset the converter state.
+        *
+        * @private
+        */
+       private function reloadTables() {
+       }
 }
index 19d644c..2137786 100644 (file)
@@ -891,9 +891,11 @@ class LanguageConverter {
        /**
         * Reload the conversion tables.
         *
+        * Also used by test suites which need to reset the converter state.
+        *
         * @private
         */
-       function reloadTables() {
+       private function reloadTables() {
                if ( $this->mTables ) {
                        unset( $this->mTables );
                }
index 35c22ef..546491a 100644 (file)
        "specialpage-securitylevel-not-allowed": "Выбачайце, вам не дазволена выкарыстоўваць гэтую старонку, бо вашая асоба ня можа быць пацьверджаная.",
        "authpage-cannot-login": "Не атрымалася пачаць уваход у сыстэму.",
        "authpage-cannot-login-continue": "Немагчыма працягнуць уваход у сыстэму. Падобна, што тэрмін вашай сэсіі скончыўся.",
+       "authpage-cannot-create": "Немагчыма пачаць стварэньне рахунку.",
        "changecredentials": "Зьмена ўліковых зьвестак",
        "removecredentials": "Выдаленьне ўліковых зьвестак",
        "removecredentials-submit": "Выдаліць уліковыя зьвесткі",
index 092f159..e93c826 100644 (file)
        "anontalk": "बातचीत",
        "navigation": "नेविगेशन",
        "and": "&#32;अउर",
-       "qbfind": "खोज",
-       "qbbrowse": "ब्राउज",
-       "qbedit": "संपादन",
-       "qbpageoptions": "ई पन्ना",
-       "qbmyoptions": "हमार पन्ना",
        "faq": "आम सवाल",
-       "faqpage": "Project:अक्सर पूछल जाए वाला सवाल",
        "actions": "एक्शन",
        "namespaces": "नाँवस्थान",
        "variants": "अउरी प्रकार",
        "edit-local": "लोकल विवरण संपादन",
        "create": "बनाईं",
        "create-local": "लोकल विवरण जोड़ीं",
-       "editthispage": "ए पन्ना के संपादन करीं",
-       "create-this-page": "ई पन्ना बनाईं",
        "delete": "हटाईं",
-       "deletethispage": "ए पन्ना के हटाईं",
-       "undeletethispage": "हटावल पन्ना वापस ले आईं",
        "undelete_short": "{{PLURAL:$1|एक ठो हटावल गइल संपादन|$1 ठे हटावल गइल संपादन कुल}} वापस ले आईं",
        "viewdeleted_short": "{{PLURAL:$1|एक ठो हटावल गइल संपादन|$1 हटावल गइल संपादन}} देखीं",
        "protect": "सुरक्षित करीं",
        "protect_change": "बदलीं",
-       "protectthispage": "ए पन्ना के सुरक्षित करीं।",
        "unprotect": "सुरक्षा बदलीं",
-       "unprotectthispage": "ए पन्ना के सुरक्षा बदलीं",
        "newpage": "नया पन्ना",
-       "talkpage": "ए पन्ना पर चर्चा करीं",
        "talkpagelinktext": "बातचीत",
        "specialpage": "खास पन्ना",
        "personaltools": "निजी औजार",
-       "articlepage": "सामग्री पन्ना देखीं",
        "talk": "बातचीत",
        "views": "बिबिध रूप",
        "toolbox": "औजार",
        "tool-link-userrights": "{{GENDER:$1|प्रयोगकर्ता}} के मंडली बदलीं",
        "tool-link-userrights-readonly": "{{GENDER:$1|प्रयोगकर्ता}} मंडली देखीं",
        "tool-link-emailuser": "{{GENDER:$1|प्रयोगकर्ता}} के ईमेल करीं",
-       "userpage": "प्रयोगकर्ता पन्ना देखीं",
-       "projectpage": "प्रोजेक्ट पन्ना देखीं",
        "imagepage": "फाइल पन्ना देखीं",
        "mediawikipage": "सनेसा पन्ना देखीं",
        "templatepage": "टेम्पलेट पन्ना देखीं",
        "search-section": "(खंड $1)",
        "search-category": "(श्रेणी $1)",
        "search-suggest": "का राउर मतलब बा: $1",
-       "search-interwiki-caption": "भà¥\8dरातà¥\83 à¤ªà¤°à¤¿à¤¯à¥\8bà¤\9cना",
+       "search-interwiki-caption": "साथà¥\80 à¤ªà¥\8dरà¥\8bà¤\9cà¥\87à¤\95à¥\8dà¤\9f à¤¸à¤­ à¤¸à¥\87 à¤°à¤¿à¤\9cलà¥\8dà¤\9f",
        "search-interwiki-default": "$1 से परिणाम:",
        "search-interwiki-more": "(अउर)",
+       "search-interwiki-more-results": "अउरी रिजल्ट",
        "search-relatedarticle": "संबंधित",
        "searchrelated": "संबंधित",
        "searchall": "सगरी",
        "prefs-watchlist-token": "धियानसूची टोकन:",
        "prefs-misc": "बिबिध",
        "prefs-resetpass": "गुप्तशब्द बदलीं",
-       "prefs-changeemail": "ईमेल पता बदलीं",
+       "prefs-changeemail": "ईमेल पता बदलीं भा हटाईं",
        "prefs-setemail": "ईमेल पता सेट करीं",
        "prefs-email": "ईमेल बिकल्प",
        "prefs-rendering": "रंगरूप",
        "restoreprefs": "सगरी डिफाल्ट सेटिंग पहिले जइसन करीं (सगरी खंड में)",
        "prefs-editing": "संपादन",
        "searchresultshead": "खोज",
+       "stub-threshold-sample-link": "नमूना",
        "stub-threshold-disabled": "अक्षम",
        "recentchangesdays": "हाल में भइल परिवर्तन में देखावे खातिर दिन:",
        "recentchangesdays-max": "अधिकतम $1{{PLURAL:$1|दिन}}",
        "group-bot": "बॉट",
        "group-sysop": "प्रबंधक",
        "group-bureaucrat": "ब्यूरोक्रेट",
-       "group-suppress": "à¤\93वरसाà¤\87à¤\9fर",
+       "group-suppress": "सपà¥\8dरà¥\87सर",
        "group-all": "(सब)",
        "group-user-member": "{{GENDER:$1|सदस्य}}",
        "group-autoconfirmed-member": "{{GENDER:$1|खुद अस्थापित सदस्य}}",
        "group-bot-member": "{{GENDER:$1|बॉट}}",
        "group-sysop-member": "{{GENDER:$1|प्रबंधक}}",
        "group-bureaucrat-member": "{{GENDER:$1|प्रशासक}}",
-       "group-suppress-member": "{{GENDER:$1|à¤\93वरसाà¤\87à¤\9f}}",
+       "group-suppress-member": "{{GENDER:$1|सपà¥\8dरà¥\87स}}",
        "grouppage-user": "{{ns:project}}:सदस्य सभ",
        "grouppage-autoconfirmed": "{{ns:project}}:खुद अस्थापित सदस्य सभ",
        "grouppage-bot": "{{ns:project}}:बॉट सभ",
        "grouppage-sysop": "{{ns:project}}:प्रबंधक सभ",
        "grouppage-bureaucrat": "{{ns:project}}:प्रशासक सभ",
-       "grouppage-suppress": "{{ns:project}}:à¤\93वरसाà¤\87à¤\9fर à¤¸à¤­",
+       "grouppage-suppress": "{{ns:project}}:सपà¥\8dरà¥\87स",
        "right-read": "पन्ना पढ़ीं",
        "right-edit": "पन्नवन के संपादन करीं",
        "right-createpage": "पन्ना बनाईं (बातचीत पन्ना की अलावा)",
        "unwatchedpages": "ध्यान न दिहल गइल पन्ना",
        "listredirects": "पुनर्निर्देशन के सूची",
        "unusedtemplates": "बिना प्रयोग के खाँचा",
-       "randompage": "à¤\95à¥\8cनà¥\8bà¤\82 à¤\8fà¤\97à¥\8b पन्ना",
+       "randompage": "à¤\85à¤\9fà¥\8dरà¥\87à¤\82डम पन्ना",
        "randomincategory": "श्रेणी में अनियमित पन्ना",
        "randomincategory-nopages": "[[:Category:$1|$1]] श्रेणी में कउनो पन्ना नइखे।",
        "randomincategory-category": "श्रेणी:",
        "tooltip-n-portal": "प्रोजेक्ट की बारे में, रउआँ का कर सकत बानी, कौनों चीज कहाँ खोजब",
        "tooltip-n-currentevents": "वर्तमान के घटना पर पृष्ठभूमी जानकारी खोजीं",
        "tooltip-n-recentchanges": "विकि पर तुरंत भइल बदलाव के लिस्ट",
-       "tooltip-n-randompage": "बà¥\87तरतà¥\80ब à¤ªà¤¨à¥\8dना लोड करीं",
+       "tooltip-n-randompage": "à¤\95à¥\8cनà¥\8bà¤\82 à¤\8fà¤\97à¥\8b à¤ªà¤¨à¥\8dना à¤\85à¤\9fà¥\8dरà¥\87à¤\82डम लोड करीं",
        "tooltip-n-help": "जगह पता लगावे खातिर",
        "tooltip-t-whatlinkshere": "इहाँ जुड़े वाला सब विकि पन्नवन के लिस्ट",
        "tooltip-t-recentchangeslinked": "ए पन्ना से जुड़ल पन्नवन पर तुरंत भइल बदलाव",
index c3c2109..117b558 100644 (file)
@@ -49,7 +49,7 @@
        "tog-shownumberswatching": "ژمارەی بەکارھێنەرە چاودێرەکان نیشان بدە",
        "tog-oldsig": "واژووی ئێستا:",
        "tog-fancysig": "وەکوو ویکیدەق واژووەکە لەبەر چاو بگرە (بێ بەستەرێکی خۆگەڕ)",
-       "tog-uselivepreview": "پێشبینینی زیندوو بە کار بھێنە",
+       "tog-uselivepreview": "پێشبینینی ڕاستەوخۆ بەکاربھێنە",
        "tog-forceeditsummary": "ئەگەر کورتەی دەستکاریم نەنووسی پێم بڵێ",
        "tog-watchlisthideown": "دەستکارییەکانم بشارەوە لە پێرستی چاودێری",
        "tog-watchlisthidebots": "دەستکارییەکانی بات بشارەوە لە لیستی چاودێری",
        "anontalk": "لێدوان",
        "navigation": "ڕێدۆزی",
        "and": "&#32;و",
-       "qbfind": "بدۆزەرەوە",
-       "qbbrowse": "بگەڕێ",
-       "qbedit": "دەستکاری",
-       "qbpageoptions": "ئەم پەڕەیە",
-       "qbmyoptions": "پەڕەکانم",
        "faq": "پرسیار و وەڵام (FAQ)",
-       "faqpage": "Project:پرسیار و وەڵام",
        "actions": "کردەوەکان",
        "namespaces": "شوێنناوەکان",
        "variants": "شێوەزارەکان",
        "edit-local": "دەستکاریکردنی زانیارییە ناوخۆییەکان",
        "create": "دروستکردن",
        "create-local": "وەسفی ناوچەیی زۆر بکە",
-       "editthispage": "دەستکاری ئەم پەڕەیە بکە‌",
-       "create-this-page": "ئەم پەڕەیە دروست بکە",
        "delete": "سڕینەوە",
-       "deletethispage": "سڕینەوه‌ی ئەم پەڕەیە",
-       "undeletethispage": "ئەم پەڕەیە بھێنەوە",
        "undelete_short": "{{PLURAL:$1|یەک گۆڕانکاریی|$1 گۆڕانکاریی}} سڕاوە بەجێبھێنەرەوە",
        "viewdeleted_short": "{{PLURAL:$1|یەک گۆڕانکاریی سڕاو|$1 گۆڕانکاریی سڕاو}} ببینە",
        "protect": "پاراستن",
        "protect_change": "گۆڕین",
-       "protectthispage": "ئەم پەڕەیە بپارێزە",
        "unprotect": "پاراستنی بگۆڕە",
-       "unprotectthispage": "پاراستنی ئەم پەڕەیە بگۆڕە",
        "newpage": "پەڕەی نوێ",
-       "talkpage": "باس لەسەر ئەم پەڕە بکە‌",
        "talkpagelinktext": "لێدوان",
        "specialpage": "پەڕەی تایبەت",
        "personaltools": "ئامڕازە تاکەکەسییەکان",
-       "articlepage": "پەڕەی ناوەرۆک ببینە",
        "talk": "وتووێژ",
        "views": "بینینەکان",
        "toolbox": "ئامرازەکان",
        "tool-link-userrights": "بینینی گرووپەکانی {{GENDER:$1|بەکارھێنەر}}",
        "tool-link-userrights-readonly": "بینینی گرووپەکانی {{GENDER:$1|بەکارھێنەر}}",
        "tool-link-emailuser": "ئیمەیلی ئەم {{GENDER:$1|بەکارھێنەر}}ە",
-       "userpage": "بینینی پەڕەی بەکارھێنەر",
-       "projectpage": "پەڕەی پرۆژە نیشان بدە",
        "imagepage": "پەڕەی پەڕگە نیشان بدە",
        "mediawikipage": "پەڕەی پەیام نیشان بدە",
        "templatepage": "پەڕەی داڕێژە ببینە",
        "version-ext-colheader-description": "وەسف",
        "version-ext-colheader-credits": "بەرھەمھێنەر",
        "version-poweredby-others": "دیکە",
+       "version-poweredby-translators": "وەرگێڕەرەکانی translatewiki.net",
        "version-software": "نەرمەکاڵای دامەزراو",
        "version-software-product": "بەرهەم",
        "version-software-version": "وەشان",
index 430a051..8db80e5 100644 (file)
        "recentchanges-submit": "Show",
        "rcfilters-activefilters": "Active filters",
        "rcfilters-advancedfilters": "Advanced filters",
-       "rcfilters-quickfilters": "Saved filter settings",
+       "rcfilters-quickfilters": "Saved filters",
        "rcfilters-quickfilters-placeholder-title": "No links saved yet",
        "rcfilters-quickfilters-placeholder-description": "To save your filter settings and reuse them later, click the bookmark icon in the Active Filter area, below.",
        "rcfilters-savedqueries-defaultlabel": "Saved filters",
index 8189f9b..5353a8d 100644 (file)
        "apisandbox-sending-request": "Envoi de la requête à l'API...",
        "apisandbox-loading-results": "Réception des résultats de l'API...",
        "apisandbox-results-error": "Une erreur s'est produite lors du chargement de la réponse à la requête de l'API: $1.",
+       "apisandbox-results-login-suppressed": "Cette requête a été exécutée en tant qu'utilisateur déconnecté et aurait pu être utilisée pour évincer la sécurité concernant le contrôle de la même source dans le navigateur. Notez que la gestion automatique du jeton de l'API du bac à sable ne fonctionne pas correctement avec de telles requêtes; vous devez les remplir manuellement.",
        "apisandbox-request-selectformat-label": "Afficher les données de la requête comme :",
        "apisandbox-request-format-url-label": "Chaîne de requête de l’URL",
        "apisandbox-request-url-label": "Requête URL :",
        "creditspage": "Crédits de la page",
        "nocredits": "Il n'y a pas d'informations d'attribution disponibles pour cette page.",
        "spamprotectiontitle": "Filtre de protection anti-pollupostage",
-       "spamprotectiontext": "La page que vous avez voulu sauvegarder a été bloquée par le filtre anti-pourriel. Ceci est probablement dû à l’introduction d’un lien vers un site externe apparaissant sur la liste noire.",
+       "spamprotectiontext": "La page que vous avez voulu sauvegarder a été bloquée par le filtre anti-pollupostage. \nCeci est probablement dû à l’introduction d’un lien vers un site externe apparaissant sur la liste noire.",
        "spamprotectionmatch": "Le texte suivant a déclenché notre filtre de protection anti-pollupostage : $1",
        "spambot_username": "Nettoyage de pourriels par MediaWiki",
        "spam_reverting": "Rétablissement de la dernière version ne contenant pas de lien vers $1",
index 1b64081..817b636 100644 (file)
        "htmlform-user-not-exists": "<strong>$1</strong> jaft at ei.",
        "htmlform-user-not-valid": "<strong>$1</strong> as nään tuläät brükernööm",
        "logentry-delete-delete": "$1 {{Gender:$2}} hää det sidj $3 stregen",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|hää}} det widjerfeerang $3 stregen an auerskrewen",
        "logentry-delete-restore": "$1 {{GENDER:$2}} hää det sidj $3 weder iinsteld ($4)",
        "logentry-delete-event": "$1 {{GENDER:$2}} hää det uunsicht feranert faan {{PLURAL:$5|en logbuk iindrach|$5 logbuk iindracher}} üüb $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2}} hää det uunsicht feranert faan {{PLURAL:$5|ian werjuun|$5 werjuunen}} faan det sidj $3: $4",
index 195250d..c4042f1 100644 (file)
        "historywarning": "<strong>Upozorenje:</strong> stranica koju želite izbrisati ima starije izmjene s $1 {{PLURAL:$1|inačicom|inačice|inačica}}:",
        "historyaction-submit": "Prikaži",
        "confirmdeletetext": "Zauvijek ćete izbrisati stranicu ili sliku zajedno s prijašnjim inačicama.\nMolim potvrdite svoju namjeru, da razumijete posljedice i da ovo radite u skladu s [[{{MediaWiki:Policy-url}}|pravilima]].",
-       "actioncomplete": "Zahvat završen",
+       "actioncomplete": "Radnja je dovršena",
        "actionfailed": "Radnja nije uspjela",
        "deletedtext": "\"$1\" je izbrisana.\nVidi $2 za evidenciju nedavnih brisanja.",
        "dellogpage": "Evidencija brisanja",
        "tooltip-ca-nstab-special": "Ovo je posebna stranica koju nije moguće izravno uređivati.",
        "tooltip-ca-nstab-project": "Pogledaj stranicu o projektu",
        "tooltip-ca-nstab-image": "Pogledaj stranicu o slici",
-       "tooltip-ca-nstab-mediawiki": "Pogledaj sistemske poruke",
+       "tooltip-ca-nstab-mediawiki": "Pogledaj sustavsku poruku",
        "tooltip-ca-nstab-template": "Pogledaj predložak",
        "tooltip-ca-nstab-help": "Pogledaj stranicu za pomoć",
        "tooltip-ca-nstab-category": "Pogledaj stranicu kategorije",
        "exif-software": "Korišteni softver",
        "exif-artist": "Autor",
        "exif-copyright": "Nositelj prava",
-       "exif-exifversion": "Exif verzija",
-       "exif-flashpixversion": "Podržana verzija Flashpixa",
+       "exif-exifversion": "Inačica Exifa",
+       "exif-flashpixversion": "Podržana inačica Flashpixa",
        "exif-colorspace": "Kolor prostor",
        "exif-componentsconfiguration": "Značenje pojedinih komponenti",
        "exif-compressedbitsperpixel": "Dubina boje poslije sažimanja",
index bcce571..eab248b 100644 (file)
        "readonlywarning": "<strong>Attençion</strong>: o database o l'è bloccou pe manutençion, no l'è momentaniamente poscibile sarvâ e modifiche effettuæ.\nPe no perdile, coppile in te'n file de testo e sarvilo in atteisa do sbrocco do database.\n\nL'amministratô de scistema ch'o l'ha misso l'abrocco o l'ha fornio questa spiegaçion: $1.",
        "protectedpagewarning": "'''Attençion: questa paggina a l'è stæta bloccâ de moddo che solo i utenti co-i privileggi d'amministratô possan modificala.'''\nL'urtimo elemento do registro o l'è riportou chì appreuvo pe referença:",
        "semiprotectedpagewarning": "'''Notta:''' Questa paggina a l'è stæta bloccä de moddo che solo i utenti registræ possan modificâla.\nL'urtimo elemento do registro o l'è riportou chì appreuvo pe referensa:",
-       "cascadeprotectedwarning": "'''Attençion:''' Questa paggina a l'è stæta bloccâ de moddo che solo i utenti co-i privileggi d'amministratô possan modificala da-o momento ch'a l'é inclusa seleçionando a proteçion \"ricorsciva\" {{PLURAL:$1|inta paggina|inte paggine}}:",
+       "cascadeprotectedwarning": "'''Attençion:''' Questa paggina a l'è stæta bloccâ de moddo che solo i utenti con [[Special:ListGroupRights|di driti speciffichi]] possan modificâla da-o momento ch'a l'è inclusa seleçionando a proteçion \"ricorsciva\" {{PLURAL:$1|inta paggina|inte paggine}}:",
        "titleprotectedwarning": "'''Attension: Questa paggina a l'è stæta bloccâ de moddo che seggian necessai [[Special:ListGroupRights|di driti speciffichi]] pe creâla.'''\nL'urtimo elemento do registro o l'è riportou chì appreuvo pe referensa:",
        "templatesused": "{{PLURAL:$1|Template dêuviòu|Template dêuviæ}} in sta pàgina:",
        "templatesusedpreview": "{{PLURAL:$1|Template deuviou|Template deuviæ}} in te st'anteprimma:",
index 7dba2f2..f2662c1 100644 (file)
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (skatīt arī [[Special:NewPages|jaunās lapas]])",
        "recentchanges-submit": "Rādīt",
        "rcfilters-activefilters": "Aktīvie filtri",
+       "rcfilters-quickfilters": "Saglabātie filtra iestatījumi",
        "rcfilters-restore-default-filters": "Atjaunot noklusētos filtrus",
        "rcfilters-clear-all-filters": "Noņemt visus filtrus",
        "rcfilters-search-placeholder": "Filtrēt pēdējās izmaiņas (pārlūko vai sāc rakstīt)",
index b548e84..0e286eb 100644 (file)
        "copyrightwarning": "Merk deg at alle bidrag til {{SITENAME}} er å rekne som utgjevne under $2 (sjå $1 for detaljar). Om du ikkje vil ha teksten endra og kopiert under desse vilkåra, kan du ikkje leggje han her.<br />\nTeksten må du ha skrive sjølv, eller kopiert frå ein ressurs som er kompatibel med vilkåra eller ikkje verna av opphavsrett.\n\n'''LEGG ALDRI INN MATERIALE SOM ANDRE HAR OPPHAVSRETT TIL UTAN LØYVE FRÅ DEI!'''",
        "copyrightwarning2": "Merk deg at alle bidrag til {{SITENAME}} kan bli endra, omskrive og fjerna av andre bidragsytarar. Om du ikkje vil ha teksten endra under desse vilkåra, kan du ikkje leggje han her.<br />\nTeksten må du ha skrive sjølv eller ha kopiert frå ein ressurs som er kompatibel med vilkåra eller ikkje verna av opphavsrett (sjå $1 for detaljar).\n\n'''LEGG ALDRI INN MATERIALE SOM ANDRE HAR OPPHAVSRETT TIL UTAN LØYVE FRÅ DEI!'''",
        "longpageerror": "'''Feil: Teksten du sende inn er {{PLURAL:$1|éin kilobyte|$1 kilobyte}} stor, noko som er større enn øvstegrensa på {{PLURAL:$2|éin kilobyte|$2 kilobyte}}.''' Han kan difor ikkje lagrast.",
-       "readonlywarning": "'''ÅTVARING: Databasen er skriveverna på grunn av vedlikehald, så du kan ikkje lagre endringane dine akkurat no. Det kan vera lurt å kopiere teksten din til ei tekstfil, så du kan lagre han her seinare.'''\n\nSystemadministratoren som låste databasen gav denne årsaka: $1",
+       "readonlywarning": "<strong>ÅTVARING: Databasen er skriveverna på grunn av vedlikehald, så du kan ikkje lagre endringane dine akkurat no. Det kan vera lurt å kopiere teksten din til ei tekstfil, så du kan lagre han her seinare.</strong>\n\nSystemadministratoren som låste databasen gav denne årsaka: $1",
        "protectedpagewarning": "'''ÅTVARING: Denne sida er verna, slik at berre administratorar kan endra henne.'''\nDet siste loggelementet er oppgjeve under som referanse:",
        "semiprotectedpagewarning": "'''Merk:''' Denne sida er verna slik at berre registrerte brukarar kan endre henne.\nDet siste loggelementet er oppgjeve under som referanse:",
        "cascadeprotectedwarning": "'''Åtvaring:''' Denne sida er verna så berre brukarar med administratortilgang kan endre henne. Dette er fordi ho er inkludert i {{PLURAL:$1|denne djupverna sida|desse djupverna sidene}}:",
        "rcfilters-filter-bots-label": "Robot",
        "rcfilters-filter-bots-description": "Endringar gjorde med automatiske verktøy.",
        "rcfilters-filter-humans-label": "Menneske (ikkje robot)",
+       "rcfilters-filter-humans-description": "Endringar gjorde av menneske.",
        "rcfilters-filter-patrolled-description": "Endringar merkte som patruljerte.",
        "rcfilters-filter-unpatrolled-description": "Endringar ikkje merkte som patruljerte.",
+       "rcfilters-filtergroup-significance": "Vekt",
        "rcfilters-filter-minor-label": "Småplukk",
+       "rcfilters-filter-minor-description": "Endringar merkte som småplukk av forfattaren.",
        "rcfilters-filter-major-label": "Ikkje småplukk",
+       "rcfilters-filter-major-description": "Endringar ikkje merkte som småplukk.",
        "rcfilters-filter-pageedits-label": "Sideendringar",
        "rcfilters-filter-pageedits-description": "Endringar av wikiinnhald, diskusjonar, kategoriskildringar ...",
        "rcfilters-filter-newpages-label": "Sideopprettingar",
+       "rcfilters-filter-newpages-description": "Endringar som opprettar nye sider.",
        "rcfilters-filter-categorization-label": "Kategoriendringar",
        "rcfilters-filter-categorization-description": "Oppføringar av sider som vert lagde til eller fjerna frå katerogiar.",
        "rcfilters-filter-logactions-label": "Loggførte handlingar",
+       "rcfilters-filtergroup-lastRevision": "Siste versjonen",
+       "rcfilters-view-tags": "Endringar med merke",
        "rcnotefrom": "Nedanfor er endringane gjorde sidan <strong>$2</strong> viste (opp til <strong>$1</strong> stykke)",
        "rclistfrom": "Vis nye endringar sidan $3 $2",
        "rcshowhideminor": "$1 småplukk",
        "alreadyrolled": "Kan ikkje rulla attende den siste endringa på [[:$1]] gjord av [[User:$2|$2]] ([[User talk:$2|diskusjon]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) av di nokon andre alt har endra eller attenderulla sida.\n\nDen siste endringa vart gjord av [[User:$3|$3]] ([[User talk:$3|brukardiskusjon]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Samandraget for endringa var: <em>$1</em>.",
        "revertpage": "Attenderulla endring gjord av [[Special:Contributions/$2|$2]] ([[User talk:$2|diskusjon]]) til siste versjonen av [[User:$1|$1]]",
-       "revertpage-nouser": "Tilbakestilte endringar av (brukarnamn fjerna) til den siste versjonen av [[User:$1|$1]]",
+       "revertpage-nouser": "Attenderulla endring gjord av ein løynd brukar til siste versjonen av {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Rulla attende endringane av $1, attende til siste versjonen av $2.",
        "sessionfailure-title": "Feil med omgangen.",
        "sessionfailure": "Det ser ut til å vera eit problem med innloggingsøkta di. Handlinga er vorten avbroten for å vera føre var mot kidnapping av økta. Bruk attendeknappen i nettlesaren din og prøv om att.",
        "tooltip-pt-preferences": "{{GENDER:|Innstillingane}} dine",
        "tooltip-pt-watchlist": "Liste over sidene du overvakar.",
        "tooltip-pt-mycontris": "{{GENDER:|Liste}} over bidraga dine",
+       "tooltip-pt-anoncontribs": "Liste over endringar gjorde frå denne IP-adressa",
        "tooltip-pt-login": "Det er ikkje obligatorisk å logga inn, men medfører mange fordelar.",
        "tooltip-pt-logout": "Logg ut",
        "tooltip-pt-createaccount": "Me oppfordrar til at du oppretter ein konto og loggar inn, men det er ikkje påkravd.",
index d6f2b73..d6b322a 100644 (file)
        "anontalk": "'Ngazzaminde",
        "navigation": "Naveghesce",
        "and": "&#32;e",
-       "qbfind": "Cirche",
-       "qbbrowse": "Sfoglie",
-       "qbedit": "Cange",
-       "qbpageoptions": "Pàgene currende",
-       "qbmyoptions": "Pàggene mije",
        "faq": "FAQ",
-       "faqpage": "Project:FAQ",
        "actions": "Aziune",
        "namespaces": "Namespace",
        "variants": "Variande",
        "edit-local": "Cange 'a descrizione locale",
        "create": "Ccreje",
        "create-local": "Aggiunge 'a descrizione locale",
-       "editthispage": "Cange sta pàgene",
-       "create-this-page": "Ccreje 'a pàgene",
        "delete": "Scangìlle",
-       "deletethispage": "Scangille sta pàgene",
-       "undeletethispage": "Repristine sta pàgene",
        "undelete_short": "Annulle {{PLURAL:$1|'nu camgiamende|$1 cangiaminde}}",
        "viewdeleted_short": "Vide {{PLURAL:$1|'nu cangiamende scangellate|$1 cangiaminde scangellate}}",
        "protect": "Prutette",
        "protect_change": "cange",
-       "protectthispage": "Prutigge sta pàgene",
        "unprotect": "Cange 'a protezione",
-       "unprotectthispage": "Cange 'a protezione de sta pàgene",
        "newpage": "Pàgene nova",
-       "talkpage": "'Ngazzete pe sta pàgene",
        "talkpagelinktext": "Parle",
        "specialpage": "Pàgene Speciele",
        "personaltools": "Struminde personele",
-       "articlepage": "Vide 'a pàgene de le condenute",
        "talk": "'Ngazzaminde",
        "views": "Visite",
        "toolbox": "Struminde",
        "tool-link-userrights": "Cange le gruppe {{GENDER:$1|utinde}}",
        "tool-link-userrights-readonly": "'Ndruche le gruppe {{GENDER:$1|utinde}}",
        "tool-link-emailuser": "Manne 'na mail a stu {{GENDER:$1|utende}}",
-       "userpage": "Vide a pàgene de l'utende",
-       "projectpage": "Vide a pàgene de le pruggette",
        "imagepage": "Vide a pàgene de le file",
        "mediawikipage": "Vide a pàgene de le messàgge",
        "templatepage": "Vide a pàgene de le template",
        "whatlinkshere-hideredirs": "$1 ridirezionaminde",
        "whatlinkshere-hidetrans": "$1 transclusiune",
        "whatlinkshere-hidelinks": "$1 collegaminde",
-       "whatlinkshere-hideimages": "$1 collegaminde a 'u file",
+       "whatlinkshere-hideimages": "$1 collegaminde da file",
        "whatlinkshere-filters": "Filtre",
        "autoblockid": "Autoblocche #$1",
        "block": "Bluècche l'utende",
        "tooltip-feed-rss": "RSS feed pe sta pàgene",
        "tooltip-feed-atom": "Atom feed pe sta pàgene",
        "tooltip-t-contributions": "Vide l'elenghe de le condrebbute de {{GENDER:$1|stu utende}}",
-       "tooltip-t-emailuser": "Manne n'e-mail a stu utende",
+       "tooltip-t-emailuser": "Manne n'e-mail a {{GENDER:$1stu utende}}",
        "tooltip-t-info": "Cchiù 'mbormaziune sus a sta pàgene",
        "tooltip-t-upload": "Careche le file",
        "tooltip-t-specialpages": "Liste de tutte le pàggene speciale",
        "version-libraries-license": "Licenze",
        "version-libraries-description": "Descrizione",
        "version-libraries-authors": "Auture",
-       "redirect": "Redirette da 'u file, utende o ID d'a revisione",
-       "redirect-summary": "Sta pàgena speciale redirezione a 'nu file (date 'u nome d'u file), 'na pàgene (date 'n'ID de revisione), o 'na pàgene utende (date 'n'ID numeriche de l'utende). Ause: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]], o [[{{#Special:Redirect}}/user/101]].",
+       "redirect": "Redirette da 'u file, utende, pàgene, revisione o ID de l'archivije",
+       "redirect-summary": "Sta pàgena speciale redirezione a 'nu file (date 'u nome d'u file), a 'na pàgene (date 'n'ID de revisione o 'n'ID de pàgene), o 'na pàgene utende (date 'n'ID a numere de l'utende), o a 'na vôsce de l'archivije (date 'n'ID de l'archivije). Ause: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], o [[{{#Special:Redirect}}/user/101]] o [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "Véje",
        "redirect-lookup": "Mappature:",
        "redirect-value": "Valore:",
index 55f698c..c7398ca 100644 (file)
        "index-category": "Индексируемые страницы",
        "noindex-category": "Неиндексируемые страницы",
        "broken-file-category": "Страницы с неработающими файловыми ссылками",
+       "categoryviewer-pagedlinks": "($1) ($2)",
+       "category-header-numerals": "$1–$2",
        "about": "Описание",
        "article": "Статья",
        "newwindow": "(в новом окне)",
        "versionrequiredtext": "Для работы с этой страницей требуется MediaWiki версии $1. См. [[Special:Version|информацию об программном обеспечении]].",
        "ok": "OK",
        "pagetitle": "$1 — {{SITENAME}}",
+       "backlinksubtitle": "← $1",
        "retrievedfrom": "Источник — «$1»",
        "youhavenewmessages": "Вы получили $1 ($2).",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|Вы получили}} $1 от {{PLURAL:$3|1=$3 участника|$3 участников|1=другого участника}} ($2).",
        "headline_tip": "Заголовок 2-го уровня",
        "nowiki_sample": "Вставьте сюда текст, который не нужно форматировать",
        "nowiki_tip": "Игнорировать вики-форматирование",
+       "image_sample": "Пример.jpg",
        "image_tip": "Встроенный файл",
+       "media_sample": "Пример.ogg",
        "media_tip": "Ссылка на файл",
        "sig_tip": "Ваша подпись и момент времени",
        "hr_tip": "Горизонтальная линия (не используйте слишком часто)",
        "template-semiprotected": "(частично защищено)",
        "hiddencategories": "Эта страница относится к {{PLURAL:$1|$1 скрытой категории|$1 скрытым категориям|1=одной скрытой категории}}:",
        "edittools": "<!-- Расположенный здесь текст будет показываться под формой редактирования и формой загрузки. -->",
+       "edittools-upload": "-",
        "nocreatetext": "На этом сайте ограничена возможность создания новых страниц.\nВы можете вернуться назад и отредактировать существующую страницу, [[Special:UserLogin|представиться системе или создать новую учётную запись]].",
        "nocreate-loggedin": "У вас нет разрешения создавать новые страницы.",
        "sectioneditnotsupported-title": "Редактирование разделов не поддерживается",
        "content-model-text": "обычный текст",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-model-json": "JSON",
        "content-json-empty-object": "Пустой объект",
        "content-json-empty-array": "Пустой массив",
        "deprecated-self-close-category": "Страницы, использующие недопустимые самозакрывающиеся HTML-теги",
        "whatlinkshere-hideredirs": "$1 перенаправления",
        "whatlinkshere-hidetrans": "$1 включения",
        "whatlinkshere-hidelinks": "$1 ссылки",
-       "whatlinkshere-hideimages": "$1 файл{{PLURAL:$1|овая ссылка|овых ссылки|овых ссылок}}",
+       "whatlinkshere-hideimages": "$1 файловые ссылки",
        "whatlinkshere-filters": "Фильтры",
        "whatlinkshere-submit": "Выполнить",
        "autoblockid": "Автоблокировка #$1",
        "exif-compression-2": "CCITT Group 3, 1-мерная модификация кодирования длин серий Хаффмана",
        "exif-compression-3": "CCITT Group 3, факсовое кодирование",
        "exif-compression-4": "CCITT Group 4, факсовое кодирование",
+       "exif-compression-5": "LZW",
+       "exif-compression-6": "JPEG (старый)",
+       "exif-compression-7": "JPEG",
        "exif-copyrighted-true": "Охраняется авторским правом",
        "exif-copyrighted-false": "Авторско-правовой статус не задан",
+       "exif-photometricinterpretation-0": "Чёрный и белый (белый — 0)",
        "exif-photometricinterpretation-1": "Чёрный и белый (чёрный — 0)",
        "exif-photometricinterpretation-4": "Маска прозрачности",
        "exif-photometricinterpretation-5": "Разделены (вероятно CMYK)",
        "size-kilobytes": "$1 КБ",
        "size-megabytes": "$1 МБ",
        "size-gigabytes": "$1 ГБ",
+       "size-terabytes": "$1 ТБ",
+       "size-petabytes": "$1 ПБ",
+       "size-exabytes": "$1 ЭБ",
+       "size-zetabytes": "$1 ЗБ",
+       "size-yottabytes": "$1 ИБ",
+       "size-pixel": "$1 {{PLURAL:$1|пиксель|пикселя|пикселей}}",
        "bitrate-bits": "$1 б/с",
        "bitrate-kilobits": "$1 Кб/с",
        "bitrate-megabits": "$1 Мб/с",
        "bitrate-gigabits": "$1 Гб/с",
        "bitrate-terabits": "$1 Тб/с",
+       "bitrate-petabits": "$1 Пб/с",
+       "bitrate-exabits": "$1 Эб/с",
+       "bitrate-zetabits": "$1 Зб/с",
+       "bitrate-yottabits": "$1 Иб/с",
        "lag-warn-normal": "Изменения, сделанные менее {{PLURAL:$1|$1 секунды|$1 секунд|1=секунды}} назад, могут не отображаться в этом списке.",
        "lag-warn-high": "Из-за большого отставания в синхронизации серверов, в этом списке могут не отображаться изменения, сделанные менее {{PLURAL:$1|$1 секунды|$1 секунд|1=секунды}} назад.",
        "watchlistedit-normal-title": "Изменение списка наблюдения",
        "hebrew-calendar-m11-gen": "Ава",
        "hebrew-calendar-m12-gen": "Элула",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|обсуждение]])",
+       "timezone-utc": "UTC",
        "timezone-local": "Местное",
        "duplicate-defaultsort": "Внимание. Ключ сортировки по умолчанию «$2» переопределяет прежний ключ сортировки по умолчанию «$1».",
        "duplicate-displaytitle": "<strong>Внимание:</strong> Отображаемое название «$2» переопределяет ранее заданное отображаемое название «$1».",
        "version-parserhooks": "Перехватчики синтаксического анализатора",
        "version-variables": "Переменные",
        "version-antispam": "Антиспам",
+       "version-api": "API",
        "version-other": "Иное",
        "version-mediahandlers": "Обработчики медиа",
        "version-hooks": "Перехватчики",
        "limitreport-walltime": "Использование в режиме реального времени",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|секунда|секунды|секунд}}",
        "limitreport-ppvisitednodes": "Количество узлов, посещённых препроцессором",
+       "limitreport-ppvisitednodes-value": "$1/$2",
        "limitreport-ppgeneratednodes": "Количество сгенерированных препроцессором узлов",
+       "limitreport-ppgeneratednodes-value": "$1/$2",
        "limitreport-postexpandincludesize": "Размер раскрытых включений",
        "limitreport-postexpandincludesize-value": "$1/$2 {{PLURAL:$2|байт|байта|байт}}",
        "limitreport-templateargumentsize": "Размер аргумента шаблона",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|байт|байта|байт}}",
        "limitreport-expansiondepth": "Наибольшая глубина расширения",
+       "limitreport-expansiondepth-value": "$1/$2",
        "limitreport-expensivefunctioncount": "Количество «дорогих» функций анализатора",
+       "limitreport-expensivefunctioncount-value": "$1/$2",
        "expandtemplates": "Развёртка шаблонов",
        "expand_templates_intro": "Эта служебная страница преобразует текст, рекурсивно разворачивая все шаблоны в нём.\nТакже развёртке подвергаются функции парсера\n<code><nowiki>{{#language:…}}</nowiki></code> и переменные вида\n<code><nowiki>{{CURRENTDAY}}</nowiki></code> — в общем, всё внутри двойных фигурных скобок.",
        "expand_templates_title": "Заголовок страницы для {{FULLPAGENAME}} и т. п.:",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>отключено</strong>)",
        "mediastatistics": "Медиа-статистика",
        "mediastatistics-summary": "Статистические данные о типах загруженных файлов. Она включает информацию только о последних версиях файлов. Более старые или удалённые версии файлов не учитываются.",
+       "mediastatistics-nfiles": "$1 ($2%)",
        "mediastatistics-nbytes": "$1 {{PLURAL:$1|байт|байта|байт}} ($2; $3%)",
        "mediastatistics-bytespertype": "Общий размер файла для этого раздела: $1 {{PLURAL:$1|байт|байта|байт}} ($2; $3%).",
        "mediastatistics-allbytes": "Общий размер всех файлов: $1 {{PLURAL:$1|байт|байта|байт}} ($2).",
index bda032f..200cd07 100644 (file)
        "category-empty": "''ಈ ವರ್ಗೊಡು ಸದ್ಯಗ್ ಓವುಲ ಪುಟೊಕುಲಾವಡ್ ಅತ್ತಂಡ ಚಿತ್ರೊಲಾವಡ್ ಇಜ್ಜಿ.''",
        "hidden-categories": "{{PLURAL:$1|Hidden category|ದೆಂಗಾದ್ ದೀತಿನ ವರ್ಗೊಲು}}",
        "hidden-category-category": "ದೆಂಗಾದ್ ದೀತಿನ ವರ್ಗೊಲು",
-       "category-subcat-count": "{{PLURAL:$2|This category has only the following subcategory.|ಈ ವರ್ಗೊಡು ಈ ತಿರ್ತ್‍ದ {{PLURAL:$1|subcategory|$1 ಉಪವರ್ಗೊಲೆನ್}} ಸೇರಾದ್, ಒಟ್ಟಿಗೆ $2 ಉಂಡು.}}",
+       "category-subcat-count": "{{PLURAL:$2|ಈ ವರ್ಗೊಡು ತಿರ್ತ್ ಕೊರ್ತಿನ ಒಂಜಿ ಉಪವರ್ಗೊ ಮಾತ್ರ ಉಂಡು.|ಈ ವರ್ಗೊಡು ತಿರ್ತ್ ಕೊರ್ತಿನ {{PLURAL:$1|ಉಪವರ್ಗೊ|$1 ಉಪವರ್ಗೊಲೆನ್}} ಸೇರಾದ್, ಒಟ್ಟುಗು $2 ಉಪವರ್ಗೊಲು ಉಂಡು.}}",
        "category-subcat-count-limited": "ಈ ವರ್ಗೊಡು ತಿರ್ತ್ ತೊಜ್ಪಾದಿನ {{PLURAL:$1|ಉಪವರ್ಗ|$1 ಉಪವರ್ಗೊಲು}} ಉಂಡು.",
        "category-article-count": "{{PLURAL:$2|ಈ ವರ್ಗೊಡು ತಿರ್ತ್ ಉಪ್ಪುನ ಒಂಜಿ ಪುಟೊ ಮಾತ್ರ ಉಂಡು|ಒಟ್ಟು $2 ಪುಟೊಕುಲೆಡ್ ತಿರ್ತ್ ಉಪ್ಪುನ {{PLURAL:$1|ಪುಟೊ|$1 ಪುಟೊಕುಲು}} ಈ ವರ್ಗೊಡು ಉಂಡು.}}",
        "category-article-count-limited": "ಪ್ರಸಕ್ತ ವರ್ಗೊಡು ಈ ತಿರ್ತ್’ದ {{PLURAL:$1|ಪುಟ ಉಂಡು|$1 ಪುಟೊಲು ಉಂಡು}}.",
        "searchresults": "ನಾಡ್‍ಪತ್ತ್‌ನೆತ ಪಲಿತಾಂಸೊಲು",
        "searchresults-title": "\"$1\"ಕ್ ನಾಡ್‍ಪತ್ತ್‌ನೆತ ಪಲಿತಾಂಸೊಲು",
        "notextmatches": "ವಾ ಪುಟೊತ ಪಠ್ಯೊಡುಲಾ ಹೋಲಿಕೆ ಇಜ್ಜಿ",
-       "prevn": "ದà³\81à²\82ಬà³\81ತà³\8dತ {{PLURAL:$1|$1}}",
+       "prevn": "ದà³\81à²\82ಬà³\81ದ {{PLURAL:$1|$1}}",
        "nextn": "ಬೊಕ್ಕದ {{PLURAL:$1|$1}}",
        "prev-page": "ದುಂಬುತ ಪುಟೊ",
        "next-page": "ನನತಾ ಪುಟ",
        "viewprevnext": "ತೂಲೆ ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "<strong>ಈ ವಿಕಿಟ್ \"[[:$1]]\" ಪುದರ್ದ ಪುಟೊ ಉಂಡು.</strong> {{PLURAL:$2|0=|ನಾಡಿನ ಪುದರ್ಗ್ ತಿಕ್ಕಿನ ಬೇತೆ ಫಲಿತಾಶೊಲೆನ್ಲಾ ತೂಲೆ.}}",
        "searchmenu-new": "<strong>ಈ ಪುಟೊನು ರಚಿಸಲೆ \"[[:$1]]\" ಈ ವಿಕಿಡ್!</strong> {{PLURAL:$2|0=|See also the page found with your search.|ನಾಡ್‍ನಗ ತೋಜಿದ್ ಬರ್ಪುನ ಪಲಿತಾಂಸೊನು ತೂಲೆ.}}",
-       "searchprofile-articles": "ಲà³\87à²\95ನà³\8a à²ªà³\81à²\9fà³\8a",
+       "searchprofile-articles": "ವಿಸಯ à²ªà³\81à²\9fà³\8aà²\95à³\81ಲà³\81",
        "searchprofile-images": "ಮಲ್ಟಿಮೀಡಿಯೊ",
        "searchprofile-everything": "ಪ್ರತಿ ವಿಸಯೊ",
-       "searchprofile-advanced": "ಸà³\81ದಾರಣà³\86ದ",
+       "searchprofile-advanced": "ಸà³\81ದಾರà³\8dತಿನ",
        "searchprofile-articles-tooltip": "$1ಟ್ ನಾಡ್‍ಲೆ",
        "searchprofile-images-tooltip": "ಫೈಲ್‍ನ್ ನಾಡ್‍ಲೆ",
        "searchprofile-everything-tooltip": "ಮಾತ ಮಾಹಿತಿಲೆನ್ ನಾಡ್‍ಲೆ (ಪಾತೆರದ ಪುಟೊಲ ಸೇರ್ದ್)",
-       "searchprofile-advanced-tooltip": "ಬಳà²\95à³\86ದ à²¨à²¾à²®à³\8aವರà³\8dà²\97à³\8aಡà³\81 ನಾಡ್‍ಲೆ",
+       "searchprofile-advanced-tooltip": "ವà³\88ಯà²\95à³\8dತಿà²\95à³\8a à²ªà³\81ದರà³\8d-à²\9cಾà²\97à³\86ಲà³\86ಡà³\8d ನಾಡ್‍ಲೆ",
        "search-result-size": "$1 ({{PLURAL:$2|೧ ಪದೊ|$2 ಪದೊಕುಲು}})",
        "search-result-category-size": "{{PLURAL:$1|1 ಸದಸ್ಯೆರ್|$1 ಸದಸ್ಯೆರ್ಲು}} ({{PLURAL:$2|1 ಉಪವರ್ಗೊ|$2 ಉಪವರ್ಗೊಲು}}, {{PLURAL:$3|1 ಫೈಲ್|$3 ಫೈಲ್‍ಲು}})",
        "search-redirect": "($1 ಡ್ದ್ ಪಿರ ನಿರ್ದೇಸನೊ)",
        "grouppage-sysop": "{{ns:project}}:ನಿರ್ವಾಹಕೆರ್",
        "right-read": "ಪುಟಕ್‍ಲೆನ್ ಓದುಲೆ",
        "right-edit": "ಪುಟೊನ್ ಸಂಪಾದನೆ ಮಲ್ಪುಲೆ",
-       "right-writeapi": "ಬರà³\86ಯಿನ à²\8eಪಿà²\90ದ à²¬à²³à²\95à³\86",
+       "right-writeapi": "ಬರವà³\81 à²\8e.ಪಿ.à²\90. à²¦ à²\89ಪಯà³\8bà²\97à³\8a",
        "right-delete": "ಪುಟೊಕುಲೆನ್ ಮಾಜಾಲೆ",
        "right-undelete": "ಪುಟೊನ್ ಮಾಜಾವಡೆ",
        "grant-group-email": "ಇ-ಅಂಚೆ ಕಡಪುಡುಲೆ",
        "grant-createaccount": "ಪೊಸ ಕಾತೆ ಸುರು ಮಲ್ಪುಲೆ",
-       "newuserlogpage": "ಸದಸà³\8dಯà³\86ರà³\86 à²¸à³\8dರಿಸà³\8dà²\9fಿದ ದಾಕಲೆ",
+       "newuserlogpage": "ಸದಸà³\8dಯà³\86ರà³\86 à²\89à²\82ಡà³\81ಮಲà³\8dತಿನ ದಾಕಲೆ",
        "rightslog": "ಸದಸ್ಯೆರ್ನ ಹಕ್ಕು ದಾಖಲೆ",
        "action-read": "ಈ ಪುಟೊನು ಓದುಲೆ",
        "action-edit": "ಈ ಪುಟೊನು ಎಡಿಟ್ ಮಲ್ಪುಲೆ",
        "recentchanges-legend": "ಇಂಚಿಪೊದ ಬದಲಾವಣೆಲೆ ಆಯ್ಕೆಲು",
        "recentchanges-summary": "ಈ ವಿಕಿಟ್ ಇಂಚಿಪ್ಪ ಮಲ್ತ್‌ನ ಬದಲಾವಣೆನ್ ಈ ಪುಟೊಡು ಈರ್ ತೂವೊಲಿ",
        "recentchanges-feed-description": "ಈ ಫೀಡ್’ಡ್ ವಿಕಿಕ್ ಇಂಚಿಪ್ಪ ಆತಿನಂಚಿನ ಬದಲಾವಣೆಲೆನ್ ಟ್ರ್ಯಾಕ್ ಮಲ್ಪುಲೆ.",
-       "recentchanges-label-newpage": "à²\87ರà³\8dನ à²\88 à²¬à²¦à²²à²¾à²µà²£à³\86 à²ªà³\8aಸ à²ªà³\81à²\9fà³\8aನà³\81 à²¸à³\81ರà³\81 à²®à²²à³\8dಪà³\81à²\82ಡà³\81",
+       "recentchanges-label-newpage": "à²\88 à²¬à²¦à²²à²¾à²µà²£à³\86 à²\92à²\82à²\9cಿ à²ªà³\8aಸ à²ªà³\81à²\9fà³\8aನà³\81 à²\89à²\82ಡà³\81 à²®à²²à³\8dತà³\8dâ\80\8cà²\82ಡà³\8d.",
        "recentchanges-label-minor": "ಉಂದು ಕಿಞ್ಞ ಬದಲಾವಣೆ",
        "recentchanges-label-bot": "ಈ ಸಂಪದನೆ ಒಂಜಿ ಬಾಟ್‍ಡ್ ಆತ್ಂಡ್",
        "recentchanges-label-unpatrolled": "ಈ ಸಂಪಾದನೆನ್ ನನಲಾ ಪರೀಕ್ಷೆ ಮಲ್ತ್‌ಜಿ.",
        "recentchanges-label-plusminus": "ಬೈಟ್ಸ್‌ದ ಲೆಕ್ಕೊಡು ಈ ಪುಟೊತ್ತ ಗಾತ್ರೊ ಬದಲಾತ್ಂಡ್",
        "recentchanges-legend-heading": "<strong>ಪರಿವಿಡಿ:</strong>",
-       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ಬೊಕ್ಕೊಲಾ ತೂಲೆ [[Special:NewPages|ಪೊಸ ಪುಟೊದ ಪಟ್ಟಿ]])",
+       "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|ಪೊಸ ಪುಟೊಕ್ಲೆನ ಪಟ್ಟಿ]]ನ್ಲಾ ತೂಲೆ)",
        "recentchanges-submit": "ತೋಜಾಲೆ",
        "rcfilters-filterlist-whatsthis": "ಉಂದು ದಾದಾ?",
        "rcfilters-filter-user-experience-level-learner-label": "ಕಲ್ಪುನರ್",
        "listfiles-latestversion-no": "ಅತ್ತ್",
        "file-anchor-link": "ಫೈಲ್",
        "filehist": "ಫೈಲ್‍ದ ಇತಿಹಾಸೊ",
-       "filehist-help": "ದಿನà³\8a/ಪà³\8aರà³\8dತà³\81ದ à²®à²¿à²¤à³\8dತà³\8d à²\92ತà³\8dತà³\8dâ\80\8cà²\82ಡ à²\88 à²«à³\88ಲà³\8dâ\80\8dದ à²¨à²¿à²\9cà³\8aಸà³\8dತಿತಿ à²¤à³\8bà²\9cà³\81à²\82ಡà³\81.",
+       "filehist-help": "ದಿನà³\8a/ಪà³\8aರà³\8dತà³\81ದ à²®à²¿à²¤à³\8dತà³\8d à²\92ತà³\8dತà³\8dâ\80\8cà²\82ಡ à²«à³\88ಲà³\8dâ\80\8d à²\86 à²ªà³\8aರà³\8dತà³\81ಡà³\81 à²\8eà²\82à²\9a à²¤à³\8bà²\9cà³\8aà²\82ದಿತà³\8dತà³\8dà²\82ಡà³\8d à²ªà²\82ದà³\8d à²¤à³\82ವà³\8aಲಿ.",
        "filehist-deleteall": "ಮಾತಾ ಮಾಜಾಲೆ",
        "filehist-deleteone": "ಮಾಜಾಲೆ",
        "filehist-revert": "ದುಂಬುದ ಲೆಕ ಮಲ್ಪುಲೆ",
        "filehist-thumb": "ಎಲ್ಯಚಿತ್ರೊ",
        "filehist-thumbtext": "$1ತ ಆವೃತ್ತಿದ ಎಲ್ಯಚಿತ್ರೊ",
        "filehist-nothumb": "ಎಲ್ಯಚಿತ್ರೊ ಇಜ್ಜಿ",
-       "filehist-user": "ಬಳà²\95à³\86ದಾರೆರ್",
+       "filehist-user": "ಸದಸà³\8dಯೆರ್",
        "filehist-dimensions": "ಆಯಾಮೊಲು",
        "filehist-filesize": "ಫೈಲ್’ದ ಗಾತ್ರ",
        "filehist-comment": "ಅಬಿಪ್ರಾಯೊ",
        "imagelinks": "ಫೈಲ್‍ದ ಉಪಯೋಗ",
-       "linkstoimage": "ಈ ತಿರ್ತ್‍ದ {{PLURAL:$1|page links|$1 ಪುಟೊಲೆ ಕೊಂಡಿ}}ಈ ಫೈಲ್‍ಗ್ ಕೊನಪೋಪುಂಡು.",
+       "linkstoimage": "ಈ ತಿರ್ತ್‍ದ {{PLURAL:$1|ಪುಟೊ|$1 ಪುಟೊಕುಲು}} ಈ ಫೈಲ್‍ಗ್ ಸಂಪರ್ಕೊ ಕೊರ್ಪುಂಡು.",
        "nolinkstoimage": "ಈ ಫೈಲ್‍ಗ್ ಸಂಪರ್ಕೊ ಉಪ್ಪುನ ವಾ ಪುಟೊಲಾ ಇದ್ದಿ.",
        "sharedupload": "ಈ ಫೈಲ್’ನ್ ಮಸ್ತ್ ಜನ ಪಟ್ಟ್’ದುಲ್ಲೆರ್ ಅಂಚೆನೆ ಉಂದು ಮಸ್ತ್ ಪ್ರೊಜೆಕ್ಟ್’ಲೆಡ್ ಉಪಯೋಗಿಸೊಲಿ",
-       "sharedupload-desc-here": "à²\88 à²ªà³\81à²\9fà³\8a $1ಡà³\8dದà³\8d à²¬à³\8aà²\95à³\8dà²\95 à²¬à³\87ತà³\86 à²¯à³\8bà²\9cನà³\86ಡà³\8dದà³\8d à²\97ಲಸà³\8aಲಿ.\nà²\88 à²ªà³\81à²\9fà³\8aತ à²µà²¿à²µà²°à³\8a [$2 à²ªà³\81à²\9fà³\8aತ à²µà²¿à²µà²°à³\8a] à²¤à²¿à²°à³\8dತ à²¸à²¾à²²à³\8dâ\80\8dಡà³\8d à²¤à³\8bà²\9cಾದà³\8dà²\82ಡà³\8d",
-       "upload-disallowed-here": "à²\88ರà³\8d à²\88 à²«à³\88ಲà³\8dâ\80\8dನà³\8d à²\95à³\81ಡà³\8aರà³\8a à²¬à²°à³\86ವರà³\86 à²¸à²¾à²¦à³\8dಯà³\8a à²\87ದà³\8dದಿ.",
+       "sharedupload-desc-here": "à²\88 à²ªà³\81à²\9fà³\8a $1ಡà³\8dದà³\8d à²¬à³\88ದà³\8dà²\82ಡà³\8d à²¬à³\8aà²\95à³\8dà²\95 à²¬à³\87ತà³\86 à²¯à³\8bà²\9cನà³\86ಲà³\86ಡà³\8d à²\97ಲಸà³\8aಲಿ.\n[$2 à²\95ಡತ à²µà²¿à²µà²°à²£à³\86 à²ªà³\81à²\9f]ತ à²®à²¿à²¤à³\8dತà³\8d à²µà²¿à²µà²°à²£à³\86ನà³\8d à²¤à²¿à²°à³\8dತ à²¸à²¾à²²à³\8dâ\80\8dಡà³\8d à²¤à³\8bà²\9cಾದà³\8dà²\82ಡà³\8d.",
+       "upload-disallowed-here": "à²\88ರà³\8d à²\88 à²«à³\88ಲà³\8dâ\80\8dನà³\8d à²\95à³\81ಡà³\8aರà³\8a à²¬à²°à³\86ಯà³\86ರà³\86 à²¸à²¾à²¦à³\8dಯà³\8a à²\87à²\9cà³\8dà²\9cಿ.",
        "filerevert-comment": "ಕಾರಣ:",
        "filerevert-submit": "ದುಂಬುದ ಲೆಕ ಮಲ್ಪುಲೆ",
        "filedelete": "$1 ನ್ ಮಾಜಾಲೆ",
        "deletecomment": "ಕಾರಣ:",
        "deletereasonotherlist": "ಬೇತೆ ಕಾರಣ",
        "delete-edit-reasonlist": "ಮಾಜಾಯಿನ ಕಾರಣೊಲೆನ್ ಸಂಪಾದನೆ ಮಲ್ಪುಲೆ",
-       "rollbacklink": "ಪà³\81ಡತà³\8dತà³\8d à²ªà²¾à²¡್",
-       "rollbacklinkcount": "ಪಿರ ದೆತೊನ್ಲೆ $1 {{PLURAL:$1|edit|ಸಂಪದನೆಲು}}",
+       "rollbacklink": "ಪಿರ à²¤à²¿à²°à³\8dà²\97ಾವ್",
+       "rollbacklinkcount": "$1 {{PLURAL:$1|ಸಂಪಾದನೆನ್|ಸಂಪಾದನೆಲೆನ್}} ಪಿರ ತಿರ್ಗಾವ್",
        "changecontentmodel": "ಪುಟೊತ ವಿಸಯ ಮಾದರಿನ್ ಬದಲ್ ಮಲ್ಪುಲೆ",
        "changecontentmodel-title-label": "ಪುಟೊದ ಪುದರ್",
        "changecontentmodel-reason-label": "ಕಾರಣ:",
        "blocklist-target": "ಗುರಿ",
        "blocklist-reason": "ಕಾರಣೊ",
        "ipblocklist-submit": "ನಾಡ್‍ಲೆ",
-       "blocklink": "à²\85ಡà³\8dಡ à²ªà²¤à³\8dತà³\8dâ\80\8cಲೆ",
+       "blocklink": "ತಡà³\86ಪà³\81ಲೆ",
        "unblocklink": "ಅಡ್ಡನ್ ದೆಪ್ಪುಲೆ",
        "change-blocklink": "ಬ್ಲಾಕ್’ನ್ ಬದಲಾಲೆ",
        "contribslink": "ಕಾಣಿಕೆಲು",
        "tooltip-watch": "ಈ ಪುಟನ್ ಈರ್ನ ತೂಪುನ ಪಟ್ಟಿಗ್ ಸೇರ್ಸಾಲೆ",
        "tooltip-recreate": "ಈ ಪುಟ ಇತ್ತೆ ಇಜ್ಜ೦ಡಲಾ ಐನ್ ಪಿರ ಮಲ್ಪ್",
        "tooltip-upload": "ಅಪ್ಲೋಡ್ ಸುರು ಮಲ್ಪು",
-       "tooltip-rollback": "ಅಕೇರಿದ ಸಂಪಾದಕೆರೆನ ಮಾಂತ ಸಂಪದನೆನ್ಲಾ ಮಾಜದ್ ಪಾಡುಂಡು",
+       "tooltip-rollback": "\"ಪಿರ ತಿರ್ಗಾವ್\" ಅಕೇರಿದ ಸಂಪಾದಕೆರೆನ ಸಂಪಾದನೆಲೆನ್ ಒಂಜೇ ಕ್ಲಿಕ್ಕ್‌ಡ್ ಈ ಪುಟೊಕು ಪಿರ ತಿರ್ಗಾವುಂಡು.",
        "tooltip-undo": "\"ವಜಾ ಮಲ್ಪುಲೆ\" ಈ ಬದಲಾವಣೆನ್ ದೆತೊನುಜಿ ಬುಕ್ಕೊ ಪ್ರಿವ್ಯೂ ಮೋಡ್‍ಡ್ ಬದಲಾವಣೆ ಮಲ್ಪೆರ್ ಕೊನೊಪು೦ಡು. ಅ೦ಚೆನೆ ಸಾರಾಂಸೊಡು ಬದಲಾವಣೆಗ್ ಕಾರಣ ಸೇರಾಯರ ಆಪು೦ಡು.",
        "tooltip-summary": "ಒಂಜಿ ಎಲ್ಯ ಸಾರಾಂಸೊ ಕೊರ್ಲೆ",
        "simpleantispam-label": "ಯಾಂಟಿ-ಸ್ಪಾಮ್ ಚೆಕ್.\nಮುಲ್ಪ <strong>ದಿಂಜಾವೊಡ್ಚಿ</strong>",
        "file-nohires": "ಇಂದೆರ್ದ್ ಜಾಸ್ತಿ ರೆಸಲ್ಯೂಶನ್ ಇಜ್ಜಿ.",
        "svg-long-desc": "ಎಸ್.ವಿ.ಜಿ ಫೈಲ್, ಸುಮಾರಾದ್ $1 × $2 ಚಿತ್ರೊಬಿಂದು, ಫೈಲ್‍ದ ಗಾತ್ರ: $3",
        "show-big-image": "ಮೂಲೊ ಫೈಲ್",
-       "show-big-image-preview": "ಪಿರವà³\81ದ à²ªà³\81à²\9fà³\8aತ ಗಾತ್ರೊ: $1.",
-       "show-big-image-other": "ಬೇತೆ{{PLURAL:$2|resolution|ಪಟೊತ್ತ ಗಾತ್ರೊ }}: $1.",
+       "show-big-image-preview": "à²\88 à²®à³\81ನà³\8dನà³\8bà²\9fದ ಗಾತ್ರೊ: $1.",
+       "show-big-image-other": "ಬೇತೆ{{PLURAL:$2|ಪಟೊತ್ತ ಗಾತ್ರೊ|ಪಟೊತ್ತ ಗಾತ್ರೊ }}: $1.",
        "show-big-image-size": "$1 × $2 ಚಿತ್ರೊ ಬಿಂದುಲು",
        "newimages": "ಪೊಸ ಕಡತೊಲೆನ್ ಗ್ಯಾಲರಿ",
        "newimages-legend": "ಅರಿಪೆ",
        "days": "{{PLURAL:$1|$1 ದಿನೊ|$1 ದಿನೊಕುಲು}}",
        "bad_image_list": "ವ್ಯವಸ್ಥೆದ ಆಕಾರ ಈ ರೀತಿ ಉಂಡು:\n\nಪಟ್ಟಿಡುಪ್ಪುನಂಚಿನ ದಾಖಲೆಲೆನ್ (* ರ್ದ್ ಶುರು ಆಪುನ ಸಾಲ್’ಲು) ಮಾತ್ರ ಪರಿಗಣನೆಗ್ ದೆತೊನೆರಾಪುಂಡು.\nಪ್ರತಿ ಸಾಲ್’ದ ಶುರುತ ಲಿಂಕ್ ಒಂಜಿ ದೋಷ ಉಪ್ಪುನಂಚಿನ ಫೈಲ್’ಗ್ ಲಿಂಕಾದುಪ್ಪೊಡು.\nಅವ್ವೇ ಸಾಲ್’ದ ಶುರುತ ಪೂರಾ ಲಿಂಕ್’ಲೆನ್ ಪರಿಗನೆರ್ದ್ ದೆಪ್ಪೆರಾಪುಂಡು, ಪಂಡ ಓವು ಪುಟೊಲೆಡ್ ಫೈಲ್’ದ ಬಗ್ಗೆ ಬರ್ಪುಂಡೋ ಔಲು.",
        "metadata": "ಮೆಟಾಡೇಟಾ",
-       "metadata-help": "à²\88 à²ªà³\88ಲà³\8dâ\80\8dಡà³\8d à²\9cಾಸà³\8dತಿ à²®à²¾à²¹à²¿à²¤à²¿ à²\89à²\82ಡà³\81. à²¹à³\86à²\9aà³\8dà²\9aಿನà²\82ಸà³\8a à²ªà³\88ಲà³\8dâ\80\8dನà³\8d à²\89à²\82ಡà³\81 à²®à²²à³\8dಪà³\86ರà³\86 à²\89ಪಯà³\8bà²\97 à²®à²²à³\8dತಿನ à²¡à²¿à²\9cಿà²\9fಲà³\8d à²\95à³\8dಯಾಮà³\86ರರà³\8dದà³\8d à²\85ತà³\8dತà³\8dà²\82ಡ à²¸à³\8dà²\95à³\8dಯಾನರà³\8dâ\80\8cರà³\8dದà³\8d à²\88 à²®à²¾à²¹à²¿à²¤à²¿ à²¬à³\88ದà³\8dà²\82ಡà³\8d.\nಮà³\82ಲಪà³\8dರತಿರà³\8dದà³\8d à²\88 à²ªà³\88ಲà³\8d à²¬à²¦à²²à²¾à²¦à²¿à²¤à³\8dತà³\8dà²\82ಡ, à²\95à³\86ಲವà³\81 à²®à²¾à²¹à²¿à²¤à²¿ à²¬à²¦à²²à²¾à²¤à²¿à²¨ à²ªà³\88ಲà³\8dâ\80\8dದ à²µà²¿à²µà²°à³\8aಲà³\86à²\97à³\8d à²¸à²°à²¿à²¯à²¾à²¦à³\8d à²¹à³\8aà²\82ದಂದೆ ಉಪ್ಪು.",
+       "metadata-help": "à²\88 à²ªà³\88ಲà³\8dâ\80\8dಡà³\8d à²\9cಾಸà³\8dತಿ à²®à²¾à²¹à²¿à²¤à²¿ à²\89à²\82ಡà³\81. à²¹à³\86à²\9aà³\8dà²\9aಿನà²\82ಸà³\8a à²ªà³\88ಲà³\8dâ\80\8dನà³\8d à²\89à²\82ಡà³\81 à²®à²²à³\8dಪà³\86ರà³\86 à²\89ಪಯà³\8bà²\97 à²®à²²à³\8dತಿನ à²¡à²¿à²\9cಿà²\9fಲà³\8d à²\95à³\8dಯಾಮà³\86ರರà³\8dದà³\8d à²\85ತà³\8dತà³\8dà²\82ಡ à²¸à³\8dà²\95à³\8dಯಾನರà³\8dâ\80\8cರà³\8dದà³\8d à²\88 à²®à²¾à²¹à²¿à²¤à²¿ à²¬à³\88ದà³\8dà²\82ಡà³\8d.\nಮà³\82ಲಪà³\8dರತಿರà³\8dದà³\8d à²\88 à²ªà³\88ಲà³\8d à²¬à²¦à²²à²¾à²¦à²¿à²¤à³\8dತà³\8dà²\82ಡ, à²\95à³\86ಲವà³\81 à²®à²¾à²¹à²¿à²¤à²¿ à²¬à²¦à²²à²¾à²¤à²¿à²¨ à²ªà³\88ಲà³\8dâ\80\8dದ à²µà²¿à²µà²°à³\8aಲà³\86à²\97à³\8d à²¸à²°à²¿à²¯à²¾à²¦à³\8d à²\92ಪà³\8dಪಂದೆ ಉಪ್ಪು.",
        "metadata-expand": "ವಿಸ್ತಾರವಾಯಿನ ವಿವರೊಲೆನ್ ತೊಜ್ಪಾವು",
        "metadata-collapse": "ವಿಸ್ತಾರವಾಯಿನ ವಿವರೊಲೆನ್ ದೆಂಗಾವು",
-       "metadata-fields": "à²\88 à²¸à²\82ದà³\87ಸà³\8aಡà³\81 à²ªà²\9fà³\8dà²\9fಿ à²®à²²à³\8dತಿನà²\82à²\9aಿನ EXIF à²®à²¿à²¤à³\8dತ à²¦à²°à³\8dà²\9cà³\86ದ à²®à²¾à²¹à²¿à²¤à²¿à²¨à³\8d à²\9aಿತà³\8dರà³\8a à²ªà³\81à²\9fà³\8aà²\95à³\81 à²¸à³\87ರà³\8dಪಾಯà³\86ರà³\86 à²\86ವà³\8aà²\82ದà³\81à²\82ಡà³\81. à²ªà³\81à²\9fà³\8aà²\9fà³\81 à²®à²¿à²¤à³\8dತ à²¦à²°à³\8dà²\9cà³\86 à²®à²¾à²¹à²¿à²¤à²¿à²¦ à²ªà²\9fà³\8dà²\9fಿನà³\8d à²¦à³\86ಪà³\8dಪà³\81ನà²\97 à²\89à²\82ದà³\81 à²¤à³\8bà²\9cà³\81à²\82ಡà³\81.\nà²\92ರಿದನವà³\81 à²®à³\82ಲà³\8a à²¸à³\8dಥಿತಿà²\9fà³\8d à²\85ಡà³\86à²\82à²\97à³\8dâ\80\8dದà³\81à²\82ಡà³\81.\n*ಮಲà³\8dಪà³\81ಲà³\86\n*ಮಾದರಿ\n*ದಿನà³\8a à²ªà³\8aರà³\8dತà³\81 à²®à³\82ಲà³\8a\n*ಮಾನಾದಿà²\97à³\86ದ à²¸à²®à²¯à³\8a\n*ಫà³\8dâ\80\8dಸà²\82à²\96à³\8dಯà³\86\n*à²\90à²\8eಸà³\8dà²\92 à²µà³\87à²\97à³\8aದ à²°à³\87à²\9fಿà²\82à²\97à³\8d\n*ತà³\82ಪಿನ à²\9cಾà²\97à³\86ದ à²¦à³\82ರ\n*à²\95ಲಾವಿದà³\86\n*à²\95à³\83ತಿಸà³\8dವಾಮà³\8dಯà³\8a\n*à²\9aಿತà³\8dರà³\8a à²µà²¿à²µà²°à²£à³\86\n*à²\9cಿಪಿà²\8eಸà³\8d à²\85à²\95à³\8dಷಾà²\82ಸà³\8a\n*à²\9cಿಪಿà²\8eಸà³\8d à²°à³\87à²\96ಾà²\82ಸà³\8a\n*à²\9cಿಪಿà²\8eಸà³\8d à²\8eತà³\8dತರà³\8a",
+       "metadata-fields": "ಮà³\86à²\9fಾಡà³\87à²\9fಾ à²\9fà³\87ಬಲà³\8d à²\8eಲà³\8dಯ à²\86ನà²\97, à²\88 à²¸à²\82ದà³\87ಸà³\8aಡà³\81 à²ªà²\9fà³\8dà²\9fಿ à²®à²²à³\8dತಿನ à²\9aಿತà³\8dರ à²®à³\86à²\9fಾಡà³\87à²\9fಾ à²\9cಾà²\97à³\86ಲà³\81 à²\9aಿತà³\8dರ à²ªà³\81à²\9f à²ªà³\8dರದರà³\8dಶನà³\8aಡà³\81 à²¸à³\87ರà³\81à²\82ಡà³\81. à²\92ರಿದಿನವà³\81 à²®à³\82ಲ à²¸à³\8dಥಿತಿà²\9fà³\8d à²¦à³\86à²\82à²\97à³\8dâ\80\8cದà³\81ಪà³\8dಪà³\81à²\82ಡà³\81.   \n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
        "exif-imagewidth": "ಅಗೆಲ",
        "exif-imagelength": "ಎತ್ತರೊ",
        "exif-orientation": "ದಿಕ್ಕ್ ದಿಸೆ",
        "logentry-move-move": "$1 {{GENDER:$2|ಜಾರಲೆ}} ಪುಟೊ $3 ಡ್ದ್ $4",
        "logentry-move-move-noredirect": "$1 ಪುಟೊ $3 ನ್ ಪುಟೊ $4 ಕ್ ರೀಡೈರೆಕ್ಟ್ ಕೊರಂದೆ {{GENDER:$2|ವರ್ಗಾವಣೆ ಮಲ್ತೆರ್}}",
        "logentry-move-move_redir": "$1 ಪುಟೊ $3 ನ್ ಪುಟೊ $4 ಕ್ ರೀಡೈರೆಕ್ಟ್ ಕೊರ್ದು {{GENDER:$2|ವರ್ಗಾವಣೆ ಮಲ್ತೆರ್}}",
-       "logentry-newusers-create": "ಬಳà²\95à³\86ದಾರà³\86ರà³\86 à²\95ಾತà³\86 $1 à²¨à³\8d {{GENDER:$2|ಸà³\8dರಿಸà³\8dà²\9fಿ à²®à²²à³\8dತಾಂಡ್}}",
+       "logentry-newusers-create": "ಸದಸà³\8dಯà³\86ರà³\86 à²\95ಾತà³\86 $1 à²¨à³\8d {{GENDER:$2|à²\89à²\82ಡà³\81 à²®à²²à³\8dತà³\8dâ\80\8cಂಡ್}}",
        "logentry-newusers-autocreate": "ಸದಸ್ಯೆರೆ ಖಾತೆ $1 ತನ್ನಾತೆಗ್ {{GENDER:$2|ಉಂಡಾತ್ಂಡ್}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|ಅಪ್ಲೋಡ್ ಮಲ್ತ್‌ದೆರ್}} $3",
        "searchsuggest-search": "{{SITENAME}}ನ್ ನಾಡ್‍ಲೆ",
index 5e8e754..9ccf6d6 100644 (file)
@@ -49,4 +49,3 @@ class CodeCleanerGlobalsPass extends \Psy\CodeCleaner\CodeCleanerPass {
                return $nodes;
        }
 }
-
index 0039d20..832da4d 100644 (file)
@@ -35,15 +35,20 @@ require_once __DIR__ . '/../Maintenance.php';
  */
 abstract class Benchmarker extends Maintenance {
        protected $defaultCount = 100;
+       private $lang;
 
        public function __construct() {
                parent::__construct();
                $this->addOption( 'count', 'How many times to run a benchmark', false, true );
+               $this->addOption( 'verbose', 'Verbose logging of resource usage', false, false, 'v' );
        }
 
        public function bench( array $benchs ) {
+               $this->lang = Language::factory( 'en' );
+
                $this->startBench();
                $count = $this->getOption( 'count', $this->defaultCount );
+               $verbose = $this->hasOption( 'verbose' );
                foreach ( $benchs as $key => $bench ) {
                        // Shortcut for simple functions
                        if ( is_callable( $bench ) ) {
@@ -66,6 +71,9 @@ abstract class Benchmarker extends Maintenance {
                                $t = microtime( true );
                                call_user_func_array( $bench['function'], $bench['args'] );
                                $t = ( microtime( true ) - $t ) * 1000;
+                               if ( $verbose ) {
+                                       $this->verboseRun( $i );
+                               }
                                $times[] = $t;
                        }
 
@@ -104,6 +112,10 @@ abstract class Benchmarker extends Maintenance {
                                'median' => $median,
                                'mean' => $mean,
                                'max' => $max,
+                               'usage' => [
+                                       'mem' => memory_get_usage( true ),
+                                       'mempeak' => memory_get_peak_usage( true ),
+                               ],
                        ] );
                }
        }
@@ -126,12 +138,32 @@ abstract class Benchmarker extends Maintenance {
                        'times',
                        $res['count']
                );
+
                foreach ( [ 'total', 'min', 'median', 'mean', 'max' ] as $metric ) {
                        $ret .= sprintf( "  %' 6s: %6.2fms\n",
                                $metric,
                                $res[$metric]
                        );
                }
+
+               foreach ( [
+                       'mem' => 'Current memory usage',
+                       'mempeak' => 'Peak memory usage'
+               ] as $key => $label ) {
+                       $ret .= sprintf( "%' 20s: %s\n",
+                               $label,
+                               $this->lang->formatSize( $res['usage'][$key] )
+                       );
+               }
+
                $this->output( "$ret\n" );
        }
+
+       protected function verboseRun( $iteration ) {
+               $this->output( sprintf( "#%3d - memory: %-10s - peak: %-10s\n",
+                       $iteration,
+                       $this->lang->formatSize( memory_get_usage( true ) ),
+                       $this->lang->formatSize( memory_get_peak_usage( true ) )
+               ) );
+       }
 }
diff --git a/maintenance/benchmarks/benchmarkJSMinPlus.php b/maintenance/benchmarks/benchmarkJSMinPlus.php
new file mode 100644 (file)
index 0000000..dc92516
--- /dev/null
@@ -0,0 +1,62 @@
+<?php
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Benchmark
+ * @author Timo Tijhof
+ */
+
+require_once __DIR__ . '/Benchmarker.php';
+
+/**
+ * Maintenance script that benchmarks JSMinPlus.
+ *
+ * @ingroup Benchmark
+ */
+class BenchmarkJSMinPlus extends Benchmarker {
+       protected $defaultCount = 10;
+
+       public function __construct() {
+               parent::__construct();
+               $this->addDescription( 'Benchmarks JSMinPlus.' );
+               $this->addOption( 'file', 'Path to JS file', true, true );
+       }
+
+       public function execute() {
+               MediaWiki\suppressWarnings();
+               $content = file_get_contents( $this->getOption( 'file' ) );
+               MediaWiki\restoreWarnings();
+               if ( $content === false ) {
+                       $this->error( 'Unable to open input file', 1 );
+               }
+
+               $filename = basename( $this->getOption( 'file' ) );
+               $parser = new JSParser();
+
+               $this->bench( [
+                       "JSParser::parse ($filename)" => [
+                               'function' => function ( $parser, $content, $filename ) {
+                                       $parser->parse( $content, $filename, 1 );
+                               },
+                               'args' => [ $parser, $content, $filename ]
+                       ]
+               ] );
+       }
+}
+
+$maintClass = 'BenchmarkJSMinPlus';
+require_once RUN_MAINTENANCE_IF_MAIN;
index af05a81..0f33a14 100644 (file)
@@ -21,7 +21,6 @@
  *
  * @file
  * @ingroup Maintenance
- * @author Aaron Schulz
  */
 
 require_once __DIR__ . '/Maintenance.php';
index 2fb83fc..905b5d9 100644 (file)
@@ -21,7 +21,6 @@
  *
  * @file
  * @ingroup Maintenance
- * @author Aaron Schulz
  */
 
 require_once __DIR__ . '/Maintenance.php';
index 1ddc0f5..c90056d 100644 (file)
@@ -19,7 +19,6 @@
  *
  * @file
  * @ingroup Maintenance
- * @author Aaron Schulz
  */
 
 require_once __DIR__ . '/Maintenance.php';
index 7979e7d..4ce7ca6 100644 (file)
@@ -16,7 +16,6 @@
  * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
- * @author Aaron Schulz
  */
 
 require_once __DIR__ . '/Maintenance.php';
index 5980631..765fbe4 100644 (file)
@@ -16,7 +16,6 @@
  * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
- * @author Aaron Schulz
  */
 
 require_once __DIR__ . '/Maintenance.php';
index 770251c..49b945c 100644 (file)
@@ -24,7 +24,7 @@
 require_once __DIR__ . '/Maintenance.php';
 
 /**
- * Maintenance script to do test JavaScript validity parses using jsmin+'s parser
+ * Maintenance script to test JavaScript validity using JsMinPlus' parser
  *
  * @ingroup Maintenance
  */
index bbedf0c..32333b7 100644 (file)
@@ -19,7 +19,6 @@
  *
  * @file
  * @ingroup Maintenance
- * @author Aaron Schulz
  */
 
 require_once __DIR__ . '/Maintenance.php';
index e252256..bca1c96 100644 (file)
@@ -20,7 +20,6 @@
  * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
- * @author Aaron Schulz
  * @ingroup Maintenance
  */
 
index 9906990..aa1f668 100644 (file)
@@ -8,7 +8,7 @@ class ValidateRegistrationFile extends Maintenance {
                $this->addArg( 'path', 'Path to extension.json/skin.json file.', true );
        }
        public function execute() {
-               $validator = new ExtensionJsonValidator( function( $msg ) {
+               $validator = new ExtensionJsonValidator( function ( $msg ) {
                        $this->error( $msg, 1 );
                } );
                $validator->checkDependencies();
index 440604e..197cc78 100644 (file)
--- a/phpcs.xml
+++ b/phpcs.xml
@@ -38,7 +38,7 @@
                </properties>
        </rule>
        <file>.</file>
-       <arg name="encoding" value="utf8"/>
+       <arg name="encoding" value="UTF-8"/>
        <arg name="extensions" value="php,php5,inc,sample"/>
        <rule ref="Generic.Files.LineLength">
                <exclude-pattern>*/languages/messages/Messages*.php</exclude-pattern>
index 66ea2a9..dc05387 100644 (file)
@@ -1418,6 +1418,7 @@ return [
                        'jquery.accessKeyLabel',
                        'jquery.textSelection',
                        'jquery.byteLimit',
+                       'mediawiki.widgets.visibleByteLimit',
                        'mediawiki.api',
                ],
        ],
@@ -2013,7 +2014,7 @@ return [
        'mediawiki.special.movePage' => [
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.movePage.js',
                'dependencies' => [
-                       'jquery.byteLimit',
+                       'mediawiki.widgets.visibleByteLimit',
                        'mediawiki.widgets',
                ],
        ],
@@ -2373,6 +2374,16 @@ return [
                ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
+       'mediawiki.widgets.visibleByteLimit' => [
+               'scripts' => [
+                       'resources/src/mediawiki.widgets.visibleByteLimit/mediawiki.widgets.visibleByteLimit.js'
+               ],
+               'dependencies' => [
+                       'oojs-ui-core',
+                       'jquery.byteLimit'
+               ],
+               'targets' => [ 'desktop', 'mobile' ]
+       ],
        'mediawiki.widgets.datetime' => [
                'scripts' => [
                        'resources/src/mediawiki.widgets.datetime/mediawiki.widgets.datetime.js',
index 8cde703..5b81017 100644 (file)
                                // TODO: This should be an OOjs UI feature, or somehow happen automatically after infusing.
                                wpSummary.$input.updateTooltipAccessKeys();
 
-                               // Make sure edit summary does not exceed byte limit
-                               wpSummary.$input.byteLimit( 255 );
-
                                // Show a byte-counter to users with how many bytes are left for their edit summary.
                                // TODO: This looks a bit weird, as there is no unit in the UI, just numbers; showing
                                // 'bytes' confused users in testing, and showing 'chars' would be a lie. See T42035.
-                               function updateSummaryLabelCount() {
-                                       wpSummary.setLabel( String( 255 - $.byteLength( wpSummary.getValue() ) ) );
-                               }
-                               wpSummary.on( 'change', updateSummaryLabelCount );
-                               // Initialise value
-                               updateSummaryLabelCount();
+                               mw.widgets.visibleByteLimit( wpSummary, 255 );
                        } );
                } else {
                        // Make sure edit summary does not exceed byte limit
index eb52efb..75431d9 100644 (file)
                // Collect views
                allViews = {
                        'default': {
-                               label: mw.msg( 'rcfilters-filterlist-title' ),
+                               title: mw.msg( 'rcfilters-filterlist-title' ),
                                groups: filterGroups
                        }
                };
        /**
         * Get the label for the current view
         *
+        * @param {string} viewName View name
         * @return {string} Label for the current view
         */
-       mw.rcfilters.dm.FiltersViewModel.prototype.getCurrentViewLabel = function () {
-               return this.views[ this.getCurrentView() ].title;
+       mw.rcfilters.dm.FiltersViewModel.prototype.getViewTitle = function ( viewName ) {
+               viewName = viewName || this.getCurrentView();
+
+               return this.views[ viewName ] && this.views[ viewName ].title;
        };
 
        /**
index 6ab1575..5ce7988 100644 (file)
@@ -4,6 +4,7 @@
        .oo-ui-tagMultiselectWidget-input input {
                // Make sure this uses the interface direction, not the content direction
                direction: ltr;
+               border-bottom-right-radius: 0;
        }
 
        &.oo-ui-widget-enabled .oo-ui-tagMultiselectWidget-handle {
@@ -53,7 +54,7 @@
                                }
 
                                &.oo-ui-buttonSelectWidget .oo-ui-buttonOptionWidget:last-child a.oo-ui-buttonElement-button {
-                                       border-radius: 0;
+                                       border-bottom-right-radius: 2px;
                                }
 
                        }
index fe91489..0138884 100644 (file)
        mw.rcfilters.ui.FilterMenuHeaderWidget.prototype.onModelUpdate = function () {
                var currentView = this.model.getCurrentView();
 
-               this.setLabel( this.model.getCurrentViewLabel() );
+               this.setLabel( this.model.getViewTitle( currentView ) );
 
                this.invertNamespacesButton.toggle( currentView === 'namespaces' );
                this.backButton.toggle( currentView !== 'default' );
index 70381f2..0ab459e 100644 (file)
@@ -47,6 +47,7 @@
                                footers: [
                                        {
                                                name: 'viewSelect',
+                                               sticky: false,
                                                // View select menu, appears on default view only
                                                $element: $( '<div>' )
                                                        .append( new mw.rcfilters.ui.ViewSwitchWidget( this.controller, this.model ).$element ),
index 4e1ae97..dbee65c 100644 (file)
         * Clean up the old-style show/hide that we have implemented in the filter list
         */
        mw.rcfilters.ui.FormWrapperWidget.prototype.cleanUpFieldset = function () {
-               var $namespaceSelect = this.$element.find( '#namespace' ),
-                       collapseCookieName = 'changeslist-state';
+               var $namespaceSelect = this.$element.find( '#namespace' );
 
                this.$element.find( '.rcshowhideoption[data-feature-in-structured-ui=1]' ).each( function () {
                        // HACK: Remove the text node after the span.
                        this.$element.find( '.mw-tagfilter-label' ).closest( 'tr' ).detach();
                }
 
-               // Collapse legend
-               // see resources/src/mediawiki.special/mediawiki.special.changelist.legend.js
-               this.$element.find( '.mw-changeslist-legend' )
-                       .makeCollapsible( {
-                               collapsed: mw.cookie.get( collapseCookieName ) === 'collapsed'
-                       } )
-                       .on( 'beforeExpand.mw-collapsible', function () {
-                               mw.cookie.set( collapseCookieName, 'expanded' );
-                       } )
-                       .on( 'beforeCollapse.mw-collapsible', function () {
-                               mw.cookie.set( collapseCookieName, 'collapsed' );
-                       } );
-
+               if ( !this.$element.find( '.mw-recentchanges-table tr' ).length ) {
+                       this.$element.find( 'hr' ).detach();
+               }
        };
 }( mediaWiki ) );
index 74f8bcd..c12e10e 100644 (file)
                // based on view
                config.footers = config.footers || [];
                config.footers.forEach( function ( footerData ) {
-                       var adjustedData = {
-                               // Wrap the element with our own footer wrapper
-                               $element: $( '<div>' )
-                                       .addClass( 'mw-rcfilters-ui-menuSelectWidget-footer' )
-                                       .addClass( 'mw-rcfilters-ui-menuSelectWidget-footer-' + footerData.name )
-                                       .append( footerData.$element ),
-                               views: footerData.views
-                       };
+                       var isSticky = footerData.sticky === undefined ? true : !!footerData.sticky,
+                               adjustedData = {
+                                       // Wrap the element with our own footer wrapper
+                                       $element: $( '<div>' )
+                                               .addClass( 'mw-rcfilters-ui-menuSelectWidget-footer' )
+                                               .addClass( 'mw-rcfilters-ui-menuSelectWidget-footer-' + footerData.name )
+                                               .append( footerData.$element ),
+                                       views: footerData.views
+                               };
 
                        this.footers.push( adjustedData );
-                       this.$element.append( adjustedData.$element );
+
+                       if ( isSticky ) {
+                               this.$element.append( adjustedData.$element );
+                       } else {
+                               this.$body.append( adjustedData.$element );
+                       }
                }.bind( this ) );
 
                // Switch to the correct view
index 3f920f0..fc0f302 100644 (file)
@@ -24,7 +24,7 @@
                // Parent
                mw.rcfilters.ui.SaveFiltersPopupButtonWidget.parent.call( this, $.extend( {
                        framed: false,
-                       icon: 'clip',
+                       icon: 'unClip',
                        $overlay: this.$overlay,
                        title: mw.msg( 'rcfilters-savedqueries-add-new-title' ),
                        popup: {
@@ -36,7 +36,7 @@
                        }
                }, config ) );
                // // HACK: Add an icon to the popup head label
-               this.popup.$head.prepend( ( new OO.ui.IconWidget( { icon: 'clip' } ) ).$element );
+               this.popup.$head.prepend( ( new OO.ui.IconWidget( { icon: 'unClip' } ) ).$element );
 
                this.input = new OO.ui.TextInputWidget( {
                        validate: /\S/
@@ -71,8 +71,7 @@
 
                // Events
                this.popup.connect( this, {
-                       ready: 'onPopupReady',
-                       toggle: 'onPopupToggle'
+                       ready: 'onPopupReady'
                } );
                this.input.connect( this, { enter: 'onInputEnter' } );
                this.input.$input.on( {
                }
        };
 
-       /**
-        * Respond to popup toggle event
-        *
-        * @param {boolean} isVisible Popup is visible
-        */
-       mw.rcfilters.ui.SaveFiltersPopupButtonWidget.prototype.onPopupToggle = function ( isVisible ) {
-               this.setIcon( isVisible ? 'unClip' : 'clip' );
-       };
-
        /**
         * Respond to popup ready event
         */
index f217bf5..ea63e39 100644 (file)
@@ -7,18 +7,21 @@
        var
                cookieName = 'changeslist-state',
                // Expanded by default
-               isCollapsed = mw.cookie.get( cookieName ) === 'collapsed';
+               isCollapsed = mw.cookie.get( cookieName ) === 'collapsed',
+               doCollapsibleLegend = function ( $container ) {
+                       $container.find( '.mw-changeslist-legend' )
+                               .makeCollapsible( {
+                                       collapsed: isCollapsed
+                               } )
+                               .on( 'beforeExpand.mw-collapsible', function () {
+                                       mw.cookie.set( cookieName, 'expanded' );
+                               } )
+                               .on( 'beforeCollapse.mw-collapsible', function () {
+                                       mw.cookie.set( cookieName, 'collapsed' );
+                               } );
+               };
 
        $( function () {
-               $( '.mw-changeslist-legend' )
-                       .makeCollapsible( {
-                               collapsed: isCollapsed
-                       } )
-                       .on( 'beforeExpand.mw-collapsible', function () {
-                               mw.cookie.set( cookieName, 'expanded' );
-                       } )
-                       .on( 'beforeCollapse.mw-collapsible', function () {
-                               mw.cookie.set( cookieName, 'collapsed' );
-                       } );
+               mw.hook( 'wikipage.content' ).add( doCollapsibleLegend );
        } );
 }( mediaWiki, jQuery ) );
index bce512c..2e980ac 100644 (file)
@@ -1,13 +1,15 @@
 /*!
  * JavaScript for Special:MovePage
  */
-jQuery( function ( $ ) {
-       // Infuse for pretty dropdown
-       OO.ui.infuse( 'wpNewTitle' );
-       // Limit to 255 bytes, not characters
-       OO.ui.infuse( 'wpReason' ).$input.byteLimit();
-       // Infuse for nicer "help" popup
-       if ( $( '#wpMovetalk-field' ).length ) {
-               OO.ui.infuse( 'wpMovetalk-field' );
-       }
-} );
+( function ( mw, $ ) {
+       $( function () {
+               // Infuse for pretty dropdown
+               OO.ui.infuse( $( '#wpNewTitle' ) );
+               // Limit to bytes, not characters
+               mw.widgets.visibleByteLimit( OO.ui.infuse( $( '#wpReason' ) ) );
+               // Infuse for nicer "help" popup
+               if ( $( '#wpMovetalk-field' ).length ) {
+                       OO.ui.infuse( $( '#wpMovetalk-field' ) );
+               }
+       } );
+}( mediaWiki, jQuery ) );
diff --git a/resources/src/mediawiki.widgets.visibleByteLimit/mediawiki.widgets.visibleByteLimit.js b/resources/src/mediawiki.widgets.visibleByteLimit/mediawiki.widgets.visibleByteLimit.js
new file mode 100644 (file)
index 0000000..5678a80
--- /dev/null
@@ -0,0 +1,21 @@
+/**
+ * Add a visible byte limit label to a TextInputWidget
+ *
+ * Uses jQuery.byteLimit to enforce the limit.
+
+ * @param {OO.ui.TextInputWidget} textInputWidget Text input widget
+ * @param {number} [limit] Byte limit, defaults to $input's maxlength
+ */
+mediaWiki.widgets.visibleByteLimit = function ( textInputWidget, limit ) {
+       limit = limit || +textInputWidget.$input.attr( 'maxlength' );
+
+       function updateCount() {
+               textInputWidget.setLabel( ( limit - $.byteLength( textInputWidget.getValue() ) ).toString() );
+       }
+       textInputWidget.on( 'change', updateCount );
+       // Initialise value
+       updateCount();
+
+       // Actually enforce limit
+       textInputWidget.$input.byteLimit( limit );
+};
index f44b0d5..a373142 100644 (file)
@@ -28,6 +28,7 @@
 use Wikimedia\Rdbms\IDatabase;
 use MediaWiki\MediaWikiServices;
 use Wikimedia\ScopedCallback;
+use Wikimedia\TestingAccessWrapper;
 
 /**
  * @ingroup Testing
@@ -240,7 +241,7 @@ class ParserTestRunner {
                        'name' => 'nullLockManager',
                        'class' => 'NullLockManager',
                ] ];
-               $reset = function() {
+               $reset = function () {
                        LockManagerGroup::destroySingletons();
                };
                $setup[] = $reset;
@@ -288,7 +289,7 @@ class ParserTestRunner {
                MediaWikiServices::getInstance()->disableService( 'MediaHandlerFactory' );
                MediaWikiServices::getInstance()->redefineService(
                        'MediaHandlerFactory',
-                       function() {
+                       function () {
                                return new MockMediaHandlerFactory();
                        }
                );
@@ -428,7 +429,7 @@ class ParserTestRunner {
         * @return ScopedCallback
         */
        protected function createTeardownObject( $teardown, $nextTeardown = null ) {
-               return new ScopedCallback( function() use ( $teardown, $nextTeardown ) {
+               return new ScopedCallback( function () use ( $teardown, $nextTeardown ) {
                        // Schedule teardown snippets in reverse order
                        $teardown = array_reverse( $teardown );
 
@@ -1045,6 +1046,11 @@ class ParserTestRunner {
                $context->setUser( $user );
                $context->setLanguage( $lang );
                $teardown[] = function () use ( $context ) {
+                       // Clear language conversion tables
+                       $wrapper = TestingAccessWrapper::newFromObject(
+                               $context->getLanguage()->getConverter()
+                       );
+                       $wrapper->reloadTables();
                        // Reset context to the restored globals
                        $context->setUser( $GLOBALS['wgUser'] );
                        $context->setLanguage( $GLOBALS['wgContLang'] );
index df3d568..c1ada45 100644 (file)
@@ -309,7 +309,7 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                ConfigFactory $oldFactory,
                array $configurations
        ) {
-               return function( MediaWikiServices $services ) use ( $oldFactory, $configurations ) {
+               return function ( MediaWikiServices $services ) use ( $oldFactory, $configurations ) {
                        $factory = new ConfigFactory();
 
                        // clone configurations from $oldFactory that are not overwritten by $configurations
diff --git a/tests/phpunit/data/resourceloader/script-comment.js b/tests/phpunit/data/resourceloader/script-comment.js
new file mode 100644 (file)
index 0000000..46b60f9
--- /dev/null
@@ -0,0 +1,3 @@
+/* eslint-disable */
+mw.foo()
+// mw.bar();
diff --git a/tests/phpunit/data/resourceloader/script-nosemi.js b/tests/phpunit/data/resourceloader/script-nosemi.js
new file mode 100644 (file)
index 0000000..2b1550f
--- /dev/null
@@ -0,0 +1,2 @@
+/* eslint-disable */
+mw.foo()
index afd80ff..388aee7 100644 (file)
@@ -3,19 +3,19 @@
 class WfArrayFilterTest extends \PHPUnit_Framework_TestCase {
        public function testWfArrayFilter() {
                $arr = [ 'a' => 1, 'b' => 2, 'c' => 3 ];
-               $filtered = wfArrayFilter( $arr, function( $val, $key ) {
+               $filtered = wfArrayFilter( $arr, function ( $val, $key ) {
                        return $key !== 'b';
                } );
                $this->assertSame( [ 'a' => 1, 'c' => 3 ], $filtered );
 
                $arr = [ 'a' => 1, 'b' => 2, 'c' => 3 ];
-               $filtered = wfArrayFilter( $arr, function( $val, $key ) {
+               $filtered = wfArrayFilter( $arr, function ( $val, $key ) {
                        return $val !== 2;
                } );
                $this->assertSame( [ 'a' => 1, 'c' => 3 ], $filtered );
 
                $arr = [ 'a', 'b', 'c' ];
-               $filtered = wfArrayFilter( $arr, function( $val, $key ) {
+               $filtered = wfArrayFilter( $arr, function ( $val, $key ) {
                        return $key !== 0;
                } );
                $this->assertSame( [ 1 => 'b',  2 => 'c' ], $filtered );
@@ -23,13 +23,13 @@ class WfArrayFilterTest extends \PHPUnit_Framework_TestCase {
 
        public function testWfArrayFilterByKey() {
                $arr = [ 'a' => 1, 'b' => 2, 'c' => 3 ];
-               $filtered = wfArrayFilterByKey( $arr, function( $key ) {
+               $filtered = wfArrayFilterByKey( $arr, function ( $key ) {
                        return $key !== 'b';
                } );
                $this->assertSame( [ 'a' => 1, 'c' => 3 ], $filtered );
 
                $arr = [ 'a', 'b', 'c' ];
-               $filtered = wfArrayFilterByKey( $arr, function( $key ) {
+               $filtered = wfArrayFilterByKey( $arr, function ( $key ) {
                        return $key !== 0;
                } );
                $this->assertSame( [ 1 => 'b',  2 => 'c' ], $filtered );
index 3edf99f..2ca5935 100644 (file)
@@ -385,21 +385,21 @@ class LinkerTest extends MediaWikiLangTestCase {
                return [
                        // Override $html
                        [
-                               function( $dummy, $title, $options, &$html, &$attribs, &$ret ) {
+                               function ( $dummy, $title, $options, &$html, &$attribs, &$ret ) {
                                        $html = 'foobar';
                                },
                                '<a href="/wiki/Special:BlankPage" title="Special:BlankPage">foobar</a>'
                        ],
                        // Modify $attribs
                        [
-                               function( $dummy, $title, $options, &$html, &$attribs, &$ret ) {
+                               function ( $dummy, $title, $options, &$html, &$attribs, &$ret ) {
                                        $attribs['bar'] = 'baz';
                                },
                                '<a href="/wiki/Special:BlankPage" title="Special:BlankPage" bar="baz">Special:BlankPage</a>'
                        ],
                        // Fully override return value and abort hook
                        [
-                               function( $dummy, $title, $options, &$html, &$attribs, &$ret ) {
+                               function ( $dummy, $title, $options, &$html, &$attribs, &$ret ) {
                                        $ret = 'blahblahblah';
                                        return false;
                                },
index 037faa6..b4e9626 100644 (file)
@@ -77,7 +77,7 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
 
                $newServices->defineService(
                        'Test',
-                       function() use ( $service1 ) {
+                       function () use ( $service1 ) {
                                return $service1;
                        }
                );
@@ -121,7 +121,7 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
 
                $newServices->defineService(
                        'Test',
-                       function() use ( &$instantiatorReturnValues ) {
+                       function () use ( &$instantiatorReturnValues ) {
                                return array_shift( $instantiatorReturnValues );
                        }
                );
@@ -150,7 +150,7 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
 
                $newServices->redefineService(
                        'DBLoadBalancerFactory',
-                       function() use ( $lbFactory ) {
+                       function () use ( $lbFactory ) {
                                return $lbFactory;
                        }
                );
@@ -194,7 +194,7 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
 
                $newServices->defineService(
                        'Test',
-                       function() use ( &$instantiatorReturnValues ) {
+                       function () use ( &$instantiatorReturnValues ) {
                                return array_shift( $instantiatorReturnValues );
                        }
                );
@@ -217,7 +217,7 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
 
                $services->defineService(
                        'Test',
-                       function() use ( &$serviceCounter ) {
+                       function () use ( &$serviceCounter ) {
                                $serviceCounter++;
                                $service = $this->createMock( 'MediaWiki\Services\DestructibleService' );
                                $service->expects( $this->once() )->method( 'destroy' );
@@ -247,7 +247,7 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
 
                $services->defineService(
                        'Test',
-                       function() {
+                       function () {
                                $service = $this->createMock( 'MediaWiki\Services\DestructibleService' );
                                $service->expects( $this->never() )->method( 'destroy' );
                                return $service;
index 617e39c..b68ee48 100644 (file)
@@ -20,7 +20,7 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
                $this->assertEmpty( $names );
 
                $name = 'TestService92834576';
-               $services->defineService( $name, function() {
+               $services->defineService( $name, function () {
                        return null;
                } );
 
@@ -34,7 +34,7 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
                $name = 'TestService92834576';
                $this->assertFalse( $services->hasService( $name ) );
 
-               $services->defineService( $name, function() {
+               $services->defineService( $name, function () {
                        return null;
                } );
 
@@ -50,7 +50,7 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
 
                $services->defineService(
                        $name,
-                       function( $actualLocator, $extra ) use ( $services, $theService, &$count ) {
+                       function ( $actualLocator, $extra ) use ( $services, $theService, &$count ) {
                                $count++;
                                PHPUnit_Framework_Assert::assertSame( $services, $actualLocator );
                                PHPUnit_Framework_Assert::assertSame( $extra, 'Foo' );
@@ -79,14 +79,14 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
 
                $services->defineService(
                        'Foo',
-                       function() {
+                       function () {
                                return new stdClass();
                        }
                );
 
                $services->defineService(
                        'Bar',
-                       function() {
+                       function () {
                                return new stdClass();
                        }
                );
@@ -122,7 +122,7 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
                $theService = new stdClass();
                $name = 'TestService92834576';
 
-               $services->defineService( $name, function( $actualLocator ) use ( $services, $theService ) {
+               $services->defineService( $name, function ( $actualLocator ) use ( $services, $theService ) {
                        PHPUnit_Framework_Assert::assertSame( $services, $actualLocator );
                        return $theService;
                } );
@@ -137,13 +137,13 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
                $theService = new stdClass();
                $name = 'TestService92834576';
 
-               $services->defineService( $name, function() use ( $theService ) {
+               $services->defineService( $name, function () use ( $theService ) {
                        return $theService;
                } );
 
                $this->setExpectedException( 'MediaWiki\Services\ServiceAlreadyDefinedException' );
 
-               $services->defineService( $name, function() use ( $theService ) {
+               $services->defineService( $name, function () use ( $theService ) {
                        return $theService;
                } );
        }
@@ -152,10 +152,10 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
                $services = $this->newServiceContainer();
 
                $wiring = [
-                       'Foo' => function() {
+                       'Foo' => function () {
                                return 'Foo!';
                        },
-                       'Bar' => function() {
+                       'Bar' => function () {
                                return 'Bar!';
                        },
                ];
@@ -170,13 +170,13 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
                $services = $this->newServiceContainer();
 
                $wiring = [
-                       'Foo' => function() {
+                       'Foo' => function () {
                                return 'Foo!';
                        },
-                       'Bar' => function() {
+                       'Bar' => function () {
                                return 'Bar!';
                        },
-                       'Car' => function() {
+                       'Car' => function () {
                                return 'FUBAR!';
                        },
                ];
@@ -187,7 +187,7 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
 
                // define a service before importing, so we can later check that
                // existing service instances survive importWiring()
-               $newServices->defineService( 'Car', function() {
+               $newServices->defineService( 'Car', function () {
                        return 'Car!';
                } );
 
@@ -196,7 +196,7 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
 
                // Define another service, so we can later check that extra wiring
                // is not lost.
-               $newServices->defineService( 'Xar', function() {
+               $newServices->defineService( 'Xar', function () {
                        return 'Xar!';
                } );
 
@@ -249,7 +249,7 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
                $theService1 = new stdClass();
                $name = 'TestService92834576';
 
-               $services->defineService( $name, function() {
+               $services->defineService( $name, function () {
                        PHPUnit_Framework_Assert::fail(
                                'The original instantiator function should not get called'
                        );
@@ -258,7 +258,7 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
                // redefine before instantiation
                $services->redefineService(
                        $name,
-                       function( $actualLocator, $extra ) use ( $services, $theService1 ) {
+                       function ( $actualLocator, $extra ) use ( $services, $theService1 ) {
                                PHPUnit_Framework_Assert::assertSame( $services, $actualLocator );
                                PHPUnit_Framework_Assert::assertSame( 'Foo', $extra );
                                return $theService1;
@@ -275,14 +275,14 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
                $theService1 = new stdClass();
                $name = 'TestService92834576';
 
-               $services->defineService( $name, function() {
+               $services->defineService( $name, function () {
                        return 'Foo';
                } );
 
                // disable the service. we should be able to redefine it anyway.
                $services->disableService( $name );
 
-               $services->redefineService( $name, function() use ( $theService1 ) {
+               $services->redefineService( $name, function () use ( $theService1 ) {
                        return $theService1;
                } );
 
@@ -298,7 +298,7 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
 
                $this->setExpectedException( 'MediaWiki\Services\NoSuchServiceException' );
 
-               $services->redefineService( $name, function() use ( $theService ) {
+               $services->redefineService( $name, function () use ( $theService ) {
                        return $theService;
                } );
        }
@@ -309,7 +309,7 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
                $theService = new stdClass();
                $name = 'TestService92834576';
 
-               $services->defineService( $name, function() {
+               $services->defineService( $name, function () {
                        return 'Foo';
                } );
 
@@ -318,7 +318,7 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
 
                $this->setExpectedException( 'MediaWiki\Services\CannotReplaceActiveServiceException' );
 
-               $services->redefineService( $name, function() use ( $theService ) {
+               $services->redefineService( $name, function () use ( $theService ) {
                        return $theService;
                } );
        }
@@ -331,13 +331,13 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
                $destructible->expects( $this->once() )
                        ->method( 'destroy' );
 
-               $services->defineService( 'Foo', function() use ( $destructible ) {
+               $services->defineService( 'Foo', function () use ( $destructible ) {
                        return $destructible;
                } );
-               $services->defineService( 'Bar', function() {
+               $services->defineService( 'Bar', function () {
                        return new stdClass();
                } );
-               $services->defineService( 'Qux', function() {
+               $services->defineService( 'Qux', function () {
                        return new stdClass();
                } );
 
@@ -377,7 +377,7 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
 
                $this->setExpectedException( 'MediaWiki\Services\NoSuchServiceException' );
 
-               $services->redefineService( $name, function() use ( $theService ) {
+               $services->redefineService( $name, function () use ( $theService ) {
                        return $theService;
                } );
        }
@@ -390,11 +390,11 @@ class ServiceContainerTest extends PHPUnit_Framework_TestCase {
                $destructible->expects( $this->once() )
                        ->method( 'destroy' );
 
-               $services->defineService( 'Foo', function() use ( $destructible ) {
+               $services->defineService( 'Foo', function () use ( $destructible ) {
                        return $destructible;
                } );
 
-               $services->defineService( 'Bar', function() {
+               $services->defineService( 'Bar', function () {
                        return new stdClass();
                } );
 
index 186021a..b6ff4eb 100644 (file)
@@ -4,7 +4,7 @@
  */
 
 return [
-       'Foo' => function() {
+       'Foo' => function () {
                return 'Foo!';
        },
 ];
index 3b4fff0..dfff64f 100644 (file)
@@ -4,7 +4,7 @@
  */
 
 return [
-       'Bar' => function() {
+       'Bar' => function () {
                return 'Bar!';
        },
 ];
index 84a6adf..21d1bf2 100644 (file)
@@ -2,7 +2,7 @@
 /**
  * Testing logger
  *
- * Copyright (C) 2015 Brad Jorsch <bjorsch@wikimedia.org>
+ * Copyright (C) 2015 Wikimedia Foundation and contributors
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -20,7 +20,6 @@
  * http://www.gnu.org/copyleft/gpl.html
  *
  * @file
- * @author Brad Jorsch <bjorsch@wikimedia.org>
  */
 
 use Psr\Log\LogLevel;
index 872c580..6b436a8 100644 (file)
@@ -21,9 +21,9 @@ class WatchedItemQueryServiceUnitTest extends PHPUnit_Framework_TestCase {
                                $this->isType( 'array' ),
                                $this->isType( 'int' )
                        )
-                       ->will( $this->returnCallback( function( $a, $conj ) {
+                       ->will( $this->returnCallback( function ( $a, $conj ) {
                                $sqlConj = $conj === LIST_AND ? ' AND ' : ' OR ';
-                               return join( $sqlConj, array_map( function( $s ) {
+                               return join( $sqlConj, array_map( function ( $s ) {
                                        return '(' . $s . ')';
                                }, $a
                                ) );
@@ -31,7 +31,7 @@ class WatchedItemQueryServiceUnitTest extends PHPUnit_Framework_TestCase {
 
                $mock->expects( $this->any() )
                        ->method( 'addQuotes' )
-                       ->will( $this->returnCallback( function( $value ) {
+                       ->will( $this->returnCallback( function ( $value ) {
                                return "'$value'";
                        } ) );
 
@@ -41,7 +41,7 @@ class WatchedItemQueryServiceUnitTest extends PHPUnit_Framework_TestCase {
 
                $mock->expects( $this->any() )
                        ->method( 'bitAnd' )
-                       ->willReturnCallback( function( $a, $b ) {
+                       ->willReturnCallback( function ( $a, $b ) {
                                return "($a & $b)";
                        } );
 
@@ -106,12 +106,12 @@ class WatchedItemQueryServiceUnitTest extends PHPUnit_Framework_TestCase {
 
                $mock->expects( $this->any() )
                        ->method( 'isAllowed' )
-                       ->will( $this->returnCallback( function( $action ) use ( $notAllowedAction ) {
+                       ->will( $this->returnCallback( function ( $action ) use ( $notAllowedAction ) {
                                return $action !== $notAllowedAction;
                        } ) );
                $mock->expects( $this->any() )
                        ->method( 'isAllowedAny' )
-                       ->will( $this->returnCallback( function() use ( $notAllowedAction ) {
+                       ->will( $this->returnCallback( function () use ( $notAllowedAction ) {
                                $actions = func_get_args();
                                return !in_array( $notAllowedAction, $actions );
                        } ) );
@@ -1450,7 +1450,7 @@ class WatchedItemQueryServiceUnitTest extends PHPUnit_Framework_TestCase {
                $mockDb = $this->getMockDb();
                $mockDb->expects( $this->any() )
                        ->method( 'addQuotes' )
-                       ->will( $this->returnCallback( function( $value ) {
+                       ->will( $this->returnCallback( function ( $value ) {
                                return "'$value'";
                        } ) );
                $mockDb->expects( $this->any() )
@@ -1459,9 +1459,9 @@ class WatchedItemQueryServiceUnitTest extends PHPUnit_Framework_TestCase {
                                $this->isType( 'array' ),
                                $this->isType( 'int' )
                        )
-                       ->will( $this->returnCallback( function( $a, $conj ) {
+                       ->will( $this->returnCallback( function ( $a, $conj ) {
                                $sqlConj = $conj === LIST_AND ? ' AND ' : ' OR ';
-                               return join( $sqlConj, array_map( function( $s ) {
+                               return join( $sqlConj, array_map( function ( $s ) {
                                        return '(' . $s . ')';
                                }, $a
                                ) );
index f31028d..fa81eb1 100644 (file)
@@ -48,7 +48,7 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
                        ->getMock();
                $mock->expects( $this->any() )
                        ->method( 'makeKey' )
-                       ->will( $this->returnCallback( function() {
+                       ->will( $this->returnCallback( function () {
                                return implode( ':', func_get_args() );
                        } ) );
                return $mock;
@@ -313,12 +313,12 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
                        ->will( $this->returnValue( 7 ) );
                $mockDb->expects( $this->exactly( 1 ) )
                        ->method( 'addQuotes' )
-                       ->will( $this->returnCallback( function( $value ) {
+                       ->will( $this->returnCallback( function ( $value ) {
                                return "'$value'";
                        } ) );
                $mockDb->expects( $this->exactly( 1 ) )
                        ->method( 'timestamp' )
-                       ->will( $this->returnCallback( function( $value ) {
+                       ->will( $this->returnCallback( function ( $value ) {
                                return 'TS' . $value . 'TS';
                        } ) );
 
@@ -351,12 +351,12 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
                $mockDb = $this->getMockDb();
                $mockDb->expects( $this->exactly( 2 * 3 ) )
                        ->method( 'addQuotes' )
-                       ->will( $this->returnCallback( function( $value ) {
+                       ->will( $this->returnCallback( function ( $value ) {
                                return "'$value'";
                        } ) );
                $mockDb->expects( $this->exactly( 3 ) )
                        ->method( 'timestamp' )
-                       ->will( $this->returnCallback( function( $value ) {
+                       ->will( $this->returnCallback( function ( $value ) {
                                return 'TS' . $value . 'TS';
                        } ) );
                $mockDb->expects( $this->any() )
@@ -365,9 +365,9 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
                                $this->isType( 'array' ),
                                $this->isType( 'int' )
                        )
-                       ->will( $this->returnCallback( function( $a, $conj ) {
+                       ->will( $this->returnCallback( function ( $a, $conj ) {
                                $sqlConj = $conj === LIST_AND ? ' AND ' : ' OR ';
-                               return join( $sqlConj, array_map( function( $s ) {
+                               return join( $sqlConj, array_map( function ( $s ) {
                                        return '(' . $s . ')';
                                }, $a
                                ) );
@@ -446,12 +446,12 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
                $mockDb = $this->getMockDb();
                $mockDb->expects( $this->exactly( 2 * 3 ) )
                        ->method( 'addQuotes' )
-                       ->will( $this->returnCallback( function( $value ) {
+                       ->will( $this->returnCallback( function ( $value ) {
                                return "'$value'";
                        } ) );
                $mockDb->expects( $this->exactly( 3 ) )
                        ->method( 'timestamp' )
-                       ->will( $this->returnCallback( function( $value ) {
+                       ->will( $this->returnCallback( function ( $value ) {
                                return 'TS' . $value . 'TS';
                        } ) );
                $mockDb->expects( $this->any() )
@@ -460,9 +460,9 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
                                $this->isType( 'array' ),
                                $this->isType( 'int' )
                        )
-                       ->will( $this->returnCallback( function( $a, $conj ) {
+                       ->will( $this->returnCallback( function ( $a, $conj ) {
                                $sqlConj = $conj === LIST_AND ? ' AND ' : ' OR ';
-                               return join( $sqlConj, array_map( function( $s ) {
+                               return join( $sqlConj, array_map( function ( $s ) {
                                        return '(' . $s . ')';
                                }, $a
                                ) );
@@ -1970,7 +1970,7 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                // Note: This does not actually assert the job is correct
                $callableCallCounter = 0;
-               $mockCallback = function( $callable ) use ( &$callableCallCounter ) {
+               $mockCallback = function ( $callable ) use ( &$callableCallCounter ) {
                        $callableCallCounter++;
                        $this->assertInternalType( 'callable', $callable );
                };
@@ -2011,7 +2011,7 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                // Note: This does not actually assert the job is correct
                $callableCallCounter = 0;
-               $mockCallback = function( $callable ) use ( &$callableCallCounter ) {
+               $mockCallback = function ( $callable ) use ( &$callableCallCounter ) {
                        $callableCallCounter++;
                        $this->assertInternalType( 'callable', $callable );
                };
@@ -2105,13 +2105,13 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $callableCallCounter = 0;
                $scopedOverride = $store->overrideDeferredUpdatesAddCallableUpdateCallback(
-                       function( $callable ) use ( &$callableCallCounter, $title, $user ) {
+                       function ( $callable ) use ( &$callableCallCounter, $title, $user ) {
                                $callableCallCounter++;
                                $this->verifyCallbackJob(
                                        $callable,
                                        $title,
                                        $user->getId(),
-                                       function( $time ) {
+                                       function ( $time ) {
                                                return $time === null;
                                        }
                                );
@@ -2172,13 +2172,13 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $addUpdateCallCounter = 0;
                $scopedOverrideDeferred = $store->overrideDeferredUpdatesAddCallableUpdateCallback(
-                       function( $callable ) use ( &$addUpdateCallCounter, $title, $user ) {
+                       function ( $callable ) use ( &$addUpdateCallCounter, $title, $user ) {
                                $addUpdateCallCounter++;
                                $this->verifyCallbackJob(
                                        $callable,
                                        $title,
                                        $user->getId(),
-                                       function( $time ) {
+                                       function ( $time ) {
                                                return $time !== null && $time > '20151212010101';
                                        }
                                );
@@ -2187,7 +2187,7 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $getTimestampCallCounter = 0;
                $scopedOverrideRevision = $store->overrideRevisionGetTimestampFromIdCallback(
-                       function( $titleParam, $oldidParam ) use ( &$getTimestampCallCounter, $title, $oldid ) {
+                       function ( $titleParam, $oldidParam ) use ( &$getTimestampCallCounter, $title, $oldid ) {
                                $getTimestampCallCounter++;
                                $this->assertEquals( $title, $titleParam );
                                $this->assertEquals( $oldid, $oldidParam );
@@ -2248,13 +2248,13 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $callableCallCounter = 0;
                $scopedOverride = $store->overrideDeferredUpdatesAddCallableUpdateCallback(
-                       function( $callable ) use ( &$callableCallCounter, $title, $user ) {
+                       function ( $callable ) use ( &$callableCallCounter, $title, $user ) {
                                $callableCallCounter++;
                                $this->verifyCallbackJob(
                                        $callable,
                                        $title,
                                        $user->getId(),
-                                       function( $time ) {
+                                       function ( $time ) {
                                                return $time === null;
                                        }
                                );
@@ -2315,13 +2315,13 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $addUpdateCallCounter = 0;
                $scopedOverrideDeferred = $store->overrideDeferredUpdatesAddCallableUpdateCallback(
-                       function( $callable ) use ( &$addUpdateCallCounter, $title, $user ) {
+                       function ( $callable ) use ( &$addUpdateCallCounter, $title, $user ) {
                                $addUpdateCallCounter++;
                                $this->verifyCallbackJob(
                                        $callable,
                                        $title,
                                        $user->getId(),
-                                       function( $time ) {
+                                       function ( $time ) {
                                                return $time === '30151212010101';
                                        }
                                );
@@ -2330,7 +2330,7 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $getTimestampCallCounter = 0;
                $scopedOverrideRevision = $store->overrideRevisionGetTimestampFromIdCallback(
-                       function( $titleParam, $oldidParam ) use ( &$getTimestampCallCounter, $title, $oldid ) {
+                       function ( $titleParam, $oldidParam ) use ( &$getTimestampCallCounter, $title, $oldid ) {
                                $getTimestampCallCounter++;
                                $this->assertEquals( $title, $titleParam );
                                $this->assertEquals( $oldid, $oldidParam );
@@ -2393,13 +2393,13 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $addUpdateCallCounter = 0;
                $scopedOverrideDeferred = $store->overrideDeferredUpdatesAddCallableUpdateCallback(
-                       function( $callable ) use ( &$addUpdateCallCounter, $title, $user ) {
+                       function ( $callable ) use ( &$addUpdateCallCounter, $title, $user ) {
                                $addUpdateCallCounter++;
                                $this->verifyCallbackJob(
                                        $callable,
                                        $title,
                                        $user->getId(),
-                                       function( $time ) {
+                                       function ( $time ) {
                                                return $time === false;
                                        }
                                );
@@ -2408,7 +2408,7 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
 
                $getTimestampCallCounter = 0;
                $scopedOverrideRevision = $store->overrideRevisionGetTimestampFromIdCallback(
-                       function( $titleParam, $oldidParam ) use ( &$getTimestampCallCounter, $title, $oldid ) {
+                       function ( $titleParam, $oldidParam ) use ( &$getTimestampCallCounter, $title, $oldid ) {
                                $getTimestampCallCounter++;
                                $this->assertEquals( $title, $titleParam );
                                $this->assertEquals( $oldid, $oldidParam );
@@ -2454,7 +2454,7 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
                        ->will( $this->returnValue( true ) );
                $mockDb->expects( $this->exactly( 1 ) )
                        ->method( 'timestamp' )
-                       ->will( $this->returnCallback( function( $value ) {
+                       ->will( $this->returnCallback( function ( $value ) {
                                return 'TS' . $value . 'TS';
                        } ) );
 
@@ -2484,7 +2484,7 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
                        ->will( $this->returnValue( true ) );
                $mockDb->expects( $this->exactly( 0 ) )
                        ->method( 'timestamp' )
-                       ->will( $this->returnCallback( function( $value ) {
+                       ->will( $this->returnCallback( function ( $value ) {
                                return 'TS' . $value . 'TS';
                        } ) );
 
@@ -2515,7 +2515,7 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
                        ->will( $this->returnValue( true ) );
                $mockDb->expects( $this->exactly( 1 ) )
                        ->method( 'timestamp' )
-                       ->will( $this->returnCallback( function( $value ) {
+                       ->will( $this->returnCallback( function ( $value ) {
                                return 'TS' . $value . 'TS';
                        } ) );
                $mockDb->expects( $this->once() )
index 8a2146a..1aa0a13 100644 (file)
@@ -14,7 +14,7 @@ class ApiPageSetTest extends ApiTestCase {
                        ],
 
                        'A simple merge policy adds the redirect data in' => [
-                               function( $current, $new ) {
+                               function ( $current, $new ) {
                                        if ( !isset( $current['index'] ) || $new['index'] < $current['index'] ) {
                                                $current['index'] = $new['index'];
                                        }
index b508928..4f4453f 100644 (file)
@@ -210,7 +210,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
 
                // not checking values of all keys of the actual item, so removing unwanted keys from comparison
                $actualItemsOnlyComparedValues = array_map(
-                       function( array $item ) use ( $keysUsedInValueComparison ) {
+                       function ( array $item ) use ( $keysUsedInValueComparison ) {
                                return array_intersect_key( $item, array_flip( $keysUsedInValueComparison ) );
                        },
                        $actualItems
index d5c17ee..50a59f9 100644 (file)
@@ -87,7 +87,7 @@ class RandomImageGenerator {
                                        __DIR__ . '/words.txt'
                                ] as $dictionaryFile
                        ) {
-                               if ( is_file( $dictionaryFile ) and is_readable( $dictionaryFile ) ) {
+                               if ( is_file( $dictionaryFile ) && is_readable( $dictionaryFile ) ) {
                                        $this->dictionaryFile = $dictionaryFile;
                                        break;
                                }
index 8a76618..ba38128 100644 (file)
@@ -63,7 +63,7 @@ class ConfigFactoryTest extends MediaWikiTestCase {
                // define new config instance
                $newFactory = new ConfigFactory();
                $newFactory->register( 'foo', 'GlobalVarConfig::newInstance' );
-               $newFactory->register( 'bar', function() {
+               $newFactory->register( 'bar', function () {
                        return new HashConfig();
                } );
 
index 403bee1..ee79ffa 100644 (file)
@@ -28,7 +28,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
                                CONTENT_MODEL_CSS => 'CssContentHandler',
                                CONTENT_MODEL_TEXT => 'TextContentHandler',
                                'testing' => 'DummyContentHandlerForTesting',
-                               'testing-callbacks' => function( $modelId ) {
+                               'testing-callbacks' => function ( $modelId ) {
                                        return new DummyContentHandlerForTesting( $modelId );
                                }
                        ],
@@ -418,7 +418,7 @@ class ContentHandlerTest extends MediaWikiTestCase {
 
                $searchEngine->expects( $this->any() )
                        ->method( 'makeSearchFieldMapping' )
-                       ->will( $this->returnCallback( function( $name, $type ) {
+                       ->will( $this->returnCallback( function ( $name, $type ) {
                                        return new DummySearchIndexFieldDefinition( $name, $type );
                        } ) );
 
index f61569a..3dc810c 100644 (file)
  *
  * @file
  * @author Antoine Musso
- * @author Bryan Davis
  * @copyright © 2013 Antoine Musso
- * @copyright © 2013 Bryan Davis
- * @copyright © 2013 Wikimedia Foundation Inc.
+ * @copyright © 2013 Wikimedia Foundation and contributors
  */
 
 use Wikimedia\Rdbms\TransactionProfiler;
index 00c47c8..6723a0b 100644 (file)
@@ -112,7 +112,7 @@ class JobTest extends MediaWikiTestCase {
        public function provideTestJobFactory() {
                return [
                        'class name' => [ 'NullJob' ],
-                       'closure' => [ function( Title $title, array $params ) {
+                       'closure' => [ function ( Title $title, array $params ) {
                                return new NullJob( $title, $params );
                        } ],
                        'function' => [ [ $this, 'newNullJob' ] ],
index 5e1970b..cba2939 100644 (file)
@@ -17,7 +17,7 @@ class DeferredStringifierTest extends PHPUnit_Framework_TestCase {
                        // No args
                        [
                                [
-                                       function() {
+                                       function () {
                                                return 'foo';
                                        }
                                ],
@@ -26,7 +26,7 @@ class DeferredStringifierTest extends PHPUnit_Framework_TestCase {
                        // Has args
                        [
                                [
-                                       function( $i ) {
+                                       function ( $i ) {
                                                return $i;
                                        },
                                        'bar'
@@ -41,7 +41,7 @@ class DeferredStringifierTest extends PHPUnit_Framework_TestCase {
         * it is never converted to a string
         */
        public function testCallbackNotCalled() {
-               $ds = new DeferredStringifier( function() {
+               $ds = new DeferredStringifier( function () {
                        throw new Exception( 'This should not be reached!' );
                } );
                // No exception was thrown
index 3e0a61e..35a7b60 100644 (file)
@@ -27,13 +27,13 @@ class ObjectFactoryTest extends PHPUnit_Framework_TestCase {
                $obj = ObjectFactory::getObjectFromSpec( [
                        'class' => 'ObjectFactoryTestFixture',
                        'args' => [
-                               function() {
+                               function () {
                                        return 'wrapped';
                                },
                                'unwrapped',
                        ],
                        'calls' => [
-                               'setter' => [ function() {
+                               'setter' => [ function () {
                                        return 'wrapped';
                                }, ],
                        ],
@@ -54,13 +54,13 @@ class ObjectFactoryTest extends PHPUnit_Framework_TestCase {
                $obj = ObjectFactory::getObjectFromSpec( [
                        'class' => 'ObjectFactoryTestFixture',
                        'args' => [
-                               function() {
+                               function () {
                                        return 'wrapped';
                                },
                                'unwrapped',
                        ],
                        'calls' => [
-                               'setter' => [ function() {
+                               'setter' => [ function () {
                                        return 'wrapped';
                                }, ],
                        ],
@@ -74,11 +74,11 @@ class ObjectFactoryTest extends PHPUnit_Framework_TestCase {
 
                $obj = ObjectFactory::getObjectFromSpec( [
                        'class' => 'ObjectFactoryTestFixture',
-                       'args' => [ function() {
+                       'args' => [ function () {
                                return 'unwrapped';
                        }, ],
                        'calls' => [
-                               'setter' => [ function() {
+                               'setter' => [ function () {
                                        return 'unwrapped';
                                }, ],
                        ],
index a0fb563..35e9005 100644 (file)
@@ -21,8 +21,7 @@
 /**
  * @uses XhprofData
  * @uses AutoLoader
- * @author Bryan Davis <bd808@wikimedia.org>
- * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
+ * @copyright © 2014 Wikimedia Foundation and contributors
  * @since 1.25
  */
 class XhprofDataTest extends PHPUnit_Framework_TestCase {
index 7f9a772..5c5eeaa 100644 (file)
@@ -66,7 +66,7 @@ XML;
                        null,
                        false,
                        [
-                               'processing_instruction_handler' => function() use ( &$called ) {
+                               'processing_instruction_handler' => function () use ( &$called ) {
                                        $called = true;
                                }
                        ]
index 2b04366..3d405fa 100644 (file)
@@ -176,7 +176,7 @@ class WANObjectCacheTest extends PHPUnit_Framework_TestCase  {
                $priorValue = null;
                $priorAsOf = null;
                $wasSet = 0;
-               $func = function( $old, &$ttl, &$opts, $asOf )
+               $func = function ( $old, &$ttl, &$opts, $asOf )
                use ( &$wasSet, &$priorValue, &$priorAsOf, $value )
                {
                        ++$wasSet;
@@ -583,7 +583,7 @@ class WANObjectCacheTest extends PHPUnit_Framework_TestCase  {
                $value = wfRandomString();
 
                $calls = 0;
-               $func = function() use ( &$calls, $value, $cache, $key ) {
+               $func = function () use ( &$calls, $value, $cache, $key ) {
                        ++$calls;
                        // Immediately kill any mutex rather than waiting a second
                        $cache->delete( $cache::MUTEX_KEY_PREFIX . $key );
@@ -625,7 +625,7 @@ class WANObjectCacheTest extends PHPUnit_Framework_TestCase  {
                $value = wfRandomString();
 
                $calls = 0;
-               $func = function( $oldValue, &$ttl, &$setOpts ) use ( &$calls, $value, $cache, $key ) {
+               $func = function ( $oldValue, &$ttl, &$setOpts ) use ( &$calls, $value, $cache, $key ) {
                        ++$calls;
                        $setOpts['since'] = microtime( true ) - 10;
                        // Immediately kill any mutex rather than waiting a second
@@ -659,7 +659,7 @@ class WANObjectCacheTest extends PHPUnit_Framework_TestCase  {
                $busyValue = wfRandomString();
 
                $calls = 0;
-               $func = function() use ( &$calls, $value, $cache, $key ) {
+               $func = function () use ( &$calls, $value, $cache, $key ) {
                        ++$calls;
                        // Immediately kill any mutex rather than waiting a second
                        $cache->delete( $cache::MUTEX_KEY_PREFIX . $key );
@@ -921,7 +921,7 @@ class WANObjectCacheTest extends PHPUnit_Framework_TestCase  {
                $value = wfRandomString();
 
                $wasSet = 0;
-               $func = function( $old, &$ttl ) use ( &$wasSet, $value ) {
+               $func = function ( $old, &$ttl ) use ( &$wasSet, $value ) {
                        ++$wasSet;
                        return $value;
                };
diff --git a/tests/phpunit/includes/libs/rdbms/TransactionProfilerTest.php b/tests/phpunit/includes/libs/rdbms/TransactionProfilerTest.php
new file mode 100644 (file)
index 0000000..cb18fb3
--- /dev/null
@@ -0,0 +1,141 @@
+<?php
+
+use Wikimedia\Rdbms\TransactionProfiler;
+use Psr\Log\LoggerInterface;
+
+class TransactionProfilerTest extends PHPUnit_Framework_TestCase {
+       public function testAffected() {
+               $logger = $this->getMockBuilder( LoggerInterface::class )->getMock();
+               $logger->expects( $this->exactly( 3 ) )->method( 'info' );
+
+               $tp = new TransactionProfiler();
+               $tp->setLogger( $logger );
+               $tp->setExpectation( 'maxAffected', 100, __METHOD__ );
+
+               $tp->transactionWritingIn( 'srv1', 'db1', '123' );
+               $tp->recordQueryCompletion( "SQL 1", microtime( true ) - 3, true, 200 );
+               $tp->recordQueryCompletion( "SQL 2", microtime( true ) - 3, true, 200 );
+               $tp->transactionWritingOut( 'srv1', 'db1', '123', 1, 400 );
+       }
+
+       public function testReadTime() {
+               $logger = $this->getMockBuilder( LoggerInterface::class )->getMock();
+               // 1 per query
+               $logger->expects( $this->exactly( 2 ) )->method( 'info' );
+
+               $tp = new TransactionProfiler();
+               $tp->setLogger( $logger );
+               $tp->setExpectation( 'readQueryTime', 5, __METHOD__ );
+
+               $tp->transactionWritingIn( 'srv1', 'db1', '123' );
+               $tp->recordQueryCompletion( "SQL 1", microtime( true ) - 10, false, 1 );
+               $tp->recordQueryCompletion( "SQL 2", microtime( true ) - 10, false, 1 );
+               $tp->transactionWritingOut( 'srv1', 'db1', '123', 0, 0 );
+       }
+
+       public function testWriteTime() {
+               $logger = $this->getMockBuilder( LoggerInterface::class )->getMock();
+               // 1 per query, 1 per trx, and one "sub-optimal trx" entry
+               $logger->expects( $this->exactly( 4 ) )->method( 'info' );
+
+               $tp = new TransactionProfiler();
+               $tp->setLogger( $logger );
+               $tp->setExpectation( 'writeQueryTime', 5, __METHOD__ );
+
+               $tp->transactionWritingIn( 'srv1', 'db1', '123' );
+               $tp->recordQueryCompletion( "SQL 1", microtime( true ) - 10, true, 1 );
+               $tp->recordQueryCompletion( "SQL 2", microtime( true ) - 10, true, 1 );
+               $tp->transactionWritingOut( 'srv1', 'db1', '123', 20, 1 );
+       }
+
+       public function testAffectedTrx() {
+               $logger = $this->getMockBuilder( LoggerInterface::class )->getMock();
+               $logger->expects( $this->exactly( 1 ) )->method( 'info' );
+
+               $tp = new TransactionProfiler();
+               $tp->setLogger( $logger );
+               $tp->setExpectation( 'maxAffected', 100, __METHOD__ );
+
+               $tp->transactionWritingIn( 'srv1', 'db1', '123' );
+               $tp->transactionWritingOut( 'srv1', 'db1', '123', 1, 200 );
+       }
+
+       public function testWriteTimeTrx() {
+               $logger = $this->getMockBuilder( LoggerInterface::class )->getMock();
+               // 1 per trx, and one "sub-optimal trx" entry
+               $logger->expects( $this->exactly( 2 ) )->method( 'info' );
+
+               $tp = new TransactionProfiler();
+               $tp->setLogger( $logger );
+               $tp->setExpectation( 'writeQueryTime', 5, __METHOD__ );
+
+               $tp->transactionWritingIn( 'srv1', 'db1', '123' );
+               $tp->transactionWritingOut( 'srv1', 'db1', '123', 10, 1 );
+       }
+
+       public function testConns() {
+               $logger = $this->getMockBuilder( LoggerInterface::class )->getMock();
+               $logger->expects( $this->exactly( 2 ) )->method( 'info' );
+
+               $tp = new TransactionProfiler();
+               $tp->setLogger( $logger );
+               $tp->setExpectation( 'conns', 2, __METHOD__ );
+
+               $tp->recordConnection( 'srv1', 'db1', false );
+               $tp->recordConnection( 'srv1', 'db2', false );
+               $tp->recordConnection( 'srv1', 'db3', false ); // warn
+               $tp->recordConnection( 'srv1', 'db4', false ); // warn
+       }
+
+       public function testMasterConns() {
+               $logger = $this->getMockBuilder( LoggerInterface::class )->getMock();
+               $logger->expects( $this->exactly( 2 ) )->method( 'info' );
+
+               $tp = new TransactionProfiler();
+               $tp->setLogger( $logger );
+               $tp->setExpectation( 'masterConns', 2, __METHOD__ );
+
+               $tp->recordConnection( 'srv1', 'db1', false );
+               $tp->recordConnection( 'srv1', 'db2', false );
+
+               $tp->recordConnection( 'srv1', 'db1', true );
+               $tp->recordConnection( 'srv1', 'db2', true );
+               $tp->recordConnection( 'srv1', 'db3', true ); // warn
+               $tp->recordConnection( 'srv1', 'db4', true ); // warn
+       }
+
+       public function testReadQueryCount() {
+               $logger = $this->getMockBuilder( LoggerInterface::class )->getMock();
+               $logger->expects( $this->exactly( 2 ) )->method( 'info' );
+
+               $tp = new TransactionProfiler();
+               $tp->setLogger( $logger );
+               $tp->setExpectation( 'queries', 2, __METHOD__ );
+
+               $tp->recordQueryCompletion( "SQL 1", microtime( true ) - .01, false, 0 );
+               $tp->recordQueryCompletion( "SQL 2", microtime( true ) - .01, false, 0 );
+               $tp->recordQueryCompletion( "SQL 3", microtime( true ) - .01, false, 0 ); // warn
+               $tp->recordQueryCompletion( "SQL 4", microtime( true ) - .01, false, 0 ); // warn
+       }
+
+       public function testWriteQueryCount() {
+               $logger = $this->getMockBuilder( LoggerInterface::class )->getMock();
+               $logger->expects( $this->exactly( 2 ) )->method( 'info' );
+
+               $tp = new TransactionProfiler();
+               $tp->setLogger( $logger );
+               $tp->setExpectation( 'writes', 2, __METHOD__ );
+
+               $tp->recordQueryCompletion( "SQL 1", microtime( true ) - .01, false, 0 );
+               $tp->recordQueryCompletion( "SQL 2", microtime( true ) - .01, false, 0 );
+               $tp->recordQueryCompletion( "SQL 3", microtime( true ) - .01, false, 0 );
+               $tp->recordQueryCompletion( "SQL 4", microtime( true ) - .01, false, 0 );
+
+               $tp->transactionWritingIn( 'srv1', 'db1', '123' );
+               $tp->recordQueryCompletion( "SQL 1w", microtime( true ) - .01, true, 2 );
+               $tp->recordQueryCompletion( "SQL 2w", microtime( true ) - .01, true, 5 );
+               $tp->recordQueryCompletion( "SQL 3w", microtime( true ) - .01, true, 3 );
+               $tp->recordQueryCompletion( "SQL 4w", microtime( true ) - .01, true, 1 );
+               $tp->transactionWritingOut( 'srv1', 'db1', '123', 1, 1 );
+       }
+}
index d606142..264e35d 100644 (file)
@@ -37,66 +37,6 @@ class ParserOptionsTest extends MediaWikiTestCase {
                ];
        }
 
-       /**
-        * @dataProvider provideOptionsHashPre30
-        * @param array $usedOptions Used options
-        * @param string $expect Expected value
-        * @param array $options Options to set
-        * @param array $globals Globals to set
-        */
-       public function testOptionsHashPre30( $usedOptions, $expect, $options, $globals = [] ) {
-               global $wgHooks;
-
-               $globals += [
-                       'wgRenderHashAppend' => '',
-                       'wgHooks' => [],
-               ];
-               $globals['wgHooks'] += [
-                       'PageRenderingHash' => [],
-               ] + $wgHooks;
-               $this->setMwGlobals( $globals );
-
-               $popt = new ParserOptions();
-               foreach ( $options as $setter => $value ) {
-                       $popt->$setter( $value );
-               }
-               $this->assertSame( $expect, $popt->optionsHashPre30( $usedOptions ) );
-       }
-
-       public static function provideOptionsHashPre30() {
-               $used = [ 'wrapclass', 'printable' ];
-
-               return [
-                       'Canonical options, nothing used' => [ [], '*!*!*!*!*!*', [] ],
-                       'Canonical options, used some options' => [ $used, '*!*!*!*!*!*', [] ],
-                       'Used some options, non-default values' => [
-                               $used,
-                               '*!*!*!*!*!*!printable=1!wrapclass=foobar',
-                               [
-                                       'setWrapOutputClass' => 'foobar',
-                                       'setIsPrintable' => true,
-                               ]
-                       ],
-                       'Canonical options, nothing used, but with hooks and $wgRenderHashAppend' => [
-                               [],
-                               '*!*!*!*!*!wgRenderHashAppend!*!onPageRenderingHash',
-                               [],
-                               [
-                                       'wgRenderHashAppend' => '!wgRenderHashAppend',
-                                       'wgHooks' => [ 'PageRenderingHash' => [ [ __CLASS__ . '::onPageRenderingHash' ] ] ],
-                               ]
-                       ],
-
-                       // Test weird historical behavior is still weird
-                       'Canonical options, editsection=true used' => [ [ 'editsection' ], '*!*!*!*!*', [
-                               'setEditSection' => true,
-                       ] ],
-                       'Canonical options, editsection=false used' => [ [ 'editsection' ], '*!*!*!*!*!edit=0', [
-                               'setEditSection' => false,
-                       ] ],
-               ];
-       }
-
        /**
         * @dataProvider provideOptionsHash
         * @param array $usedOptions Used options
index 7d12e59..ded56e9 100644 (file)
@@ -41,6 +41,12 @@ class ResourceLoaderFileModuleTest extends ResourceLoaderTestCase {
                                ]
                        ],
 
+                       'htmlTemplateUnknown' => $base + [
+                               'templates' => [
+                                       'templates/notfound.html',
+                               ]
+                       ],
+
                        'aliasedHtmlTemplateModule' => $base + [
                                'templates' => [
                                        'foo.html' => 'templates/template.html',
@@ -126,10 +132,30 @@ class ResourceLoaderFileModuleTest extends ResourceLoaderTestCase {
         */
        public function testDeprecatedModules( $name, $expected ) {
                $modules = self::getModules();
-               $rl = new ResourceLoaderFileModule( $modules[$name] );
-               $rl->setName( $name );
+               $module = new ResourceLoaderFileModule( $modules[$name] );
+               $module->setName( $name );
+               $ctx = $this->getResourceLoaderContext();
+               $this->assertEquals( $module->getScript( $ctx ), $expected );
+       }
+
+       /**
+        * @covers ResourceLoaderFileModule::getScript
+        */
+       public function testGetScript() {
+               $module = new ResourceLoaderFileModule( [
+                       'localBasePath' => __DIR__ . '/../../data/resourceloader',
+                       'scripts' => [ 'script-nosemi.js', 'script-comment.js' ],
+               ] );
+               $module->setName( 'testing' );
                $ctx = $this->getResourceLoaderContext();
-               $this->assertEquals( $rl->getScript( $ctx ), $expected );
+               $this->assertEquals(
+                       "/* eslint-disable */\nmw.foo()\n" .
+                       "\n" .
+                       "/* eslint-disable */\nmw.foo()\n// mw.bar();\n" .
+                       "\n",
+                       $module->getScript( $ctx ),
+                       'scripts are concatenated with a new-line'
+               );
        }
 
        /**
@@ -259,6 +285,10 @@ class ResourceLoaderFileModuleTest extends ResourceLoaderTestCase {
                                        'bar.html' => "<div>goodbye</div>\n",
                                ],
                        ],
+                       [
+                               $modules['htmlTemplateUnknown'],
+                               false,
+                       ],
                ];
        }
 
@@ -270,9 +300,17 @@ class ResourceLoaderFileModuleTest extends ResourceLoaderTestCase {
                $rl = new ResourceLoaderFileModule( $module );
                $rl->setName( 'testing' );
 
-               $this->assertEquals( $rl->getTemplates(), $expected );
+               if ( $expected === false ) {
+                       $this->setExpectedException( MWException::class );
+                       $rl->getTemplates();
+               } else {
+                       $this->assertEquals( $rl->getTemplates(), $expected );
+               }
        }
 
+       /**
+        * @covers ResourceLoaderFileModule::stripBom
+        */
        public function testBomConcatenation() {
                $basePath = __DIR__ . '/../../data/css';
                $testModule = new ResourceLoaderFileModule( [
index 17861d8..6057b97 100644 (file)
@@ -94,6 +94,52 @@ class ResourceLoaderModuleTest extends ResourceLoaderTestCase {
                );
        }
 
+       public static function provideBuildContentScripts() {
+               return [
+                       [
+                               "mw.foo()",
+                               "mw.foo();\n",
+                       ],
+                       [
+                               "mw.foo();",
+                               "mw.foo();",
+                       ],
+                       [
+                               "mw.foo();\n",
+                               "mw.foo();\n",
+                       ],
+                       [
+                               "mw.foo()\n",
+                               "mw.foo()\n;\n",
+                       ],
+                       [
+                               "mw.foo()\n// mw.bar();",
+                               "mw.foo()\n// mw.bar();",
+                       ],
+                       [
+                               "mw.foo()// mw.bar();",
+                               "mw.foo()// mw.bar();",
+                       ],
+               ];
+       }
+
+       /**
+        * @dataProvider provideBuildContentScripts
+        * @covers ResourceLoaderModule::buildContent
+        */
+       public function testBuildContentScripts( $raw, $build, $message = null ) {
+               $context = $this->getResourceLoaderContext();
+               $module = new ResourceLoaderTestModule( [
+                       'script' => $raw
+               ] );
+               $this->assertEquals( $raw, $module->getScript( $context ), 'Raw script' );
+               $this->assertEquals(
+                       [ 'scripts' => $build ],
+                       $module->getModuleContent( $context ),
+                       $message
+               );
+       }
+
        /**
         * @covers ResourceLoaderModule::getRelativePaths
         * @covers ResourceLoaderModule::expandRelativePaths
index 79d0784..b7b2473 100644 (file)
@@ -165,6 +165,14 @@ class ResourceLoaderTest extends ResourceLoaderTestCase {
                $this->assertSame( $expected, $rl->isFileModule( 'test' ) );
        }
 
+       /**
+        * @covers ResourceLoader::isFileModule
+        */
+       public function testIsFileModuleUnknown() {
+               $rl = TestingAccessWrapper::newFromObject( new EmptyResourceLoader() );
+               $this->assertSame( false, $rl->isFileModule( 'unknown' ) );
+       }
+
        /**
         * @covers ResourceLoader::isModuleRegistered
         */
@@ -199,7 +207,7 @@ class ResourceLoaderTest extends ResourceLoaderTestCase {
         * @covers ResourceLoader::getModule
         */
        public function testGetModuleFactory() {
-               $factory = function( array $info ) {
+               $factory = function ( array $info ) {
                        $this->assertArrayHasKey( 'kitten', $info );
                        return new ResourceLoaderTestModule( $info );
                };
@@ -588,6 +596,12 @@ mw.example();
                ] );
                $context = $this->getResourceLoaderContext( [], $rl );
 
+               $this->assertEquals(
+                       '',
+                       $rl->getCombinedVersion( $context, [] ),
+                       'empty list'
+               );
+
                $this->assertEquals(
                        ResourceLoader::makeHash( self::BLANK_VERSION ),
                        $rl->getCombinedVersion( $context, [ 'foo' ] ),
@@ -603,10 +617,94 @@ mw.example();
                );
        }
 
+       public static function provideMakeModuleResponseConcat() {
+               $testcases = [
+                       [
+                               'modules' => [
+                                       'foo' => 'foo()',
+                               ],
+                               'expected' => "foo();\n" . 'mw.loader.state( {
+    "foo": "ready"
+} );',
+                               'minified' => "foo();" . 'mw.loader.state({"foo":"ready"});',
+                               'message' => 'Script without semi-colon',
+                       ],
+                       [
+                               'modules' => [
+                                       'foo' => 'foo()',
+                                       'bar' => 'bar()',
+                               ],
+                               'expected' => "foo();\nbar();\n" . 'mw.loader.state( {
+    "foo": "ready",
+    "bar": "ready"
+} );',
+                               'minified' => "foo();bar();" . 'mw.loader.state({"foo":"ready","bar":"ready"});',
+                               'message' => 'Two scripts without semi-colon',
+                       ],
+                       [
+                               'modules' => [
+                                       'foo' => "foo()\n// bar();"
+                               ],
+                               // FIXME: Invalid code (T162719)
+                               'expected' => "foo()\n// bar();" . 'mw.loader.state( {
+    "foo": "ready"
+} );',
+                               // FIXME: Invalid code (T162719)
+                               'minified' => "foo()" . 'mw.loader.state({"foo":"ready"});',
+                               'message' => 'Script with semi-colon in comment',
+                       ],
+               ];
+               $ret = [];
+               foreach ( $testcases as $i => $case ) {
+                       $ret["#$i"] = [
+                               $case['modules'],
+                               $case['expected'],
+                               true, // debug
+                               $case['message'],
+                       ];
+                       $ret["#$i (minified)"] = [
+                               $case['modules'],
+                               $case['minified'],
+                               false, // debug
+                               $case['message'],
+                       ];
+               }
+               return $ret;
+       }
+
+       /**
+        * Verify how multiple scripts and mw.loader.state() calls are concatenated.
+        *
+        * @dataProvider provideMakeModuleResponseConcat
+        * @covers ResourceLoader::makeModuleResponse
+        */
+       public function testMakeModuleResponseConcat( $scripts, $expected, $debug, $message = null ) {
+               $rl = new EmptyResourceLoader();
+               $modules = array_map( function ( $script ) {
+                       return self::getSimpleModuleMock( $script );
+               }, $scripts );
+               $rl->register( $modules );
+
+               $this->setMwGlobals( 'wgResourceLoaderDebug', $debug );
+               $context = $this->getResourceLoaderContext(
+                       [
+                               'modules' => implode( '|', array_keys( $modules ) ),
+                               'only' => 'scripts',
+                       ],
+                       $rl
+               );
+
+               $response = $rl->makeModuleResponse( $context, $modules );
+               $this->assertCount( 0, $rl->getErrors(), 'Error count' );
+               $this->assertEquals( $expected, $response, $message ?: 'Response' );
+       }
+
        /**
         * Verify that when building module content in a load.php response,
         * an exception from one module will not break script output from
         * other modules.
+        *
+        * @covers ResourceLoader::makeModuleResponse
         */
        public function testMakeModuleResponseError() {
                $modules = [
@@ -643,6 +741,8 @@ mw.example();
         * Verify that when building the startup module response,
         * an exception from one module class will not break the entire
         * startup module response. See T152266.
+        *
+        * @covers ResourceLoader::makeModuleResponse
         */
        public function testMakeModuleResponseStartupError() {
                $rl = new EmptyResourceLoader();
index fbbcee5..4c5bab3 100644 (file)
@@ -185,7 +185,7 @@ class SearchEnginePrefixTest extends MediaWikiLangTestCase {
        public function testSearch( array $case ) {
                $this->search->setLimitOffset( 3 );
                $results = $this->search->defaultPrefixSearch( $case['query'] );
-               $results = array_map( function( Title $t ) {
+               $results = array_map( function ( Title $t ) {
                        return $t->getPrefixedText();
                }, $results );
 
@@ -203,7 +203,7 @@ class SearchEnginePrefixTest extends MediaWikiLangTestCase {
        public function testSearchWithOffset( array $case ) {
                $this->search->setLimitOffset( 3, 1 );
                $results = $this->search->defaultPrefixSearch( $case['query'] );
-               $results = array_map( function( Title $t ) {
+               $results = array_map( function ( Title $t ) {
                        return $t->getPrefixedText();
                }, $results );
 
@@ -349,7 +349,7 @@ class SearchEnginePrefixTest extends MediaWikiLangTestCase {
                $search->setLimitOffset( 3 );
                $results = $search->completionSearch( $case['query'] );
 
-               $results = $results->map( function( SearchSuggestion $s ) {
+               $results = $results->map( function ( SearchSuggestion $s ) {
                        return $s->getText();
                } );
 
index c74c893..c945d1e 100644 (file)
@@ -121,7 +121,25 @@ class SearchEngineTest extends MediaWikiLangTestCase {
                $this->assertEquals(
                        [ 'Smithee' ],
                        $this->fetchIds( $this->search->searchText( 'smithee' ) ),
-                       "Plain search failed" );
+                       "Plain search" );
+       }
+
+       public function testPhraseSearch() {
+               $res = $this->search->searchText( '"smithee is one who smiths"' );
+               $this->assertEquals(
+                       [ 'Smithee' ],
+                       $this->fetchIds( $res ),
+                       "Search a phrase" );
+               $res = $this->search->searchText( '"smithee is one who smiths"' );
+               $match = $res->next();
+               $terms = [ 'smithee', 'is', 'one', 'who', 'smiths' ];
+               $snippet = "";
+               foreach ( $terms as $term ) {
+                       $snippet .= " <span class='searchmatch'>" . $term . "</span>";
+               }
+               $this->assertRegexp( '/' . preg_quote( $snippet, '/' ) . '/',
+                       $match->getTextSnippet( $res->termMatches() ),
+                       "Highlight a phrase search" );
        }
 
        public function testTextPowerSearch() {
@@ -132,7 +150,7 @@ class SearchEngineTest extends MediaWikiLangTestCase {
                                'Talk:Not Main Page',
                        ],
                        $this->fetchIds( $this->search->searchText( 'smithee' ) ),
-                       "Power search failed" );
+                       "Power search" );
        }
 
        public function testTitleSearch() {
@@ -142,7 +160,7 @@ class SearchEngineTest extends MediaWikiLangTestCase {
                                'Smithee',
                        ],
                        $this->fetchIds( $this->search->searchTitle( 'smithee' ) ),
-                       "Title search failed" );
+                       "Title search" );
        }
 
        public function testTextTitlePowerSearch() {
@@ -154,7 +172,7 @@ class SearchEngineTest extends MediaWikiLangTestCase {
                                'Talk:Smithee',
                        ],
                        $this->fetchIds( $this->search->searchTitle( 'smithee' ) ),
-                       "Title power search failed" );
+                       "Title power search" );
        }
 
        /**
index 60559fc..28c69fa 100644 (file)
@@ -43,7 +43,7 @@ class SearchSuggestionSetTest extends \PHPUnit_Framework_TestCase {
                $this->assertEquals( 3, $set->getBestScore() );
                $this->assertEquals( 1, $suggestion->getScore() );
 
-               $scores = $set->map( function( $s ) {
+               $scores = $set->map( function ( $s ) {
                        return $s->getScore();
                } );
                $sorted = $scores;
@@ -80,7 +80,7 @@ class SearchSuggestionSetTest extends \PHPUnit_Framework_TestCase {
                $this->assertEquals( 6, $set->getBestScore() );
                $this->assertEquals( 6, $suggestion->getScore() );
 
-               $scores = $set->map( function( $s ) {
+               $scores = $set->map( function ( $s ) {
                        return $s->getScore();
                } );
                $sorted = $scores;
index 7e37907..adf95e6 100644 (file)
@@ -101,7 +101,7 @@ class CachingSiteStoreTest extends MediaWikiTestCase {
 
                $dbSiteStore->expects( $this->any() )
                        ->method( 'getSites' )
-                       ->will( $this->returnCallback( function() {
+                       ->will( $this->returnCallback( function () {
                                $siteList = new SiteList();
                                $siteList->setSite( $this->getTestSite() );
 
index 4e9d826..94924ee 100644 (file)
@@ -183,7 +183,7 @@ class SpecialSearchTest extends MediaWikiTestCase {
                $rewrittenQuery,
                array $resultTitles
        ) {
-               $results = array_map( function( $title ) {
+               $results = array_map( function ( $title ) {
                        return SearchResult::newFromTitle( $title );
                }, $resultTitles );
 
index 6506d58..017e97d 100644 (file)
@@ -36,7 +36,7 @@ class BatchRowUpdateTest extends MediaWikiTestCase {
                $batchSize = 2;
                $reader = new BatchRowIterator( $db, 'some_table', 'id_field', $batchSize );
 
-               $response = $this->genSelectResult( $batchSize, /*numRows*/ 5, function() {
+               $response = $this->genSelectResult( $batchSize, /*numRows*/ 5, function () {
                        static $i = 0;
                        return [ 'id_field' => ++$i ];
                } );
@@ -171,7 +171,7 @@ class BatchRowUpdateTest extends MediaWikiTestCase {
        public function testReaderSelectConditionsMultiplePrimaryKeys(
                $message, $expectedSecondIteration, $primaryKeys, $batchSize = 3
        ) {
-               $results = $this->genSelectResult( $batchSize, $batchSize * 3, function() {
+               $results = $this->genSelectResult( $batchSize, $batchSize * 3, function () {
                        static $i = 0, $j = 100, $k = 1000;
                        return [ 'id_field' => ++$i, 'foo' => ++$j, 'bar' => ++$k ];
                } );
@@ -204,7 +204,7 @@ class BatchRowUpdateTest extends MediaWikiTestCase {
                        ->will( $this->consecutivelyReturnFromSelect( $retvals ) );
                $db->expects( $this->any() )
                        ->method( 'addQuotes' )
-                       ->will( $this->returnCallback( function( $value ) {
+                       ->will( $this->returnCallback( function ( $value ) {
                                return "'$value'"; // not real quoting: doesn't matter in test
                        } ) );