Merge "Delete skins/common/{ajax.js, wikibits.js, images/{magnify-clip-rtl.png, redir...
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Fri, 14 Nov 2014 22:10:59 +0000 (22:10 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 14 Nov 2014 22:10:59 +0000 (22:10 +0000)
151 files changed:
RELEASE-NOTES-1.25
autoload.php [new file with mode: 0644]
includes/AutoLoader.php
includes/ChangeTags.php
includes/DefaultSettings.php
includes/GlobalFunctions.php
includes/Linker.php
includes/Status.php
includes/StubObject.php
includes/WatchedItem.php
includes/api/ApiQueryAllDeletedRevisions.php
includes/api/ApiQueryBlocks.php
includes/api/ApiQueryDeletedRevisions.php
includes/api/ApiQueryRevisions.php
includes/api/ApiQueryRevisionsBase.php
includes/api/ApiQuerySearch.php
includes/api/ApiQuerySiteinfo.php
includes/api/i18n/be-tarask.json
includes/api/i18n/cs.json
includes/api/i18n/de.json
includes/api/i18n/es.json
includes/api/i18n/fr.json
includes/api/i18n/he.json
includes/api/i18n/ja.json
includes/api/i18n/mk.json
includes/api/i18n/pt.json
includes/api/i18n/sr-ec.json [new file with mode: 0644]
includes/api/i18n/sv.json
includes/api/i18n/zh-hans.json
includes/cache/MapCacheLRU.php [deleted file]
includes/cache/MessageCache.php
includes/context/RequestContext.php
includes/db/Database.php
includes/db/DatabaseSqlite.php
includes/db/LoadBalancer.php
includes/filebackend/FSFileBackend.php
includes/filerepo/file/File.php
includes/installer/i18n/ckb.json
includes/libs/MapCacheLRU.php [new file with mode: 0644]
includes/libs/ObjectFactory.php
includes/libs/RunningStat.php
includes/libs/Xhprof.php [new file with mode: 0644]
includes/libs/cdb/CdbException.php [new file with mode: 0644]
includes/libs/cdb/CdbFunctions.php [new file with mode: 0644]
includes/libs/cdb/CdbReader.php [new file with mode: 0644]
includes/libs/cdb/CdbReaderDBA.php [new file with mode: 0644]
includes/libs/cdb/CdbReaderPHP.php [new file with mode: 0644]
includes/libs/cdb/CdbWriter.php [new file with mode: 0644]
includes/libs/cdb/CdbWriterDBA.php [new file with mode: 0644]
includes/libs/cdb/CdbWriterPHP.php [new file with mode: 0644]
includes/media/MediaTransformOutput.php
includes/objectcache/ObjectCacheSessionHandler.php
includes/parser/LinkHolderArray.php
includes/parser/Parser.php
includes/profiler/Profiler.php
includes/profiler/ProfilerSimpleDB.php
includes/profiler/ProfilerSimpleUDP.php
includes/profiler/ProfilerStandard.php
includes/profiler/ProfilerStub.php
includes/profiler/ProfilerXhprof.php [new file with mode: 0644]
includes/profiler/SectionProfiler.php [new file with mode: 0644]
includes/specialpage/SpecialPageFactory.php
includes/specials/SpecialRecentchanges.php
includes/utils/AutoloadGenerator.php [new file with mode: 0644]
includes/utils/Cdb.php [deleted file]
includes/utils/CdbDBA.php [deleted file]
includes/utils/CdbPHP.php [deleted file]
includes/utils/MWFunction.php
languages/classes/LanguageKk.php
languages/i18n/ang.json
languages/i18n/az.json
languages/i18n/azb.json
languages/i18n/be-tarask.json
languages/i18n/bg.json
languages/i18n/cdo.json
languages/i18n/cs.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/el.json
languages/i18n/en.json
languages/i18n/et.json
languages/i18n/fa.json
languages/i18n/fr.json
languages/i18n/fy.json
languages/i18n/he.json
languages/i18n/hr.json
languages/i18n/ilo.json
languages/i18n/it.json
languages/i18n/kiu.json
languages/i18n/mai.json
languages/i18n/mg.json
languages/i18n/mk.json
languages/i18n/nap.json
languages/i18n/nb.json
languages/i18n/nl.json
languages/i18n/pl.json
languages/i18n/pms.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/ro.json
languages/i18n/ru.json
languages/i18n/rup.json
languages/i18n/sah.json
languages/i18n/scn.json
languages/i18n/sl.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/sv.json
languages/i18n/th.json
languages/i18n/tt-cyrl.json
languages/i18n/uk.json
languages/i18n/ur.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
maintenance/generateLocalAutoload.php [new file with mode: 0644]
resources/lib/oojs-ui/i18n/fy.json
resources/lib/oojs-ui/i18n/he.json
resources/lib/oojs-ui/i18n/ilo.json
resources/lib/oojs-ui/i18n/ja.json
resources/lib/oojs-ui/i18n/ka.json
resources/lib/oojs-ui/i18n/nl.json
resources/lib/oojs-ui/i18n/pl.json
resources/lib/oojs-ui/i18n/pt.json
resources/lib/oojs-ui/i18n/ta.json
resources/lib/oojs-ui/i18n/zh-hant.json
resources/lib/oojs-ui/oojs-ui-apex.css
resources/lib/oojs-ui/oojs-ui-apex.js
resources/lib/oojs-ui/oojs-ui-apex.svg.css
resources/lib/oojs-ui/oojs-ui-mediawiki.css
resources/lib/oojs-ui/oojs-ui-mediawiki.js
resources/lib/oojs-ui/oojs-ui-mediawiki.svg.css
resources/lib/oojs-ui/oojs-ui.js
resources/src/mediawiki.special/mediawiki.special.changeslist.legend.css
resources/src/mediawiki.ui/components/forms.less
tests/TestsAutoLoader.php
tests/phpunit/includes/MWFunctionTest.php
tests/phpunit/includes/api/ApiUploadTest.php
tests/phpunit/includes/api/query/ApiQueryBasicTest.php
tests/phpunit/includes/api/query/ApiQueryContinue2Test.php
tests/phpunit/includes/api/query/ApiQueryContinueTest.php
tests/phpunit/includes/api/query/ApiQueryContinueTestBase.php
tests/phpunit/includes/db/TestORMRowTest.php
tests/phpunit/includes/diff/DiffOpTest.php
tests/phpunit/includes/exception/BadTitleErrorTest.php
tests/phpunit/includes/exception/ErrorPageErrorTest.php
tests/phpunit/includes/exception/ThrottledErrorTest.php
tests/phpunit/includes/json/FormatJsonTest.php
tests/phpunit/includes/libs/ObjectFactoryTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/XhprofTest.php [new file with mode: 0644]
tests/phpunit/includes/libs/cdb/CdbTest.php [new file with mode: 0644]
tests/phpunit/includes/utils/CdbTest.php [deleted file]

index b649c2b..ea5e8b8 100644 (file)
@@ -150,6 +150,9 @@ MediaWiki supports over 350 languages. Many localisations are updated
 regularly. Below only new and removed languages are listed, as well as
 changes to languages because of Bugzilla reports.
 
+* (bug 64440) Kazakh (kk) wikis should no longer forcefully reset the user's
+  interface language to kk where unexpected.
+
 === Other changes in 1.25 ===
 * The skin autodiscovery mechanism, deprecated in MediaWiki 1.23, has been
   removed. See https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery for
@@ -182,6 +185,9 @@ changes to languages because of Bugzilla reports.
   <https://www.mediawiki.org/xml/export-0.10.xsd>.
 * MWFunction::call() and MWFunction::callArray() were removed, having being
   deprecated in 1.22.
+* Deprecated the getInternalLinkAttributes, getInternalLinkAttributesObj,
+  and getInternalLinkAttributes methods in Linker, and removed
+  getExternalLinkAttributes method, which was deprecated in MediaWiki 1.18.
 
 == Compatibility ==
 
diff --git a/autoload.php b/autoload.php
new file mode 100644 (file)
index 0000000..c5fc22c
--- /dev/null
@@ -0,0 +1,1318 @@
+<?php
+// This file is generated, do not adjust manually
+
+global $wgAutoloadLocalClasses;
+
+$wgAutoloadLocalClasses = array(
+       'APCBagOStuff' => __DIR__ . '/includes/objectcache/APCBagOStuff.php',
+       'AbstractContent' => __DIR__ . '/includes/content/AbstractContent.php',
+       'Action' => __DIR__ . '/includes/actions/Action.php',
+       'ActiveUsersPager' => __DIR__ . '/includes/specials/SpecialActiveusers.php',
+       'AjaxDispatcher' => __DIR__ . '/includes/AjaxDispatcher.php',
+       'AjaxResponse' => __DIR__ . '/includes/AjaxResponse.php',
+       'AllMessagesTablePager' => __DIR__ . '/includes/specials/SpecialAllMessages.php',
+       'AllTrans' => __DIR__ . '/maintenance/language/alltrans.php',
+       'AlphabeticPager' => __DIR__ . '/includes/pager/AlphabeticPager.php',
+       'AlterSharedConstraints' => __DIR__ . '/maintenance/oracle/alterSharedConstraints.php',
+       'AncientPagesPage' => __DIR__ . '/includes/specials/SpecialAncientpages.php',
+       'AnsiTermColorer' => __DIR__ . '/maintenance/term/MWTerm.php',
+       'ApiBase' => __DIR__ . '/includes/api/ApiBase.php',
+       'ApiBlock' => __DIR__ . '/includes/api/ApiBlock.php',
+       'ApiClearHasMsg' => __DIR__ . '/includes/api/ApiClearHasMsg.php',
+       'ApiComparePages' => __DIR__ . '/includes/api/ApiComparePages.php',
+       'ApiCreateAccount' => __DIR__ . '/includes/api/ApiCreateAccount.php',
+       'ApiDelete' => __DIR__ . '/includes/api/ApiDelete.php',
+       'ApiDisabled' => __DIR__ . '/includes/api/ApiDisabled.php',
+       'ApiEditPage' => __DIR__ . '/includes/api/ApiEditPage.php',
+       'ApiEmailUser' => __DIR__ . '/includes/api/ApiEmailUser.php',
+       'ApiExpandTemplates' => __DIR__ . '/includes/api/ApiExpandTemplates.php',
+       'ApiFeedContributions' => __DIR__ . '/includes/api/ApiFeedContributions.php',
+       'ApiFeedRecentChanges' => __DIR__ . '/includes/api/ApiFeedRecentChanges.php',
+       'ApiFeedWatchlist' => __DIR__ . '/includes/api/ApiFeedWatchlist.php',
+       'ApiFileRevert' => __DIR__ . '/includes/api/ApiFileRevert.php',
+       'ApiFormatBase' => __DIR__ . '/includes/api/ApiFormatBase.php',
+       'ApiFormatDbg' => __DIR__ . '/includes/api/ApiFormatDbg.php',
+       'ApiFormatDump' => __DIR__ . '/includes/api/ApiFormatDump.php',
+       'ApiFormatFeedWrapper' => __DIR__ . '/includes/api/ApiFormatFeedWrapper.php',
+       'ApiFormatJson' => __DIR__ . '/includes/api/ApiFormatJson.php',
+       'ApiFormatNone' => __DIR__ . '/includes/api/ApiFormatNone.php',
+       'ApiFormatPhp' => __DIR__ . '/includes/api/ApiFormatPhp.php',
+       'ApiFormatRaw' => __DIR__ . '/includes/api/ApiFormatRaw.php',
+       'ApiFormatTxt' => __DIR__ . '/includes/api/ApiFormatTxt.php',
+       'ApiFormatWddx' => __DIR__ . '/includes/api/ApiFormatWddx.php',
+       'ApiFormatXml' => __DIR__ . '/includes/api/ApiFormatXml.php',
+       'ApiFormatXmlRsd' => __DIR__ . '/includes/api/ApiRsd.php',
+       'ApiFormatYaml' => __DIR__ . '/includes/api/ApiFormatYaml.php',
+       'ApiHelp' => __DIR__ . '/includes/api/ApiHelp.php',
+       'ApiImageRotate' => __DIR__ . '/includes/api/ApiImageRotate.php',
+       'ApiImport' => __DIR__ . '/includes/api/ApiImport.php',
+       'ApiImportReporter' => __DIR__ . '/includes/api/ApiImport.php',
+       'ApiLogin' => __DIR__ . '/includes/api/ApiLogin.php',
+       'ApiLogout' => __DIR__ . '/includes/api/ApiLogout.php',
+       'ApiMain' => __DIR__ . '/includes/api/ApiMain.php',
+       'ApiModuleManager' => __DIR__ . '/includes/api/ApiModuleManager.php',
+       'ApiMove' => __DIR__ . '/includes/api/ApiMove.php',
+       'ApiOpenSearch' => __DIR__ . '/includes/api/ApiOpenSearch.php',
+       'ApiOptions' => __DIR__ . '/includes/api/ApiOptions.php',
+       'ApiPageSet' => __DIR__ . '/includes/api/ApiPageSet.php',
+       'ApiParamInfo' => __DIR__ . '/includes/api/ApiParamInfo.php',
+       'ApiParse' => __DIR__ . '/includes/api/ApiParse.php',
+       'ApiPatrol' => __DIR__ . '/includes/api/ApiPatrol.php',
+       'ApiProtect' => __DIR__ . '/includes/api/ApiProtect.php',
+       'ApiPurge' => __DIR__ . '/includes/api/ApiPurge.php',
+       'ApiQuery' => __DIR__ . '/includes/api/ApiQuery.php',
+       'ApiQueryAllCategories' => __DIR__ . '/includes/api/ApiQueryAllCategories.php',
+       'ApiQueryAllDeletedRevisions' => __DIR__ . '/includes/api/ApiQueryAllDeletedRevisions.php',
+       'ApiQueryAllImages' => __DIR__ . '/includes/api/ApiQueryAllImages.php',
+       'ApiQueryAllLinks' => __DIR__ . '/includes/api/ApiQueryAllLinks.php',
+       'ApiQueryAllMessages' => __DIR__ . '/includes/api/ApiQueryAllMessages.php',
+       'ApiQueryAllPages' => __DIR__ . '/includes/api/ApiQueryAllPages.php',
+       'ApiQueryAllUsers' => __DIR__ . '/includes/api/ApiQueryAllUsers.php',
+       'ApiQueryBacklinks' => __DIR__ . '/includes/api/ApiQueryBacklinks.php',
+       'ApiQueryBacklinksprop' => __DIR__ . '/includes/api/ApiQueryBacklinksprop.php',
+       'ApiQueryBase' => __DIR__ . '/includes/api/ApiQueryBase.php',
+       'ApiQueryBlocks' => __DIR__ . '/includes/api/ApiQueryBlocks.php',
+       'ApiQueryCategories' => __DIR__ . '/includes/api/ApiQueryCategories.php',
+       'ApiQueryCategoryInfo' => __DIR__ . '/includes/api/ApiQueryCategoryInfo.php',
+       'ApiQueryCategoryMembers' => __DIR__ . '/includes/api/ApiQueryCategoryMembers.php',
+       'ApiQueryContributions' => __DIR__ . '/includes/api/ApiQueryUserContributions.php',
+       'ApiQueryContributors' => __DIR__ . '/includes/api/ApiQueryContributors.php',
+       'ApiQueryDeletedRevisions' => __DIR__ . '/includes/api/ApiQueryDeletedRevisions.php',
+       'ApiQueryDeletedrevs' => __DIR__ . '/includes/api/ApiQueryDeletedrevs.php',
+       'ApiQueryDisabled' => __DIR__ . '/includes/api/ApiQueryDisabled.php',
+       'ApiQueryDuplicateFiles' => __DIR__ . '/includes/api/ApiQueryDuplicateFiles.php',
+       'ApiQueryExtLinksUsage' => __DIR__ . '/includes/api/ApiQueryExtLinksUsage.php',
+       'ApiQueryExternalLinks' => __DIR__ . '/includes/api/ApiQueryExternalLinks.php',
+       'ApiQueryFileRepoInfo' => __DIR__ . '/includes/api/ApiQueryFileRepoInfo.php',
+       'ApiQueryFilearchive' => __DIR__ . '/includes/api/ApiQueryFilearchive.php',
+       'ApiQueryGeneratorBase' => __DIR__ . '/includes/api/ApiQueryBase.php',
+       'ApiQueryIWBacklinks' => __DIR__ . '/includes/api/ApiQueryIWBacklinks.php',
+       'ApiQueryIWLinks' => __DIR__ . '/includes/api/ApiQueryIWLinks.php',
+       'ApiQueryImageInfo' => __DIR__ . '/includes/api/ApiQueryImageInfo.php',
+       'ApiQueryImages' => __DIR__ . '/includes/api/ApiQueryImages.php',
+       'ApiQueryInfo' => __DIR__ . '/includes/api/ApiQueryInfo.php',
+       'ApiQueryLangBacklinks' => __DIR__ . '/includes/api/ApiQueryLangBacklinks.php',
+       'ApiQueryLangLinks' => __DIR__ . '/includes/api/ApiQueryLangLinks.php',
+       'ApiQueryLinks' => __DIR__ . '/includes/api/ApiQueryLinks.php',
+       'ApiQueryLogEvents' => __DIR__ . '/includes/api/ApiQueryLogEvents.php',
+       'ApiQueryORM' => __DIR__ . '/includes/api/ApiQueryORM.php',
+       'ApiQueryPagePropNames' => __DIR__ . '/includes/api/ApiQueryPagePropNames.php',
+       'ApiQueryPageProps' => __DIR__ . '/includes/api/ApiQueryPageProps.php',
+       'ApiQueryPagesWithProp' => __DIR__ . '/includes/api/ApiQueryPagesWithProp.php',
+       'ApiQueryPrefixSearch' => __DIR__ . '/includes/api/ApiQueryPrefixSearch.php',
+       'ApiQueryProtectedTitles' => __DIR__ . '/includes/api/ApiQueryProtectedTitles.php',
+       'ApiQueryQueryPage' => __DIR__ . '/includes/api/ApiQueryQueryPage.php',
+       'ApiQueryRandom' => __DIR__ . '/includes/api/ApiQueryRandom.php',
+       'ApiQueryRecentChanges' => __DIR__ . '/includes/api/ApiQueryRecentChanges.php',
+       'ApiQueryRevisions' => __DIR__ . '/includes/api/ApiQueryRevisions.php',
+       'ApiQueryRevisionsBase' => __DIR__ . '/includes/api/ApiQueryRevisionsBase.php',
+       'ApiQuerySearch' => __DIR__ . '/includes/api/ApiQuerySearch.php',
+       'ApiQuerySiteinfo' => __DIR__ . '/includes/api/ApiQuerySiteinfo.php',
+       'ApiQueryStashImageInfo' => __DIR__ . '/includes/api/ApiQueryStashImageInfo.php',
+       'ApiQueryTags' => __DIR__ . '/includes/api/ApiQueryTags.php',
+       'ApiQueryTokens' => __DIR__ . '/includes/api/ApiQueryTokens.php',
+       'ApiQueryUserInfo' => __DIR__ . '/includes/api/ApiQueryUserInfo.php',
+       'ApiQueryUsers' => __DIR__ . '/includes/api/ApiQueryUsers.php',
+       'ApiQueryWatchlist' => __DIR__ . '/includes/api/ApiQueryWatchlist.php',
+       'ApiQueryWatchlistRaw' => __DIR__ . '/includes/api/ApiQueryWatchlistRaw.php',
+       'ApiResult' => __DIR__ . '/includes/api/ApiResult.php',
+       'ApiRevisionDelete' => __DIR__ . '/includes/api/ApiRevisionDelete.php',
+       'ApiRollback' => __DIR__ . '/includes/api/ApiRollback.php',
+       'ApiRsd' => __DIR__ . '/includes/api/ApiRsd.php',
+       'ApiSetNotificationTimestamp' => __DIR__ . '/includes/api/ApiSetNotificationTimestamp.php',
+       'ApiTokens' => __DIR__ . '/includes/api/ApiTokens.php',
+       'ApiUnblock' => __DIR__ . '/includes/api/ApiUnblock.php',
+       'ApiUndelete' => __DIR__ . '/includes/api/ApiUndelete.php',
+       'ApiUpload' => __DIR__ . '/includes/api/ApiUpload.php',
+       'ApiUserrights' => __DIR__ . '/includes/api/ApiUserrights.php',
+       'ApiWatch' => __DIR__ . '/includes/api/ApiWatch.php',
+       'ArchivedFile' => __DIR__ . '/includes/filerepo/file/ArchivedFile.php',
+       'ArrayDiffFormatter' => __DIR__ . '/includes/diff/ArrayDiffFormatter.php',
+       'ArrayUtils' => __DIR__ . '/includes/libs/ArrayUtils.php',
+       'Article' => __DIR__ . '/includes/page/Article.php',
+       'AssembleUploadChunksJob' => __DIR__ . '/includes/jobqueue/jobs/AssembleUploadChunksJob.php',
+       'AtomFeed' => __DIR__ . '/includes/Feed.php',
+       'AttachLatest' => __DIR__ . '/maintenance/attachLatest.php',
+       'AuthPlugin' => __DIR__ . '/includes/AuthPlugin.php',
+       'AuthPluginUser' => __DIR__ . '/includes/AuthPlugin.php',
+       'AutoLoader' => __DIR__ . '/includes/AutoLoader.php',
+       'AutoloadGenerator' => __DIR__ . '/includes/utils/AutoloadGenerator.php',
+       'Autopromote' => __DIR__ . '/includes/Autopromote.php',
+       'BacklinkCache' => __DIR__ . '/includes/cache/BacklinkCache.php',
+       'BacklinkJobUtils' => __DIR__ . '/includes/jobqueue/utils/BacklinkJobUtils.php',
+       'BackupDumper' => __DIR__ . '/maintenance/backup.inc',
+       'BackupReader' => __DIR__ . '/maintenance/importDump.php',
+       'BadTitleError' => __DIR__ . '/includes/exception/BadTitleError.php',
+       'BagOStuff' => __DIR__ . '/includes/objectcache/BagOStuff.php',
+       'BaseDump' => __DIR__ . '/maintenance/backupPrefetch.inc',
+       'BaseTemplate' => __DIR__ . '/includes/skins/BaseTemplate.php',
+       'BatchedQueryRunner' => __DIR__ . '/maintenance/runBatchedQuery.php',
+       'BcryptPassword' => __DIR__ . '/includes/password/BcryptPassword.php',
+       'BenchHttpHttps' => __DIR__ . '/maintenance/benchmarks/bench_HTTP_HTTPS.php',
+       'BenchIfSwitch' => __DIR__ . '/maintenance/benchmarks/bench_if_switch.php',
+       'BenchStrtrStrReplace' => __DIR__ . '/maintenance/benchmarks/bench_strtr_str_replace.php',
+       'BenchUtf8TitleCheck' => __DIR__ . '/maintenance/benchmarks/bench_utf8_title_check.php',
+       'BenchWfBaseConvert' => __DIR__ . '/maintenance/benchmarks/bench_wfBaseConvert.php',
+       'BenchWfIsWindows' => __DIR__ . '/maintenance/benchmarks/bench_wfIsWindows.php',
+       'BenchmarkDeleteTruncate' => __DIR__ . '/maintenance/benchmarks/bench_delete_truncate.php',
+       'BenchmarkHooks' => __DIR__ . '/maintenance/benchmarks/benchmarkHooks.php',
+       'BenchmarkParse' => __DIR__ . '/maintenance/benchmarks/benchmarkParse.php',
+       'BenchmarkPurge' => __DIR__ . '/maintenance/benchmarks/benchmarkPurge.php',
+       'Benchmarker' => __DIR__ . '/maintenance/benchmarks/Benchmarker.php',
+       'BitmapHandler' => __DIR__ . '/includes/media/Bitmap.php',
+       'BitmapHandler_ClientOnly' => __DIR__ . '/includes/media/Bitmap_ClientOnly.php',
+       'BitmapMetadataHandler' => __DIR__ . '/includes/media/BitmapMetadataHandler.php',
+       'Blob' => __DIR__ . '/includes/db/DatabaseUtility.php',
+       'Block' => __DIR__ . '/includes/Block.php',
+       'BlockListPager' => __DIR__ . '/includes/specials/SpecialBlockList.php',
+       'BloomCache' => __DIR__ . '/includes/cache/bloom/BloomCache.php',
+       'BloomCacheRedis' => __DIR__ . '/includes/cache/bloom/BloomCacheRedis.php',
+       'BloomFilterTitleHasLogs' => __DIR__ . '/includes/cache/bloom/BloomFilters.php',
+       'BmpHandler' => __DIR__ . '/includes/media/BMP.php',
+       'BrokenRedirectsPage' => __DIR__ . '/includes/specials/SpecialBrokenRedirects.php',
+       'CLDRPluralRuleConverter' => __DIR__ . '/languages/utils/CLDRPluralRuleConverter.php',
+       'CLDRPluralRuleConverterExpression' => __DIR__ . '/languages/utils/CLDRPluralRuleConverterExpression.php',
+       'CLDRPluralRuleConverterFragment' => __DIR__ . '/languages/utils/CLDRPluralRuleConverterFragment.php',
+       'CLDRPluralRuleConverterOperator' => __DIR__ . '/languages/utils/CLDRPluralRuleConverterOperator.php',
+       'CLDRPluralRuleError' => __DIR__ . '/languages/utils/CLDRPluralRuleError.php',
+       'CLDRPluralRuleEvaluator' => __DIR__ . '/languages/utils/CLDRPluralRuleEvaluator.php',
+       'CLDRPluralRuleEvaluatorRange' => __DIR__ . '/languages/utils/CLDRPluralRuleEvaluatorRange.php',
+       'CLIParser' => __DIR__ . '/maintenance/parse.php',
+       'CSSMin' => __DIR__ . '/includes/libs/CSSMin.php',
+       'CacheDependency' => __DIR__ . '/includes/cache/CacheDependency.php',
+       'CacheHelper' => __DIR__ . '/includes/cache/CacheHelper.php',
+       'CacheTime' => __DIR__ . '/includes/parser/CacheTime.php',
+       'CachedAction' => __DIR__ . '/includes/actions/CachedAction.php',
+       'CapsCleanup' => __DIR__ . '/maintenance/cleanupCaps.php',
+       'Category' => __DIR__ . '/includes/Category.php',
+       'CategoryFinder' => __DIR__ . '/includes/CategoryFinder.php',
+       'CategoryPage' => __DIR__ . '/includes/page/CategoryPage.php',
+       'CategoryPager' => __DIR__ . '/includes/specials/SpecialCategories.php',
+       'CategoryViewer' => __DIR__ . '/includes/CategoryViewer.php',
+       'CdbException' => __DIR__ . '/includes/libs/cdb/CdbException.php',
+       'CdbFunctions' => __DIR__ . '/includes/libs/cdb/CdbFunctions.php',
+       'CdbReader' => __DIR__ . '/includes/libs/cdb/CdbReader.php',
+       'CdbReaderDBA' => __DIR__ . '/includes/libs/cdb/CdbReaderDBA.php',
+       'CdbReaderPHP' => __DIR__ . '/includes/libs/cdb/CdbReaderPHP.php',
+       'CdbWriter' => __DIR__ . '/includes/libs/cdb/CdbWriter.php',
+       'CdbWriterDBA' => __DIR__ . '/includes/libs/cdb/CdbWriterDBA.php',
+       'CdbWriterPHP' => __DIR__ . '/includes/libs/cdb/CdbWriterPHP.php',
+       'CgzCopyTransaction' => __DIR__ . '/maintenance/storage/recompressTracked.php',
+       'ChangePassword' => __DIR__ . '/maintenance/changePassword.php',
+       'ChangeTags' => __DIR__ . '/includes/ChangeTags.php',
+       'ChangesFeed' => __DIR__ . '/includes/changes/ChangesFeed.php',
+       'ChangesList' => __DIR__ . '/includes/changes/ChangesList.php',
+       'ChangesListSpecialPage' => __DIR__ . '/includes/specialpage/ChangesListSpecialPage.php',
+       'ChannelFeed' => __DIR__ . '/includes/Feed.php',
+       'CheckBadRedirects' => __DIR__ . '/maintenance/checkBadRedirects.php',
+       'CheckExtensionsCLI' => __DIR__ . '/maintenance/language/checkLanguage.inc',
+       'CheckImages' => __DIR__ . '/maintenance/checkImages.php',
+       'CheckLanguageCLI' => __DIR__ . '/maintenance/language/checkLanguage.inc',
+       'CheckLess' => __DIR__ . '/maintenance/checkLess.php',
+       'CheckStorage' => __DIR__ . '/maintenance/storage/checkStorage.php',
+       'CheckSyntax' => __DIR__ . '/maintenance/checkSyntax.php',
+       'CheckUsernames' => __DIR__ . '/maintenance/checkUsernames.php',
+       'ChronologyProtector' => __DIR__ . '/includes/db/ChronologyProtector.php',
+       'ClassCollector' => __DIR__ . '/includes/utils/AutoloadGenerator.php',
+       'CleanupAncientTables' => __DIR__ . '/maintenance/cleanupAncientTables.php',
+       'CleanupBlocks' => __DIR__ . '/maintenance/cleanupBlocks.php',
+       'CleanupPreferences' => __DIR__ . '/maintenance/cleanupPreferences.php',
+       'CleanupRemovedModules' => __DIR__ . '/maintenance/cleanupRemovedModules.php',
+       'CleanupSpam' => __DIR__ . '/maintenance/cleanupSpam.php',
+       'ClearCacheStats' => __DIR__ . '/maintenance/clearCacheStats.php',
+       'ClearInterwikiCache' => __DIR__ . '/maintenance/clearInterwikiCache.php',
+       'CliInstaller' => __DIR__ . '/includes/installer/CliInstaller.php',
+       'CloneDatabase' => __DIR__ . '/includes/db/CloneDatabase.php',
+       'CodeContentHandler' => __DIR__ . '/includes/content/CodeContentHandler.php',
+       'Collation' => __DIR__ . '/includes/Collation.php',
+       'CollationCkb' => __DIR__ . '/includes/Collation.php',
+       'CollationEt' => __DIR__ . '/includes/Collation.php',
+       'CommandLineInc' => __DIR__ . '/maintenance/commandLine.inc',
+       'CommandLineInstaller' => __DIR__ . '/maintenance/install.php',
+       'CompareParserCache' => __DIR__ . '/maintenance/compareParserCache.php',
+       'CompareParsers' => __DIR__ . '/maintenance/compareParsers.php',
+       'ComposerHookHandler' => __DIR__ . '/includes/composer/ComposerHookHandler.php',
+       'ComposerPackageModifier' => __DIR__ . '/includes/composer/ComposerPackageModifier.php',
+       'ComposerVersionNormalizer' => __DIR__ . '/includes/composer/ComposerVersionNormalizer.php',
+       'CompressOld' => __DIR__ . '/maintenance/storage/compressOld.php',
+       'ConcatenatedGzipHistoryBlob' => __DIR__ . '/includes/HistoryBlob.php',
+       'Config' => __DIR__ . '/includes/config/Config.php',
+       'ConfigException' => __DIR__ . '/includes/config/ConfigException.php',
+       'ConfigFactory' => __DIR__ . '/includes/config/ConfigFactory.php',
+       'ConstantDependency' => __DIR__ . '/includes/cache/CacheDependency.php',
+       'Content' => __DIR__ . '/includes/content/Content.php',
+       'ContentHandler' => __DIR__ . '/includes/content/ContentHandler.php',
+       'ContextSource' => __DIR__ . '/includes/context/ContextSource.php',
+       'ContribsPager' => __DIR__ . '/includes/specials/SpecialContributions.php',
+       'ConvertLinks' => __DIR__ . '/maintenance/convertLinks.php',
+       'ConvertUserOptions' => __DIR__ . '/maintenance/convertUserOptions.php',
+       'ConverterRule' => __DIR__ . '/languages/ConverterRule.php',
+       'Cookie' => __DIR__ . '/includes/libs/Cookie.php',
+       'CookieJar' => __DIR__ . '/includes/libs/Cookie.php',
+       'CopyFileBackend' => __DIR__ . '/maintenance/copyFileBackend.php',
+       'CopyFileOp' => __DIR__ . '/includes/filebackend/FileOp.php',
+       'CopyJobQueue' => __DIR__ . '/maintenance/copyJobQueue.php',
+       'CoreParserFunctions' => __DIR__ . '/includes/parser/CoreParserFunctions.php',
+       'CoreTagHooks' => __DIR__ . '/includes/parser/CoreTagHooks.php',
+       'CreateAndPromote' => __DIR__ . '/maintenance/createAndPromote.php',
+       'CreateFileOp' => __DIR__ . '/includes/filebackend/FileOp.php',
+       'CreditsAction' => __DIR__ . '/includes/actions/CreditsAction.php',
+       'CssContent' => __DIR__ . '/includes/content/CssContent.php',
+       'CssContentHandler' => __DIR__ . '/includes/content/CssContentHandler.php',
+       'CsvStatsOutput' => __DIR__ . '/maintenance/language/StatOutputs.php',
+       'CurlHttpRequest' => __DIR__ . '/includes/HttpFunctions.php',
+       'DBAccessBase' => __DIR__ . '/includes/dao/DBAccessBase.php',
+       'DBAccessError' => __DIR__ . '/includes/db/LBFactory.php',
+       'DBConnRef' => __DIR__ . '/includes/db/LoadBalancer.php',
+       'DBConnectionError' => __DIR__ . '/includes/db/DatabaseError.php',
+       'DBError' => __DIR__ . '/includes/db/DatabaseError.php',
+       'DBExpectedError' => __DIR__ . '/includes/db/DatabaseError.php',
+       'DBFileJournal' => __DIR__ . '/includes/filebackend/filejournal/DBFileJournal.php',
+       'DBLockManager' => __DIR__ . '/includes/filebackend/lockmanager/DBLockManager.php',
+       'DBMasterPos' => __DIR__ . '/includes/db/DatabaseUtility.php',
+       'DBObject' => __DIR__ . '/includes/db/DatabaseUtility.php',
+       'DBQueryError' => __DIR__ . '/includes/db/DatabaseError.php',
+       'DBUnexpectedError' => __DIR__ . '/includes/db/DatabaseError.php',
+       'DataUpdate' => __DIR__ . '/includes/deferred/DataUpdate.php',
+       'DatabaseBase' => __DIR__ . '/includes/db/Database.php',
+       'DatabaseInstaller' => __DIR__ . '/includes/installer/DatabaseInstaller.php',
+       'DatabaseLag' => __DIR__ . '/maintenance/lag.php',
+       'DatabaseLogEntry' => __DIR__ . '/includes/logging/LogEntry.php',
+       'DatabaseMssql' => __DIR__ . '/includes/db/DatabaseMssql.php',
+       'DatabaseMysql' => __DIR__ . '/includes/db/DatabaseMysql.php',
+       'DatabaseMysqlBase' => __DIR__ . '/includes/db/DatabaseMysqlBase.php',
+       'DatabaseMysqli' => __DIR__ . '/includes/db/DatabaseMysqli.php',
+       'DatabaseOracle' => __DIR__ . '/includes/db/DatabaseOracle.php',
+       'DatabasePostgres' => __DIR__ . '/includes/db/DatabasePostgres.php',
+       'DatabaseSqlite' => __DIR__ . '/includes/db/DatabaseSqlite.php',
+       'DatabaseSqliteStandalone' => __DIR__ . '/includes/db/DatabaseSqlite.php',
+       'DatabaseUpdater' => __DIR__ . '/includes/installer/DatabaseUpdater.php',
+       'DateFormats' => __DIR__ . '/maintenance/language/date-formats.php',
+       'DateFormatter' => __DIR__ . '/includes/parser/DateFormatter.php',
+       'DeadendPagesPage' => __DIR__ . '/includes/specials/SpecialDeadendpages.php',
+       'DeferrableUpdate' => __DIR__ . '/includes/deferred/DeferredUpdates.php',
+       'DeferredUpdates' => __DIR__ . '/includes/deferred/DeferredUpdates.php',
+       'DeleteAction' => __DIR__ . '/includes/actions/DeleteAction.php',
+       'DeleteArchivedFiles' => __DIR__ . '/maintenance/deleteArchivedFiles.php',
+       'DeleteArchivedFilesImplementation' => __DIR__ . '/maintenance/deleteArchivedFiles.inc',
+       'DeleteArchivedRevisions' => __DIR__ . '/maintenance/deleteArchivedRevisions.php',
+       'DeleteArchivedRevisionsImplementation' => __DIR__ . '/maintenance/deleteArchivedRevisions.inc',
+       'DeleteBatch' => __DIR__ . '/maintenance/deleteBatch.php',
+       'DeleteDefaultMessages' => __DIR__ . '/maintenance/deleteDefaultMessages.php',
+       'DeleteEqualMessages' => __DIR__ . '/maintenance/deleteEqualMessages.php',
+       'DeleteFileOp' => __DIR__ . '/includes/filebackend/FileOp.php',
+       'DeleteImageCache' => __DIR__ . '/maintenance/deleteImageMemcached.php',
+       'DeleteLogFormatter' => __DIR__ . '/includes/logging/DeleteLogFormatter.php',
+       'DeleteOldRevisions' => __DIR__ . '/maintenance/deleteOldRevisions.php',
+       'DeleteOrphanedRevisions' => __DIR__ . '/maintenance/deleteOrphanedRevisions.php',
+       'DeleteRevision' => __DIR__ . '/maintenance/deleteRevision.php',
+       'DeleteSelfExternals' => __DIR__ . '/maintenance/deleteSelfExternals.php',
+       'DeletedContribsPager' => __DIR__ . '/includes/specials/SpecialDeletedContributions.php',
+       'DeletedContributionsPage' => __DIR__ . '/includes/specials/SpecialDeletedContributions.php',
+       'DependencyWrapper' => __DIR__ . '/includes/cache/CacheDependency.php',
+       'DeprecatedGlobal' => __DIR__ . '/includes/DeprecatedGlobal.php',
+       'DerivativeContext' => __DIR__ . '/includes/context/DerivativeContext.php',
+       'DerivativeRequest' => __DIR__ . '/includes/WebRequest.php',
+       'DerivativeResourceLoaderContext' => __DIR__ . '/includes/resourceloader/DerivativeResourceLoaderContext.php',
+       'DescribeFileOp' => __DIR__ . '/includes/filebackend/FileOp.php',
+       'Diff' => __DIR__ . '/includes/diff/DairikiDiff.php',
+       'DiffEngine' => __DIR__ . '/includes/diff/DairikiDiff.php',
+       'DiffFormatter' => __DIR__ . '/includes/diff/DiffFormatter.php',
+       'DiffHistoryBlob' => __DIR__ . '/includes/HistoryBlob.php',
+       'DiffOp' => __DIR__ . '/includes/diff/DairikiDiff.php',
+       'DiffOpAdd' => __DIR__ . '/includes/diff/DairikiDiff.php',
+       'DiffOpChange' => __DIR__ . '/includes/diff/DairikiDiff.php',
+       'DiffOpCopy' => __DIR__ . '/includes/diff/DairikiDiff.php',
+       'DiffOpDelete' => __DIR__ . '/includes/diff/DairikiDiff.php',
+       'DifferenceEngine' => __DIR__ . '/includes/diff/DifferenceEngine.php',
+       'Digit2Html' => __DIR__ . '/maintenance/language/digit2html.php',
+       'DjVuHandler' => __DIR__ . '/includes/media/DjVu.php',
+       'DjVuImage' => __DIR__ . '/includes/media/DjVuImage.php',
+       'DoubleRedirectJob' => __DIR__ . '/includes/jobqueue/jobs/DoubleRedirectJob.php',
+       'DoubleRedirectsPage' => __DIR__ . '/includes/specials/SpecialDoubleRedirects.php',
+       'DoubleReplacer' => __DIR__ . '/includes/utils/StringUtils.php',
+       'DummyLinker' => __DIR__ . '/includes/Linker.php',
+       'DummyTermColorer' => __DIR__ . '/maintenance/term/MWTerm.php',
+       'Dump7ZipOutput' => __DIR__ . '/includes/Export.php',
+       'DumpBZip2Output' => __DIR__ . '/includes/Export.php',
+       'DumpDBZip2Output' => __DIR__ . '/maintenance/backup.inc',
+       'DumpFileOutput' => __DIR__ . '/includes/Export.php',
+       'DumpFilter' => __DIR__ . '/includes/Export.php',
+       'DumpGZipOutput' => __DIR__ . '/includes/Export.php',
+       'DumpIterator' => __DIR__ . '/maintenance/dumpIterator.php',
+       'DumpLatestFilter' => __DIR__ . '/includes/Export.php',
+       'DumpLinks' => __DIR__ . '/maintenance/dumpLinks.php',
+       'DumpMessages' => __DIR__ . '/maintenance/language/dumpMessages.php',
+       'DumpMultiWriter' => __DIR__ . '/includes/Export.php',
+       'DumpNamespaceFilter' => __DIR__ . '/includes/Export.php',
+       'DumpNotalkFilter' => __DIR__ . '/includes/Export.php',
+       'DumpOutput' => __DIR__ . '/includes/Export.php',
+       'DumpPipeOutput' => __DIR__ . '/includes/Export.php',
+       'DumpRenderer' => __DIR__ . '/maintenance/renderDump.php',
+       'DumpRev' => __DIR__ . '/maintenance/storage/dumpRev.php',
+       'DumpSisterSites' => __DIR__ . '/maintenance/dumpSisterSites.php',
+       'DuplicateJob' => __DIR__ . '/includes/jobqueue/jobs/DuplicateJob.php',
+       'EditAction' => __DIR__ . '/includes/actions/EditAction.php',
+       'EditCLI' => __DIR__ . '/maintenance/edit.php',
+       'EditPage' => __DIR__ . '/includes/EditPage.php',
+       'EditWatchlistCheckboxSeriesField' => __DIR__ . '/includes/specials/SpecialEditWatchlist.php',
+       'EditWatchlistNormalHTMLForm' => __DIR__ . '/includes/specials/SpecialEditWatchlist.php',
+       'EmailConfirmation' => __DIR__ . '/includes/specials/SpecialConfirmemail.php',
+       'EmailInvalidation' => __DIR__ . '/includes/specials/SpecialConfirmemail.php',
+       'EmailNotification' => __DIR__ . '/includes/mail/EmailNotification.php',
+       'EmaillingJob' => __DIR__ . '/includes/jobqueue/jobs/EmaillingJob.php',
+       'EmptyBagOStuff' => __DIR__ . '/includes/objectcache/EmptyBagOStuff.php',
+       'EmptyBloomCache' => __DIR__ . '/includes/cache/bloom/BloomCache.php',
+       'EncryptedPassword' => __DIR__ . '/includes/password/EncryptedPassword.php',
+       'EnhancedChangesList' => __DIR__ . '/includes/changes/EnhancedChangesList.php',
+       'EnotifNotifyJob' => __DIR__ . '/includes/jobqueue/jobs/EnotifNotifyJob.php',
+       'EraseArchivedFile' => __DIR__ . '/maintenance/eraseArchivedFile.php',
+       'ErrorPageError' => __DIR__ . '/includes/exception/ErrorPageError.php',
+       'Exif' => __DIR__ . '/includes/media/Exif.php',
+       'ExifBitmapHandler' => __DIR__ . '/includes/media/ExifBitmap.php',
+       'ExplodeIterator' => __DIR__ . '/includes/utils/StringUtils.php',
+       'ExportProgressFilter' => __DIR__ . '/maintenance/backup.inc',
+       'ExtensionLanguages' => __DIR__ . '/maintenance/language/languages.inc',
+       'ExternalStore' => __DIR__ . '/includes/externalstore/ExternalStore.php',
+       'ExternalStoreDB' => __DIR__ . '/includes/externalstore/ExternalStoreDB.php',
+       'ExternalStoreHttp' => __DIR__ . '/includes/externalstore/ExternalStoreHttp.php',
+       'ExternalStoreMedium' => __DIR__ . '/includes/externalstore/ExternalStoreMedium.php',
+       'ExternalStoreMwstore' => __DIR__ . '/includes/externalstore/ExternalStoreMwstore.php',
+       'FSFile' => __DIR__ . '/includes/filebackend/FSFile.php',
+       'FSFileBackend' => __DIR__ . '/includes/filebackend/FSFileBackend.php',
+       'FSFileBackendDirList' => __DIR__ . '/includes/filebackend/FSFileBackend.php',
+       'FSFileBackendFileList' => __DIR__ . '/includes/filebackend/FSFileBackend.php',
+       'FSFileBackendList' => __DIR__ . '/includes/filebackend/FSFileBackend.php',
+       'FSFileOpHandle' => __DIR__ . '/includes/filebackend/FSFileBackend.php',
+       'FSLockManager' => __DIR__ . '/includes/filebackend/lockmanager/FSLockManager.php',
+       'FSRepo' => __DIR__ . '/includes/filerepo/FSRepo.php',
+       'FakeConverter' => __DIR__ . '/languages/FakeConverter.php',
+       'FakeMaintenance' => __DIR__ . '/maintenance/Maintenance.php',
+       'FakeResultWrapper' => __DIR__ . '/includes/db/DatabaseUtility.php',
+       'Fallback' => __DIR__ . '/includes/Fallback.php',
+       'FatalError' => __DIR__ . '/includes/exception/FatalError.php',
+       'FauxRequest' => __DIR__ . '/includes/WebRequest.php',
+       'FauxResponse' => __DIR__ . '/includes/WebResponse.php',
+       'FeedItem' => __DIR__ . '/includes/Feed.php',
+       'FeedUtils' => __DIR__ . '/includes/FeedUtils.php',
+       'FetchText' => __DIR__ . '/maintenance/fetchText.php',
+       'FewestrevisionsPage' => __DIR__ . '/includes/specials/SpecialFewestrevisions.php',
+       'Field' => __DIR__ . '/includes/db/DatabaseUtility.php',
+       'File' => __DIR__ . '/includes/filerepo/file/File.php',
+       'FileBackend' => __DIR__ . '/includes/filebackend/FileBackend.php',
+       'FileBackendError' => __DIR__ . '/includes/filebackend/FileBackend.php',
+       'FileBackendException' => __DIR__ . '/includes/filebackend/FileBackend.php',
+       'FileBackendGroup' => __DIR__ . '/includes/filebackend/FileBackendGroup.php',
+       'FileBackendMultiWrite' => __DIR__ . '/includes/filebackend/FileBackendMultiWrite.php',
+       'FileBackendStore' => __DIR__ . '/includes/filebackend/FileBackendStore.php',
+       'FileBackendStoreOpHandle' => __DIR__ . '/includes/filebackend/FileBackendStore.php',
+       'FileBackendStoreShardDirIterator' => __DIR__ . '/includes/filebackend/FileBackendStore.php',
+       'FileBackendStoreShardFileIterator' => __DIR__ . '/includes/filebackend/FileBackendStore.php',
+       'FileBackendStoreShardListIterator' => __DIR__ . '/includes/filebackend/FileBackendStore.php',
+       'FileCacheBase' => __DIR__ . '/includes/cache/FileCacheBase.php',
+       'FileDeleteForm' => __DIR__ . '/includes/FileDeleteForm.php',
+       'FileDependency' => __DIR__ . '/includes/cache/CacheDependency.php',
+       'FileDuplicateSearchPage' => __DIR__ . '/includes/specials/SpecialFileDuplicateSearch.php',
+       'FileJournal' => __DIR__ . '/includes/filebackend/filejournal/FileJournal.php',
+       'FileOp' => __DIR__ . '/includes/filebackend/FileOp.php',
+       'FileOpBatch' => __DIR__ . '/includes/filebackend/FileOpBatch.php',
+       'FileRepo' => __DIR__ . '/includes/filerepo/FileRepo.php',
+       'FileRepoStatus' => __DIR__ . '/includes/filerepo/FileRepoStatus.php',
+       'FindHooks' => __DIR__ . '/maintenance/findHooks.php',
+       'FindMissingFiles' => __DIR__ . '/maintenance/findMissingFiles.php',
+       'FixBug20757' => __DIR__ . '/maintenance/storage/fixBug20757.php',
+       'FixDoubleRedirects' => __DIR__ . '/maintenance/fixDoubleRedirects.php',
+       'FixExtLinksProtocolRelative' => __DIR__ . '/maintenance/fixExtLinksProtocolRelative.php',
+       'FixSlaveDesync' => __DIR__ . '/maintenance/fixSlaveDesync.php',
+       'FixTimestamps' => __DIR__ . '/maintenance/fixTimestamps.php',
+       'FixUserRegistration' => __DIR__ . '/maintenance/fixUserRegistration.php',
+       'ForeignAPIFile' => __DIR__ . '/includes/filerepo/file/ForeignAPIFile.php',
+       'ForeignAPIRepo' => __DIR__ . '/includes/filerepo/ForeignAPIRepo.php',
+       'ForeignDBFile' => __DIR__ . '/includes/filerepo/file/ForeignDBFile.php',
+       'ForeignDBRepo' => __DIR__ . '/includes/filerepo/ForeignDBRepo.php',
+       'ForeignDBViaLBRepo' => __DIR__ . '/includes/filerepo/ForeignDBViaLBRepo.php',
+       'ForkController' => __DIR__ . '/includes/ForkController.php',
+       'FormAction' => __DIR__ . '/includes/actions/FormAction.php',
+       'FormOptions' => __DIR__ . '/includes/FormOptions.php',
+       'FormSpecialPage' => __DIR__ . '/includes/specialpage/FormSpecialPage.php',
+       'FormatJson' => __DIR__ . '/includes/json/FormatJson.php',
+       'FormatMetadata' => __DIR__ . '/includes/media/FormatMetadata.php',
+       'FormlessAction' => __DIR__ . '/includes/actions/FormlessAction.php',
+       'GIFHandler' => __DIR__ . '/includes/media/GIF.php',
+       'GIFMetadataExtractor' => __DIR__ . '/includes/media/GIFMetadataExtractor.php',
+       'GanConverter' => __DIR__ . '/languages/classes/LanguageGan.php',
+       'GenderCache' => __DIR__ . '/includes/cache/GenderCache.php',
+       'GenerateCollationData' => __DIR__ . '/maintenance/language/generateCollationData.php',
+       'GenerateJsonI18n' => __DIR__ . '/maintenance/generateJsonI18n.php',
+       'GenerateNormalizerDataAr' => __DIR__ . '/maintenance/language/generateNormalizerDataAr.php',
+       'GenerateNormalizerDataMl' => __DIR__ . '/maintenance/language/generateNormalizerDataMl.php',
+       'GenerateSitemap' => __DIR__ . '/maintenance/generateSitemap.php',
+       'GenerateUtf8Case' => __DIR__ . '/maintenance/language/generateUtf8Case.php',
+       'GenericArrayObject' => __DIR__ . '/includes/libs/GenericArrayObject.php',
+       'GetConfiguration' => __DIR__ . '/maintenance/getConfiguration.php',
+       'GetLagTimes' => __DIR__ . '/maintenance/getLagTimes.php',
+       'GetSlaveServer' => __DIR__ . '/maintenance/getSlaveServer.php',
+       'GetTextMaint' => __DIR__ . '/maintenance/getText.php',
+       'GitInfo' => __DIR__ . '/includes/GitInfo.php',
+       'GlobalDependency' => __DIR__ . '/includes/cache/CacheDependency.php',
+       'GlobalVarConfig' => __DIR__ . '/includes/config/GlobalVarConfig.php',
+       'HTMLApiField' => __DIR__ . '/includes/htmlform/HTMLApiField.php',
+       'HTMLAutoCompleteSelectField' => __DIR__ . '/includes/htmlform/HTMLAutoCompleteSelectField.php',
+       'HTMLButtonField' => __DIR__ . '/includes/htmlform/HTMLButtonField.php',
+       'HTMLCacheUpdate' => __DIR__ . '/includes/deferred/HTMLCacheUpdate.php',
+       'HTMLCacheUpdateJob' => __DIR__ . '/includes/jobqueue/jobs/HTMLCacheUpdateJob.php',
+       'HTMLCheckField' => __DIR__ . '/includes/htmlform/HTMLCheckField.php',
+       'HTMLCheckMatrix' => __DIR__ . '/includes/htmlform/HTMLCheckMatrix.php',
+       'HTMLEditTools' => __DIR__ . '/includes/htmlform/HTMLEditTools.php',
+       'HTMLFileCache' => __DIR__ . '/includes/cache/HTMLFileCache.php',
+       'HTMLFloatField' => __DIR__ . '/includes/htmlform/HTMLFloatField.php',
+       'HTMLForm' => __DIR__ . '/includes/htmlform/HTMLForm.php',
+       'HTMLFormField' => __DIR__ . '/includes/htmlform/HTMLFormField.php',
+       'HTMLFormFieldCloner' => __DIR__ . '/includes/htmlform/HTMLFormFieldCloner.php',
+       'HTMLFormFieldRequiredOptionsException' => __DIR__ . '/includes/htmlform/HTMLFormFieldRequiredOptionsException.php',
+       'HTMLHiddenField' => __DIR__ . '/includes/htmlform/HTMLHiddenField.php',
+       'HTMLInfoField' => __DIR__ . '/includes/htmlform/HTMLInfoField.php',
+       'HTMLIntField' => __DIR__ . '/includes/htmlform/HTMLIntField.php',
+       'HTMLMultiSelectField' => __DIR__ . '/includes/htmlform/HTMLMultiSelectField.php',
+       'HTMLNestedFilterable' => __DIR__ . '/includes/htmlform/HTMLNestedFilterable.php',
+       'HTMLRadioField' => __DIR__ . '/includes/htmlform/HTMLRadioField.php',
+       'HTMLSelectAndOtherField' => __DIR__ . '/includes/htmlform/HTMLSelectAndOtherField.php',
+       'HTMLSelectField' => __DIR__ . '/includes/htmlform/HTMLSelectField.php',
+       'HTMLSelectLimitField' => __DIR__ . '/includes/htmlform/HTMLSelectLimitField.php',
+       'HTMLSelectNamespace' => __DIR__ . '/includes/htmlform/HTMLSelectNamespace.php',
+       'HTMLSelectOrOtherField' => __DIR__ . '/includes/htmlform/HTMLSelectOrOtherField.php',
+       'HTMLSubmitField' => __DIR__ . '/includes/htmlform/HTMLSubmitField.php',
+       'HTMLTagFilter' => __DIR__ . '/includes/htmlform/HTMLTagFilter.php',
+       'HTMLTextAreaField' => __DIR__ . '/includes/htmlform/HTMLTextAreaField.php',
+       'HTMLTextField' => __DIR__ . '/includes/htmlform/HTMLTextField.php',
+       'HWLDFWordAccumulator' => __DIR__ . '/includes/diff/DairikiDiff.php',
+       'HashBagOStuff' => __DIR__ . '/includes/objectcache/HashBagOStuff.php',
+       'HashConfig' => __DIR__ . '/includes/config/HashConfig.php',
+       'HashRing' => __DIR__ . '/includes/libs/HashRing.php',
+       'HashtableReplacer' => __DIR__ . '/includes/utils/StringUtils.php',
+       'HistoryAction' => __DIR__ . '/includes/actions/HistoryAction.php',
+       'HistoryBlob' => __DIR__ . '/includes/HistoryBlob.php',
+       'HistoryBlobCurStub' => __DIR__ . '/includes/HistoryBlob.php',
+       'HistoryBlobStub' => __DIR__ . '/includes/HistoryBlob.php',
+       'HistoryPager' => __DIR__ . '/includes/actions/HistoryAction.php',
+       'Hooks' => __DIR__ . '/includes/Hooks.php',
+       'Html' => __DIR__ . '/includes/Html.php',
+       'HtmlFormatter' => __DIR__ . '/includes/HtmlFormatter.php',
+       'Http' => __DIR__ . '/includes/HttpFunctions.php',
+       'HttpError' => __DIR__ . '/includes/exception/HttpError.php',
+       'HttpStatus' => __DIR__ . '/includes/libs/HttpStatus.php',
+       'ICacheHelper' => __DIR__ . '/includes/cache/CacheHelper.php',
+       'IContextSource' => __DIR__ . '/includes/context/IContextSource.php',
+       'IDBAccessObject' => __DIR__ . '/includes/dao/IDBAccessObject.php',
+       'IDatabase' => __DIR__ . '/includes/db/Database.php',
+       'IEContentAnalyzer' => __DIR__ . '/includes/libs/IEContentAnalyzer.php',
+       'IEUrlExtension' => __DIR__ . '/includes/libs/IEUrlExtension.php',
+       'IJobSpecification' => __DIR__ . '/includes/jobqueue/JobSpecification.php',
+       'IORMRow' => __DIR__ . '/includes/db/IORMRow.php',
+       'IORMTable' => __DIR__ . '/includes/db/IORMTable.php',
+       'IP' => __DIR__ . '/includes/utils/IP.php',
+       'IPSet' => __DIR__ . '/includes/libs/IPSet.php',
+       'IPTC' => __DIR__ . '/includes/media/IPTC.php',
+       'IRCColourfulRCFeedFormatter' => __DIR__ . '/includes/rcfeed/IRCColourfulRCFeedFormatter.php',
+       'IcuCollation' => __DIR__ . '/includes/Collation.php',
+       'IdentityCollation' => __DIR__ . '/includes/Collation.php',
+       'ImageBuilder' => __DIR__ . '/maintenance/rebuildImages.php',
+       'ImageCleanup' => __DIR__ . '/maintenance/cleanupImages.php',
+       'ImageGallery' => __DIR__ . '/includes/gallery/TraditionalImageGallery.php',
+       'ImageGalleryBase' => __DIR__ . '/includes/gallery/ImageGalleryBase.php',
+       'ImageHandler' => __DIR__ . '/includes/media/ImageHandler.php',
+       'ImageHistoryList' => __DIR__ . '/includes/page/ImagePage.php',
+       'ImageHistoryPseudoPager' => __DIR__ . '/includes/page/ImagePage.php',
+       'ImageListPager' => __DIR__ . '/includes/specials/SpecialListfiles.php',
+       'ImagePage' => __DIR__ . '/includes/page/ImagePage.php',
+       'ImageQueryPage' => __DIR__ . '/includes/specialpage/ImageQueryPage.php',
+       'ImportReporter' => __DIR__ . '/includes/specials/SpecialImport.php',
+       'ImportSiteScripts' => __DIR__ . '/maintenance/importSiteScripts.php',
+       'ImportStreamSource' => __DIR__ . '/includes/Import.php',
+       'ImportStringSource' => __DIR__ . '/includes/Import.php',
+       'IncludableSpecialPage' => __DIR__ . '/includes/specialpage/IncludableSpecialPage.php',
+       'IndexPager' => __DIR__ . '/includes/pager/IndexPager.php',
+       'InfoAction' => __DIR__ . '/includes/actions/InfoAction.php',
+       'InitEditCount' => __DIR__ . '/maintenance/initEditCount.php',
+       'InitSiteStats' => __DIR__ . '/maintenance/initSiteStats.php',
+       'InstallDocFormatter' => __DIR__ . '/includes/installer/InstallDocFormatter.php',
+       'Installer' => __DIR__ . '/includes/installer/Installer.php',
+       'InstallerOverrides' => __DIR__ . '/mw-config/overrides.php',
+       'Interwiki' => __DIR__ . '/includes/interwiki/Interwiki.php',
+       'InvalidPassword' => __DIR__ . '/includes/password/InvalidPassword.php',
+       'IuConverter' => __DIR__ . '/languages/classes/LanguageIu.php',
+       'JSCompilerContext' => __DIR__ . '/includes/libs/jsminplus.php',
+       'JSMinPlus' => __DIR__ . '/includes/libs/jsminplus.php',
+       'JSNode' => __DIR__ . '/includes/libs/jsminplus.php',
+       'JSONRCFeedFormatter' => __DIR__ . '/includes/rcfeed/JSONRCFeedFormatter.php',
+       'JSParseHelper' => __DIR__ . '/maintenance/jsparse.php',
+       'JSParser' => __DIR__ . '/includes/libs/jsminplus.php',
+       'JSToken' => __DIR__ . '/includes/libs/jsminplus.php',
+       'JSTokenizer' => __DIR__ . '/includes/libs/jsminplus.php',
+       'JavaScriptContent' => __DIR__ . '/includes/content/JavaScriptContent.php',
+       'JavaScriptContentHandler' => __DIR__ . '/includes/content/JavaScriptContentHandler.php',
+       'JavaScriptMinifier' => __DIR__ . '/includes/libs/JavaScriptMinifier.php',
+       'Job' => __DIR__ . '/includes/jobqueue/Job.php',
+       'JobQueue' => __DIR__ . '/includes/jobqueue/JobQueue.php',
+       'JobQueueAggregator' => __DIR__ . '/includes/jobqueue/aggregator/JobQueueAggregator.php',
+       'JobQueueAggregatorMemc' => __DIR__ . '/includes/jobqueue/aggregator/JobQueueAggregatorMemc.php',
+       'JobQueueAggregatorRedis' => __DIR__ . '/includes/jobqueue/aggregator/JobQueueAggregatorRedis.php',
+       'JobQueueConnectionError' => __DIR__ . '/includes/jobqueue/JobQueue.php',
+       'JobQueueDB' => __DIR__ . '/includes/jobqueue/JobQueueDB.php',
+       'JobQueueError' => __DIR__ . '/includes/jobqueue/JobQueue.php',
+       'JobQueueFederated' => __DIR__ . '/includes/jobqueue/JobQueueFederated.php',
+       'JobQueueGroup' => __DIR__ . '/includes/jobqueue/JobQueueGroup.php',
+       'JobQueueRedis' => __DIR__ . '/includes/jobqueue/JobQueueRedis.php',
+       'JobRunner' => __DIR__ . '/includes/jobqueue/JobRunner.php',
+       'JobSpecification' => __DIR__ . '/includes/jobqueue/JobSpecification.php',
+       'JpegHandler' => __DIR__ . '/includes/media/Jpeg.php',
+       'JpegMetadataExtractor' => __DIR__ . '/includes/media/JpegMetadataExtractor.php',
+       'JsonContent' => __DIR__ . '/includes/content/JsonContent.php',
+       'JsonContentHandler' => __DIR__ . '/includes/content/JsonContentHandler.php',
+       'KkConverter' => __DIR__ . '/languages/classes/LanguageKk.php',
+       'KuConverter' => __DIR__ . '/languages/classes/LanguageKu.php',
+       'LBFactory' => __DIR__ . '/includes/db/LBFactory.php',
+       'LBFactoryFake' => __DIR__ . '/includes/db/LBFactory.php',
+       'LBFactoryMulti' => __DIR__ . '/includes/db/LBFactoryMulti.php',
+       'LBFactorySimple' => __DIR__ . '/includes/db/LBFactory.php',
+       'LBFactorySingle' => __DIR__ . '/includes/db/LBFactorySingle.php',
+       'LCStore' => __DIR__ . '/includes/cache/LocalisationCache.php',
+       'LCStoreCDB' => __DIR__ . '/includes/cache/LocalisationCache.php',
+       'LCStoreDB' => __DIR__ . '/includes/cache/LocalisationCache.php',
+       'LCStoreNull' => __DIR__ . '/includes/cache/LocalisationCache.php',
+       'LangMemUsage' => __DIR__ . '/maintenance/language/langmemusage.php',
+       'Language' => __DIR__ . '/languages/Language.php',
+       'LanguageAr' => __DIR__ . '/languages/classes/LanguageAr.php',
+       'LanguageAz' => __DIR__ . '/languages/classes/LanguageAz.php',
+       'LanguageBe_tarask' => __DIR__ . '/languages/classes/LanguageBe_tarask.php',
+       'LanguageBg' => __DIR__ . '/languages/classes/LanguageBg.php',
+       'LanguageBs' => __DIR__ . '/languages/classes/LanguageBs.php',
+       'LanguageConverter' => __DIR__ . '/languages/LanguageConverter.php',
+       'LanguageCu' => __DIR__ . '/languages/classes/LanguageCu.php',
+       'LanguageDsb' => __DIR__ . '/languages/classes/LanguageDsb.php',
+       'LanguageEo' => __DIR__ . '/languages/classes/LanguageEo.php',
+       'LanguageEs' => __DIR__ . '/languages/classes/LanguageEs.php',
+       'LanguageEt' => __DIR__ . '/languages/classes/LanguageEt.php',
+       'LanguageFi' => __DIR__ . '/languages/classes/LanguageFi.php',
+       'LanguageGa' => __DIR__ . '/languages/classes/LanguageGa.php',
+       'LanguageGan' => __DIR__ . '/languages/classes/LanguageGan.php',
+       'LanguageHe' => __DIR__ . '/languages/classes/LanguageHe.php',
+       'LanguageHsb' => __DIR__ . '/languages/classes/LanguageHsb.php',
+       'LanguageHu' => __DIR__ . '/languages/classes/LanguageHu.php',
+       'LanguageHy' => __DIR__ . '/languages/classes/LanguageHy.php',
+       'LanguageIu' => __DIR__ . '/languages/classes/LanguageIu.php',
+       'LanguageJa' => __DIR__ . '/languages/classes/LanguageJa.php',
+       'LanguageKaa' => __DIR__ . '/languages/classes/LanguageKaa.php',
+       'LanguageKk' => __DIR__ . '/languages/classes/LanguageKk.php',
+       'LanguageKk_cyrl' => __DIR__ . '/languages/classes/LanguageKk_cyrl.php',
+       'LanguageKm' => __DIR__ . '/languages/classes/LanguageKm.php',
+       'LanguageKsh' => __DIR__ . '/languages/classes/LanguageKsh.php',
+       'LanguageKu' => __DIR__ . '/languages/classes/LanguageKu.php',
+       'LanguageKu_ku' => __DIR__ . '/languages/classes/LanguageKu_ku.php',
+       'LanguageLa' => __DIR__ . '/languages/classes/LanguageLa.php',
+       'LanguageMl' => __DIR__ . '/languages/classes/LanguageMl.php',
+       'LanguageMy' => __DIR__ . '/languages/classes/LanguageMy.php',
+       'LanguageOs' => __DIR__ . '/languages/classes/LanguageOs.php',
+       'LanguagePl' => __DIR__ . '/languages/classes/LanguagePl.php',
+       'LanguageQqx' => __DIR__ . '/languages/classes/LanguageQqx.php',
+       'LanguageRu' => __DIR__ . '/languages/classes/LanguageRu.php',
+       'LanguageShi' => __DIR__ . '/languages/classes/LanguageShi.php',
+       'LanguageSl' => __DIR__ . '/languages/classes/LanguageSl.php',
+       'LanguageSr' => __DIR__ . '/languages/classes/LanguageSr.php',
+       'LanguageTg' => __DIR__ . '/languages/classes/LanguageTg.php',
+       'LanguageTr' => __DIR__ . '/languages/classes/LanguageTr.php',
+       'LanguageTyv' => __DIR__ . '/languages/classes/LanguageTyv.php',
+       'LanguageUk' => __DIR__ . '/languages/classes/LanguageUk.php',
+       'LanguageUz' => __DIR__ . '/languages/classes/LanguageUz.php',
+       'LanguageWa' => __DIR__ . '/languages/classes/LanguageWa.php',
+       'LanguageYue' => __DIR__ . '/languages/classes/LanguageYue.php',
+       'LanguageZh' => __DIR__ . '/languages/classes/LanguageZh.php',
+       'LanguageZh_hans' => __DIR__ . '/languages/classes/LanguageZh_hans.php',
+       'Languages' => __DIR__ . '/maintenance/language/languages.inc',
+       'LayeredParameterizedPassword' => __DIR__ . '/includes/password/LayeredParameterizedPassword.php',
+       'LegacyLogFormatter' => __DIR__ . '/includes/logging/LogFormatter.php',
+       'License' => __DIR__ . '/includes/Licenses.php',
+       'Licenses' => __DIR__ . '/includes/Licenses.php',
+       'LikeMatch' => __DIR__ . '/includes/db/DatabaseUtility.php',
+       'LinkBatch' => __DIR__ . '/includes/cache/LinkBatch.php',
+       'LinkCache' => __DIR__ . '/includes/cache/LinkCache.php',
+       'LinkFilter' => __DIR__ . '/includes/LinkFilter.php',
+       'LinkHolderArray' => __DIR__ . '/includes/parser/LinkHolderArray.php',
+       'LinkSearchPage' => __DIR__ . '/includes/specials/SpecialLinkSearch.php',
+       'Linker' => __DIR__ . '/includes/Linker.php',
+       'LinksDeletionUpdate' => __DIR__ . '/includes/deferred/LinksUpdate.php',
+       'LinksUpdate' => __DIR__ . '/includes/deferred/LinksUpdate.php',
+       'ListDuplicatedFilesPage' => __DIR__ . '/includes/specials/SpecialListDuplicatedFiles.php',
+       'ListVariants' => __DIR__ . '/maintenance/language/listVariants.php',
+       'ListredirectsPage' => __DIR__ . '/includes/specials/SpecialListredirects.php',
+       'LoadBalancer' => __DIR__ . '/includes/db/LoadBalancer.php',
+       'LoadBalancerSingle' => __DIR__ . '/includes/db/LBFactorySingle.php',
+       'LoadMonitor' => __DIR__ . '/includes/db/LoadMonitor.php',
+       'LoadMonitorMySQL' => __DIR__ . '/includes/db/LoadMonitor.php',
+       'LoadMonitorNull' => __DIR__ . '/includes/db/LoadMonitor.php',
+       'LocalFile' => __DIR__ . '/includes/filerepo/file/LocalFile.php',
+       'LocalFileDeleteBatch' => __DIR__ . '/includes/filerepo/file/LocalFile.php',
+       'LocalFileMoveBatch' => __DIR__ . '/includes/filerepo/file/LocalFile.php',
+       'LocalFileRestoreBatch' => __DIR__ . '/includes/filerepo/file/LocalFile.php',
+       'LocalRepo' => __DIR__ . '/includes/filerepo/LocalRepo.php',
+       'LocalSettingsGenerator' => __DIR__ . '/includes/installer/LocalSettingsGenerator.php',
+       'LocalisationCache' => __DIR__ . '/includes/cache/LocalisationCache.php',
+       'LocalisationCacheBulkLoad' => __DIR__ . '/includes/cache/LocalisationCache.php',
+       'LockManager' => __DIR__ . '/includes/filebackend/lockmanager/LockManager.php',
+       'LockManagerGroup' => __DIR__ . '/includes/filebackend/lockmanager/LockManagerGroup.php',
+       'LogEntry' => __DIR__ . '/includes/logging/LogEntry.php',
+       'LogEntryBase' => __DIR__ . '/includes/logging/LogEntry.php',
+       'LogEventsList' => __DIR__ . '/includes/logging/LogEventsList.php',
+       'LogFormatter' => __DIR__ . '/includes/logging/LogFormatter.php',
+       'LogPage' => __DIR__ . '/includes/logging/LogPage.php',
+       'LogPager' => __DIR__ . '/includes/logging/LogPager.php',
+       'LoggedUpdateMaintenance' => __DIR__ . '/maintenance/Maintenance.php',
+       'LoginForm' => __DIR__ . '/includes/specials/SpecialUserlogin.php',
+       'LonelyPagesPage' => __DIR__ . '/includes/specials/SpecialLonelypages.php',
+       'LongPagesPage' => __DIR__ . '/includes/specials/SpecialLongpages.php',
+       'MIMEsearchPage' => __DIR__ . '/includes/specials/SpecialMIMEsearch.php',
+       'MWCallableUpdate' => __DIR__ . '/includes/deferred/CallableUpdate.php',
+       'MWContentSerializationException' => __DIR__ . '/includes/content/ContentHandler.php',
+       'MWCryptHKDF' => __DIR__ . '/includes/utils/MWCryptHKDF.php',
+       'MWCryptRand' => __DIR__ . '/includes/utils/MWCryptRand.php',
+       'MWDebug' => __DIR__ . '/includes/debug/MWDebug.php',
+       'MWDocGen' => __DIR__ . '/maintenance/mwdocgen.php',
+       'MWException' => __DIR__ . '/includes/exception/MWException.php',
+       'MWExceptionHandler' => __DIR__ . '/includes/exception/MWExceptionHandler.php',
+       'MWFunction' => __DIR__ . '/includes/utils/MWFunction.php',
+       'MWHookException' => __DIR__ . '/includes/Hooks.php',
+       'MWHttpRequest' => __DIR__ . '/includes/HttpFunctions.php',
+       'MWLogger' => __DIR__ . '/includes/debug/logger/Logger.php',
+       'MWLoggerLegacyLogger' => __DIR__ . '/includes/debug/logger/legacy/Logger.php',
+       'MWLoggerLegacySpi' => __DIR__ . '/includes/debug/logger/legacy/Spi.php',
+       'MWLoggerMonologHandler' => __DIR__ . '/includes/debug/logger/monolog/Handler.php',
+       'MWLoggerMonologProcessor' => __DIR__ . '/includes/debug/logger/monolog/Processor.php',
+       'MWLoggerMonologSpi' => __DIR__ . '/includes/debug/logger/monolog/Spi.php',
+       'MWLoggerNullSpi' => __DIR__ . '/includes/debug/logger/NullSpi.php',
+       'MWLoggerSpi' => __DIR__ . '/includes/debug/logger/Spi.php',
+       'MWMemcached' => __DIR__ . '/includes/objectcache/MemcachedClient.php',
+       'MWMessagePack' => __DIR__ . '/includes/libs/MWMessagePack.php',
+       'MWNamespace' => __DIR__ . '/includes/MWNamespace.php',
+       'MWOldPassword' => __DIR__ . '/includes/password/MWOldPassword.php',
+       'MWSaltedPassword' => __DIR__ . '/includes/password/MWSaltedPassword.php',
+       'MWTidy' => __DIR__ . '/includes/parser/MWTidy.php',
+       'MWTidyWrapper' => __DIR__ . '/includes/parser/MWTidy.php',
+       'MWTimestamp' => __DIR__ . '/includes/MWTimestamp.php',
+       'MachineReadableRCFeedFormatter' => __DIR__ . '/includes/rcfeed/MachineReadableRCFeedFormatter.php',
+       'MagicWord' => __DIR__ . '/includes/MagicWord.php',
+       'MagicWordArray' => __DIR__ . '/includes/MagicWord.php',
+       'MailAddress' => __DIR__ . '/includes/mail/MailAddress.php',
+       'Maintenance' => __DIR__ . '/maintenance/Maintenance.php',
+       'MaintenanceFormatInstallDoc' => __DIR__ . '/maintenance/formatInstallDoc.php',
+       'MalformedTitleException' => __DIR__ . '/includes/title/MalformedTitleException.php',
+       'ManualLogEntry' => __DIR__ . '/includes/logging/LogEntry.php',
+       'MapCacheLRU' => __DIR__ . '/includes/libs/MapCacheLRU.php',
+       'MappedDiff' => __DIR__ . '/includes/diff/DairikiDiff.php',
+       'MappedIterator' => __DIR__ . '/includes/libs/MappedIterator.php',
+       'MarkpatrolledAction' => __DIR__ . '/includes/actions/MarkpatrolledAction.php',
+       'McTest' => __DIR__ . '/maintenance/mctest.php',
+       'MediaHandler' => __DIR__ . '/includes/media/MediaHandler.php',
+       'MediaStatisticsPage' => __DIR__ . '/includes/specials/SpecialMediaStatistics.php',
+       'MediaTransformError' => __DIR__ . '/includes/media/MediaTransformOutput.php',
+       'MediaTransformOutput' => __DIR__ . '/includes/media/MediaTransformOutput.php',
+       'MediaWiki' => __DIR__ . '/includes/MediaWiki.php',
+       'MediaWikiBagOStuff' => __DIR__ . '/includes/objectcache/SqlBagOStuff.php',
+       'MediaWikiI18N' => __DIR__ . '/includes/skins/MediaWikiI18N.php',
+       'MediaWikiPageLinkRenderer' => __DIR__ . '/includes/title/MediaWikiPageLinkRenderer.php',
+       'MediaWikiSite' => __DIR__ . '/includes/site/MediaWikiSite.php',
+       'MediaWikiTitleCodec' => __DIR__ . '/includes/title/MediaWikiTitleCodec.php',
+       'MediaWikiVersionFetcher' => __DIR__ . '/includes/MediaWikiVersionFetcher.php',
+       'MemCachedClientforWiki' => __DIR__ . '/includes/objectcache/MemcachedClient.php',
+       'MemcLockManager' => __DIR__ . '/includes/filebackend/lockmanager/MemcLockManager.php',
+       'MemcachedBagOStuff' => __DIR__ . '/includes/objectcache/MemcachedBagOStuff.php',
+       'MemcachedPeclBagOStuff' => __DIR__ . '/includes/objectcache/MemcachedPeclBagOStuff.php',
+       'MemcachedPhpBagOStuff' => __DIR__ . '/includes/objectcache/MemcachedPhpBagOStuff.php',
+       'MemoryFileBackend' => __DIR__ . '/includes/filebackend/MemoryFileBackend.php',
+       'MergeHistoryPager' => __DIR__ . '/includes/specials/SpecialMergeHistory.php',
+       'MergeLogFormatter' => __DIR__ . '/includes/logging/MergeLogFormatter.php',
+       'MergeMessageFileList' => __DIR__ . '/maintenance/mergeMessageFileList.php',
+       'Message' => __DIR__ . '/includes/Message.php',
+       'MessageBlobStore' => __DIR__ . '/includes/MessageBlobStore.php',
+       'MessageCache' => __DIR__ . '/includes/cache/MessageCache.php',
+       'MessageContent' => __DIR__ . '/includes/content/MessageContent.php',
+       'MigrateUserGroup' => __DIR__ . '/maintenance/migrateUserGroup.php',
+       'MimeMagic' => __DIR__ . '/includes/MimeMagic.php',
+       'MinifyScript' => __DIR__ . '/maintenance/minify.php',
+       'MostcategoriesPage' => __DIR__ . '/includes/specials/SpecialMostcategories.php',
+       'MostimagesPage' => __DIR__ . '/includes/specials/SpecialMostimages.php',
+       'MostinterwikisPage' => __DIR__ . '/includes/specials/SpecialMostinterwikis.php',
+       'MostlinkedCategoriesPage' => __DIR__ . '/includes/specials/SpecialMostlinkedcategories.php',
+       'MostlinkedPage' => __DIR__ . '/includes/specials/SpecialMostlinked.php',
+       'MostlinkedTemplatesPage' => __DIR__ . '/includes/specials/SpecialMostlinkedtemplates.php',
+       'MostrevisionsPage' => __DIR__ . '/includes/specials/SpecialMostrevisions.php',
+       'MoveBatch' => __DIR__ . '/maintenance/moveBatch.php',
+       'MoveFileOp' => __DIR__ . '/includes/filebackend/FileOp.php',
+       'MoveLogFormatter' => __DIR__ . '/includes/logging/MoveLogFormatter.php',
+       'MovePage' => __DIR__ . '/includes/MovePage.php',
+       'MovePageForm' => __DIR__ . '/includes/specials/SpecialMovepage.php',
+       'MssqlBlob' => __DIR__ . '/includes/db/DatabaseMssql.php',
+       'MssqlField' => __DIR__ . '/includes/db/DatabaseMssql.php',
+       'MssqlInstaller' => __DIR__ . '/includes/installer/MssqlInstaller.php',
+       'MssqlResultWrapper' => __DIR__ . '/includes/db/DatabaseMssql.php',
+       'MssqlUpdater' => __DIR__ . '/includes/installer/MssqlUpdater.php',
+       'MultiConfig' => __DIR__ . '/includes/config/MultiConfig.php',
+       'MultiHttpClient' => __DIR__ . '/includes/libs/MultiHttpClient.php',
+       'MultiWriteBagOStuff' => __DIR__ . '/includes/objectcache/MultiWriteBagOStuff.php',
+       'MutableConfig' => __DIR__ . '/includes/config/MutableConfig.php',
+       'MwSql' => __DIR__ . '/maintenance/sql.php',
+       'MyLocalSettingsGenerator' => __DIR__ . '/mw-config/overrides.php',
+       'MySQLField' => __DIR__ . '/includes/db/DatabaseMysqlBase.php',
+       'MySQLMasterPos' => __DIR__ . '/includes/db/DatabaseMysqlBase.php',
+       'MySqlLockManager' => __DIR__ . '/includes/filebackend/lockmanager/DBLockManager.php',
+       'MysqlInstaller' => __DIR__ . '/includes/installer/MysqlInstaller.php',
+       'MysqlUpdater' => __DIR__ . '/includes/installer/MysqlUpdater.php',
+       'NamespaceConflictChecker' => __DIR__ . '/maintenance/namespaceDupes.php',
+       'NewFilesPager' => __DIR__ . '/includes/specials/SpecialNewimages.php',
+       'NewPagesPager' => __DIR__ . '/includes/specials/SpecialNewpages.php',
+       'NewUsersLogFormatter' => __DIR__ . '/includes/logging/NewUsersLogFormatter.php',
+       'NolinesImageGallery' => __DIR__ . '/includes/gallery/NolinesImageGallery.php',
+       'NukeNS' => __DIR__ . '/maintenance/nukeNS.php',
+       'NukePage' => __DIR__ . '/maintenance/nukePage.php',
+       'NullFileJournal' => __DIR__ . '/includes/filebackend/filejournal/FileJournal.php',
+       'NullFileOp' => __DIR__ . '/includes/filebackend/FileOp.php',
+       'NullJob' => __DIR__ . '/includes/jobqueue/jobs/NullJob.php',
+       'NullLockManager' => __DIR__ . '/includes/filebackend/lockmanager/LockManager.php',
+       'NullRepo' => __DIR__ . '/includes/filerepo/NullRepo.php',
+       'ORAField' => __DIR__ . '/includes/db/DatabaseOracle.php',
+       'ORAResult' => __DIR__ . '/includes/db/DatabaseOracle.php',
+       'ORMIterator' => __DIR__ . '/includes/db/ORMIterator.php',
+       'ORMResult' => __DIR__ . '/includes/db/ORMResult.php',
+       'ORMRow' => __DIR__ . '/includes/db/ORMRow.php',
+       'ORMTable' => __DIR__ . '/includes/db/ORMTable.php',
+       'ObjectCache' => __DIR__ . '/includes/objectcache/ObjectCache.php',
+       'ObjectCacheSessionHandler' => __DIR__ . '/includes/objectcache/ObjectCacheSessionHandler.php',
+       'ObjectFactory' => __DIR__ . '/includes/libs/ObjectFactory.php',
+       'ObjectFileCache' => __DIR__ . '/includes/cache/ObjectFileCache.php',
+       'OldChangesList' => __DIR__ . '/includes/changes/OldChangesList.php',
+       'OldLocalFile' => __DIR__ . '/includes/filerepo/file/OldLocalFile.php',
+       'OracleInstaller' => __DIR__ . '/includes/installer/OracleInstaller.php',
+       'OracleUpdater' => __DIR__ . '/includes/installer/OracleUpdater.php',
+       'OrphanStats' => __DIR__ . '/maintenance/storage/orphanStats.php',
+       'Orphans' => __DIR__ . '/maintenance/orphans.php',
+       'OutputPage' => __DIR__ . '/includes/OutputPage.php',
+       'PNGHandler' => __DIR__ . '/includes/media/PNG.php',
+       'PNGMetadataExtractor' => __DIR__ . '/includes/media/PNGMetadataExtractor.php',
+       'PPCustomFrame_DOM' => __DIR__ . '/includes/parser/Preprocessor_DOM.php',
+       'PPCustomFrame_Hash' => __DIR__ . '/includes/parser/Preprocessor_Hash.php',
+       'PPDAccum_Hash' => __DIR__ . '/includes/parser/Preprocessor_Hash.php',
+       'PPDPart' => __DIR__ . '/includes/parser/Preprocessor_DOM.php',
+       'PPDPart_Hash' => __DIR__ . '/includes/parser/Preprocessor_Hash.php',
+       'PPDStack' => __DIR__ . '/includes/parser/Preprocessor_DOM.php',
+       'PPDStackElement' => __DIR__ . '/includes/parser/Preprocessor_DOM.php',
+       'PPDStackElement_Hash' => __DIR__ . '/includes/parser/Preprocessor_Hash.php',
+       'PPDStack_Hash' => __DIR__ . '/includes/parser/Preprocessor_Hash.php',
+       'PPFrame' => __DIR__ . '/includes/parser/Preprocessor.php',
+       'PPFrame_DOM' => __DIR__ . '/includes/parser/Preprocessor_DOM.php',
+       'PPFrame_Hash' => __DIR__ . '/includes/parser/Preprocessor_Hash.php',
+       'PPFuzzTest' => __DIR__ . '/maintenance/preprocessorFuzzTest.php',
+       'PPFuzzTester' => __DIR__ . '/maintenance/preprocessorFuzzTest.php',
+       'PPFuzzUser' => __DIR__ . '/maintenance/preprocessorFuzzTest.php',
+       'PPNode' => __DIR__ . '/includes/parser/Preprocessor.php',
+       'PPNode_DOM' => __DIR__ . '/includes/parser/Preprocessor_DOM.php',
+       'PPNode_Hash_Array' => __DIR__ . '/includes/parser/Preprocessor_Hash.php',
+       'PPNode_Hash_Attr' => __DIR__ . '/includes/parser/Preprocessor_Hash.php',
+       'PPNode_Hash_Text' => __DIR__ . '/includes/parser/Preprocessor_Hash.php',
+       'PPNode_Hash_Tree' => __DIR__ . '/includes/parser/Preprocessor_Hash.php',
+       'PPTemplateFrame_DOM' => __DIR__ . '/includes/parser/Preprocessor_DOM.php',
+       'PPTemplateFrame_Hash' => __DIR__ . '/includes/parser/Preprocessor_Hash.php',
+       'PackedHoverImageGallery' => __DIR__ . '/includes/gallery/PackedOverlayImageGallery.php',
+       'PackedImageGallery' => __DIR__ . '/includes/gallery/PackedImageGallery.php',
+       'PackedOverlayImageGallery' => __DIR__ . '/includes/gallery/PackedOverlayImageGallery.php',
+       'Page' => __DIR__ . '/includes/page/WikiPage.php',
+       'PageArchive' => __DIR__ . '/includes/specials/SpecialUndelete.php',
+       'PageExists' => __DIR__ . '/maintenance/pageExists.php',
+       'PageLangLogFormatter' => __DIR__ . '/includes/logging/PageLangLogFormatter.php',
+       'PageLinkRenderer' => __DIR__ . '/includes/title/PageLinkRenderer.php',
+       'PageQueryPage' => __DIR__ . '/includes/specialpage/PageQueryPage.php',
+       'Pager' => __DIR__ . '/includes/pager/Pager.php',
+       'ParameterizedPassword' => __DIR__ . '/includes/password/ParameterizedPassword.php',
+       'Parser' => __DIR__ . '/includes/parser/Parser.php',
+       'ParserCache' => __DIR__ . '/includes/parser/ParserCache.php',
+       'ParserDiffTest' => __DIR__ . '/includes/parser/ParserDiffTest.php',
+       'ParserOptions' => __DIR__ . '/includes/parser/ParserOptions.php',
+       'ParserOutput' => __DIR__ . '/includes/parser/ParserOutput.php',
+       'Password' => __DIR__ . '/includes/password/Password.php',
+       'PasswordError' => __DIR__ . '/includes/password/PasswordError.php',
+       'PasswordFactory' => __DIR__ . '/includes/password/PasswordFactory.php',
+       'PatchSql' => __DIR__ . '/maintenance/patchSql.php',
+       'PathRouter' => __DIR__ . '/includes/PathRouter.php',
+       'PathRouterPatternReplacer' => __DIR__ . '/includes/PathRouter.php',
+       'PatrolLog' => __DIR__ . '/includes/logging/PatrolLog.php',
+       'PatrolLogFormatter' => __DIR__ . '/includes/logging/PatrolLogFormatter.php',
+       'Pbkdf2Password' => __DIR__ . '/includes/password/Pbkdf2Password.php',
+       'PermissionsError' => __DIR__ . '/includes/exception/PermissionsError.php',
+       'PhpHttpRequest' => __DIR__ . '/includes/HttpFunctions.php',
+       'PhpXmlBugTester' => __DIR__ . '/includes/installer/PhpBugTests.php',
+       'PoolCounter' => __DIR__ . '/includes/poolcounter/PoolCounter.php',
+       'PoolCounterRedis' => __DIR__ . '/includes/poolcounter/PoolCounterRedis.php',
+       'PoolCounterWork' => __DIR__ . '/includes/poolcounter/PoolCounterWork.php',
+       'PoolCounterWorkViaCallback' => __DIR__ . '/includes/poolcounter/PoolCounterWorkViaCallback.php',
+       'PoolCounter_Stub' => __DIR__ . '/includes/poolcounter/PoolCounter.php',
+       'PoolWorkArticleView' => __DIR__ . '/includes/poolcounter/PoolWorkArticleView.php',
+       'PopulateBacklinkNamespace' => __DIR__ . '/maintenance/populateBacklinkNamespace.php',
+       'PopulateBloomFilter' => __DIR__ . '/maintenance/populateBloomCache.php',
+       'PopulateCategory' => __DIR__ . '/maintenance/populateCategory.php',
+       'PopulateFilearchiveSha1' => __DIR__ . '/maintenance/populateFilearchiveSha1.php',
+       'PopulateImageSha1' => __DIR__ . '/maintenance/populateImageSha1.php',
+       'PopulateLogSearch' => __DIR__ . '/maintenance/populateLogSearch.php',
+       'PopulateLogUsertext' => __DIR__ . '/maintenance/populateLogUsertext.php',
+       'PopulateParentId' => __DIR__ . '/maintenance/populateParentId.php',
+       'PopulateRecentChangesSource' => __DIR__ . '/maintenance/populateRecentChangesSource.php',
+       'PopulateRevisionLength' => __DIR__ . '/maintenance/populateRevisionLength.php',
+       'PopulateRevisionSha1' => __DIR__ . '/maintenance/populateRevisionSha1.php',
+       'PostgreSqlLockManager' => __DIR__ . '/includes/filebackend/lockmanager/DBLockManager.php',
+       'PostgresField' => __DIR__ . '/includes/db/DatabasePostgres.php',
+       'PostgresInstaller' => __DIR__ . '/includes/installer/PostgresInstaller.php',
+       'PostgresTransactionState' => __DIR__ . '/includes/db/DatabasePostgres.php',
+       'PostgresUpdater' => __DIR__ . '/includes/installer/PostgresUpdater.php',
+       'Preferences' => __DIR__ . '/includes/Preferences.php',
+       'PreferencesForm' => __DIR__ . '/includes/Preferences.php',
+       'PrefixSearch' => __DIR__ . '/includes/PrefixSearch.php',
+       'PreprocessDump' => __DIR__ . '/maintenance/preprocessDump.php',
+       'Preprocessor' => __DIR__ . '/includes/parser/Preprocessor.php',
+       'Preprocessor_DOM' => __DIR__ . '/includes/parser/Preprocessor_DOM.php',
+       'Preprocessor_Hash' => __DIR__ . '/includes/parser/Preprocessor_Hash.php',
+       'ProcessCacheLRU' => __DIR__ . '/includes/libs/ProcessCacheLRU.php',
+       'ProfileSection' => __DIR__ . '/includes/profiler/ProfileSection.php',
+       'Profiler' => __DIR__ . '/includes/profiler/Profiler.php',
+       'ProfilerSimpleDB' => __DIR__ . '/includes/profiler/ProfilerSimpleDB.php',
+       'ProfilerSimpleText' => __DIR__ . '/includes/profiler/ProfilerSimpleText.php',
+       'ProfilerSimpleTrace' => __DIR__ . '/includes/profiler/ProfilerSimpleTrace.php',
+       'ProfilerSimpleUDP' => __DIR__ . '/includes/profiler/ProfilerSimpleUDP.php',
+       'ProfilerStandard' => __DIR__ . '/includes/profiler/ProfilerStandard.php',
+       'ProfilerStub' => __DIR__ . '/includes/profiler/ProfilerStub.php',
+       'ProfilerXhprof' => __DIR__ . '/includes/profiler/ProfilerXhprof.php',
+       'Protect' => __DIR__ . '/maintenance/protect.php',
+       'ProtectAction' => __DIR__ . '/includes/actions/ProtectAction.php',
+       'ProtectedPagesPager' => __DIR__ . '/includes/specials/SpecialProtectedpages.php',
+       'ProtectedTitlesPager' => __DIR__ . '/includes/specials/SpecialProtectedtitles.php',
+       'ProtectionForm' => __DIR__ . '/includes/ProtectionForm.php',
+       'PruneFileCache' => __DIR__ . '/maintenance/pruneFileCache.php',
+       'PublishStashedFileJob' => __DIR__ . '/includes/jobqueue/jobs/PublishStashedFileJob.php',
+       'PurgeAction' => __DIR__ . '/includes/actions/PurgeAction.php',
+       'PurgeChangedFiles' => __DIR__ . '/maintenance/purgeChangedFiles.php',
+       'PurgeChangedPages' => __DIR__ . '/maintenance/purgeChangedPages.php',
+       'PurgeList' => __DIR__ . '/maintenance/purgeList.php',
+       'PurgeOldText' => __DIR__ . '/maintenance/purgeOldText.php',
+       'PurgeParserCache' => __DIR__ . '/maintenance/purgeParserCache.php',
+       'QueryPage' => __DIR__ . '/includes/specialpage/QueryPage.php',
+       'QuickTemplate' => __DIR__ . '/includes/skins/QuickTemplate.php',
+       'QuorumLockManager' => __DIR__ . '/includes/filebackend/lockmanager/QuorumLockManager.php',
+       'RCCacheEntry' => __DIR__ . '/includes/changes/RCCacheEntry.php',
+       'RCCacheEntryFactory' => __DIR__ . '/includes/changes/RCCacheEntryFactory.php',
+       'RCDatabaseLogEntry' => __DIR__ . '/includes/logging/LogEntry.php',
+       'RCFeedEngine' => __DIR__ . '/includes/rcfeed/RCFeedEngine.php',
+       'RCFeedFormatter' => __DIR__ . '/includes/rcfeed/RCFeedFormatter.php',
+       'RSSFeed' => __DIR__ . '/includes/Feed.php',
+       'RandomPage' => __DIR__ . '/includes/specials/SpecialRandompage.php',
+       'RangeDifference' => __DIR__ . '/includes/diff/WikiDiff3.php',
+       'RawAction' => __DIR__ . '/includes/actions/RawAction.php',
+       'RawMessage' => __DIR__ . '/includes/Message.php',
+       'ReadOnlyError' => __DIR__ . '/includes/exception/ReadOnlyError.php',
+       'ReassignEdits' => __DIR__ . '/maintenance/reassignEdits.php',
+       'RebuildAll' => __DIR__ . '/maintenance/rebuildall.php',
+       'RebuildFileCache' => __DIR__ . '/maintenance/rebuildFileCache.php',
+       'RebuildLocalisationCache' => __DIR__ . '/maintenance/rebuildLocalisationCache.php',
+       'RebuildMessages' => __DIR__ . '/maintenance/rebuildmessages.php',
+       'RebuildRecentchanges' => __DIR__ . '/maintenance/rebuildrecentchanges.php',
+       'RebuildTextIndex' => __DIR__ . '/maintenance/rebuildtextindex.php',
+       'RecentChange' => __DIR__ . '/includes/changes/RecentChange.php',
+       'RecompressTracked' => __DIR__ . '/maintenance/storage/recompressTracked.php',
+       'RedirectSpecialArticle' => __DIR__ . '/includes/specialpage/RedirectSpecialPage.php',
+       'RedirectSpecialPage' => __DIR__ . '/includes/specialpage/RedirectSpecialPage.php',
+       'RedisBagOStuff' => __DIR__ . '/includes/objectcache/RedisBagOStuff.php',
+       'RedisConnRef' => __DIR__ . '/includes/clientpool/RedisConnectionPool.php',
+       'RedisConnectionPool' => __DIR__ . '/includes/clientpool/RedisConnectionPool.php',
+       'RedisLockManager' => __DIR__ . '/includes/filebackend/lockmanager/RedisLockManager.php',
+       'RedisPubSubFeedEngine' => __DIR__ . '/includes/rcfeed/RedisPubSubFeedEngine.php',
+       'RefreshFileHeaders' => __DIR__ . '/maintenance/refreshFileHeaders.php',
+       'RefreshImageMetadata' => __DIR__ . '/maintenance/refreshImageMetadata.php',
+       'RefreshLinks' => __DIR__ . '/maintenance/refreshLinks.php',
+       'RefreshLinksJob' => __DIR__ . '/includes/jobqueue/jobs/RefreshLinksJob.php',
+       'RefreshLinksJob2' => __DIR__ . '/includes/jobqueue/jobs/RefreshLinksJob2.php',
+       'RegexlikeReplacer' => __DIR__ . '/includes/utils/StringUtils.php',
+       'RemoveUnusedAccounts' => __DIR__ . '/maintenance/removeUnusedAccounts.php',
+       'RenameDbPrefix' => __DIR__ . '/maintenance/renameDbPrefix.php',
+       'RenderAction' => __DIR__ . '/includes/actions/RenderAction.php',
+       'ReplacementArray' => __DIR__ . '/includes/utils/StringUtils.php',
+       'Replacer' => __DIR__ . '/includes/utils/StringUtils.php',
+       'RepoGroup' => __DIR__ . '/includes/filerepo/RepoGroup.php',
+       'RequestContext' => __DIR__ . '/includes/context/RequestContext.php',
+       'ResetUserTokens' => __DIR__ . '/maintenance/resetUserTokens.php',
+       'ResourceFileCache' => __DIR__ . '/includes/cache/ResourceFileCache.php',
+       'ResourceLoader' => __DIR__ . '/includes/resourceloader/ResourceLoader.php',
+       'ResourceLoaderContext' => __DIR__ . '/includes/resourceloader/ResourceLoaderContext.php',
+       'ResourceLoaderEditToolbarModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderEditToolbarModule.php',
+       'ResourceLoaderFileModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderFileModule.php',
+       'ResourceLoaderFilePageModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderFilePageModule.php',
+       'ResourceLoaderFilePath' => __DIR__ . '/includes/resourceloader/ResourceLoaderFilePath.php',
+       'ResourceLoaderLanguageDataModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderLanguageDataModule.php',
+       'ResourceLoaderLanguageNamesModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderLanguageNamesModule.php',
+       'ResourceLoaderModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderModule.php',
+       'ResourceLoaderNoscriptModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderNoscriptModule.php',
+       'ResourceLoaderSiteModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderSiteModule.php',
+       'ResourceLoaderSkinModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderSkinModule.php',
+       'ResourceLoaderStartUpModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderStartUpModule.php',
+       'ResourceLoaderUserCSSPrefsModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php',
+       'ResourceLoaderUserGroupsModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderUserGroupsModule.php',
+       'ResourceLoaderUserModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderUserModule.php',
+       'ResourceLoaderUserOptionsModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderUserOptionsModule.php',
+       'ResourceLoaderUserTokensModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderUserTokensModule.php',
+       'ResourceLoaderWikiModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderWikiModule.php',
+       'ResultWrapper' => __DIR__ . '/includes/db/DatabaseUtility.php',
+       'RevDelArchiveItem' => __DIR__ . '/includes/revisiondelete/RevDelArchiveItem.php',
+       'RevDelArchiveList' => __DIR__ . '/includes/revisiondelete/RevDelArchiveList.php',
+       'RevDelArchivedFileItem' => __DIR__ . '/includes/revisiondelete/RevDelArchivedFileItem.php',
+       'RevDelArchivedFileList' => __DIR__ . '/includes/revisiondelete/RevDelArchivedFileList.php',
+       'RevDelArchivedRevisionItem' => __DIR__ . '/includes/revisiondelete/RevDelArchivedRevisionItem.php',
+       'RevDelFileItem' => __DIR__ . '/includes/revisiondelete/RevDelFileItem.php',
+       'RevDelFileList' => __DIR__ . '/includes/revisiondelete/RevDelFileList.php',
+       'RevDelItem' => __DIR__ . '/includes/revisiondelete/RevDelItem.php',
+       'RevDelList' => __DIR__ . '/includes/revisiondelete/RevDelList.php',
+       'RevDelLogItem' => __DIR__ . '/includes/revisiondelete/RevDelLogItem.php',
+       'RevDelLogList' => __DIR__ . '/includes/revisiondelete/RevDelLogList.php',
+       'RevDelRevisionItem' => __DIR__ . '/includes/revisiondelete/RevDelRevisionItem.php',
+       'RevDelRevisionList' => __DIR__ . '/includes/revisiondelete/RevDelRevisionList.php',
+       'ReverseChronologicalPager' => __DIR__ . '/includes/pager/ReverseChronologicalPager.php',
+       'RevertAction' => __DIR__ . '/includes/actions/RevertAction.php',
+       'Revision' => __DIR__ . '/includes/Revision.php',
+       'RevisionDeleteUser' => __DIR__ . '/includes/revisiondelete/RevisionDeleteUser.php',
+       'RevisionDeleter' => __DIR__ . '/includes/revisiondelete/RevisionDeleter.php',
+       'RevisionItem' => __DIR__ . '/includes/RevisionList.php',
+       'RevisionItemBase' => __DIR__ . '/includes/RevisionList.php',
+       'RevisionList' => __DIR__ . '/includes/RevisionList.php',
+       'RevisionListBase' => __DIR__ . '/includes/RevisionList.php',
+       'RevisiondeleteAction' => __DIR__ . '/includes/actions/RevisiondeleteAction.php',
+       'RightsLogFormatter' => __DIR__ . '/includes/logging/RightsLogFormatter.php',
+       'RollbackAction' => __DIR__ . '/includes/actions/RollbackAction.php',
+       'RollbackEdits' => __DIR__ . '/maintenance/rollbackEdits.php',
+       'RunJobs' => __DIR__ . '/maintenance/runJobs.php',
+       'RunningStat' => __DIR__ . '/includes/libs/RunningStat.php',
+       'SQLiteField' => __DIR__ . '/includes/db/DatabaseSqlite.php',
+       'SVGMetadataExtractor' => __DIR__ . '/includes/media/SVGMetadataExtractor.php',
+       'SVGReader' => __DIR__ . '/includes/media/SVGMetadataExtractor.php',
+       'Sanitizer' => __DIR__ . '/includes/Sanitizer.php',
+       'SavepointPostgres' => __DIR__ . '/includes/db/DatabasePostgres.php',
+       'ScopedCallback' => __DIR__ . '/includes/libs/ScopedCallback.php',
+       'ScopedLock' => __DIR__ . '/includes/filebackend/lockmanager/ScopedLock.php',
+       'ScopedPHPTimeout' => __DIR__ . '/includes/libs/ScopedPHPTimeout.php',
+       'SearchDatabase' => __DIR__ . '/includes/search/SearchDatabase.php',
+       'SearchDump' => __DIR__ . '/maintenance/dumpIterator.php',
+       'SearchEngine' => __DIR__ . '/includes/search/SearchEngine.php',
+       'SearchEngineDummy' => __DIR__ . '/includes/search/SearchEngine.php',
+       'SearchHighlighter' => __DIR__ . '/includes/search/SearchHighlighter.php',
+       'SearchMssql' => __DIR__ . '/includes/search/SearchMssql.php',
+       'SearchMySQL' => __DIR__ . '/includes/search/SearchMySQL.php',
+       'SearchNearMatchResultSet' => __DIR__ . '/includes/search/SearchResultSet.php',
+       'SearchOracle' => __DIR__ . '/includes/search/SearchOracle.php',
+       'SearchPostgres' => __DIR__ . '/includes/search/SearchPostgres.php',
+       'SearchResult' => __DIR__ . '/includes/search/SearchResult.php',
+       'SearchResultSet' => __DIR__ . '/includes/search/SearchResultSet.php',
+       'SearchSqlite' => __DIR__ . '/includes/search/SearchSqlite.php',
+       'SearchUpdate' => __DIR__ . '/includes/deferred/SearchUpdate.php',
+       'SectionProfiler' => __DIR__ . '/includes/profiler/SectionProfiler.php',
+       'SevenZipStream' => __DIR__ . '/maintenance/7zip.inc',
+       'ShiConverter' => __DIR__ . '/languages/classes/LanguageShi.php',
+       'ShortPagesPage' => __DIR__ . '/includes/specials/SpecialShortpages.php',
+       'ShowCacheStats' => __DIR__ . '/maintenance/showCacheStats.php',
+       'ShowJobs' => __DIR__ . '/maintenance/showJobs.php',
+       'ShowSiteStats' => __DIR__ . '/maintenance/showSiteStats.php',
+       'Site' => __DIR__ . '/includes/site/Site.php',
+       'SiteArray' => __DIR__ . '/includes/site/SiteList.php',
+       'SiteConfiguration' => __DIR__ . '/includes/SiteConfiguration.php',
+       'SiteList' => __DIR__ . '/includes/site/SiteList.php',
+       'SiteObject' => __DIR__ . '/includes/site/Site.php',
+       'SiteSQLStore' => __DIR__ . '/includes/site/SiteSQLStore.php',
+       'SiteStats' => __DIR__ . '/includes/SiteStats.php',
+       'SiteStatsInit' => __DIR__ . '/includes/SiteStats.php',
+       'SiteStatsUpdate' => __DIR__ . '/includes/deferred/SiteStatsUpdate.php',
+       'SiteStore' => __DIR__ . '/includes/site/SiteStore.php',
+       'Sites' => __DIR__ . '/includes/site/SiteSQLStore.php',
+       'Skin' => __DIR__ . '/includes/skins/Skin.php',
+       'SkinApi' => __DIR__ . '/includes/skins/SkinApi.php',
+       'SkinApiTemplate' => __DIR__ . '/includes/skins/SkinApiTemplate.php',
+       'SkinException' => __DIR__ . '/includes/skins/SkinException.php',
+       'SkinFactory' => __DIR__ . '/includes/skins/SkinFactory.php',
+       'SkinFallback' => __DIR__ . '/includes/skins/SkinFallback.php',
+       'SkinFallbackTemplate' => __DIR__ . '/includes/skins/SkinFallbackTemplate.php',
+       'SkinTemplate' => __DIR__ . '/includes/skins/SkinTemplate.php',
+       'SpecialActiveUsers' => __DIR__ . '/includes/specials/SpecialActiveusers.php',
+       'SpecialAllMessages' => __DIR__ . '/includes/specials/SpecialAllMessages.php',
+       'SpecialAllMyUploads' => __DIR__ . '/includes/specials/SpecialMyRedirectPages.php',
+       'SpecialAllPages' => __DIR__ . '/includes/specials/SpecialAllPages.php',
+       'SpecialApiHelp' => __DIR__ . '/includes/specials/SpecialApiHelp.php',
+       'SpecialBlankpage' => __DIR__ . '/includes/specials/SpecialBlankpage.php',
+       'SpecialBlock' => __DIR__ . '/includes/specials/SpecialBlock.php',
+       'SpecialBlockList' => __DIR__ . '/includes/specials/SpecialBlockList.php',
+       'SpecialBookSources' => __DIR__ . '/includes/specials/SpecialBooksources.php',
+       'SpecialCachedPage' => __DIR__ . '/includes/specials/SpecialCachedPage.php',
+       'SpecialCategories' => __DIR__ . '/includes/specials/SpecialCategories.php',
+       'SpecialChangeEmail' => __DIR__ . '/includes/specials/SpecialChangeEmail.php',
+       'SpecialChangePassword' => __DIR__ . '/includes/specials/SpecialChangePassword.php',
+       'SpecialComparePages' => __DIR__ . '/includes/specials/SpecialComparePages.php',
+       'SpecialContributions' => __DIR__ . '/includes/specials/SpecialContributions.php',
+       'SpecialCreateAccount' => __DIR__ . '/includes/specials/SpecialCreateAccount.php',
+       'SpecialDiff' => __DIR__ . '/includes/specials/SpecialDiff.php',
+       'SpecialEditWatchlist' => __DIR__ . '/includes/specials/SpecialEditWatchlist.php',
+       'SpecialEmailUser' => __DIR__ . '/includes/specials/SpecialEmailuser.php',
+       'SpecialExpandTemplates' => __DIR__ . '/includes/specials/SpecialExpandTemplates.php',
+       'SpecialExport' => __DIR__ . '/includes/specials/SpecialExport.php',
+       'SpecialFilepath' => __DIR__ . '/includes/specials/SpecialFilepath.php',
+       'SpecialImport' => __DIR__ . '/includes/specials/SpecialImport.php',
+       'SpecialJavaScriptTest' => __DIR__ . '/includes/specials/SpecialJavaScriptTest.php',
+       'SpecialListAdmins' => __DIR__ . '/includes/specials/SpecialListusers.php',
+       'SpecialListBots' => __DIR__ . '/includes/specials/SpecialListusers.php',
+       'SpecialListFiles' => __DIR__ . '/includes/specials/SpecialListfiles.php',
+       'SpecialListGroupRights' => __DIR__ . '/includes/specials/SpecialListgrouprights.php',
+       'SpecialListUsers' => __DIR__ . '/includes/specials/SpecialListusers.php',
+       'SpecialLockdb' => __DIR__ . '/includes/specials/SpecialLockdb.php',
+       'SpecialLog' => __DIR__ . '/includes/specials/SpecialLog.php',
+       'SpecialMergeHistory' => __DIR__ . '/includes/specials/SpecialMergeHistory.php',
+       'SpecialMyLanguage' => __DIR__ . '/includes/specials/SpecialMyLanguage.php',
+       'SpecialMycontributions' => __DIR__ . '/includes/specials/SpecialMyRedirectPages.php',
+       'SpecialMypage' => __DIR__ . '/includes/specials/SpecialMyRedirectPages.php',
+       'SpecialMytalk' => __DIR__ . '/includes/specials/SpecialMyRedirectPages.php',
+       'SpecialMyuploads' => __DIR__ . '/includes/specials/SpecialMyRedirectPages.php',
+       'SpecialNewFiles' => __DIR__ . '/includes/specials/SpecialNewimages.php',
+       'SpecialNewpages' => __DIR__ . '/includes/specials/SpecialNewpages.php',
+       'SpecialPage' => __DIR__ . '/includes/specialpage/SpecialPage.php',
+       'SpecialPageFactory' => __DIR__ . '/includes/specialpage/SpecialPageFactory.php',
+       'SpecialPageLanguage' => __DIR__ . '/includes/specials/SpecialPageLanguage.php',
+       'SpecialPagesWithProp' => __DIR__ . '/includes/specials/SpecialPagesWithProp.php',
+       'SpecialPasswordReset' => __DIR__ . '/includes/specials/SpecialPasswordReset.php',
+       'SpecialPermanentLink' => __DIR__ . '/includes/specials/SpecialPermanentLink.php',
+       'SpecialPreferences' => __DIR__ . '/includes/specials/SpecialPreferences.php',
+       'SpecialPrefixindex' => __DIR__ . '/includes/specials/SpecialPrefixindex.php',
+       'SpecialProtectedpages' => __DIR__ . '/includes/specials/SpecialProtectedpages.php',
+       'SpecialProtectedtitles' => __DIR__ . '/includes/specials/SpecialProtectedtitles.php',
+       'SpecialRandomInCategory' => __DIR__ . '/includes/specials/SpecialRandomInCategory.php',
+       'SpecialRandomredirect' => __DIR__ . '/includes/specials/SpecialRandomredirect.php',
+       'SpecialRecentChanges' => __DIR__ . '/includes/specials/SpecialRecentchanges.php',
+       'SpecialRecentChangesLinked' => __DIR__ . '/includes/specials/SpecialRecentchangeslinked.php',
+       'SpecialRedirect' => __DIR__ . '/includes/specials/SpecialRedirect.php',
+       'SpecialRedirectToSpecial' => __DIR__ . '/includes/specialpage/RedirectSpecialPage.php',
+       'SpecialResetTokens' => __DIR__ . '/includes/specials/SpecialResetTokens.php',
+       'SpecialRevisionDelete' => __DIR__ . '/includes/specials/SpecialRevisiondelete.php',
+       'SpecialRunJobs' => __DIR__ . '/includes/specials/SpecialRunJobs.php',
+       'SpecialSearch' => __DIR__ . '/includes/specials/SpecialSearch.php',
+       'SpecialSpecialpages' => __DIR__ . '/includes/specials/SpecialSpecialpages.php',
+       'SpecialStatistics' => __DIR__ . '/includes/specials/SpecialStatistics.php',
+       'SpecialTags' => __DIR__ . '/includes/specials/SpecialTags.php',
+       'SpecialTrackingCategories' => __DIR__ . '/includes/specials/SpecialTrackingCategories.php',
+       'SpecialUnblock' => __DIR__ . '/includes/specials/SpecialUnblock.php',
+       'SpecialUndelete' => __DIR__ . '/includes/specials/SpecialUndelete.php',
+       'SpecialUnlockdb' => __DIR__ . '/includes/specials/SpecialUnlockdb.php',
+       'SpecialUpload' => __DIR__ . '/includes/specials/SpecialUpload.php',
+       'SpecialUploadStash' => __DIR__ . '/includes/specials/SpecialUploadStash.php',
+       'SpecialUploadStashTooLargeException' => __DIR__ . '/includes/specials/SpecialUploadStash.php',
+       'SpecialUserlogout' => __DIR__ . '/includes/specials/SpecialUserlogout.php',
+       'SpecialVersion' => __DIR__ . '/includes/specials/SpecialVersion.php',
+       'SpecialWatchlist' => __DIR__ . '/includes/specials/SpecialWatchlist.php',
+       'SpecialWhatLinksHere' => __DIR__ . '/includes/specials/SpecialWhatlinkshere.php',
+       'SqlBagOStuff' => __DIR__ . '/includes/objectcache/SqlBagOStuff.php',
+       'SqlDataUpdate' => __DIR__ . '/includes/deferred/SqlDataUpdate.php',
+       'SqlSearchResultSet' => __DIR__ . '/includes/search/SearchResultSet.php',
+       'Sqlite' => __DIR__ . '/maintenance/sqlite.inc',
+       'SqliteInstaller' => __DIR__ . '/includes/installer/SqliteInstaller.php',
+       'SqliteMaintenance' => __DIR__ . '/maintenance/sqlite.php',
+       'SqliteUpdater' => __DIR__ . '/includes/installer/SqliteUpdater.php',
+       'SquidPurgeClient' => __DIR__ . '/includes/SquidPurgeClient.php',
+       'SquidPurgeClientPool' => __DIR__ . '/includes/SquidPurgeClient.php',
+       'SquidUpdate' => __DIR__ . '/includes/deferred/SquidUpdate.php',
+       'SrConverter' => __DIR__ . '/languages/classes/LanguageSr.php',
+       'StatCounter' => __DIR__ . '/includes/StatCounter.php',
+       'StatsOutput' => __DIR__ . '/maintenance/language/StatOutputs.php',
+       'Status' => __DIR__ . '/includes/Status.php',
+       'StorageTypeStats' => __DIR__ . '/maintenance/storage/storageTypeStats.php',
+       'StoreFileOp' => __DIR__ . '/includes/filebackend/FileOp.php',
+       'StreamFile' => __DIR__ . '/includes/StreamFile.php',
+       'StringPrefixSearch' => __DIR__ . '/includes/PrefixSearch.php',
+       'StringUtils' => __DIR__ . '/includes/utils/StringUtils.php',
+       'StripState' => __DIR__ . '/includes/parser/StripState.php',
+       'StubObject' => __DIR__ . '/includes/StubObject.php',
+       'StubUserLang' => __DIR__ . '/includes/StubObject.php',
+       'SubmitAction' => __DIR__ . '/includes/actions/SubmitAction.php',
+       'SvgHandler' => __DIR__ . '/includes/media/SVG.php',
+       'SwiftFileBackend' => __DIR__ . '/includes/filebackend/SwiftFileBackend.php',
+       'SwiftFileBackendDirList' => __DIR__ . '/includes/filebackend/SwiftFileBackend.php',
+       'SwiftFileBackendFileList' => __DIR__ . '/includes/filebackend/SwiftFileBackend.php',
+       'SwiftFileBackendList' => __DIR__ . '/includes/filebackend/SwiftFileBackend.php',
+       'SwiftFileOpHandle' => __DIR__ . '/includes/filebackend/SwiftFileBackend.php',
+       'SwiftVirtualRESTService' => __DIR__ . '/includes/libs/virtualrest/SwiftVirtualRESTService.php',
+       'SyncFileBackend' => __DIR__ . '/maintenance/syncFileBackend.php',
+       'TableCleanup' => __DIR__ . '/maintenance/cleanupTable.inc',
+       'TableCleanupTest' => __DIR__ . '/maintenance/cleanupTable.inc',
+       'TableDiffFormatter' => __DIR__ . '/includes/diff/TableDiffFormatter.php',
+       'TablePager' => __DIR__ . '/includes/pager/TablePager.php',
+       'TempFSFile' => __DIR__ . '/includes/filebackend/TempFSFile.php',
+       'TempFileRepo' => __DIR__ . '/includes/filerepo/FileRepo.php',
+       'TestFileOpPerformance' => __DIR__ . '/maintenance/fileOpPerfTest.php',
+       'TextContent' => __DIR__ . '/includes/content/TextContent.php',
+       'TextContentHandler' => __DIR__ . '/includes/content/TextContentHandler.php',
+       'TextPassDumper' => __DIR__ . '/maintenance/backupTextPass.inc',
+       'TextStatsOutput' => __DIR__ . '/maintenance/language/StatOutputs.php',
+       'TgConverter' => __DIR__ . '/languages/classes/LanguageTg.php',
+       'ThrottledError' => __DIR__ . '/includes/exception/ThrottledError.php',
+       'ThumbnailImage' => __DIR__ . '/includes/media/MediaTransformOutput.php',
+       'ThumbnailRenderJob' => __DIR__ . '/includes/jobqueue/jobs/ThumbnailRenderJob.php',
+       'TidyUpBug37714' => __DIR__ . '/maintenance/tidyUpBug37714.php',
+       'TiffHandler' => __DIR__ . '/includes/media/Tiff.php',
+       'TimestampException' => __DIR__ . '/includes/exception/TimestampException.php',
+       'Title' => __DIR__ . '/includes/Title.php',
+       'TitleArray' => __DIR__ . '/includes/TitleArray.php',
+       'TitleArrayFromResult' => __DIR__ . '/includes/TitleArrayFromResult.php',
+       'TitleCleanup' => __DIR__ . '/maintenance/cleanupTitles.php',
+       'TitleFormatter' => __DIR__ . '/includes/title/TitleFormatter.php',
+       'TitleParser' => __DIR__ . '/includes/title/TitleParser.php',
+       'TitlePrefixSearch' => __DIR__ . '/includes/PrefixSearch.php',
+       'TitleValue' => __DIR__ . '/includes/title/TitleValue.php',
+       'TrackBlobs' => __DIR__ . '/maintenance/storage/trackBlobs.php',
+       'TraditionalImageGallery' => __DIR__ . '/includes/gallery/TraditionalImageGallery.php',
+       'TransactionProfiler' => __DIR__ . '/includes/profiler/TransactionProfiler.php',
+       'TransformParameterError' => __DIR__ . '/includes/media/MediaTransformOutput.php',
+       'TransformationalImageHandler' => __DIR__ . '/includes/media/TransformationalImageHandler.php',
+       'UDPRCFeedEngine' => __DIR__ . '/includes/rcfeed/UDPRCFeedEngine.php',
+       'UIDGenerator' => __DIR__ . '/includes/utils/UIDGenerator.php',
+       'UcdXmlReader' => __DIR__ . '/maintenance/language/generateCollationData.php',
+       'UncategorizedCategoriesPage' => __DIR__ . '/includes/specials/SpecialUncategorizedcategories.php',
+       'UncategorizedImagesPage' => __DIR__ . '/includes/specials/SpecialUncategorizedimages.php',
+       'UncategorizedPagesPage' => __DIR__ . '/includes/specials/SpecialUncategorizedpages.php',
+       'UncategorizedTemplatesPage' => __DIR__ . '/includes/specials/SpecialUncategorizedtemplates.php',
+       'Undelete' => __DIR__ . '/maintenance/undelete.php',
+       'UnifiedDiffFormatter' => __DIR__ . '/includes/diff/UnifiedDiffFormatter.php',
+       'UnlistedSpecialPage' => __DIR__ . '/includes/specialpage/UnlistedSpecialPage.php',
+       'UnprotectAction' => __DIR__ . '/includes/actions/UnprotectAction.php',
+       'UnregisteredLocalFile' => __DIR__ . '/includes/filerepo/file/UnregisteredLocalFile.php',
+       'UnusedCategoriesPage' => __DIR__ . '/includes/specials/SpecialUnusedcategories.php',
+       'UnusedimagesPage' => __DIR__ . '/includes/specials/SpecialUnusedimages.php',
+       'UnusedtemplatesPage' => __DIR__ . '/includes/specials/SpecialUnusedtemplates.php',
+       'UnwatchAction' => __DIR__ . '/includes/actions/UnwatchAction.php',
+       'UnwatchedpagesPage' => __DIR__ . '/includes/specials/SpecialUnwatchedpages.php',
+       'UpdateArticleCount' => __DIR__ . '/maintenance/updateArticleCount.php',
+       'UpdateCollation' => __DIR__ . '/maintenance/updateCollation.php',
+       'UpdateDoubleWidthSearch' => __DIR__ . '/maintenance/updateDoubleWidthSearch.php',
+       'UpdateLogging' => __DIR__ . '/maintenance/archives/upgradeLogging.php',
+       'UpdateMediaWiki' => __DIR__ . '/maintenance/update.php',
+       'UpdateRestrictions' => __DIR__ . '/maintenance/updateRestrictions.php',
+       'UpdateSearchIndex' => __DIR__ . '/maintenance/updateSearchIndex.php',
+       'UpdateSpecialPages' => __DIR__ . '/maintenance/updateSpecialPages.php',
+       'UploadBase' => __DIR__ . '/includes/upload/UploadBase.php',
+       'UploadChunkFileException' => __DIR__ . '/includes/upload/UploadFromChunks.php',
+       'UploadChunkVerificationException' => __DIR__ . '/includes/upload/UploadFromChunks.php',
+       'UploadChunkZeroLengthFileException' => __DIR__ . '/includes/upload/UploadFromChunks.php',
+       'UploadDumper' => __DIR__ . '/maintenance/dumpUploads.php',
+       'UploadForm' => __DIR__ . '/includes/specials/SpecialUpload.php',
+       'UploadFromChunks' => __DIR__ . '/includes/upload/UploadFromChunks.php',
+       'UploadFromFile' => __DIR__ . '/includes/upload/UploadFromFile.php',
+       'UploadFromStash' => __DIR__ . '/includes/upload/UploadFromStash.php',
+       'UploadFromUrl' => __DIR__ . '/includes/upload/UploadFromUrl.php',
+       'UploadFromUrlJob' => __DIR__ . '/includes/jobqueue/jobs/UploadFromUrlJob.php',
+       'UploadSourceAdapter' => __DIR__ . '/includes/Import.php',
+       'UploadSourceField' => __DIR__ . '/includes/specials/SpecialUpload.php',
+       'UploadStash' => __DIR__ . '/includes/upload/UploadStash.php',
+       'UploadStashBadPathException' => __DIR__ . '/includes/upload/UploadStash.php',
+       'UploadStashCleanup' => __DIR__ . '/maintenance/cleanupUploadStash.php',
+       'UploadStashException' => __DIR__ . '/includes/upload/UploadStash.php',
+       'UploadStashFile' => __DIR__ . '/includes/upload/UploadStash.php',
+       'UploadStashFileException' => __DIR__ . '/includes/upload/UploadStash.php',
+       'UploadStashFileNotFoundException' => __DIR__ . '/includes/upload/UploadStash.php',
+       'UploadStashNoSuchKeyException' => __DIR__ . '/includes/upload/UploadStash.php',
+       'UploadStashNotAvailableException' => __DIR__ . '/includes/upload/UploadStash.php',
+       'UploadStashNotLoggedInException' => __DIR__ . '/includes/upload/UploadStash.php',
+       'UploadStashWrongOwnerException' => __DIR__ . '/includes/upload/UploadStash.php',
+       'UploadStashZeroLengthFileException' => __DIR__ . '/includes/upload/UploadStash.php',
+       'UppercaseCollation' => __DIR__ . '/includes/Collation.php',
+       'UsageException' => __DIR__ . '/includes/api/ApiMain.php',
+       'User' => __DIR__ . '/includes/User.php',
+       'UserArray' => __DIR__ . '/includes/UserArray.php',
+       'UserArrayFromResult' => __DIR__ . '/includes/UserArrayFromResult.php',
+       'UserBlockedError' => __DIR__ . '/includes/exception/UserBlockedError.php',
+       'UserCache' => __DIR__ . '/includes/cache/UserCache.php',
+       'UserDupes' => __DIR__ . '/maintenance/userDupes.inc',
+       'UserMailer' => __DIR__ . '/includes/mail/UserMailer.php',
+       'UserNotLoggedIn' => __DIR__ . '/includes/exception/UserNotLoggedIn.php',
+       'UserOptions' => __DIR__ . '/maintenance/userOptions.inc',
+       'UserRightsProxy' => __DIR__ . '/includes/UserRightsProxy.php',
+       'UsercreateTemplate' => __DIR__ . '/includes/templates/Usercreate.php',
+       'UserloginTemplate' => __DIR__ . '/includes/templates/Userlogin.php',
+       'UserrightsPage' => __DIR__ . '/includes/specials/SpecialUserrights.php',
+       'UsersPager' => __DIR__ . '/includes/specials/SpecialListusers.php',
+       'UtfNormal' => __DIR__ . '/includes/normal/UtfNormal.php',
+       'UzConverter' => __DIR__ . '/languages/classes/LanguageUz.php',
+       'ViewAction' => __DIR__ . '/includes/actions/ViewAction.php',
+       'VirtualRESTService' => __DIR__ . '/includes/libs/virtualrest/VirtualRESTService.php',
+       'VirtualRESTServiceClient' => __DIR__ . '/includes/libs/virtualrest/VirtualRESTServiceClient.php',
+       'WaitForSlave' => __DIR__ . '/maintenance/waitForSlave.php',
+       'WantedCategoriesPage' => __DIR__ . '/includes/specials/SpecialWantedcategories.php',
+       'WantedFilesPage' => __DIR__ . '/includes/specials/SpecialWantedfiles.php',
+       'WantedPagesPage' => __DIR__ . '/includes/specials/SpecialWantedpages.php',
+       'WantedQueryPage' => __DIR__ . '/includes/specialpage/WantedQueryPage.php',
+       'WantedTemplatesPage' => __DIR__ . '/includes/specials/SpecialWantedtemplates.php',
+       'WatchAction' => __DIR__ . '/includes/actions/WatchAction.php',
+       'WatchedItem' => __DIR__ . '/includes/WatchedItem.php',
+       'WatchlistCleanup' => __DIR__ . '/maintenance/cleanupWatchlist.php',
+       'WebInstaller' => __DIR__ . '/includes/installer/WebInstaller.php',
+       'WebInstallerComplete' => __DIR__ . '/includes/installer/WebInstallerPage.php',
+       'WebInstallerCopying' => __DIR__ . '/includes/installer/WebInstallerPage.php',
+       'WebInstallerDBConnect' => __DIR__ . '/includes/installer/WebInstallerPage.php',
+       'WebInstallerDBSettings' => __DIR__ . '/includes/installer/WebInstallerPage.php',
+       'WebInstallerDocument' => __DIR__ . '/includes/installer/WebInstallerPage.php',
+       'WebInstallerExistingWiki' => __DIR__ . '/includes/installer/WebInstallerPage.php',
+       'WebInstallerInstall' => __DIR__ . '/includes/installer/WebInstallerPage.php',
+       'WebInstallerLanguage' => __DIR__ . '/includes/installer/WebInstallerPage.php',
+       'WebInstallerName' => __DIR__ . '/includes/installer/WebInstallerPage.php',
+       'WebInstallerOptions' => __DIR__ . '/includes/installer/WebInstallerPage.php',
+       'WebInstallerOutput' => __DIR__ . '/includes/installer/WebInstallerOutput.php',
+       'WebInstallerPage' => __DIR__ . '/includes/installer/WebInstallerPage.php',
+       'WebInstallerReadme' => __DIR__ . '/includes/installer/WebInstallerPage.php',
+       'WebInstallerReleaseNotes' => __DIR__ . '/includes/installer/WebInstallerPage.php',
+       'WebInstallerRestart' => __DIR__ . '/includes/installer/WebInstallerPage.php',
+       'WebInstallerUpgrade' => __DIR__ . '/includes/installer/WebInstallerPage.php',
+       'WebInstallerUpgradeDoc' => __DIR__ . '/includes/installer/WebInstallerPage.php',
+       'WebInstallerWelcome' => __DIR__ . '/includes/installer/WebInstallerPage.php',
+       'WebRequest' => __DIR__ . '/includes/WebRequest.php',
+       'WebRequestUpload' => __DIR__ . '/includes/WebRequest.php',
+       'WebResponse' => __DIR__ . '/includes/WebResponse.php',
+       'WikiCategoryPage' => __DIR__ . '/includes/page/WikiCategoryPage.php',
+       'WikiDiff3' => __DIR__ . '/includes/diff/WikiDiff3.php',
+       'WikiExporter' => __DIR__ . '/includes/Export.php',
+       'WikiFilePage' => __DIR__ . '/includes/page/WikiFilePage.php',
+       'WikiImporter' => __DIR__ . '/includes/Import.php',
+       'WikiMap' => __DIR__ . '/includes/WikiMap.php',
+       'WikiPage' => __DIR__ . '/includes/page/WikiPage.php',
+       'WikiReference' => __DIR__ . '/includes/WikiMap.php',
+       'WikiRevision' => __DIR__ . '/includes/Import.php',
+       'WikiStatsOutput' => __DIR__ . '/maintenance/language/StatOutputs.php',
+       'WikitextContent' => __DIR__ . '/includes/content/WikitextContent.php',
+       'WikitextContentHandler' => __DIR__ . '/includes/content/WikitextContentHandler.php',
+       'WinCacheBagOStuff' => __DIR__ . '/includes/objectcache/WinCacheBagOStuff.php',
+       'WithoutInterwikiPage' => __DIR__ . '/includes/specials/SpecialWithoutinterwiki.php',
+       'WordLevelDiff' => __DIR__ . '/includes/diff/DairikiDiff.php',
+       'WrapOldPasswords' => __DIR__ . '/maintenance/wrapOldPasswords.php',
+       'XCFHandler' => __DIR__ . '/includes/media/XCF.php',
+       'XCacheBagOStuff' => __DIR__ . '/includes/objectcache/XCacheBagOStuff.php',
+       'XMLRCFeedFormatter' => __DIR__ . '/includes/rcfeed/XMLRCFeedFormatter.php',
+       'XMPInfo' => __DIR__ . '/includes/media/XMPInfo.php',
+       'XMPReader' => __DIR__ . '/includes/media/XMP.php',
+       'XMPValidate' => __DIR__ . '/includes/media/XMPValidate.php',
+       'Xhprof' => __DIR__ . '/includes/libs/Xhprof.php',
+       'Xml' => __DIR__ . '/includes/Xml.php',
+       'XmlDumpWriter' => __DIR__ . '/includes/Export.php',
+       'XmlJsCode' => __DIR__ . '/includes/Xml.php',
+       'XmlSelect' => __DIR__ . '/includes/Xml.php',
+       'XmlTypeCheck' => __DIR__ . '/includes/libs/XmlTypeCheck.php',
+       'ZhConverter' => __DIR__ . '/languages/classes/LanguageZh.php',
+       'ZipDirectoryReader' => __DIR__ . '/includes/utils/ZipDirectoryReader.php',
+       'ZipDirectoryReaderError' => __DIR__ . '/includes/utils/ZipDirectoryReader.php',
+       'lessc' => __DIR__ . '/includes/libs/lessc.inc.php',
+       'lessc_formatter_classic' => __DIR__ . '/includes/libs/lessc.inc.php',
+       'lessc_formatter_compressed' => __DIR__ . '/includes/libs/lessc.inc.php',
+       'lessc_formatter_lessjs' => __DIR__ . '/includes/libs/lessc.inc.php',
+       'lessc_parser' => __DIR__ . '/includes/libs/lessc.inc.php',
+       'profile_point' => __DIR__ . '/profileinfo.php',
+);
index e89e500..9c6f1f0 100644 (file)
  * Locations of core classes
  * Extension classes are specified with $wgAutoloadClasses
  * This array is a global instead of a static member of AutoLoader to work around a bug in APC
+ * This array is now generated by maintenance/generateLocalAutoload.php
  */
-global $wgAutoloadLocalClasses;
-
-$wgAutoloadLocalClasses = array(
-       # Includes
-       'AjaxDispatcher' => 'includes/AjaxDispatcher.php',
-       'AjaxResponse' => 'includes/AjaxResponse.php',
-       'AtomFeed' => 'includes/Feed.php',
-       'AuthPlugin' => 'includes/AuthPlugin.php',
-       'AuthPluginUser' => 'includes/AuthPlugin.php',
-       'Autopromote' => 'includes/Autopromote.php',
-       'Block' => 'includes/Block.php',
-       'BloomCache' => 'includes/cache/bloom/BloomCache.php',
-       'BloomCacheRedis' => 'includes/cache/bloom/BloomCacheRedis.php',
-       'BloomFilterTitleHasLogs' => 'includes/cache/bloom/BloomFilters.php',
-       'Category' => 'includes/Category.php',
-       'CategoryFinder' => 'includes/CategoryFinder.php',
-       'CategoryViewer' => 'includes/CategoryViewer.php',
-       'ChangeTags' => 'includes/ChangeTags.php',
-       'ChannelFeed' => 'includes/Feed.php',
-       'Collation' => 'includes/Collation.php',
-       'CollationCkb' => 'includes/Collation.php',
-       'CollationEt' => 'includes/Collation.php',
-       'ConcatenatedGzipHistoryBlob' => 'includes/HistoryBlob.php',
-       'CurlHttpRequest' => 'includes/HttpFunctions.php',
-       'DeprecatedGlobal' => 'includes/DeprecatedGlobal.php',
-       'DerivativeRequest' => 'includes/WebRequest.php',
-       'DiffHistoryBlob' => 'includes/HistoryBlob.php',
-       'DummyLinker' => 'includes/Linker.php',
-       'Dump7ZipOutput' => 'includes/Export.php',
-       'DumpBZip2Output' => 'includes/Export.php',
-       'DumpFileOutput' => 'includes/Export.php',
-       'DumpFilter' => 'includes/Export.php',
-       'DumpGZipOutput' => 'includes/Export.php',
-       'DumpLatestFilter' => 'includes/Export.php',
-       'DumpMultiWriter' => 'includes/Export.php',
-       'DumpNamespaceFilter' => 'includes/Export.php',
-       'DumpNotalkFilter' => 'includes/Export.php',
-       'DumpOutput' => 'includes/Export.php',
-       'DumpPipeOutput' => 'includes/Export.php',
-       'EditPage' => 'includes/EditPage.php',
-       'EmptyBloomCache' => 'includes/cache/bloom/BloomCache.php',
-       'Fallback' => 'includes/Fallback.php',
-       'FauxRequest' => 'includes/WebRequest.php',
-       'FauxResponse' => 'includes/WebResponse.php',
-       'FeedItem' => 'includes/Feed.php',
-       'FeedUtils' => 'includes/FeedUtils.php',
-       'FileDeleteForm' => 'includes/FileDeleteForm.php',
-       'ForkController' => 'includes/ForkController.php',
-       'FormOptions' => 'includes/FormOptions.php',
-       'GitInfo' => 'includes/GitInfo.php',
-       'HistoryBlob' => 'includes/HistoryBlob.php',
-       'HistoryBlobCurStub' => 'includes/HistoryBlob.php',
-       'HistoryBlobStub' => 'includes/HistoryBlob.php',
-       'Hooks' => 'includes/Hooks.php',
-       'Html' => 'includes/Html.php',
-       'HtmlFormatter' => 'includes/HtmlFormatter.php',
-       'HTMLApiField' => 'includes/htmlform/HTMLApiField.php',
-       'HTMLAutoCompleteSelectField' => 'includes/htmlform/HTMLAutoCompleteSelectField.php',
-       'HTMLButtonField' => 'includes/htmlform/HTMLButtonField.php',
-       'HTMLCheckField' => 'includes/htmlform/HTMLCheckField.php',
-       'HTMLCheckMatrix' => 'includes/htmlform/HTMLCheckMatrix.php',
-       'HTMLFormFieldCloner' => 'includes/htmlform/HTMLFormFieldCloner.php',
-       'HTMLEditTools' => 'includes/htmlform/HTMLEditTools.php',
-       'HTMLFloatField' => 'includes/htmlform/HTMLFloatField.php',
-       'HTMLForm' => 'includes/htmlform/HTMLForm.php',
-       'HTMLFormField' => 'includes/htmlform/HTMLFormField.php',
-       'HTMLFormFieldRequiredOptionsException' =>
-               'includes/htmlform/HTMLFormFieldRequiredOptionsException.php',
-       'HTMLHiddenField' => 'includes/htmlform/HTMLHiddenField.php',
-       'HTMLInfoField' => 'includes/htmlform/HTMLInfoField.php',
-       'HTMLIntField' => 'includes/htmlform/HTMLIntField.php',
-       'HTMLNestedFilterable' => 'includes/htmlform/HTMLNestedFilterable.php',
-       'HTMLMultiSelectField' => 'includes/htmlform/HTMLMultiSelectField.php',
-       'HTMLRadioField' => 'includes/htmlform/HTMLRadioField.php',
-       'HTMLSelectAndOtherField' => 'includes/htmlform/HTMLSelectAndOtherField.php',
-       'HTMLSelectField' => 'includes/htmlform/HTMLSelectField.php',
-       'HTMLSelectLimitField' => 'includes/htmlform/HTMLSelectLimitField.php',
-       'HTMLSelectOrOtherField' => 'includes/htmlform/HTMLSelectOrOtherField.php',
-       'HTMLSelectNamespace' => 'includes/htmlform/HTMLSelectNamespace.php',
-       'HTMLTagFilter' => 'includes/htmlform/HTMLTagFilter.php',
-       'HTMLSubmitField' => 'includes/htmlform/HTMLSubmitField.php',
-       'HTMLTextAreaField' => 'includes/htmlform/HTMLTextAreaField.php',
-       'HTMLTextField' => 'includes/htmlform/HTMLTextField.php',
-       'Http' => 'includes/HttpFunctions.php',
-       'IcuCollation' => 'includes/Collation.php',
-       'IdentityCollation' => 'includes/Collation.php',
-       'ImportStreamSource' => 'includes/Import.php',
-       'ImportStringSource' => 'includes/Import.php',
-       'Interwiki' => 'includes/interwiki/Interwiki.php',
-       'License' => 'includes/Licenses.php',
-       'Licenses' => 'includes/Licenses.php',
-       'Linker' => 'includes/Linker.php',
-       'LinkFilter' => 'includes/LinkFilter.php',
-       'MagicWord' => 'includes/MagicWord.php',
-       'MagicWordArray' => 'includes/MagicWord.php',
-       'MediaWiki' => 'includes/MediaWiki.php',
-       'MediaWikiVersionFetcher' => 'includes/MediaWikiVersionFetcher.php',
-       'Message' => 'includes/Message.php',
-       'MessageBlobStore' => 'includes/MessageBlobStore.php',
-       'MimeMagic' => 'includes/MimeMagic.php',
-       'MovePage' => 'includes/MovePage.php',
-       'MWHookException' => 'includes/Hooks.php',
-       'MWHttpRequest' => 'includes/HttpFunctions.php',
-       'MWNamespace' => 'includes/MWNamespace.php',
-       'ObjectFactory' => 'includes/libs/ObjectFactory.php',
-       'OutputPage' => 'includes/OutputPage.php',
-       'PathRouter' => 'includes/PathRouter.php',
-       'PathRouterPatternReplacer' => 'includes/PathRouter.php',
-       'PhpHttpRequest' => 'includes/HttpFunctions.php',
-       'PoolCounter' => 'includes/poolcounter/PoolCounter.php',
-       'PoolCounter_Stub' => 'includes/poolcounter/PoolCounter.php',
-       'PoolCounterRedis' => 'includes/poolcounter/PoolCounterRedis.php',
-       'PoolCounterWork' => 'includes/poolcounter/PoolCounterWork.php',
-       'PoolCounterWorkViaCallback' => 'includes/poolcounter/PoolCounterWorkViaCallback.php',
-       'PoolWorkArticleView' => 'includes/poolcounter/PoolWorkArticleView.php',
-       'Preferences' => 'includes/Preferences.php',
-       'PreferencesForm' => 'includes/Preferences.php',
-       'PrefixSearch' => 'includes/PrefixSearch.php',
-       'ProtectionForm' => 'includes/ProtectionForm.php',
-       'RawMessage' => 'includes/Message.php',
-       'RevisionItem' => 'includes/RevisionList.php',
-       'RevisionItemBase' => 'includes/RevisionList.php',
-       'RevisionListBase' => 'includes/RevisionList.php',
-       'Revision' => 'includes/Revision.php',
-       'RevisionList' => 'includes/RevisionList.php',
-       'RSSFeed' => 'includes/Feed.php',
-       'Sanitizer' => 'includes/Sanitizer.php',
-       'SiteConfiguration' => 'includes/SiteConfiguration.php',
-       'SiteStats' => 'includes/SiteStats.php',
-       'SiteStatsInit' => 'includes/SiteStats.php',
-       'SquidPurgeClient' => 'includes/SquidPurgeClient.php',
-       'SquidPurgeClientPool' => 'includes/SquidPurgeClient.php',
-       'StatCounter' => 'includes/StatCounter.php',
-       'Status' => 'includes/Status.php',
-       'StreamFile' => 'includes/StreamFile.php',
-       'StringPrefixSearch' => 'includes/PrefixSearch.php',
-       'StubObject' => 'includes/StubObject.php',
-       'StubUserLang' => 'includes/StubObject.php',
-       'MWTimestamp' => 'includes/MWTimestamp.php',
-       'Title' => 'includes/Title.php',
-       'TitleArray' => 'includes/TitleArray.php',
-       'TitleArrayFromResult' => 'includes/TitleArrayFromResult.php',
-       'TitlePrefixSearch' => 'includes/PrefixSearch.php',
-       'UploadSourceAdapter' => 'includes/Import.php',
-       'UppercaseCollation' => 'includes/Collation.php',
-       'User' => 'includes/User.php',
-       'UserArray' => 'includes/UserArray.php',
-       'UserArrayFromResult' => 'includes/UserArrayFromResult.php',
-       'UserRightsProxy' => 'includes/UserRightsProxy.php',
-       'WatchedItem' => 'includes/WatchedItem.php',
-       'WebRequest' => 'includes/WebRequest.php',
-       'WebRequestUpload' => 'includes/WebRequest.php',
-       'WebResponse' => 'includes/WebResponse.php',
-       'WikiExporter' => 'includes/Export.php',
-       'WikiImporter' => 'includes/Import.php',
-       'WikiRevision' => 'includes/Import.php',
-       'WikiMap' => 'includes/WikiMap.php',
-       'WikiReference' => 'includes/WikiMap.php',
-       'Xml' => 'includes/Xml.php',
-       'XmlDumpWriter' => 'includes/Export.php',
-       'XmlJsCode' => 'includes/Xml.php',
-       'XmlSelect' => 'includes/Xml.php',
-
-       # includes/actions
-       'Action' => 'includes/actions/Action.php',
-       'CachedAction' => 'includes/actions/CachedAction.php',
-       'CreditsAction' => 'includes/actions/CreditsAction.php',
-       'DeleteAction' => 'includes/actions/DeleteAction.php',
-       'EditAction' => 'includes/actions/EditAction.php',
-       'FormlessAction' => 'includes/actions/FormlessAction.php',
-       'FormAction' => 'includes/actions/FormAction.php',
-       'HistoryAction' => 'includes/actions/HistoryAction.php',
-       'HistoryPager' => 'includes/actions/HistoryAction.php',
-       'InfoAction' => 'includes/actions/InfoAction.php',
-       'MarkpatrolledAction' => 'includes/actions/MarkpatrolledAction.php',
-       'ProtectAction' => 'includes/actions/ProtectAction.php',
-       'PurgeAction' => 'includes/actions/PurgeAction.php',
-       'RawAction' => 'includes/actions/RawAction.php',
-       'RenderAction' => 'includes/actions/RenderAction.php',
-       'RevertAction' => 'includes/actions/RevertAction.php',
-       'RevisiondeleteAction' => 'includes/actions/RevisiondeleteAction.php',
-       'RollbackAction' => 'includes/actions/RollbackAction.php',
-       'SubmitAction' => 'includes/actions/SubmitAction.php',
-       'UnprotectAction' => 'includes/actions/UnprotectAction.php',
-       'UnwatchAction' => 'includes/actions/UnwatchAction.php',
-       'ViewAction' => 'includes/actions/ViewAction.php',
-       'WatchAction' => 'includes/actions/WatchAction.php',
-
-       # includes/api
-       'ApiBase' => 'includes/api/ApiBase.php',
-       'ApiBlock' => 'includes/api/ApiBlock.php',
-       'ApiClearHasMsg' => 'includes/api/ApiClearHasMsg.php',
-       'ApiComparePages' => 'includes/api/ApiComparePages.php',
-       'ApiCreateAccount' => 'includes/api/ApiCreateAccount.php',
-       'ApiDelete' => 'includes/api/ApiDelete.php',
-       'ApiDisabled' => 'includes/api/ApiDisabled.php',
-       'ApiEditPage' => 'includes/api/ApiEditPage.php',
-       'ApiEmailUser' => 'includes/api/ApiEmailUser.php',
-       'ApiExpandTemplates' => 'includes/api/ApiExpandTemplates.php',
-       'ApiFeedContributions' => 'includes/api/ApiFeedContributions.php',
-       'ApiFeedRecentChanges' => 'includes/api/ApiFeedRecentChanges.php',
-       'ApiFeedWatchlist' => 'includes/api/ApiFeedWatchlist.php',
-       'ApiFileRevert' => 'includes/api/ApiFileRevert.php',
-       'ApiFormatBase' => 'includes/api/ApiFormatBase.php',
-       'ApiFormatDbg' => 'includes/api/ApiFormatDbg.php',
-       'ApiFormatDump' => 'includes/api/ApiFormatDump.php',
-       'ApiFormatFeedWrapper' => 'includes/api/ApiFormatFeedWrapper.php',
-       'ApiFormatJson' => 'includes/api/ApiFormatJson.php',
-       'ApiFormatNone' => 'includes/api/ApiFormatNone.php',
-       'ApiFormatPhp' => 'includes/api/ApiFormatPhp.php',
-       'ApiFormatRaw' => 'includes/api/ApiFormatRaw.php',
-       'ApiFormatTxt' => 'includes/api/ApiFormatTxt.php',
-       'ApiFormatWddx' => 'includes/api/ApiFormatWddx.php',
-       'ApiFormatXml' => 'includes/api/ApiFormatXml.php',
-       'ApiFormatXmlRsd' => 'includes/api/ApiRsd.php',
-       'ApiFormatYaml' => 'includes/api/ApiFormatYaml.php',
-       'ApiHelp' => 'includes/api/ApiHelp.php',
-       'ApiImageRotate' => 'includes/api/ApiImageRotate.php',
-       'ApiImport' => 'includes/api/ApiImport.php',
-       'ApiImportReporter' => 'includes/api/ApiImport.php',
-       'ApiLogin' => 'includes/api/ApiLogin.php',
-       'ApiLogout' => 'includes/api/ApiLogout.php',
-       'ApiMain' => 'includes/api/ApiMain.php',
-       'ApiModuleManager' => 'includes/api/ApiModuleManager.php',
-       'ApiMove' => 'includes/api/ApiMove.php',
-       'ApiOpenSearch' => 'includes/api/ApiOpenSearch.php',
-       'ApiOptions' => 'includes/api/ApiOptions.php',
-       'ApiPageSet' => 'includes/api/ApiPageSet.php',
-       'ApiParamInfo' => 'includes/api/ApiParamInfo.php',
-       'ApiParse' => 'includes/api/ApiParse.php',
-       'ApiPatrol' => 'includes/api/ApiPatrol.php',
-       'ApiProtect' => 'includes/api/ApiProtect.php',
-       'ApiPurge' => 'includes/api/ApiPurge.php',
-       'ApiQuery' => 'includes/api/ApiQuery.php',
-       'ApiQueryAllCategories' => 'includes/api/ApiQueryAllCategories.php',
-       'ApiQueryAllDeletedRevisions' => 'includes/api/ApiQueryAllDeletedRevisions.php',
-       'ApiQueryAllImages' => 'includes/api/ApiQueryAllImages.php',
-       'ApiQueryAllLinks' => 'includes/api/ApiQueryAllLinks.php',
-       'ApiQueryAllMessages' => 'includes/api/ApiQueryAllMessages.php',
-       'ApiQueryAllPages' => 'includes/api/ApiQueryAllPages.php',
-       'ApiQueryAllUsers' => 'includes/api/ApiQueryAllUsers.php',
-       'ApiQueryBacklinks' => 'includes/api/ApiQueryBacklinks.php',
-       'ApiQueryBacklinksprop' => 'includes/api/ApiQueryBacklinksprop.php',
-       'ApiQueryBase' => 'includes/api/ApiQueryBase.php',
-       'ApiQueryBlocks' => 'includes/api/ApiQueryBlocks.php',
-       'ApiQueryCategories' => 'includes/api/ApiQueryCategories.php',
-       'ApiQueryCategoryInfo' => 'includes/api/ApiQueryCategoryInfo.php',
-       'ApiQueryCategoryMembers' => 'includes/api/ApiQueryCategoryMembers.php',
-       'ApiQueryContributions' => 'includes/api/ApiQueryUserContributions.php',
-       'ApiQueryContributors' => 'includes/api/ApiQueryContributors.php',
-       'ApiQueryDeletedRevisions' => 'includes/api/ApiQueryDeletedRevisions.php',
-       'ApiQueryDeletedrevs' => 'includes/api/ApiQueryDeletedrevs.php',
-       'ApiQueryDisabled' => 'includes/api/ApiQueryDisabled.php',
-       'ApiQueryDuplicateFiles' => 'includes/api/ApiQueryDuplicateFiles.php',
-       'ApiQueryExternalLinks' => 'includes/api/ApiQueryExternalLinks.php',
-       'ApiQueryExtLinksUsage' => 'includes/api/ApiQueryExtLinksUsage.php',
-       'ApiQueryFilearchive' => 'includes/api/ApiQueryFilearchive.php',
-       'ApiQueryGeneratorBase' => 'includes/api/ApiQueryBase.php',
-       'ApiQueryImageInfo' => 'includes/api/ApiQueryImageInfo.php',
-       'ApiQueryImages' => 'includes/api/ApiQueryImages.php',
-       'ApiQueryInfo' => 'includes/api/ApiQueryInfo.php',
-       'ApiQueryIWBacklinks' => 'includes/api/ApiQueryIWBacklinks.php',
-       'ApiQueryIWLinks' => 'includes/api/ApiQueryIWLinks.php',
-       'ApiQueryLangBacklinks' => 'includes/api/ApiQueryLangBacklinks.php',
-       'ApiQueryLangLinks' => 'includes/api/ApiQueryLangLinks.php',
-       'ApiQueryLinks' => 'includes/api/ApiQueryLinks.php',
-       'ApiQueryLogEvents' => 'includes/api/ApiQueryLogEvents.php',
-       'ApiQueryORM' => 'includes/api/ApiQueryORM.php',
-       'ApiQueryPageProps' => 'includes/api/ApiQueryPageProps.php',
-       'ApiQueryPagesWithProp' => 'includes/api/ApiQueryPagesWithProp.php',
-       'ApiQueryPagePropNames' => 'includes/api/ApiQueryPagePropNames.php',
-       'ApiQueryPrefixSearch' => 'includes/api/ApiQueryPrefixSearch.php',
-       'ApiQueryProtectedTitles' => 'includes/api/ApiQueryProtectedTitles.php',
-       'ApiQueryQueryPage' => 'includes/api/ApiQueryQueryPage.php',
-       'ApiQueryRandom' => 'includes/api/ApiQueryRandom.php',
-       'ApiQueryRecentChanges' => 'includes/api/ApiQueryRecentChanges.php',
-       'ApiQueryFileRepoInfo' => 'includes/api/ApiQueryFileRepoInfo.php',
-       'ApiQueryRevisions' => 'includes/api/ApiQueryRevisions.php',
-       'ApiQueryRevisionsBase' => 'includes/api/ApiQueryRevisionsBase.php',
-       'ApiQuerySearch' => 'includes/api/ApiQuerySearch.php',
-       'ApiQuerySiteinfo' => 'includes/api/ApiQuerySiteinfo.php',
-       'ApiQueryStashImageInfo' => 'includes/api/ApiQueryStashImageInfo.php',
-       'ApiQueryTags' => 'includes/api/ApiQueryTags.php',
-       'ApiQueryTokens' => 'includes/api/ApiQueryTokens.php',
-       'ApiQueryUserInfo' => 'includes/api/ApiQueryUserInfo.php',
-       'ApiQueryUsers' => 'includes/api/ApiQueryUsers.php',
-       'ApiQueryWatchlist' => 'includes/api/ApiQueryWatchlist.php',
-       'ApiQueryWatchlistRaw' => 'includes/api/ApiQueryWatchlistRaw.php',
-       'ApiResult' => 'includes/api/ApiResult.php',
-       'ApiRevisionDelete' => 'includes/api/ApiRevisionDelete.php',
-       'ApiRollback' => 'includes/api/ApiRollback.php',
-       'ApiRsd' => 'includes/api/ApiRsd.php',
-       'ApiSetNotificationTimestamp' => 'includes/api/ApiSetNotificationTimestamp.php',
-       'ApiTokens' => 'includes/api/ApiTokens.php',
-       'ApiUnblock' => 'includes/api/ApiUnblock.php',
-       'ApiUndelete' => 'includes/api/ApiUndelete.php',
-       'ApiUpload' => 'includes/api/ApiUpload.php',
-       'ApiUserrights' => 'includes/api/ApiUserrights.php',
-       'ApiWatch' => 'includes/api/ApiWatch.php',
-       'UsageException' => 'includes/api/ApiMain.php',
-
-       # includes/cache
-       'BacklinkCache' => 'includes/cache/BacklinkCache.php',
-       'CacheDependency' => 'includes/cache/CacheDependency.php',
-       'CacheHelper' => 'includes/cache/CacheHelper.php',
-       'ConstantDependency' => 'includes/cache/CacheDependency.php',
-       'DependencyWrapper' => 'includes/cache/CacheDependency.php',
-       'FileCacheBase' => 'includes/cache/FileCacheBase.php',
-       'FileDependency' => 'includes/cache/CacheDependency.php',
-       'GenderCache' => 'includes/cache/GenderCache.php',
-       'GlobalDependency' => 'includes/cache/CacheDependency.php',
-       'HTMLFileCache' => 'includes/cache/HTMLFileCache.php',
-       'ICacheHelper' => 'includes/cache/CacheHelper.php',
-       'LCStore' => 'includes/cache/LocalisationCache.php',
-       'LCStoreCDB' => 'includes/cache/LocalisationCache.php',
-       'LCStoreDB' => 'includes/cache/LocalisationCache.php',
-       'LCStoreNull' => 'includes/cache/LocalisationCache.php',
-       'LinkBatch' => 'includes/cache/LinkBatch.php',
-       'LinkCache' => 'includes/cache/LinkCache.php',
-       'LocalisationCache' => 'includes/cache/LocalisationCache.php',
-       'LocalisationCacheBulkLoad' => 'includes/cache/LocalisationCache.php',
-       'MapCacheLRU' => 'includes/cache/MapCacheLRU.php',
-       'MessageCache' => 'includes/cache/MessageCache.php',
-       'ObjectFileCache' => 'includes/cache/ObjectFileCache.php',
-       'ResourceFileCache' => 'includes/cache/ResourceFileCache.php',
-       'UserCache' => 'includes/cache/UserCache.php',
-
-       # includes/changes
-       'ChangesFeed' => 'includes/changes/ChangesFeed.php',
-       'ChangesList' => 'includes/changes/ChangesList.php',
-       'EnhancedChangesList' => 'includes/changes/EnhancedChangesList.php',
-       'OldChangesList' => 'includes/changes/OldChangesList.php',
-       'RCCacheEntry' => 'includes/changes/RCCacheEntry.php',
-       'RCCacheEntryFactory' => 'includes/changes/RCCacheEntryFactory.php',
-       'RecentChange' => 'includes/changes/RecentChange.php',
-
-       # includes/clientpool
-       'RedisConnectionPool' => 'includes/clientpool/RedisConnectionPool.php',
-       'RedisConnRef' => 'includes/clientpool/RedisConnectionPool.php',
-
-       # includes/composer
-       'ComposerPackageModifier' => 'includes/composer/ComposerPackageModifier.php',
-       'ComposerVersionNormalizer' => 'includes/composer/ComposerVersionNormalizer.php',
-
-       # includes/config
-       'Config' => 'includes/config/Config.php',
-       'ConfigException' => 'includes/config/ConfigException.php',
-       'ConfigFactory' => 'includes/config/ConfigFactory.php',
-       'GlobalVarConfig' => 'includes/config/GlobalVarConfig.php',
-       'HashConfig' => 'includes/config/HashConfig.php',
-       'MultiConfig' => 'includes/config/MultiConfig.php',
-       'MutableConfig' => 'includes/config/MutableConfig.php',
-
-       # includes/content
-       'AbstractContent' => 'includes/content/AbstractContent.php',
-       'CodeContentHandler' => 'includes/content/CodeContentHandler.php',
-       'Content' => 'includes/content/Content.php',
-       'ContentHandler' => 'includes/content/ContentHandler.php',
-       'CssContent' => 'includes/content/CssContent.php',
-       'CssContentHandler' => 'includes/content/CssContentHandler.php',
-       'JavaScriptContent' => 'includes/content/JavaScriptContent.php',
-       'JavaScriptContentHandler' => 'includes/content/JavaScriptContentHandler.php',
-       'JsonContent' => 'includes/content/JsonContent.php',
-       'JsonContentHandler' => 'includes/content/JsonContentHandler.php',
-       'MessageContent' => 'includes/content/MessageContent.php',
-       'MWContentSerializationException' => 'includes/content/ContentHandler.php',
-       'TextContent' => 'includes/content/TextContent.php',
-       'TextContentHandler' => 'includes/content/TextContentHandler.php',
-       'WikitextContent' => 'includes/content/WikitextContent.php',
-       'WikitextContentHandler' => 'includes/content/WikitextContentHandler.php',
-
-       # includes/context
-       'ContextSource' => 'includes/context/ContextSource.php',
-       'DerivativeContext' => 'includes/context/DerivativeContext.php',
-       'IContextSource' => 'includes/context/IContextSource.php',
-       'RequestContext' => 'includes/context/RequestContext.php',
-
-       # includes/dao
-       'IDBAccessObject' => 'includes/dao/IDBAccessObject.php',
-       'DBAccessBase' => 'includes/dao/DBAccessBase.php',
-
-       # includes/db
-       'Blob' => 'includes/db/DatabaseUtility.php',
-       'ChronologyProtector' => 'includes/db/ChronologyProtector.php',
-       'CloneDatabase' => 'includes/db/CloneDatabase.php',
-       'DatabaseBase' => 'includes/db/Database.php',
-       'DatabaseMssql' => 'includes/db/DatabaseMssql.php',
-       'DatabaseMysql' => 'includes/db/DatabaseMysql.php',
-       'DatabaseMysqlBase' => 'includes/db/DatabaseMysqlBase.php',
-       'DatabaseMysqli' => 'includes/db/DatabaseMysqli.php',
-       'DatabaseOracle' => 'includes/db/DatabaseOracle.php',
-       'DatabasePostgres' => 'includes/db/DatabasePostgres.php',
-       'DatabaseSqlite' => 'includes/db/DatabaseSqlite.php',
-       'DatabaseSqliteStandalone' => 'includes/db/DatabaseSqlite.php',
-       'DatabaseType' => 'includes/db/Database.php',
-       'DBAccessError' => 'includes/db/LBFactory.php',
-       'DBConnectionError' => 'includes/db/DatabaseError.php',
-       'DBConnRef' => 'includes/db/LoadBalancer.php',
-       'DBError' => 'includes/db/DatabaseError.php',
-       'DBExpectedError' => 'includes/db/DatabaseError.php',
-       'DBObject' => 'includes/db/DatabaseUtility.php',
-       'IDatabase'  => 'includes/db/Database.php',
-       'IORMRow' => 'includes/db/IORMRow.php',
-       'IORMTable' => 'includes/db/IORMTable.php',
-       'DBMasterPos' => 'includes/db/DatabaseUtility.php',
-       'DBQueryError' => 'includes/db/DatabaseError.php',
-       'DBUnexpectedError' => 'includes/db/DatabaseError.php',
-       'FakeResultWrapper' => 'includes/db/DatabaseUtility.php',
-       'Field' => 'includes/db/DatabaseUtility.php',
-       'LBFactory' => 'includes/db/LBFactory.php',
-       'LBFactoryFake' => 'includes/db/LBFactory.php',
-       'LBFactoryMulti' => 'includes/db/LBFactoryMulti.php',
-       'LBFactorySimple' => 'includes/db/LBFactory.php',
-       'LBFactorySingle' => 'includes/db/LBFactorySingle.php',
-       'LikeMatch' => 'includes/db/DatabaseUtility.php',
-       'LoadBalancer' => 'includes/db/LoadBalancer.php',
-       'LoadBalancerSingle' => 'includes/db/LBFactorySingle.php',
-       'LoadMonitor' => 'includes/db/LoadMonitor.php',
-       'LoadMonitorMySQL' => 'includes/db/LoadMonitor.php',
-       'LoadMonitorNull' => 'includes/db/LoadMonitor.php',
-       'MssqlField' => 'includes/db/DatabaseMssql.php',
-       'MssqlBlob' => 'includes/db/DatabaseMssql.php',
-       'MssqlResultWrapper' => 'includes/db/DatabaseMssql.php',
-       'MySQLField' => 'includes/db/DatabaseMysqlBase.php',
-       'MySQLMasterPos' => 'includes/db/DatabaseMysqlBase.php',
-       'ORAField' => 'includes/db/DatabaseOracle.php',
-       'ORAResult' => 'includes/db/DatabaseOracle.php',
-       'ORMIterator' => 'includes/db/ORMIterator.php',
-       'ORMResult' => 'includes/db/ORMResult.php',
-       'ORMRow' => 'includes/db/ORMRow.php',
-       'ORMTable' => 'includes/db/ORMTable.php',
-       'PostgresField' => 'includes/db/DatabasePostgres.php',
-       'PostgresTransactionState' => 'includes/db/DatabasePostgres.php',
-       'ResultWrapper' => 'includes/db/DatabaseUtility.php',
-       'SavepointPostgres' => 'includes/db/DatabasePostgres.php',
-       'SQLiteField' => 'includes/db/DatabaseSqlite.php',
-
-       # includes/debug
-       'MWDebug' => 'includes/debug/MWDebug.php',
-       'MWLogger' => 'includes/debug/logger/Logger.php',
-       'MWLoggerLegacyLogger' => 'includes/debug/logger/legacy/Logger.php',
-       'MWLoggerLegacySpi' => 'includes/debug/logger/legacy/Spi.php',
-       'MWLoggerMonologHandler' => 'includes/debug/logger/monolog/Handler.php',
-       'MWLoggerMonologProcessor' => 'includes/debug/logger/monolog/Processor.php',
-       'MWLoggerMonologSpi' => 'includes/debug/logger/monolog/Spi.php',
-       'MWLoggerNullSpi' => 'includes/debug/logger/NullSpi.php',
-       'MWLoggerSpi' => 'includes/debug/logger/Spi.php',
-
-       # includes/deferred
-       'DataUpdate' => 'includes/deferred/DataUpdate.php',
-       'DeferrableUpdate' => 'includes/deferred/DeferredUpdates.php',
-       'DeferredUpdates' => 'includes/deferred/DeferredUpdates.php',
-       'HTMLCacheUpdate' => 'includes/deferred/HTMLCacheUpdate.php',
-       'LinksDeletionUpdate' => 'includes/deferred/LinksUpdate.php',
-       'LinksUpdate' => 'includes/deferred/LinksUpdate.php',
-       'MWCallableUpdate' => 'includes/deferred/CallableUpdate.php',
-       'SearchUpdate' => 'includes/deferred/SearchUpdate.php',
-       'SiteStatsUpdate' => 'includes/deferred/SiteStatsUpdate.php',
-       'SqlDataUpdate' => 'includes/deferred/SqlDataUpdate.php',
-       'SquidUpdate' => 'includes/deferred/SquidUpdate.php',
-
-       # includes/diff
-       'DiffEngine' => 'includes/diff/DairikiDiff.php',
-       'DiffOp' => 'includes/diff/DairikiDiff.php',
-       'DiffOpAdd' => 'includes/diff/DairikiDiff.php',
-       'DiffOpChange' => 'includes/diff/DairikiDiff.php',
-       'DiffOpCopy' => 'includes/diff/DairikiDiff.php',
-       'DiffOpDelete' => 'includes/diff/DairikiDiff.php',
-       'HWLDFWordAccumulator' => 'includes/diff/DairikiDiff.php',
-       'ArrayDiffFormatter' => 'includes/diff/ArrayDiffFormatter.php',
-       'Diff' => 'includes/diff/DairikiDiff.php',
-       'DifferenceEngine' => 'includes/diff/DifferenceEngine.php',
-       'DiffFormatter' => 'includes/diff/DiffFormatter.php',
-       'MappedDiff' => 'includes/diff/DairikiDiff.php',
-       'RangeDifference' => 'includes/diff/WikiDiff3.php',
-       'TableDiffFormatter' => 'includes/diff/TableDiffFormatter.php',
-       'UnifiedDiffFormatter' => 'includes/diff/UnifiedDiffFormatter.php',
-       'WikiDiff3' => 'includes/diff/WikiDiff3.php',
-       'WordLevelDiff' => 'includes/diff/DairikiDiff.php',
-
-       # includes/exception
-       'UserBlockedError' => 'includes/exception/UserBlockedError.php',
-       'UserNotLoggedIn' => 'includes/exception/UserNotLoggedIn.php',
-       'ThrottledError' => 'includes/exception/ThrottledError.php',
-       'TimestampException' => 'includes/exception/TimestampException.php',
-       'ReadOnlyError' => 'includes/exception/ReadOnlyError.php',
-       'PermissionsError' => 'includes/exception/PermissionsError.php',
-       'MWException' => 'includes/exception/MWException.php',
-       'MWExceptionHandler' => 'includes/exception/MWExceptionHandler.php',
-       'HttpError' => 'includes/exception/HttpError.php',
-       'BadTitleError' => 'includes/exception/BadTitleError.php',
-       'ErrorPageError' => 'includes/exception/ErrorPageError.php',
-       'FatalError' => 'includes/exception/FatalError.php',
-
-       # includes/externalstore
-       'ExternalStore' => 'includes/externalstore/ExternalStore.php',
-       'ExternalStoreDB' => 'includes/externalstore/ExternalStoreDB.php',
-       'ExternalStoreHttp' => 'includes/externalstore/ExternalStoreHttp.php',
-       'ExternalStoreMedium' => 'includes/externalstore/ExternalStoreMedium.php',
-       'ExternalStoreMwstore' => 'includes/externalstore/ExternalStoreMwstore.php',
-
-       # includes/filebackend
-       'FileBackendGroup' => 'includes/filebackend/FileBackendGroup.php',
-       'FileBackend' => 'includes/filebackend/FileBackend.php',
-       'FileBackendError' => 'includes/filebackend/FileBackend.php',
-       'FileBackendException' => 'includes/filebackend/FileBackend.php',
-       'FileBackendStore' => 'includes/filebackend/FileBackendStore.php',
-       'FileBackendStoreShardListIterator' => 'includes/filebackend/FileBackendStore.php',
-       'FileBackendStoreShardDirIterator' => 'includes/filebackend/FileBackendStore.php',
-       'FileBackendStoreShardFileIterator' => 'includes/filebackend/FileBackendStore.php',
-       'FileBackendMultiWrite' => 'includes/filebackend/FileBackendMultiWrite.php',
-       'FileBackendStoreOpHandle' => 'includes/filebackend/FileBackendStore.php',
-       'FSFile' => 'includes/filebackend/FSFile.php',
-       'FSFileBackend' => 'includes/filebackend/FSFileBackend.php',
-       'FSFileBackendList' => 'includes/filebackend/FSFileBackend.php',
-       'FSFileBackendDirList' => 'includes/filebackend/FSFileBackend.php',
-       'FSFileBackendFileList' => 'includes/filebackend/FSFileBackend.php',
-       'FSFileOpHandle' => 'includes/filebackend/FSFileBackend.php',
-       'MemoryFileBackend' => 'includes/filebackend/MemoryFileBackend.php',
-       'SwiftFileBackend' => 'includes/filebackend/SwiftFileBackend.php',
-       'SwiftFileBackendList' => 'includes/filebackend/SwiftFileBackend.php',
-       'SwiftFileBackendDirList' => 'includes/filebackend/SwiftFileBackend.php',
-       'SwiftFileBackendFileList' => 'includes/filebackend/SwiftFileBackend.php',
-       'SwiftFileOpHandle' => 'includes/filebackend/SwiftFileBackend.php',
-       'TempFSFile' => 'includes/filebackend/TempFSFile.php',
-       'FileJournal' => 'includes/filebackend/filejournal/FileJournal.php',
-       'DBFileJournal' => 'includes/filebackend/filejournal/DBFileJournal.php',
-       'NullFileJournal' => 'includes/filebackend/filejournal/FileJournal.php',
-       'LockManagerGroup' => 'includes/filebackend/lockmanager/LockManagerGroup.php',
-       'LockManager' => 'includes/filebackend/lockmanager/LockManager.php',
-       'ScopedLock' => 'includes/filebackend/lockmanager/ScopedLock.php',
-       'FSLockManager' => 'includes/filebackend/lockmanager/FSLockManager.php',
-       'DBLockManager' => 'includes/filebackend/lockmanager/DBLockManager.php',
-       'MemcLockManager' => 'includes/filebackend/lockmanager/MemcLockManager.php',
-       'QuorumLockManager' => 'includes/filebackend/lockmanager/QuorumLockManager.php',
-       'MySqlLockManager' => 'includes/filebackend/lockmanager/DBLockManager.php',
-       'PostgreSqlLockManager' => 'includes/filebackend/lockmanager/DBLockManager.php',
-       'RedisLockManager' => 'includes/filebackend/lockmanager/RedisLockManager.php',
-       'NullLockManager' => 'includes/filebackend/lockmanager/LockManager.php',
-       'FileOp' => 'includes/filebackend/FileOp.php',
-       'FileOpBatch' => 'includes/filebackend/FileOpBatch.php',
-       'StoreFileOp' => 'includes/filebackend/FileOp.php',
-       'CopyFileOp' => 'includes/filebackend/FileOp.php',
-       'MoveFileOp' => 'includes/filebackend/FileOp.php',
-       'DeleteFileOp' => 'includes/filebackend/FileOp.php',
-       'CreateFileOp' => 'includes/filebackend/FileOp.php',
-       'DescribeFileOp' => 'includes/filebackend/FileOp.php',
-       'NullFileOp' => 'includes/filebackend/FileOp.php',
-
-       # includes/filerepo
-       'FileRepo' => 'includes/filerepo/FileRepo.php',
-       'FileRepoStatus' => 'includes/filerepo/FileRepoStatus.php',
-       'ForeignAPIRepo' => 'includes/filerepo/ForeignAPIRepo.php',
-       'ForeignDBRepo' => 'includes/filerepo/ForeignDBRepo.php',
-       'ForeignDBViaLBRepo' => 'includes/filerepo/ForeignDBViaLBRepo.php',
-       'FSRepo' => 'includes/filerepo/FSRepo.php',
-       'LocalRepo' => 'includes/filerepo/LocalRepo.php',
-       'NullRepo' => 'includes/filerepo/NullRepo.php',
-       'RepoGroup' => 'includes/filerepo/RepoGroup.php',
-       'TempFileRepo' => 'includes/filerepo/FileRepo.php',
-
-       # includes/filerepo/file
-       'ArchivedFile' => 'includes/filerepo/file/ArchivedFile.php',
-       'File' => 'includes/filerepo/file/File.php',
-       'ForeignAPIFile' => 'includes/filerepo/file/ForeignAPIFile.php',
-       'ForeignDBFile' => 'includes/filerepo/file/ForeignDBFile.php',
-       'LocalFile' => 'includes/filerepo/file/LocalFile.php',
-       'LocalFileDeleteBatch' => 'includes/filerepo/file/LocalFile.php',
-       'LocalFileMoveBatch' => 'includes/filerepo/file/LocalFile.php',
-       'LocalFileRestoreBatch' => 'includes/filerepo/file/LocalFile.php',
-       'OldLocalFile' => 'includes/filerepo/file/OldLocalFile.php',
-       'UnregisteredLocalFile' => 'includes/filerepo/file/UnregisteredLocalFile.php',
-
-       # includes/installer
-       'CliInstaller' => 'includes/installer/CliInstaller.php',
-       'DatabaseInstaller' => 'includes/installer/DatabaseInstaller.php',
-       'DatabaseUpdater' => 'includes/installer/DatabaseUpdater.php',
-       'InstallDocFormatter' => 'includes/installer/InstallDocFormatter.php',
-       'Installer' => 'includes/installer/Installer.php',
-       'LocalSettingsGenerator' => 'includes/installer/LocalSettingsGenerator.php',
-       'MssqlInstaller' => 'includes/installer/MssqlInstaller.php',
-       'MssqlUpdater' => 'includes/installer/MssqlUpdater.php',
-       'MysqlInstaller' => 'includes/installer/MysqlInstaller.php',
-       'MysqlUpdater' => 'includes/installer/MysqlUpdater.php',
-       'OracleInstaller' => 'includes/installer/OracleInstaller.php',
-       'OracleUpdater' => 'includes/installer/OracleUpdater.php',
-       'PhpXmlBugTester' => 'includes/installer/PhpBugTests.php',
-       'PostgresInstaller' => 'includes/installer/PostgresInstaller.php',
-       'PostgresUpdater' => 'includes/installer/PostgresUpdater.php',
-       'SqliteInstaller' => 'includes/installer/SqliteInstaller.php',
-       'SqliteUpdater' => 'includes/installer/SqliteUpdater.php',
-       'WebInstaller' => 'includes/installer/WebInstaller.php',
-       'WebInstallerComplete' => 'includes/installer/WebInstallerPage.php',
-       'WebInstallerCopying' => 'includes/installer/WebInstallerPage.php',
-       'WebInstallerDBConnect' => 'includes/installer/WebInstallerPage.php',
-       'WebInstallerDBSettings' => 'includes/installer/WebInstallerPage.php',
-       'WebInstallerDocument' => 'includes/installer/WebInstallerPage.php',
-       'WebInstallerExistingWiki' => 'includes/installer/WebInstallerPage.php',
-       'WebInstallerInstall' => 'includes/installer/WebInstallerPage.php',
-       'WebInstallerLanguage' => 'includes/installer/WebInstallerPage.php',
-       'WebInstallerName' => 'includes/installer/WebInstallerPage.php',
-       'WebInstallerOptions' => 'includes/installer/WebInstallerPage.php',
-       'WebInstallerReadme' => 'includes/installer/WebInstallerPage.php',
-       'WebInstallerReleaseNotes' => 'includes/installer/WebInstallerPage.php',
-       'WebInstallerRestart' => 'includes/installer/WebInstallerPage.php',
-       'WebInstallerUpgrade' => 'includes/installer/WebInstallerPage.php',
-       'WebInstallerUpgradeDoc' => 'includes/installer/WebInstallerPage.php',
-       'WebInstallerWelcome' => 'includes/installer/WebInstallerPage.php',
-       'WebInstallerOutput' => 'includes/installer/WebInstallerOutput.php',
-       'WebInstallerPage' => 'includes/installer/WebInstallerPage.php',
-
-       # includes/job
-       'IJobSpecification' => 'includes/jobqueue/JobSpecification.php',
-       'Job' => 'includes/jobqueue/Job.php',
-       'JobQueue' => 'includes/jobqueue/JobQueue.php',
-       'JobQueueAggregator' => 'includes/jobqueue/aggregator/JobQueueAggregator.php',
-       'JobQueueAggregatorMemc' => 'includes/jobqueue/aggregator/JobQueueAggregatorMemc.php',
-       'JobQueueAggregatorRedis' => 'includes/jobqueue/aggregator/JobQueueAggregatorRedis.php',
-       'JobQueueDB' => 'includes/jobqueue/JobQueueDB.php',
-       'JobQueueConnectionError' => 'includes/jobqueue/JobQueue.php',
-       'JobQueueError' => 'includes/jobqueue/JobQueue.php',
-       'JobQueueGroup' => 'includes/jobqueue/JobQueueGroup.php',
-       'JobQueueFederated' => 'includes/jobqueue/JobQueueFederated.php',
-       'JobQueueRedis' => 'includes/jobqueue/JobQueueRedis.php',
-       'JobRunner' => 'includes/jobqueue/JobRunner.php',
-       'JobSpecification' => 'includes/jobqueue/JobSpecification.php',
-
-       # includes/jobqueue/jobs
-       'DoubleRedirectJob' => 'includes/jobqueue/jobs/DoubleRedirectJob.php',
-       'DuplicateJob' => 'includes/jobqueue/jobs/DuplicateJob.php',
-       'EmaillingJob' => 'includes/jobqueue/jobs/EmaillingJob.php',
-       'EnotifNotifyJob' => 'includes/jobqueue/jobs/EnotifNotifyJob.php',
-       'HTMLCacheUpdateJob' => 'includes/jobqueue/jobs/HTMLCacheUpdateJob.php',
-       'NullJob' => 'includes/jobqueue/jobs/NullJob.php',
-       'RefreshLinksJob' => 'includes/jobqueue/jobs/RefreshLinksJob.php',
-       'RefreshLinksJob2' => 'includes/jobqueue/jobs/RefreshLinksJob2.php',
-       'UploadFromUrlJob' => 'includes/jobqueue/jobs/UploadFromUrlJob.php',
-       'AssembleUploadChunksJob' => 'includes/jobqueue/jobs/AssembleUploadChunksJob.php',
-       'PublishStashedFileJob' => 'includes/jobqueue/jobs/PublishStashedFileJob.php',
-       'ThumbnailRenderJob' => 'includes/jobqueue/jobs/ThumbnailRenderJob.php',
-
-       # includes/jobqueue/utils
-       'BacklinkJobUtils' => 'includes/jobqueue/utils/BacklinkJobUtils.php',
-
-       # includes/json
-       'FormatJson' => 'includes/json/FormatJson.php',
-
-       # includes/libs
-       'ArrayUtils' => 'includes/libs/ArrayUtils.php',
-       'Cookie' => 'includes/libs/Cookie.php',
-       'CookieJar' => 'includes/libs/Cookie.php',
-       'CSSMin' => 'includes/libs/CSSMin.php',
-       'GenericArrayObject' => 'includes/libs/GenericArrayObject.php',
-       'HashRing' => 'includes/libs/HashRing.php',
-       'HttpStatus' => 'includes/libs/HttpStatus.php',
-       'IEContentAnalyzer' => 'includes/libs/IEContentAnalyzer.php',
-       'IEUrlExtension' => 'includes/libs/IEUrlExtension.php',
-       'MappedIterator' => 'includes/libs/MappedIterator.php',
-       'IPSet' => 'includes/libs/IPSet.php',
-       'JavaScriptMinifier' => 'includes/libs/JavaScriptMinifier.php',
-       'JSCompilerContext' => 'includes/libs/jsminplus.php',
-       'JSMinPlus' => 'includes/libs/jsminplus.php',
-       'JSNode' => 'includes/libs/jsminplus.php',
-       'JSParser' => 'includes/libs/jsminplus.php',
-       'JSToken' => 'includes/libs/jsminplus.php',
-       'JSTokenizer' => 'includes/libs/jsminplus.php',
-       'MultiHttpClient' => 'includes/libs/MultiHttpClient.php',
-       'MWMessagePack' => 'includes/libs/MWMessagePack.php',
-       'ProcessCacheLRU' => 'includes/libs/ProcessCacheLRU.php',
-       'RunningStat' => 'includes/libs/RunningStat.php',
-       'ScopedCallback' => 'includes/libs/ScopedCallback.php',
-       'ScopedPHPTimeout' => 'includes/libs/ScopedPHPTimeout.php',
-       'SwiftVirtualRESTService' => 'includes/libs/virtualrest/SwiftVirtualRESTService.php',
-       'VirtualRESTService' => 'includes/libs/virtualrest/VirtualRESTService.php',
-       'VirtualRESTServiceClient' => 'includes/libs/virtualrest/VirtualRESTServiceClient.php',
-       'XmlTypeCheck' => 'includes/libs/XmlTypeCheck.php',
-
-       # includes/libs/lessphp
-       'lessc' => 'includes/libs/lessc.inc.php',
-       'lessc_parser' => 'includes/libs/lessc.inc.php',
-       'lessc_formatter_classic' => 'includes/libs/lessc.inc.php',
-       'lessc_formatter_compressed' => 'includes/libs/lessc.inc.php',
-       'lessc_formatter_lessjs' => 'includes/libs/lessc.inc.php',
-
-       # includes/logging
-       'DatabaseLogEntry' => 'includes/logging/LogEntry.php',
-       'DeleteLogFormatter' => 'includes/logging/DeleteLogFormatter.php',
-       'LegacyLogFormatter' => 'includes/logging/LogFormatter.php',
-       'LogEntry' => 'includes/logging/LogEntry.php',
-       'LogEventsList' => 'includes/logging/LogEventsList.php',
-       'LogEntryBase' => 'includes/logging/LogEntry.php',
-       'LogFormatter' => 'includes/logging/LogFormatter.php',
-       'LogPage' => 'includes/logging/LogPage.php',
-       'LogPager' => 'includes/logging/LogPager.php',
-       'ManualLogEntry' => 'includes/logging/LogEntry.php',
-       'MergeLogFormatter' => 'includes/logging/MergeLogFormatter.php',
-       'MoveLogFormatter' => 'includes/logging/MoveLogFormatter.php',
-       'NewUsersLogFormatter' => 'includes/logging/NewUsersLogFormatter.php',
-       'PageLangLogFormatter' => 'includes/logging/PageLangLogFormatter.php',
-       'PatrolLog' => 'includes/logging/PatrolLog.php',
-       'PatrolLogFormatter' => 'includes/logging/PatrolLogFormatter.php',
-       'RCDatabaseLogEntry' => 'includes/logging/LogEntry.php',
-       'RightsLogFormatter' => 'includes/logging/RightsLogFormatter.php',
-
-       # Image gallery
-
-       'ImageGallery' => 'includes/gallery/TraditionalImageGallery.php',
-       'ImageGalleryBase' => 'includes/gallery/ImageGalleryBase.php',
-       'NolinesImageGallery' => 'includes/gallery/NolinesImageGallery.php',
-       'TraditionalImageGallery' => 'includes/gallery/TraditionalImageGallery.php',
-       'PackedImageGallery' => 'includes/gallery/PackedImageGallery.php',
-       'PackedHoverImageGallery' => 'includes/gallery/PackedOverlayImageGallery.php',
-       'PackedOverlayImageGallery' => 'includes/gallery/PackedOverlayImageGallery.php',
-
-       # includes/mail
-       'EmailNotification' => 'includes/mail/EmailNotification.php',
-       'MailAddress' => 'includes/mail/MailAddress.php',
-       'UserMailer' => 'includes/mail/UserMailer.php',
-
-       # includes/media
-       'BitmapHandler' => 'includes/media/Bitmap.php',
-       'BitmapHandler_ClientOnly' => 'includes/media/Bitmap_ClientOnly.php',
-       'BitmapMetadataHandler' => 'includes/media/BitmapMetadataHandler.php',
-       'BmpHandler' => 'includes/media/BMP.php',
-       'DjVuHandler' => 'includes/media/DjVu.php',
-       'DjVuImage' => 'includes/media/DjVuImage.php',
-       'Exif' => 'includes/media/Exif.php',
-       'ExifBitmapHandler' => 'includes/media/ExifBitmap.php',
-       'FormatMetadata' => 'includes/media/FormatMetadata.php',
-       'GIFHandler' => 'includes/media/GIF.php',
-       'GIFMetadataExtractor' => 'includes/media/GIFMetadataExtractor.php',
-       'ImageHandler' => 'includes/media/ImageHandler.php',
-       'IPTC' => 'includes/media/IPTC.php',
-       'JpegHandler' => 'includes/media/Jpeg.php',
-       'JpegMetadataExtractor' => 'includes/media/JpegMetadataExtractor.php',
-       'MediaHandler' => 'includes/media/MediaHandler.php',
-       'MediaTransformError' => 'includes/media/MediaTransformOutput.php',
-       'MediaTransformOutput' => 'includes/media/MediaTransformOutput.php',
-       'PNGHandler' => 'includes/media/PNG.php',
-       'PNGMetadataExtractor' => 'includes/media/PNGMetadataExtractor.php',
-       'SvgHandler' => 'includes/media/SVG.php',
-       'SVGMetadataExtractor' => 'includes/media/SVGMetadataExtractor.php',
-       'SVGReader' => 'includes/media/SVGMetadataExtractor.php',
-       'ThumbnailImage' => 'includes/media/MediaTransformOutput.php',
-       'TiffHandler' => 'includes/media/Tiff.php',
-       'TransformationalImageHandler' => 'includes/media/TransformationalImageHandler.php',
-       'TransformParameterError' => 'includes/media/MediaTransformOutput.php',
-       'XCFHandler' => 'includes/media/XCF.php',
-       'XMPInfo' => 'includes/media/XMPInfo.php',
-       'XMPReader' => 'includes/media/XMP.php',
-       'XMPValidate' => 'includes/media/XMPValidate.php',
-
-       # includes/normal
-       'UtfNormal' => 'includes/normal/UtfNormal.php',
-
-       # includes/objectcache
-       'APCBagOStuff' => 'includes/objectcache/APCBagOStuff.php',
-       'BagOStuff' => 'includes/objectcache/BagOStuff.php',
-       'EmptyBagOStuff' => 'includes/objectcache/EmptyBagOStuff.php',
-       'HashBagOStuff' => 'includes/objectcache/HashBagOStuff.php',
-       'MediaWikiBagOStuff' => 'includes/objectcache/SqlBagOStuff.php',
-       'MemCachedClientforWiki' => 'includes/objectcache/MemcachedClient.php',
-       'MemcachedBagOStuff' => 'includes/objectcache/MemcachedBagOStuff.php',
-       'MemcachedPeclBagOStuff' => 'includes/objectcache/MemcachedPeclBagOStuff.php',
-       'MemcachedPhpBagOStuff' => 'includes/objectcache/MemcachedPhpBagOStuff.php',
-       'MultiWriteBagOStuff' => 'includes/objectcache/MultiWriteBagOStuff.php',
-       'MWMemcached' => 'includes/objectcache/MemcachedClient.php',
-       'ObjectCache' => 'includes/objectcache/ObjectCache.php',
-       'ObjectCacheSessionHandler' => 'includes/objectcache/ObjectCacheSessionHandler.php',
-       'RedisBagOStuff' => 'includes/objectcache/RedisBagOStuff.php',
-       'SqlBagOStuff' => 'includes/objectcache/SqlBagOStuff.php',
-       'WinCacheBagOStuff' => 'includes/objectcache/WinCacheBagOStuff.php',
-       'XCacheBagOStuff' => 'includes/objectcache/XCacheBagOStuff.php',
-
-       # includes/page
-       'Article' => 'includes/page/Article.php',
-       'CategoryPage' => 'includes/page/CategoryPage.php',
-       'ImageHistoryList' => 'includes/page/ImagePage.php',
-       'ImageHistoryPseudoPager' => 'includes/page/ImagePage.php',
-       'ImagePage' => 'includes/page/ImagePage.php',
-       'Page' => 'includes/page/WikiPage.php',
-       'WikiCategoryPage' => 'includes/page/WikiCategoryPage.php',
-       'WikiFilePage' => 'includes/page/WikiFilePage.php',
-       'WikiPage' => 'includes/page/WikiPage.php',
-
-       # includes/pager
-       'AlphabeticPager' => 'includes/pager/AlphabeticPager.php',
-       'IndexPager' => 'includes/pager/IndexPager.php',
-       'Pager' => 'includes/pager/Pager.php',
-       'ReverseChronologicalPager' => 'includes/pager/ReverseChronologicalPager.php',
-       'TablePager' => 'includes/pager/TablePager.php',
-
-       # includes/parser
-       'CacheTime' => 'includes/parser/CacheTime.php',
-       'CoreParserFunctions' => 'includes/parser/CoreParserFunctions.php',
-       'CoreTagHooks' => 'includes/parser/CoreTagHooks.php',
-       'DateFormatter' => 'includes/parser/DateFormatter.php',
-       'LinkHolderArray' => 'includes/parser/LinkHolderArray.php',
-       'MWTidy' => 'includes/parser/MWTidy.php',
-       'MWTidyWrapper' => 'includes/parser/MWTidy.php',
-       'PPCustomFrame_DOM' => 'includes/parser/Preprocessor_DOM.php',
-       'PPCustomFrame_Hash' => 'includes/parser/Preprocessor_Hash.php',
-       'PPDAccum_Hash' => 'includes/parser/Preprocessor_Hash.php',
-       'PPDPart' => 'includes/parser/Preprocessor_DOM.php',
-       'PPDPart_Hash' => 'includes/parser/Preprocessor_Hash.php',
-       'PPDStack' => 'includes/parser/Preprocessor_DOM.php',
-       'PPDStackElement' => 'includes/parser/Preprocessor_DOM.php',
-       'PPDStackElement_Hash' => 'includes/parser/Preprocessor_Hash.php',
-       'PPDStack_Hash' => 'includes/parser/Preprocessor_Hash.php',
-       'PPFrame' => 'includes/parser/Preprocessor.php',
-       'PPFrame_DOM' => 'includes/parser/Preprocessor_DOM.php',
-       'PPFrame_Hash' => 'includes/parser/Preprocessor_Hash.php',
-       'PPNode' => 'includes/parser/Preprocessor.php',
-       'PPNode_DOM' => 'includes/parser/Preprocessor_DOM.php',
-       'PPNode_Hash_Array' => 'includes/parser/Preprocessor_Hash.php',
-       'PPNode_Hash_Attr' => 'includes/parser/Preprocessor_Hash.php',
-       'PPNode_Hash_Text' => 'includes/parser/Preprocessor_Hash.php',
-       'PPNode_Hash_Tree' => 'includes/parser/Preprocessor_Hash.php',
-       'PPTemplateFrame_DOM' => 'includes/parser/Preprocessor_DOM.php',
-       'PPTemplateFrame_Hash' => 'includes/parser/Preprocessor_Hash.php',
-       'Parser' => 'includes/parser/Parser.php',
-       'ParserCache' => 'includes/parser/ParserCache.php',
-       'ParserOptions' => 'includes/parser/ParserOptions.php',
-       'ParserOutput' => 'includes/parser/ParserOutput.php',
-       'ParserDiffTest' => 'includes/parser/ParserDiffTest.php',
-       'Preprocessor' => 'includes/parser/Preprocessor.php',
-       'Preprocessor_DOM' => 'includes/parser/Preprocessor_DOM.php',
-       'Preprocessor_Hash' => 'includes/parser/Preprocessor_Hash.php',
-       'StripState' => 'includes/parser/StripState.php',
-
-       # includes/password
-       'BcryptPassword' => 'includes/password/BcryptPassword.php',
-       'InvalidPassword' => 'includes/password/InvalidPassword.php',
-       'LayeredParameterizedPassword' => 'includes/password/LayeredParameterizedPassword.php',
-       'MWSaltedPassword' => 'includes/password/MWSaltedPassword.php',
-       'MWOldPassword' => 'includes/password/MWOldPassword.php',
-       'ParameterizedPassword' => 'includes/password/ParameterizedPassword.php',
-       'Password' => 'includes/password/Password.php',
-       'PasswordError' => 'includes/password/PasswordError.php',
-       'PasswordFactory' => 'includes/password/PasswordFactory.php',
-       'Pbkdf2Password' => 'includes/password/Pbkdf2Password.php',
-       'EncryptedPassword' => 'includes/password/EncryptedPassword.php',
-
-       # includes/profiler
-       'Profiler' => 'includes/profiler/Profiler.php',
-       'ProfilerSimpleDB' => 'includes/profiler/ProfilerSimpleDB.php',
-       'ProfilerSimpleText' => 'includes/profiler/ProfilerSimpleText.php',
-       'ProfilerSimpleTrace' => 'includes/profiler/ProfilerSimpleTrace.php',
-       'ProfilerSimpleUDP' => 'includes/profiler/ProfilerSimpleUDP.php',
-       'ProfilerStandard' => 'includes/profiler/ProfilerStandard.php',
-       'ProfilerStub' => 'includes/profiler/ProfilerStub.php',
-       'ProfileSection' => 'includes/profiler/ProfileSection.php',
-       'TransactionProfiler' => 'includes/profiler/TransactionProfiler.php',
-
-       # includes/rcfeed
-       'RCFeedEngine' => 'includes/rcfeed/RCFeedEngine.php',
-       'RedisPubSubFeedEngine' => 'includes/rcfeed/RedisPubSubFeedEngine.php',
-       'UDPRCFeedEngine' => 'includes/rcfeed/UDPRCFeedEngine.php',
-       'RCFeedFormatter' => 'includes/rcfeed/RCFeedFormatter.php',
-       'IRCColourfulRCFeedFormatter' => 'includes/rcfeed/IRCColourfulRCFeedFormatter.php',
-       'JSONRCFeedFormatter' => 'includes/rcfeed/JSONRCFeedFormatter.php',
-       'XMLRCFeedFormatter' => 'includes/rcfeed/XMLRCFeedFormatter.php',
-       'MachineReadableRCFeedFormatter' => 'includes/rcfeed/MachineReadableRCFeedFormatter.php',
-
-       # includes/resourceloader
-       'DerivativeResourceLoaderContext' =>
-               'includes/resourceloader/DerivativeResourceLoaderContext.php',
-       'ResourceLoader' => 'includes/resourceloader/ResourceLoader.php',
-       'ResourceLoaderContext' => 'includes/resourceloader/ResourceLoaderContext.php',
-       'ResourceLoaderEditToolbarModule' => 'includes/resourceloader/ResourceLoaderEditToolbarModule.php',
-       'ResourceLoaderFileModule' => 'includes/resourceloader/ResourceLoaderFileModule.php',
-       'ResourceLoaderFilePageModule' => 'includes/resourceloader/ResourceLoaderFilePageModule.php',
-       'ResourceLoaderFilePath' => 'includes/resourceloader/ResourceLoaderFilePath.php',
-       'ResourceLoaderModule' => 'includes/resourceloader/ResourceLoaderModule.php',
-       'ResourceLoaderNoscriptModule' => 'includes/resourceloader/ResourceLoaderNoscriptModule.php',
-       'ResourceLoaderSiteModule' => 'includes/resourceloader/ResourceLoaderSiteModule.php',
-       'ResourceLoaderSkinModule' => 'includes/resourceloader/ResourceLoaderSkinModule.php',
-       'ResourceLoaderStartUpModule' => 'includes/resourceloader/ResourceLoaderStartUpModule.php',
-       'ResourceLoaderUserCSSPrefsModule' =>
-               'includes/resourceloader/ResourceLoaderUserCSSPrefsModule.php',
-       'ResourceLoaderUserGroupsModule' => 'includes/resourceloader/ResourceLoaderUserGroupsModule.php',
-       'ResourceLoaderUserModule' => 'includes/resourceloader/ResourceLoaderUserModule.php',
-       'ResourceLoaderUserOptionsModule' => 'includes/resourceloader/ResourceLoaderUserOptionsModule.php',
-       'ResourceLoaderUserTokensModule' => 'includes/resourceloader/ResourceLoaderUserTokensModule.php',
-       'ResourceLoaderLanguageDataModule' =>
-               'includes/resourceloader/ResourceLoaderLanguageDataModule.php',
-       'ResourceLoaderLanguageNamesModule' =>
-               'includes/resourceloader/ResourceLoaderLanguageNamesModule.php',
-       'ResourceLoaderWikiModule' => 'includes/resourceloader/ResourceLoaderWikiModule.php',
-
-       # includes/revisiondelete
-       'RevDelArchivedFileItem' => 'includes/revisiondelete/RevDelArchivedFileItem.php',
-       'RevDelArchivedFileList' => 'includes/revisiondelete/RevDelArchivedFileList.php',
-       'RevDelArchivedRevisionItem' => 'includes/revisiondelete/RevDelArchivedRevisionItem.php',
-       'RevDelArchiveItem' => 'includes/revisiondelete/RevDelArchiveItem.php',
-       'RevDelArchiveList' => 'includes/revisiondelete/RevDelArchiveList.php',
-       'RevDelFileItem' => 'includes/revisiondelete/RevDelFileItem.php',
-       'RevDelFileList' => 'includes/revisiondelete/RevDelFileList.php',
-       'RevDelItem' => 'includes/revisiondelete/RevDelItem.php',
-       'RevDelList' => 'includes/revisiondelete/RevDelList.php',
-       'RevDelLogItem' => 'includes/revisiondelete/RevDelLogItem.php',
-       'RevDelLogList' => 'includes/revisiondelete/RevDelLogList.php',
-       'RevDelRevisionItem' => 'includes/revisiondelete/RevDelRevisionItem.php',
-       'RevDelRevisionList' => 'includes/revisiondelete/RevDelRevisionList.php',
-       'RevisionDeleter' => 'includes/revisiondelete/RevisionDeleter.php',
-       'RevisionDeleteUser' => 'includes/revisiondelete/RevisionDeleteUser.php',
-
-       # includes/search
-       'SearchDatabase' => 'includes/search/SearchDatabase.php',
-       'SearchEngine' => 'includes/search/SearchEngine.php',
-       'SearchEngineDummy' => 'includes/search/SearchEngine.php',
-       'SearchHighlighter' => 'includes/search/SearchHighlighter.php',
-       'SearchMssql' => 'includes/search/SearchMssql.php',
-       'SearchMySQL' => 'includes/search/SearchMySQL.php',
-       'SearchNearMatchResultSet' => 'includes/search/SearchResultSet.php',
-       'SearchOracle' => 'includes/search/SearchOracle.php',
-       'SearchPostgres' => 'includes/search/SearchPostgres.php',
-       'SearchResult' => 'includes/search/SearchResult.php',
-       'SearchResultSet' => 'includes/search/SearchResultSet.php',
-       'SearchSqlite' => 'includes/search/SearchSqlite.php',
-       'SqlSearchResultSet' => 'includes/search/SearchResultSet.php',
-
-       # includes/site
-       'MediaWikiSite' => 'includes/site/MediaWikiSite.php',
-       'Site' => 'includes/site/Site.php',
-       'SiteObject' => 'includes/site/Site.php',
-       'SiteArray' => 'includes/site/SiteList.php',
-       'SiteList' => 'includes/site/SiteList.php',
-       'SiteSQLStore' => 'includes/site/SiteSQLStore.php',
-       'Sites' => 'includes/site/SiteSQLStore.php',
-       'SiteStore' => 'includes/site/SiteStore.php',
-
-       # includes/skins
-       'BaseTemplate' => 'includes/skins/BaseTemplate.php',
-       'MediaWikiI18N' => 'includes/skins/MediaWikiI18N.php',
-       'QuickTemplate' => 'includes/skins/QuickTemplate.php',
-       'Skin' => 'includes/skins/Skin.php',
-       'SkinApi' => 'includes/skins/SkinApi.php',
-       'SkinApiTemplate' => 'includes/skins/SkinApiTemplate.php',
-       'SkinException' => 'includes/skins/SkinException.php',
-       'SkinFactory' => 'includes/skins/SkinFactory.php',
-       'SkinFallback' => 'includes/skins/SkinFallback.php',
-       'SkinFallbackTemplate' => 'includes/skins/SkinFallbackTemplate.php',
-       'SkinTemplate' => 'includes/skins/SkinTemplate.php',
-
-       # includes/specialpage
-       'ChangesListSpecialPage' => 'includes/specialpage/ChangesListSpecialPage.php',
-       'FormSpecialPage' => 'includes/specialpage/FormSpecialPage.php',
-       'ImageQueryPage' => 'includes/specialpage/ImageQueryPage.php',
-       'IncludableSpecialPage' => 'includes/specialpage/IncludableSpecialPage.php',
-       'PageQueryPage' => 'includes/specialpage/PageQueryPage.php',
-       'QueryPage' => 'includes/specialpage/QueryPage.php',
-       'RedirectSpecialArticle' => 'includes/specialpage/RedirectSpecialPage.php',
-       'RedirectSpecialPage' => 'includes/specialpage/RedirectSpecialPage.php',
-       'SpecialPage' => 'includes/specialpage/SpecialPage.php',
-       'SpecialPageFactory' => 'includes/specialpage/SpecialPageFactory.php',
-       'SpecialRedirectToSpecial' => 'includes/specialpage/RedirectSpecialPage.php',
-       'UnlistedSpecialPage' => 'includes/specialpage/UnlistedSpecialPage.php',
-       'WantedQueryPage' => 'includes/specialpage/WantedQueryPage.php',
-
-       # includes/specials
-       'ActiveUsersPager' => 'includes/specials/SpecialActiveusers.php',
-       'AllMessagesTablePager' => 'includes/specials/SpecialAllMessages.php',
-       'AncientPagesPage' => 'includes/specials/SpecialAncientpages.php',
-       'BlockListPager' => 'includes/specials/SpecialBlockList.php',
-       'BrokenRedirectsPage' => 'includes/specials/SpecialBrokenRedirects.php',
-       'CategoryPager' => 'includes/specials/SpecialCategories.php',
-       'ContribsPager' => 'includes/specials/SpecialContributions.php',
-       'DeadendPagesPage' => 'includes/specials/SpecialDeadendpages.php',
-       'DeletedContribsPager' => 'includes/specials/SpecialDeletedContributions.php',
-       'DeletedContributionsPage' => 'includes/specials/SpecialDeletedContributions.php',
-       'DoubleRedirectsPage' => 'includes/specials/SpecialDoubleRedirects.php',
-       'EditWatchlistCheckboxSeriesField' => 'includes/specials/SpecialEditWatchlist.php',
-       'EditWatchlistNormalHTMLForm' => 'includes/specials/SpecialEditWatchlist.php',
-       'EmailConfirmation' => 'includes/specials/SpecialConfirmemail.php',
-       'EmailInvalidation' => 'includes/specials/SpecialConfirmemail.php',
-       'FewestrevisionsPage' => 'includes/specials/SpecialFewestrevisions.php',
-       'FileDuplicateSearchPage' => 'includes/specials/SpecialFileDuplicateSearch.php',
-       'ImageListPager' => 'includes/specials/SpecialListfiles.php',
-       'ImportReporter' => 'includes/specials/SpecialImport.php',
-       'LinkSearchPage' => 'includes/specials/SpecialLinkSearch.php',
-       'ListredirectsPage' => 'includes/specials/SpecialListredirects.php',
-       'ListDuplicatedFilesPage' => 'includes/specials/SpecialListDuplicatedFiles.php',
-       'LoginForm' => 'includes/specials/SpecialUserlogin.php',
-       'LonelyPagesPage' => 'includes/specials/SpecialLonelypages.php',
-       'LongPagesPage' => 'includes/specials/SpecialLongpages.php',
-       'MediaStatisticsPage' => 'includes/specials/SpecialMediaStatistics.php',
-       'MergeHistoryPager' => 'includes/specials/SpecialMergeHistory.php',
-       'MIMEsearchPage' => 'includes/specials/SpecialMIMEsearch.php',
-       'MostcategoriesPage' => 'includes/specials/SpecialMostcategories.php',
-       'MostimagesPage' => 'includes/specials/SpecialMostimages.php',
-       'MostinterwikisPage' => 'includes/specials/SpecialMostinterwikis.php',
-       'MostlinkedCategoriesPage' => 'includes/specials/SpecialMostlinkedcategories.php',
-       'MostlinkedPage' => 'includes/specials/SpecialMostlinked.php',
-       'MostlinkedTemplatesPage' => 'includes/specials/SpecialMostlinkedtemplates.php',
-       'MostrevisionsPage' => 'includes/specials/SpecialMostrevisions.php',
-       'MovePageForm' => 'includes/specials/SpecialMovepage.php',
-       'NewFilesPager' => 'includes/specials/SpecialNewimages.php',
-       'NewPagesPager' => 'includes/specials/SpecialNewpages.php',
-       'PageArchive' => 'includes/specials/SpecialUndelete.php',
-       'ProtectedPagesPager' => 'includes/specials/SpecialProtectedpages.php',
-       'ProtectedTitlesPager' => 'includes/specials/SpecialProtectedtitles.php',
-       'RandomPage' => 'includes/specials/SpecialRandompage.php',
-       'ShortPagesPage' => 'includes/specials/SpecialShortpages.php',
-       'SpecialActiveUsers' => 'includes/specials/SpecialActiveusers.php',
-       'SpecialAllMessages' => 'includes/specials/SpecialAllMessages.php',
-       'SpecialAllMyUploads' => 'includes/specials/SpecialMyRedirectPages.php',
-       'SpecialAllPages' => 'includes/specials/SpecialAllPages.php',
-       'SpecialApiHelp' => 'includes/specials/SpecialApiHelp.php',
-       'SpecialBlankpage' => 'includes/specials/SpecialBlankpage.php',
-       'SpecialBlock' => 'includes/specials/SpecialBlock.php',
-       'SpecialBlockList' => 'includes/specials/SpecialBlockList.php',
-       'SpecialBookSources' => 'includes/specials/SpecialBooksources.php',
-       'SpecialCachedPage' => 'includes/specials/SpecialCachedPage.php',
-       'SpecialCategories' => 'includes/specials/SpecialCategories.php',
-       'SpecialChangeEmail' => 'includes/specials/SpecialChangeEmail.php',
-       'SpecialChangePassword' => 'includes/specials/SpecialChangePassword.php',
-       'SpecialComparePages' => 'includes/specials/SpecialComparePages.php',
-       'SpecialContributions' => 'includes/specials/SpecialContributions.php',
-       'SpecialCreateAccount' => 'includes/specials/SpecialCreateAccount.php',
-       'SpecialDiff' => 'includes/specials/SpecialDiff.php',
-       'SpecialEditWatchlist' => 'includes/specials/SpecialEditWatchlist.php',
-       'SpecialEmailUser' => 'includes/specials/SpecialEmailuser.php',
-       'SpecialExpandTemplates' => 'includes/specials/SpecialExpandTemplates.php',
-       'SpecialExport' => 'includes/specials/SpecialExport.php',
-       'SpecialFilepath' => 'includes/specials/SpecialFilepath.php',
-       'SpecialImport' => 'includes/specials/SpecialImport.php',
-       'SpecialJavaScriptTest' => 'includes/specials/SpecialJavaScriptTest.php',
-       'SpecialListAdmins' => 'includes/specials/SpecialListusers.php',
-       'SpecialListBots' => 'includes/specials/SpecialListusers.php',
-       'SpecialListFiles' => 'includes/specials/SpecialListfiles.php',
-       'SpecialListGroupRights' => 'includes/specials/SpecialListgrouprights.php',
-       'SpecialListUsers' => 'includes/specials/SpecialListusers.php',
-       'SpecialLockdb' => 'includes/specials/SpecialLockdb.php',
-       'SpecialLog' => 'includes/specials/SpecialLog.php',
-       'SpecialMergeHistory' => 'includes/specials/SpecialMergeHistory.php',
-       'SpecialMycontributions' => 'includes/specials/SpecialMyRedirectPages.php',
-       'SpecialMyLanguage' => 'includes/specials/SpecialMyLanguage.php',
-       'SpecialMypage' => 'includes/specials/SpecialMyRedirectPages.php',
-       'SpecialMytalk' => 'includes/specials/SpecialMyRedirectPages.php',
-       'SpecialMyuploads' => 'includes/specials/SpecialMyRedirectPages.php',
-       'SpecialNewFiles' => 'includes/specials/SpecialNewimages.php',
-       'SpecialNewpages' => 'includes/specials/SpecialNewpages.php',
-       'SpecialPageLanguage' => 'includes/specials/SpecialPageLanguage.php',
-       'SpecialPasswordReset' => 'includes/specials/SpecialPasswordReset.php',
-       'SpecialPagesWithProp' => 'includes/specials/SpecialPagesWithProp.php',
-       'SpecialPermanentLink' => 'includes/specials/SpecialPermanentLink.php',
-       'SpecialPreferences' => 'includes/specials/SpecialPreferences.php',
-       'SpecialPrefixindex' => 'includes/specials/SpecialPrefixindex.php',
-       'SpecialProtectedpages' => 'includes/specials/SpecialProtectedpages.php',
-       'SpecialProtectedtitles' => 'includes/specials/SpecialProtectedtitles.php',
-       'SpecialRandomInCategory' => 'includes/specials/SpecialRandomInCategory.php',
-       'SpecialRandomredirect' => 'includes/specials/SpecialRandomredirect.php',
-       'SpecialRecentChanges' => 'includes/specials/SpecialRecentchanges.php',
-       'SpecialRecentChangesLinked' => 'includes/specials/SpecialRecentchangeslinked.php',
-       'SpecialRedirect' => 'includes/specials/SpecialRedirect.php',
-       'SpecialResetTokens' => 'includes/specials/SpecialResetTokens.php',
-       'SpecialRevisionDelete' => 'includes/specials/SpecialRevisiondelete.php',
-       'SpecialRunJobs' => 'includes/specials/SpecialRunJobs.php',
-       'SpecialSearch' => 'includes/specials/SpecialSearch.php',
-       'SpecialSpecialpages' => 'includes/specials/SpecialSpecialpages.php',
-       'SpecialStatistics' => 'includes/specials/SpecialStatistics.php',
-       'SpecialTags' => 'includes/specials/SpecialTags.php',
-       'SpecialTrackingCategories' => 'includes/specials/SpecialTrackingCategories.php',
-       'SpecialUnblock' => 'includes/specials/SpecialUnblock.php',
-       'SpecialUndelete' => 'includes/specials/SpecialUndelete.php',
-       'SpecialUnlockdb' => 'includes/specials/SpecialUnlockdb.php',
-       'SpecialUpload' => 'includes/specials/SpecialUpload.php',
-       'SpecialUploadStash' => 'includes/specials/SpecialUploadStash.php',
-       'SpecialUploadStashTooLargeException' => 'includes/specials/SpecialUploadStash.php',
-       'SpecialUserlogout' => 'includes/specials/SpecialUserlogout.php',
-       'SpecialVersion' => 'includes/specials/SpecialVersion.php',
-       'SpecialWatchlist' => 'includes/specials/SpecialWatchlist.php',
-       'SpecialWhatLinksHere' => 'includes/specials/SpecialWhatlinkshere.php',
-       'UncategorizedCategoriesPage' => 'includes/specials/SpecialUncategorizedcategories.php',
-       'UncategorizedImagesPage' => 'includes/specials/SpecialUncategorizedimages.php',
-       'UncategorizedPagesPage' => 'includes/specials/SpecialUncategorizedpages.php',
-       'UncategorizedTemplatesPage' => 'includes/specials/SpecialUncategorizedtemplates.php',
-       'UnusedCategoriesPage' => 'includes/specials/SpecialUnusedcategories.php',
-       'UnusedimagesPage' => 'includes/specials/SpecialUnusedimages.php',
-       'UnusedtemplatesPage' => 'includes/specials/SpecialUnusedtemplates.php',
-       'UnwatchedpagesPage' => 'includes/specials/SpecialUnwatchedpages.php',
-       'UploadChunkFileException' => 'includes/upload/UploadFromChunks.php',
-       'UploadChunkZeroLengthFileException' => 'includes/upload/UploadFromChunks.php',
-       'UploadChunkVerificationException' => 'includes/upload/UploadFromChunks.php',
-       'UploadForm' => 'includes/specials/SpecialUpload.php',
-       'UploadSourceField' => 'includes/specials/SpecialUpload.php',
-       'UserrightsPage' => 'includes/specials/SpecialUserrights.php',
-       'UsersPager' => 'includes/specials/SpecialListusers.php',
-       'WantedCategoriesPage' => 'includes/specials/SpecialWantedcategories.php',
-       'WantedFilesPage' => 'includes/specials/SpecialWantedfiles.php',
-       'WantedPagesPage' => 'includes/specials/SpecialWantedpages.php',
-       'WantedTemplatesPage' => 'includes/specials/SpecialWantedtemplates.php',
-       'WithoutInterwikiPage' => 'includes/specials/SpecialWithoutinterwiki.php',
-
-       # includes/templates
-       'UserloginTemplate' => 'includes/templates/Userlogin.php',
-       'UsercreateTemplate' => 'includes/templates/Usercreate.php',
-
-       # includes/title
-       'PageLinkRenderer' => 'includes/title/PageLinkRenderer.php',
-       'TitleFormatter' => 'includes/title/TitleFormatter.php',
-       'TitleParser' => 'includes/title/TitleParser.php',
-       'TitleValue' => 'includes/title/TitleValue.php',
-       'MalformedTitleException' => 'includes/title/MalformedTitleException.php',
-       'MediaWikiPageLinkRenderer' => 'includes/title/MediaWikiPageLinkRenderer.php',
-       'MediaWikiTitleCodec' => 'includes/title/MediaWikiTitleCodec.php',
-
-       # includes/upload
-       'UploadBase' => 'includes/upload/UploadBase.php',
-       'UploadFromFile' => 'includes/upload/UploadFromFile.php',
-       'UploadFromChunks' => 'includes/upload/UploadFromChunks.php',
-       'UploadFromStash' => 'includes/upload/UploadFromStash.php',
-       'UploadFromUrl' => 'includes/upload/UploadFromUrl.php',
-       'UploadStash' => 'includes/upload/UploadStash.php',
-       'UploadStashBadPathException' => 'includes/upload/UploadStash.php',
-       'UploadStashException' => 'includes/upload/UploadStash.php',
-       'UploadStashFile' => 'includes/upload/UploadStash.php',
-       'UploadStashFileException' => 'includes/upload/UploadStash.php',
-       'UploadStashFileNotFoundException' => 'includes/upload/UploadStash.php',
-       'UploadStashNotAvailableException' => 'includes/upload/UploadStash.php',
-       'UploadStashZeroLengthFileException' => 'includes/upload/UploadStash.php',
-       'UploadStashNotLoggedInException' => 'includes/upload/UploadStash.php',
-       'UploadStashWrongOwnerException' => 'includes/upload/UploadStash.php',
-       'UploadStashNoSuchKeyException' => 'includes/upload/UploadStash.php',
-
-       # includes/utils
-       'CdbException' => 'includes/utils/Cdb.php',
-       'CdbFunctions' => 'includes/utils/CdbPHP.php',
-       'CdbReader' => 'includes/utils/Cdb.php',
-       'CdbReaderDBA' => 'includes/utils/CdbDBA.php',
-       'CdbReaderPHP' => 'includes/utils/CdbPHP.php',
-       'CdbWriter' => 'includes/utils/Cdb.php',
-       'CdbWriterDBA' => 'includes/utils/CdbDBA.php',
-       'CdbWriterPHP' => 'includes/utils/CdbPHP.php',
-       'DoubleReplacer' => 'includes/utils/StringUtils.php',
-       'ExplodeIterator' => 'includes/utils/StringUtils.php',
-       'HashtableReplacer' => 'includes/utils/StringUtils.php',
-       'IP' => 'includes/utils/IP.php',
-       'MWCryptRand' => 'includes/utils/MWCryptRand.php',
-       'MWCryptHKDF' => 'includes/utils/MWCryptHKDF.php',
-       'MWFunction' => 'includes/utils/MWFunction.php',
-       'RegexlikeReplacer' => 'includes/utils/StringUtils.php',
-       'ReplacementArray' => 'includes/utils/StringUtils.php',
-       'Replacer' => 'includes/utils/StringUtils.php',
-       'StringUtils' => 'includes/utils/StringUtils.php',
-       'UIDGenerator' => 'includes/utils/UIDGenerator.php',
-       'ZipDirectoryReader' => 'includes/utils/ZipDirectoryReader.php',
-       'ZipDirectoryReaderError' => 'includes/utils/ZipDirectoryReader.php',
-
-       # languages
-       'ConverterRule' => 'languages/ConverterRule.php',
-       'FakeConverter' => 'languages/FakeConverter.php',
-       'Language' => 'languages/Language.php',
-       'LanguageConverter' => 'languages/LanguageConverter.php',
-       'CLDRPluralRuleConverter' => 'languages/utils/CLDRPluralRuleConverter.php',
-       'CLDRPluralRuleConverterExpression' => 'languages/utils/CLDRPluralRuleConverterExpression.php',
-       'CLDRPluralRuleConverterFragment' => 'languages/utils/CLDRPluralRuleConverterFragment.php',
-       'CLDRPluralRuleConverterOperator' => 'languages/utils/CLDRPluralRuleConverterOperator.php',
-       'CLDRPluralRuleEvaluator' => 'languages/utils/CLDRPluralRuleEvaluator.php',
-       'CLDRPluralRuleEvaluatorRange' => 'languages/utils/CLDRPluralRuleEvaluatorRange.php',
-       'CLDRPluralRuleError' => 'languages/utils/CLDRPluralRuleError.php',
-
-       # maintenance
-       'BackupDumper' => 'maintenance/backup.inc',
-       'ConvertLinks' => 'maintenance/convertLinks.php',
-       'DeleteArchivedFilesImplementation' => 'maintenance/deleteArchivedFiles.inc',
-       'DeleteArchivedRevisionsImplementation' => 'maintenance/deleteArchivedRevisions.inc',
-       'DeleteDefaultMessages' => 'maintenance/deleteDefaultMessages.php',
-       'DumpDBZip2Output' => 'maintenance/backup.inc',
-       'ExportProgressFilter' => 'maintenance/backup.inc',
-       'FakeMaintenance' => 'maintenance/Maintenance.php',
-       'FixExtLinksProtocolRelative' => 'maintenance/fixExtLinksProtocolRelative.php',
-       'LoggedUpdateMaintenance' => 'maintenance/Maintenance.php',
-       'Maintenance' => 'maintenance/Maintenance.php',
-       'PopulateBacklinkNamespace' => 'maintenance/populateBacklinkNamespace.php',
-       'PopulateCategory' => 'maintenance/populateCategory.php',
-       'PopulateImageSha1' => 'maintenance/populateImageSha1.php',
-       'PopulateFilearchiveSha1' => 'maintenance/populateFilearchiveSha1.php',
-       'PopulateLogSearch' => 'maintenance/populateLogSearch.php',
-       'PopulateLogUsertext' => 'maintenance/populateLogUsertext.php',
-       'PopulateParentId' => 'maintenance/populateParentId.php',
-       'PopulateRevisionLength' => 'maintenance/populateRevisionLength.php',
-       'PopulateRevisionSha1' => 'maintenance/populateRevisionSha1.php',
-       'RefreshLinks' => 'maintenance/refreshLinks.php',
-       'SevenZipStream' => 'maintenance/7zip.inc',
-       'Sqlite' => 'maintenance/sqlite.inc',
-       'UpdateCollation' => 'maintenance/updateCollation.php',
-       'UpdateRestrictions' => 'maintenance/updateRestrictions.php',
-       'UserDupes' => 'maintenance/userDupes.inc',
-
-       # maintenance/language
-       'CsvStatsOutput' => 'maintenance/language/StatOutputs.php',
-       'ExtensionLanguages' => 'maintenance/language/languages.inc',
-       'Languages' => 'maintenance/language/languages.inc',
-       'StatsOutput' => 'maintenance/language/StatOutputs.php',
-       'TextStatsOutput' => 'maintenance/language/StatOutputs.php',
-       'WikiStatsOutput' => 'maintenance/language/StatOutputs.php',
-
-       # maintenance/term
-       'AnsiTermColorer' => 'maintenance/term/MWTerm.php',
-       'DummyTermColorer' => 'maintenance/term/MWTerm.php',
-
-       # mw-config
-       'InstallerOverrides' => 'mw-config/overrides.php',
-       'MyLocalSettingsGenerator' => 'mw-config/overrides.php',
-);
+require_once __DIR__ . '/../autoload.php';
 
 class AutoLoader {
        static protected $autoloadLocalClassesLower = null;
index a3c2360..87c6ce5 100644 (file)
@@ -34,13 +34,17 @@ class ChangeTags {
        public static function formatSummaryRow( $tags, $page ) {
                global $wgLang;
 
+               $tags = explode( ',', $tags );
+
+               // XXX(Ori Livneh, 2014-11-08): remove once bug 73181 is resolved.
+               $tags = array_diff( $tags, array( 'HHVM', '' ) );
+
                if ( !$tags ) {
                        return array( '', array() );
                }
 
                $classes = array();
 
-               $tags = explode( ',', $tags );
                $displayTags = array();
                foreach ( $tags as $tag ) {
                        $displayTags[] = Xml::tags(
index b779c01..4a35120 100644 (file)
@@ -2715,8 +2715,8 @@ $wgBrowserBlackList = array(
 $wgLegacySchemaConversion = false;
 
 /**
- * Enable dates like 'May 12' instead of '12 May', this only takes effect if
- * the interface is set to English.
+ * Enable dates like 'May 12' instead of '12 May', if the default date format
+ * is 'dmy or mdy'.
  */
 $wgAmericanDates = false;
 
index eab8031..81f767d 100644 (file)
@@ -1789,52 +1789,37 @@ function wfDebugBacktrace( $limit = 0 ) {
 /**
  * Get a debug backtrace as a string
  *
+ * @param bool|null $raw If true, the return value is plain text. If false, HTML.
+ *   Defaults to $wgCommandLineMode if unset.
  * @return string
+ * @since 1.25 Supports $raw parameter.
  */
-function wfBacktrace() {
+function wfBacktrace( $raw = null ) {
        global $wgCommandLineMode;
 
-       if ( $wgCommandLineMode ) {
-               $msg = '';
-       } else {
-               $msg = "<ul>\n";
+       if ( $raw === null ) {
+               $raw = $wgCommandLineMode;
        }
-       $backtrace = wfDebugBacktrace();
-       foreach ( $backtrace as $call ) {
-               if ( isset( $call['file'] ) ) {
-                       $f = explode( DIRECTORY_SEPARATOR, $call['file'] );
-                       $file = $f[count( $f ) - 1];
-               } else {
-                       $file = '-';
-               }
-               if ( isset( $call['line'] ) ) {
-                       $line = $call['line'];
-               } else {
-                       $line = '-';
-               }
-               if ( $wgCommandLineMode ) {
-                       $msg .= "$file line $line calls ";
-               } else {
-                       $msg .= '<li>' . $file . ' line ' . $line . ' calls ';
-               }
-               if ( !empty( $call['class'] ) ) {
-                       $msg .= $call['class'] . $call['type'];
-               }
-               $msg .= $call['function'] . '()';
 
-               if ( $wgCommandLineMode ) {
-                       $msg .= "\n";
-               } else {
-                       $msg .= "</li>\n";
-               }
-       }
-       if ( $wgCommandLineMode ) {
-               $msg .= "\n";
+       if ( $raw ) {
+               $frameFormat = "%s line %s calls %s()\n";
+               $traceFormat = "%s";
        } else {
-               $msg .= "</ul>\n";
+               $frameFormat = "<li>%s line %s calls %s()</li>\n";
+               $traceFormat = "<ul>\n%s</ul>\n";
        }
 
-       return $msg;
+       $frames = array_map( function ( $frame ) use ( $frameFormat ) {
+               $file = !empty( $frame['file'] ) ? basename( $frame['file'] ) : '-';
+               $line = $frame['line'] ?: '-';
+               $call = $frame['function'];
+               if ( !empty( $frame['class'] ) ) {
+                       $call = $frame['class'] . $frame['type'] . $call;
+               }
+               return sprintf( $frameFormat, $file, $line, $call );
+       }, wfDebugBacktrace() );
+
+       return sprintf( $traceFormat, implode( '', $frames ) );
 }
 
 /**
index 40ebaea..0e9ef2b 100644 (file)
@@ -36,24 +36,11 @@ class Linker {
        const TOOL_LINKS_NOBLOCK = 1;
        const TOOL_LINKS_EMAIL = 2;
 
-       /**
-        * Get the appropriate HTML attributes to add to the "a" element of an
-        * external link, as created by [wikisyntax].
-        *
-        * @param string $class The contents of the class attribute; if an empty
-        *   string is passed, which is the default value, defaults to 'external'.
-        * @return string
-        * @deprecated since 1.18 Just pass the external class directly to something
-        *   using Html::expandAttributes.
-        */
-       static function getExternalLinkAttributes( $class = 'external' ) {
-               wfDeprecated( __METHOD__, '1.18' );
-               return self::getLinkAttributesInternal( '', $class );
-       }
-
        /**
         * Get the appropriate HTML attributes to add to the "a" element of an interwiki link.
         *
+        * @deprecated since 1.25
+        *
         * @param string $title The title text for the link, URL-encoded (???) but
         *   not HTML-escaped
         * @param string $unused Unused
@@ -64,6 +51,8 @@ class Linker {
        static function getInterwikiLinkAttributes( $title, $unused = null, $class = 'external' ) {
                global $wgContLang;
 
+               wfDeprecated( __METHOD__, '1.25' );
+
                # @todo FIXME: We have a whole bunch of handling here that doesn't happen in
                # getExternalLinkAttributes, why?
                $title = urldecode( $title );
@@ -76,6 +65,8 @@ class Linker {
        /**
         * Get the appropriate HTML attributes to add to the "a" element of an internal link.
         *
+        * @deprecated since 1.25
+        *
         * @param string $title The title text for the link, URL-encoded (???) but
         *   not HTML-escaped
         * @param string $unused Unused
@@ -83,6 +74,8 @@ class Linker {
         * @return string
         */
        static function getInternalLinkAttributes( $title, $unused = null, $class = '' ) {
+               wfDeprecated( __METHOD__, '1.25' );
+
                $title = urldecode( $title );
                $title = str_replace( '_', ' ', $title );
                return self::getLinkAttributesInternal( $title, $class );
@@ -92,6 +85,8 @@ class Linker {
         * Get the appropriate HTML attributes to add to the "a" element of an internal
         * link, given the Title object for the page we want to link to.
         *
+        * @deprecated since 1.25
+        *
         * @param Title $nt
         * @param string $unused Unused
         * @param string $class The contents of the class attribute, default none
@@ -100,6 +95,8 @@ class Linker {
         * @return string
         */
        static function getInternalLinkAttributesObj( $nt, $unused = null, $class = '', $title = false ) {
+               wfDeprecated( __METHOD__, '1.25' );
+
                if ( $title === false ) {
                        $title = $nt->getPrefixedText();
                }
@@ -109,12 +106,16 @@ class Linker {
        /**
         * Common code for getLinkAttributesX functions
         *
+        * @deprecated since 1.25
+        *
         * @param string $title
         * @param string $class
         *
         * @return string
         */
        private static function getLinkAttributesInternal( $title, $class ) {
+               wfDeprecated( __METHOD__, '1.25' );
+
                $title = htmlspecialchars( $title );
                $class = htmlspecialchars( $class );
                $r = '';
index 0a8062c..265eae1 100644 (file)
@@ -369,14 +369,14 @@ class Status {
        }
 
        /**
-        * Returns a list of status messages of the given type
+        * Returns a list of status messages of the given type (or all if false)
         * @param string $type
         * @return array
         */
-       protected function getStatusArray( $type ) {
+       protected function getStatusArray( $type = false ) {
                $result = array();
                foreach ( $this->errors as $error ) {
-                       if ( $error['type'] === $type ) {
+                       if ( $type === false || $error['type'] === $type ) {
                                if ( $error['message'] instanceof Message ) {
                                        $result[] = array_merge(
                                                array( $error['message']->getKey() ),
@@ -462,4 +462,45 @@ class Status {
        public function getValue() {
                return $this->value;
        }
+
+       /**
+        * @return string
+        */
+       public function __toString() {
+               $status = $this->isOK() ? "OK" : "Error";
+               if ( count( $this->errors ) ) {
+                       $errorcount = "collected " . ( count($this->errors) ) . " error(s) on the way";
+               } else {
+                       $errorcount = "no errors detected";
+               }
+               if ( isset( $this->value ) ) {
+                       $valstr = gettype( $this->value ) . " value set";
+                       if ( is_object( $this->value ) ) {
+                               $valstr .= "\"" . get_class( $this->value ) . "\" instance";
+                       }
+               } else {
+                       $valstr = "no value set";
+               }
+               $out = sprintf( "<%s, %s, %s>",
+                       $status,
+                       $errorcount,
+                       $valstr
+               );
+               if ( count ($this->errors ) > 0 ) {
+                       $hdr = sprintf( "+-%'-4s-+-%'-25s-+-%'-40s-+\n", "", "", "" );
+                       $i = 1;
+                       $out .= "\n";
+                       $out .= $hdr;
+                       foreach( $this->getStatusArray() as $stat ) {
+                               $out .= sprintf( "| %4d | %-25.25s | %-40.40s |\n",
+                                       $i,
+                                       $stat[0],
+                                       implode(" ", array_slice( $stat, 1 ) )
+                               );
+                               $i += 1;
+                       }
+                       $out .= $hdr;
+               };
+               return $out;
+       }
 }
index 8878660..7f12c16 100644 (file)
@@ -110,7 +110,11 @@ class StubObject {
         * @return object
         */
        public function _newObject() {
-               return MWFunction::newObj( $this->class, $this->params );
+               return ObjectFactory::getObjectFromSpec( array(
+                       'class' => $this->class,
+                       'args' => $this->params,
+                       'closure_expansion' => false,
+               ) );
        }
 
        /**
index ab136b8..fbd6119 100644 (file)
@@ -401,7 +401,8 @@ class WatchedItem {
                $newtitle = $nt->getDBkey();
 
                $dbw = wfGetDB( DB_MASTER );
-               $res = $dbw->select( 'watchlist', 'wl_user',
+               $res = $dbw->select( 'watchlist',
+                       array( 'wl_user', 'wl_notificationtimestamp' ),
                        array( 'wl_namespace' => $oldnamespace, 'wl_title' => $oldtitle ),
                        __METHOD__, 'FOR UPDATE'
                );
@@ -411,7 +412,8 @@ class WatchedItem {
                        $values[] = array(
                                'wl_user' => $s->wl_user,
                                'wl_namespace' => $newnamespace,
-                               'wl_title' => $newtitle
+                               'wl_title' => $newtitle,
+                               'wl_notificationtimestamp' => $s->wl_notificationtimestamp,
                        );
                }
 
index 0292e9a..0b1accb 100644 (file)
@@ -109,7 +109,7 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
                        $this->addWhereFld( 'ct_tag', $params['tag'] );
                }
 
-               if ( $this->fld_content || !is_null( $this->diffto ) || !is_null( $this->difftotext ) ) {
+               if ( $this->fetchContent ) {
                        // Modern MediaWiki has the content for deleted revs in the 'text'
                        // table using fields old_text and old_flags. But revisions deleted
                        // pre-1.5 store the content in the 'archive' table directly using
index 5c44173..b7779a7 100644 (file)
  */
 class ApiQueryBlocks extends ApiQueryBase {
 
-       /**
-        * @var array
-        */
-       protected $usernames;
-
        public function __construct( ApiQuery $query, $moduleName ) {
                parent::__construct( $query, $moduleName, 'bk' );
        }
@@ -102,10 +97,11 @@ class ApiQueryBlocks extends ApiQueryBase {
                        $this->addWhereFld( 'ipb_id', $params['ids'] );
                }
                if ( isset( $params['users'] ) ) {
+                       $usernames = array();
                        foreach ( (array)$params['users'] as $u ) {
-                               $this->prepareUsername( $u );
+                               $usernames[] = $this->prepareUsername( $u );
                        }
-                       $this->addWhereFld( 'ipb_address', $this->usernames );
+                       $this->addWhereFld( 'ipb_address', $usernames );
                        $this->addWhereFld( 'ipb_auto', 0 );
                }
                if ( isset( $params['ip'] ) ) {
@@ -264,7 +260,7 @@ class ApiQueryBlocks extends ApiQueryBase {
                if ( $name === false ) {
                        $this->dieUsage( "User name {$user} is not valid", 'param_user' );
                }
-               $this->usernames[] = $name;
+               return $name;
        }
 
        public function getAllowedParams() {
index 0271037..26ae266 100644 (file)
@@ -94,7 +94,7 @@ class ApiQueryDeletedRevisions extends ApiQueryRevisionsBase {
                        $this->addWhereFld( 'ct_tag', $params['tag'] );
                }
 
-               if ( $this->fld_content || !is_null( $this->diffto ) || !is_null( $this->difftotext ) ) {
+               if ( $this->fetchContent ) {
                        // Modern MediaWiki has the content for deleted revs in the 'text'
                        // table using fields old_text and old_flags. But revisions deleted
                        // pre-1.5 store the content in the 'archive' table directly using
index 2e980f3..32355b9 100644 (file)
@@ -167,7 +167,7 @@ class ApiQueryRevisions extends ApiQueryRevisionsBase {
                        $this->addWhereFld( 'ct_tag', $params['tag'] );
                }
 
-               if ( $this->fld_content || !is_null( $this->diffto ) || !is_null( $this->difftotext ) ) {
+               if ( $this->fetchContent ) {
                        // For each page we will request, the user must have read rights for that page
                        $user = $this->getUser();
                        /** @var $title Title */
index 3879d7b..4d75a20 100644 (file)
@@ -32,7 +32,7 @@
 abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
 
        protected $limit, $diffto, $difftotext, $expandTemplates, $generateXML, $section,
-               $parseContent, $contentFormat, $setParsedLimit = true;
+               $parseContent, $fetchContent, $contentFormat, $setParsedLimit = true;
 
        protected $fld_ids = false, $fld_flags = false, $fld_timestamp = false,
                $fld_size = false, $fld_sha1 = false, $fld_comment = false,
@@ -111,8 +111,11 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
 
                $this->limit = $params['limit'];
 
+               $this->fetchContent = $this->fld_content || !is_null( $this->diffto )
+                       || !is_null( $this->difftotext );
+
                $smallLimit = false;
-               if ( $this->fld_content || !is_null( $this->diffto ) || !is_null( $this->difftotext ) ) {
+               if ( $this->fetchContent ) {
                        $smallLimit = true;
                        $this->expandTemplates = $params['expandtemplates'];
                        $this->generateXML = $params['generatexml'];
@@ -249,7 +252,7 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
 
                $content = null;
                global $wgParser;
-               if ( $this->fld_content || !is_null( $this->diffto ) || !is_null( $this->difftotext ) ) {
+               if ( $this->fetchContent ) {
                        $content = $revision->getContent( Revision::FOR_THIS_USER, $this->getUser() );
                        // Expand templates after getting section content because
                        // template-added sections don't count and Parser::preprocess()
index cc9f9aa..0f33d07 100644 (file)
@@ -116,19 +116,21 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                        $this->dieUsage( $matches->getWikiText(), 'search-error' );
                }
 
-               $apiResult = $this->getResult();
-               // Add search meta data to result
-               if ( isset( $searchInfo['totalhits'] ) ) {
-                       $totalhits = $matches->getTotalHits();
-                       if ( $totalhits !== null ) {
+               if ( $resultPageSet === null ) {
+                       $apiResult = $this->getResult();
+                       // Add search meta data to result
+                       if ( isset( $searchInfo['totalhits'] ) ) {
+                               $totalhits = $matches->getTotalHits();
+                               if ( $totalhits !== null ) {
+                                       $apiResult->addValue( array( 'query', 'searchinfo' ),
+                                               'totalhits', $totalhits );
+                               }
+                       }
+                       if ( isset( $searchInfo['suggestion'] ) && $matches->hasSuggestion() ) {
                                $apiResult->addValue( array( 'query', 'searchinfo' ),
-                                       'totalhits', $totalhits );
+                                       'suggestion', $matches->getSuggestionQuery() );
                        }
                }
-               if ( isset( $searchInfo['suggestion'] ) && $matches->hasSuggestion() ) {
-                       $apiResult->addValue( array( 'query', 'searchinfo' ),
-                               'suggestion', $matches->getSuggestionQuery() );
-               }
 
                // Add the search results to the result
                $terms = $wgContLang->convertForSearchResult( $matches->termMatches() );
@@ -151,7 +153,7 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                        }
 
                        $title = $result->getTitle();
-                       if ( is_null( $resultPageSet ) ) {
+                       if ( $resultPageSet === null ) {
                                $vals = array();
                                ApiQueryBase::addTitleInfo( $vals, $title );
 
@@ -207,7 +209,7 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                        $hasInterwikiResults = true;
 
                        // Include number of results if requested
-                       if ( isset( $searchInfo['totalhits'] ) ) {
+                       if ( $resultPageSet === null && isset( $searchInfo['totalhits'] ) ) {
                                $totalhits = $matches->getTotalHits();
                                if ( $totalhits !== null ) {
                                        $apiResult->addValue( array( 'query', 'interwikisearchinfo' ),
@@ -218,30 +220,35 @@ class ApiQuerySearch extends ApiQueryGeneratorBase {
                        $result = $matches->next();
                        while ( $result ) {
                                $title = $result->getTitle();
-                               $vals = array(
-                                       'namespace' => $result->getInterwikiNamespaceText(),
-                                       'title' => $title->getText(),
-                                       'url' => $title->getFullUrl(),
-                               );
-
-                               // Add item to results and see whether it fits
-                               $fit = $apiResult->addValue(
-                                       array( 'query', 'interwiki' . $this->getModuleName(), $result->getInterwikiPrefix()  ),
-                                       null,
-                                       $vals
-                               );
 
-                               if ( !$fit ) {
-                                       // We hit the limit. We can't really provide any meaningful
-                                       // pagination info so just bail out
-                                       break;
+                               if ( $resultPageSet === null ) {
+                                       $vals = array(
+                                               'namespace' => $result->getInterwikiNamespaceText(),
+                                               'title' => $title->getText(),
+                                               'url' => $title->getFullUrl(),
+                                       );
+
+                                       // Add item to results and see whether it fits
+                                       $fit = $apiResult->addValue(
+                                               array( 'query', 'interwiki' . $this->getModuleName(), $result->getInterwikiPrefix()  ),
+                                               null,
+                                               $vals
+                                       );
+
+                                       if ( !$fit ) {
+                                               // We hit the limit. We can't really provide any meaningful
+                                               // pagination info so just bail out
+                                               break;
+                                       }
+                               } else {
+                                       $titles[] = $title;
                                }
 
                                $result = $matches->next();
                        }
                }
 
-               if ( is_null( $resultPageSet ) ) {
+               if ( $resultPageSet === null ) {
                        $apiResult->setIndexedTagName_internal( array(
                                'query', $this->getModuleName()
                        ), 'p' );
index 18bbc5a..3b8a514 100644 (file)
@@ -183,6 +183,8 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                        $data['linktrail'] = '';
                }
 
+               $data['legaltitlechars'] = Title::legalChars();
+
                global $IP;
                $git = SpecialVersion::getGitHeadSha1( $IP );
                if ( $git ) {
index 09d2086..54ffc2a 100644 (file)
@@ -4,5 +4,7 @@
                        "Red Winged Duck"
                ]
        },
-       "apihelp-main-param-action": "Дзеяньне для выкананьня."
+       "apihelp-main-param-action": "Дзеяньне для выкананьня.",
+       "apihelp-main-param-format": "Фармат вываду.",
+       "apihelp-main-param-smaxage": "Выстаўце загаловак s-maxage на зададзеную колькасьць сэкундаў. Памылкі ніколі не кэшуюцца."
 }
index f8fbdc1..976b6d8 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Mormegil"
+                       "Mormegil",
+                       "YjM"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/API:Main_page Dokumentace]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/API:FAQ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-mailová konference]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Oznámení k API]\n* [https://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts Chyby a požadavky]\n</div>\n<strong>Stav:</strong> Všechny funkce uvedené na této stránce by měly fungovat, ale API se stále aktivně vyvíjí a může se kdykoli změnit. Upozornění na změny získáte přihlášením se k [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-mailové konferenci mediawiki-api-announce].\n\n<strong>Chybné požadavky:</strong> Pokud jsou do API zaslány chybné požadavky, bude vrácena HTTP hlavička s klíčem „MediaWiki-API-Error“ a hodnota této hlavičky a chybový kód budou nastaveny na stejnou hodnotu. Více informací najdete na stránce https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
        "apihelp-main-param-curtimestamp": "Zahrnout do odpovědi aktuální časové razítko.",
        "apihelp-main-param-origin": "Pokud k API přistupujete pomocí mezidoménového AJAXového požadavku (CORS), nastavte tento parametr na doménu původu. Musí být součástí všech předběžných požadavků, takže musí být součástí URI požadavku (nikoli těla POSTu). Hodnota musí přesně odpovídat jednomu z původů v hlavičce Origin:, takže musí být nastavena na něco jako http://en.wikipedia.org nebo https://meta.wikimedia.org. Pokud parametr neodpovídá hlavičce Origin:, bude vrácena odpověď 403. Pokud parametr odpovídá hlavičce Origin: a tento původ je na bílé listině, bude nastavena hlavička Access-Control-Allow-Origin.",
        "apihelp-main-param-uselang": "Jazyk, který se má použít pro překlad hlášení. Seznam kódů lze načíst z [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] se siprop=languages nebo uveďte „user“ pro použití předvoleného jazyka aktuálního uživatele či „content“ pro použití jazyka obsahu této wiki.",
+       "apihelp-block-description": "Zablokovat uživatele.",
+       "apihelp-block-param-user": "Uživatelské jméno, IP adresa nebo rozsah IP adres, které chcete zablokovat.",
+       "apihelp-block-param-reason": "Důvod bloku.",
+       "apihelp-block-param-anononly": "Zablokovat pouze anonymní uživatele (tj. zakázat editovat anonymně z této IP).",
+       "apihelp-block-param-nocreate": "Nedovolit registraci nových uživatelů.",
+       "apihelp-block-param-noemail": "Zakázat uživateli posílat e-maily prostřednictvím wiki. (Vyžaduje oprávnění „blockemail“.)",
+       "apihelp-block-param-allowusertalk": "Povolit uživateli editovat svou vlastní diskusní stránku (závisí na $wgBlockAllowsUTEdit).",
+       "apihelp-block-param-reblock": "Pokud již uživatel blokován je, přepsat současný blok.",
+       "apihelp-block-param-watchuser": "Sledovat uživatelskou a diskusní stranu tohoto uživatele nebo adresy IP.",
+       "apihelp-block-example-user-complex": "Trvale zablokovat uživatele Vandal s odůvodněním „Vandalism“ a bránit vytváření nových účtů a e-mailování",
+       "apihelp-compare-description": "Vrátí rozdíl dvou stránek.\n\nVe „from“ a „to“ musíte zadat číslo revize, název stránky nebo ID stránky.",
+       "apihelp-compare-param-fromtitle": "Název první stránky k porovnání.",
+       "apihelp-compare-param-fromid": "ID první stránky k porovnání.",
+       "apihelp-compare-param-fromrev": "Číslo revize první stránky k porovnání.",
+       "apihelp-compare-param-totitle": "Název druhé stránky k porovnání.",
+       "apihelp-compare-param-toid": "ID druhé stránky k porovnání.",
+       "apihelp-compare-param-torev": "Číslo revize druhé stránky k porovnání.",
+       "apihelp-compare-example-1": "Porovnat revize 1 a 2.",
+       "apihelp-createaccount-description": "Vytvořit nový uživatelský účet.",
+       "apihelp-createaccount-param-name": "Uživatelské jméno.",
+       "apihelp-createaccount-param-password": "Heslo (ignorováno, pokud je nastaveno $1mailpassword).",
+       "apihelp-createaccount-param-email": "E-mailová adresa uživatele (nepovinné).",
+       "apihelp-createaccount-param-realname": "Skutečné jméno uživatele (nepovinné).",
+       "apihelp-createaccount-param-mailpassword": "Pokud je nastaveno na libovolnou hodnotu, zašle se náhodně vygenerované heslo na e-mail uživatele.",
+       "apihelp-delete-description": "Smazat stránku.",
        "apihelp-help-description": "Zobrazuje nápovědu k uvedeným modulům.",
        "apihelp-help-param-modules": "Moduly, pro které se má zobrazit nápověda (hodnoty parametrů action= a format= nebo „main“). Submoduly lze zadávat pomocí „+“.",
-       "apihelp-help-param-submodules": "Zahrnout nápovědu pro submoduly uvedeného modulu.",
-       "apihelp-help-param-recursivesubmodules": "Zahrnout nápovědu pro submoduly rekurzivně.",
+       "apihelp-help-param-submodules": "Zahrnout nápovědu pro podmoduly uvedeného modulu.",
+       "apihelp-help-param-recursivesubmodules": "Zahrnout nápovědu pro podmoduly rekurzivně.",
        "apihelp-help-param-helpformat": "Formát výstupu nápovědy.",
        "apihelp-help-param-wrap": "Obalit výstup do standardní struktury API odpovědi.",
        "apihelp-help-param-toc": "Zahrnout v HTML výstupu tabulku obsahu.",
        "apihelp-help-example-main": "Nápověda k hlavnímu modulu",
        "apihelp-help-example-recursive": "Veškerá nápověda na jedné stránce",
        "apihelp-help-example-help": "Nápověda k samotnému modulu nápovědy",
-       "apihelp-help-example-query": "Nápověda pro dva submoduly query",
+       "apihelp-help-example-query": "Nápověda pro dva podmoduly query",
        "apihelp-format-example-generic": "Výsledek dotazu vypsat ve formátu $1.",
        "apihelp-dbg-description": "Vypisuje data ve formátu funkce var_export() z PHP.",
        "apihelp-dbgfm-description": "Vypisuje data ve formátu funkce var_export() z PHP (v čitelné HTML podobě).",
@@ -38,7 +64,7 @@
        "apihelp-jsonfm-description": "Vypisuje data ve formátu JSON (v čitelné HTML podobě).",
        "apihelp-none-description": "Nevypisuje nic.",
        "apihelp-php-description": "Vypisuje data v serializačním formátu PHP.",
-       "apihelp-phpfm-description": "Vypisuje data ve serializačním formátu PHP (v čitelné HTML podobě).",
+       "apihelp-phpfm-description": "Vypisuje data v serializačním formátu PHP (v čitelné HTML podobě).",
        "apihelp-rawfm-description": "Vypisuje data s ladicími prvky ve formátu JSON (v čitelné HTML podobě).",
        "apihelp-txt-description": "Vypisuje data ve formátu funkce print_r() z PHP.",
        "apihelp-txtfm-description": "Vypisuje data ve formátu funkce print_r() z PHP (v čitelné HTML podobě).",
index d1551ce..70d32e5 100644 (file)
        "apihelp-logout-example-logout": "Meldet den aktuellen Benutzer ab",
        "apihelp-move-description": "Eine Seite verschieben.",
        "apihelp-move-param-from": "Titel der Seite, die du verschieben möchtest. Kann nicht zusammen mit $1fromid verwendet werden.",
+       "apihelp-move-param-fromid": "Seitenkennung der Seite, die du verschieben möchtest. Kann nicht zusammen mit $1from verwendet werden.",
        "apihelp-move-param-to": "Titel, zu dem die Seite umbenannt werden soll.",
        "apihelp-move-param-reason": "Grund für die Verschiebung.",
        "apihelp-move-param-movetalk": "Verschiebt die Diskussionsseite, falls vorhanden.",
        "apihelp-purge-param-forcelinkupdate": "Aktualisiert die Linktabellen.",
        "apihelp-query+allcategories-description": "Alle Kategorien aufzählen.",
        "apihelp-query+allcategories-param-limit": "Wie viele Kategorien zurückgegeben werden sollen.",
+       "apihelp-query+alldeletedrevisions-param-namespace": "Nur Seiten in diesem Namensraum auflisten.",
        "apihelp-query+allfileusages-param-limit": "Wie viele Gesamtobjekte zurückgegeben werden sollen.",
        "apihelp-query+allfileusages-example-unique": "Einheitliche Dateititel auflisten",
        "apihelp-query+allfileusages-example-generator": "Seiten abrufen, die die Dateien enthalten",
        "apihelp-query+allredirects-example-generator": "Seiten abrufen, die die Weiterleitungen enthalten",
        "apihelp-query+alltransclusions-param-namespace": "Der aufzulistende Namensraum.",
        "apihelp-query+alltransclusions-example-unique": "Einheitlich eingebundene Titel auflisten",
+       "apihelp-query+allusers-param-limit": "Wie viele Benutzernamen insgesamt zurückgegeben werden sollen.",
        "apihelp-query+allusers-example-Y": "Benutzer ab Y auflisten",
        "apihelp-query+backlinks-description": "Alle Seiten finden, die auf die angegebene Seite verlinken.",
        "apihelp-query+backlinks-example-simple": "Links auf [[Hauptseite]] anzeigen",
        "apihelp-query+deletedrevs-param-from": "Auflistung bei diesem Titel beginnen.",
        "apihelp-query+deletedrevs-param-to": "Auflistung bei diesem Titel beenden.",
        "apihelp-query+extlinks-param-limit": "Wie viele Links zurückgegeben werden sollen.",
+       "apihelp-query+exturlusage-param-limit": "Wie viele Seiten zurückgegeben werden sollen.",
+       "apihelp-query+filearchive-example-simple": "Eine Liste aller gelöschten Dateien auflisten",
        "apihelp-query+imageinfo-param-limit": "Wie viele Dateiversionen pro Datei zurückgegeben werden sollen.",
        "apihelp-query+imageinfo-param-start": "Zeitstempel, von dem die Liste beginnen soll.",
        "apihelp-query+imageinfo-param-end": "Zeitstempel, an dem die Liste enden soll.",
index 10e0741..ba1d552 100644 (file)
        "apihelp-createaccount-description": "Crear una nueva cuenta de usuario.",
        "apihelp-createaccount-param-name": "Nombre de usuario.",
        "apihelp-delete-description": "Borrar una página.",
-       "apihelp-delete-param-watch": "Añadir esta página a su lista de seguimiento",
-       "apihelp-delete-param-unwatch": "Borrar esta página de su lista de seguimiento",
+       "apihelp-delete-param-watch": "Añadir esta página a tu lista de seguimiento.",
+       "apihelp-delete-param-unwatch": "Borrar esta página de tu lista de seguimiento.",
        "apihelp-delete-example-simple": "Borrar la Página Principal",
        "apihelp-edit-description": "Crear y editar páginas.",
        "apihelp-edit-param-minor": "Edición menor.",
        "apihelp-edit-param-notminor": "Edición no menor.",
        "apihelp-edit-param-bot": "Marcar esta edición como de bot.",
-       "apihelp-edit-example-edit": "Editar una página.",
+       "apihelp-edit-example-edit": "Editar una página",
        "apihelp-expandtemplates-param-title": "Título de la página.",
        "apihelp-feedrecentchanges-param-hideminor": "Ocultar cambios menores.",
        "apihelp-login-param-name": "Nombre de usuario.",
@@ -28,9 +28,9 @@
        "apihelp-login-param-domain": "Dominio (opcional).",
        "apihelp-move-description": "Mover una página.",
        "apihelp-opensearch-param-search": "Buscar cadena.",
-       "apihelp-patrol-example-rcid": "Patrullar un cambio reciente.",
-       "apihelp-patrol-example-revid": "Patrullar una revisión.",
-       "apihelp-protect-example-protect": "Proteger una página.",
+       "apihelp-patrol-example-rcid": "Patrullar un cambio reciente",
+       "apihelp-patrol-example-revid": "Patrullar una revisión",
+       "apihelp-protect-example-protect": "Proteger una página",
        "apihelp-query+allusers-param-activeusers": "Solo listar usuarios activos en {{PLURAL:$1|el último día|los $1 últimos días}}.",
        "apihelp-query+images-description": "Devuelve todos los archivos contenidos en las páginas dadas.",
        "apihelp-query+search-param-info": "Qué metadatos devolver.",
index 2077c85..5a9e66b 100644 (file)
@@ -2,10 +2,11 @@
        "@metadata": {
                "authors": [
                        "Gomoko",
-                       "Windes"
+                       "Windes",
+                       "Orlodrim"
                ]
        },
-       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Documentation]\n* [https://www.mediawiki.org/wiki/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://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts 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>Demandes erronées :</strong> Qaund des demandes erronés sont envoyées à l’API, un entête HTTP sera renvoyé avec la clé « MediaWiki-API-Error » et à la fois la valeur de l’entête et le code d’erreur retourné prendront la même valeur. Pour plus d’information, voyez https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Documentation]\n* [https://www.mediawiki.org/wiki/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://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts 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 en-tête HTTP sera renvoyé avec la clé « MediaWiki-API-Error ». La valeur de cet en-tête et le code d’erreur renvoyé prendront la même valeur. Pour plus d’information, voyez https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
        "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 « maxlag » est renvoyé avec un message tel que « Attente de $host : $lag secondes de délai ».<br />Voyez https://www.mediawiki.org/wiki/Manual:Maxlag_parameter pour plus d’information.",
        "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-param-prop": "Quelles propriétés supplémentaires récupérer :\n;protection:Liste de niveau de protection de chaque page.\n;talkid:L’ID de la page de discussion pour chaque page qui n’est pas une page de discussion.\n;watched:Liste de l’état de suivi de chaque page.\n;watchers:Le nombre d’observateurs, si c&est autorisé.\n;notificationtimestamp:L’horodatage de notification de la liste de suivi de chaque page.\n;subjectid:L’ID de la page parente de chaque page de discussion.\n;url:Fournit une URL complète, une URL de modification, et l’URL canonique pour chaque page.\n;readable:Si l’utilisateur peut lire cette page.\n;preload:Fournit le texte renvoyé par EditFormPreloadText.\n;displaytitle:Fournit la manière dont le titre de la page est vraiment affiché.",
+       "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 [[Main Page]]",
+       "apihelp-query+info-example-protection": "Obtenir des informations générale et de protection sur [[Main Page]]",
+       "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é). N’utiliser aucun paramètre revient en pratique à « 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 $1blprefix.",
+       "apihelp-query+iwbacklinks-param-limit": "Combien de pages renvoyer.",
+       "apihelp-query+iwbacklinks-param-prop": "Quelles propriétés obtenir :\n;iwprefix:Ajoute le préfixe de l’interwiki.\n;iwtitle:Ajoute le titre de l’interwiki.",
+       "apihelp-query+iwbacklinks-param-dir": "La direction dans laquelle lister.",
+       "apihelp-query+iwbacklinks-example-simple": "Obtenir les pages ayant un lien vers [[wikibooks:Test]]",
+       "apihelp-query+iwbacklinks-example-generator": "Obtenir des informations sur les pages ayant un lien vers [[wikibooks:Test]]",
+       "apihelp-query+iwlinks-description": "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 :\n;url:Ajoute l’URL complète.",
+       "apihelp-query+iwlinks-param-limit": "Combien de liens interwiki renvoyer.",
+       "apihelp-query+iwlinks-param-prefix": "Renvoyer uniquement les liens interwiki avec ce préfixe.",
+       "apihelp-query+iwlinks-param-title": "Lien interwiki à rechercher. Doit être utilisé avec $1prefix.",
+       "apihelp-query+iwlinks-param-dir": "La direction dans laquelle lister.",
+       "apihelp-query+iwlinks-example-simple": "Obtenir les liens interwiki de [[Main Page]]",
+       "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-prop": "Quelles propriétés obtenir :\n;lllang:Ajoute le code de langue du lien de langue.\n;lltitle:Ajoute le titre du lien de langue.",
+       "apihelp-query+langbacklinks-param-dir": "La direction dans laquelle lister.",
+       "apihelp-query+langbacklinks-example-simple": "Obtenir les pages avec un lien avec [[: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-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 $1prop).",
+       "apihelp-query+langlinks-param-prop": "Quelles propriétés supplémentaires obtenir pour chaque lien interlangue :\n;url:Ajoute l’URL complète.\n;langname:Ajoute le nom localisé de la langue (au mieux). Utiliser $1inlanguagecode pour contrôler la langue.\n;autonym:Ajoute le nom natif de la langue.",
+       "apihelp-query+langlinks-param-lang": "Renvoyer uniquement les liens interlangue avec ce code de langue.",
+       "apihelp-query+langlinks-param-title": "Lien à rechercher. Doit être utilisé avec $1lang.",
+       "apihelp-query+langlinks-param-dir": "La direction dans laquelle énumérer.",
+       "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 [[Main Page]]",
+       "apihelp-query+links-description": "Renvoie tous les liens des pages fournies.",
+       "apihelp-query+links-param-namespace": "Afficher les liens uniquement dans ces espaces de nom.",
+       "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-param-dir": "La direction dans laquelle lister.",
+       "apihelp-query+links-example-simple": "Obtenir les liens de [[Main Page]]",
+       "apihelp-query+links-example-generator": "Obtenir des informations sur tous les liens de page dans [[Main Page]]",
+       "apihelp-query+links-example-namespaces": "Obtenir les liens de [[Main Page]] dans les espaces de nom Utilisateur et Modèle",
+       "apihelp-query+linkshere-description": "Trouver toutes les pages ayant un lien vers les pages données.",
+       "apihelp-query+linkshere-param-prop": "Quelles propriétés obtenir :\n;pageid:ID de chaque page.\n;title:Titre de chaque page.\n;redirect:Indique si la page est une redirection.",
+       "apihelp-query+linkshere-param-namespace": "Inclure uniquement les pages dans ces espaces de nom.",
+       "apihelp-query+linkshere-param-limit": "Combien de résultats renvoyer.",
+       "apihelp-query+linkshere-param-show": "Afficher uniquement les éléments qui correspondent à ces critères :\n;redirect:Afficher uniquement les redirections.\n;!redirects: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-param-prop": "Quelles propriétés obtenir :\n;ids:Ajoute l’ID de l’événement.\n;title:Ajoute le titre de la page pour l’événement.\n;type:Ajoute le type de l’événement.\n;user:Ajoute l’utilisateur responsable de l’événement.\n;userid:Ajoute l’ID de l’utilisateur responsable de l’événement.\n;timestamp:Ajoute l’horodatage de l’événement.\n;comment:Ajoute le commentaire de l’événement.\n;parsedcomment:Ajoute le commentaire analysé de l’événement.\n;details:Liste les détails supplémentaires sur l’événement.\n;tags:Liste les balises de l’événement.",
+       "apihelp-query+logevents-param-type": "Filtrer les entrées du journal à ce seul type.",
+       "apihelp-query+logevents-param-action": "Filtrer les actions du journal à cette seule action. Écrase $1type. Des actions avec une astérisque de la forme « action/* » sont autorisées pour spécifier n’importe quelle chaîne à la place de l’astérisque.",
+       "apihelp-query+logevents-param-start": "L’horodatage auquel démarrer l’énumération.",
+       "apihelp-query+logevents-param-end": "L’horodatage auquel arrêter l’énumération.",
+       "apihelp-query+logevents-param-user": "Restreindre aux entrées générées par l’utilisateur spécifié.",
+       "apihelp-query+logevents-param-title": "Restreindre aux entrées associées à une page donnée.",
+       "apihelp-query+logevents-param-namespace": "Restreindre aux entrées dans l’espace de nom spécifié.",
+       "apihelp-query+logevents-param-prefix": "Restreindre aux entrées commençant par ce préfixe.",
+       "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-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 définies dans le contenu de la page.",
+       "apihelp-query+pageprops-param-prop": "Lister uniquement ces propriétés. Utile pour vérifier si une certaine page utilise une certaine propriété de page.",
+       "apihelp-query+pageprops-example-simple": "Obtenir les propriétés de [[:Category:Foo]]",
+       "apihelp-query+pageswithprop-description": "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.",
+       "apihelp-query+pageswithprop-param-prop": "Quelles informations inclure :\n;ids:Ajoute l’ID de la page.\n;title:Ajoute le titre et l’ID de l’espace de noms de la page.\n;value:Ajoute la valeur de la propriété de page.",
+       "apihelp-query+pageswithprop-param-limit": "Le nombre maximal de pages à renvoyer.",
+       "apihelp-query+pageswithprop-param-dir": "Dans quelle direction trier.",
+       "apihelp-query+pageswithprop-example-simple": "Lister les 10 premières pages en utilisant &#123;&#123;DISPLAYTITLE:&#125;&#125;",
+       "apihelp-query+pageswithprop-example-generator": "Obtenir des informations sur les 10 premières pages utilisant _&#95;NOTOC_&#95;",
+       "apihelp-query+prefixsearch-description": "Effectuer une recherche de préfixe sur les titres de page.",
+       "apihelp-query+prefixsearch-param-search": "Chaîne de recherche.",
+       "apihelp-query+prefixsearch-param-namespace": "Espaces de nom à rechercher.",
+       "apihelp-query+prefixsearch-param-limit": "Nombre maximal de résultats à renvoyer.",
+       "apihelp-query+prefixsearch-example-simple": "Rechercher les titres de page commençant par « meaning »",
+       "apihelp-query+protectedtitles-description": "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-param-start": "Démarrer la liste à cet horodatage de protection.",
+       "apihelp-query+protectedtitles-param-end": "Arrêter la liste à cet horodatage de protection.",
+       "apihelp-query+protectedtitles-param-prop": "Quelles propriétés obtenir :\n;timestamp:Ajoute l’horodatage de l’ajout de la protection.\n;user:Ajoute l’utilisateur ayant ajouté la protection.\n;userid:Ajoute l’ID de l’utilisateur ayant ajouté la protection.\n;comment:Ajoute le commentaire de la protection.\n;parsedcomment:Ajoute le commentaire analysé de la protection.\n;expiry:Ajoute l’horodatage de levée de la protection.\n;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-param-page": "Le nom de la page spéciale. Remarque, 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 sur votre liste est « Accueil », la seconde sera *toujours* « Liste des singes de fiction », la troisième « Liste de personnes figurant sur les timbres de Vanuatu », etc.\n\nSi le nombre de page dans l’espace de nom est inférieur à $1limit, vous obtiendrez moins de page. Vous n'obtiendrez jamais deux fois la même page.",
+       "apihelp-query+random-param-namespace": "Renvoyer seulement des pages de ces espaces de noms.",
+       "apihelp-query+random-param-limit": "Limite sur le nombre de pages aléatoires renvoyées.",
+       "apihelp-query+random-param-redirect": "Charger une redirection aléatoire plutôt qu’une page aléatoire.",
+       "apihelp-query+random-example-simple": "Obtenir deux pages aléatoires de l’espace 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-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 nom.",
+       "apihelp-query+recentchanges-param-user": "Lister uniquement les modifications par cet utilisateur.",
+       "apihelp-query+recentchanges-param-excludeuser": "Ne pas lister les modifications par cet utilisateur.",
+       "apihelp-query+recentchanges-param-tag": "Lister uniquement les modifications marquées avec cette balise.",
+       "apihelp-query+recentchanges-param-prop": "Inclure des informations supplémentaires :\n;user:Ajoute l’utilisateur responsable de la modification et marque si c’est une adresse IP.\n;userid:Ajoute l’ID de l’utilisateur responsable de la modification.\n;comment:Ajoute le commentaire de la modification.\n;parsedcomment:Ajoute le commentaire analysé pour la modification.\n;flags:Ajoute les balises de la modification.\n;timestamp:Ajoute l’horodatage de la modification.\n;title:Ajoute le titre de la page modifiée.\n;ids:Ajoute l’ID de la page, l’ID des modifications récentes et l’ID de l’ancienne et la nouvelle révisions.\n;sizes:Ajoute l’ancienne et la nouvelle tailles de la page en octets.\n;redirect:Marque la modification si la page est une redirection.\n;patrolled:Marque les modifications patrouillables comme patrouillées ou non.\n;loginfo:Ajoute les informations du journal (Id du journal, type de trace, etc.) aux entrées du journal.\n;tags:Liste les balises de l’entrée.\n;sha1:Ajoute la somme de contrôle du contenu pour les entrées associées à une révision.",
+       "apihelp-query+recentchanges-param-token": "Utiliser plutôt [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
+       "apihelp-query+recentchanges-param-show": "Afficher uniquement les éléments correspondant à ces critères. Par exemple, pour voir uniquement les modifications mineures par des utilisateurs connectés, mettre $1show=minor|!anon.",
+       "apihelp-query+recentchanges-param-limit": "Combien de modifications renvoyer au total.",
+       "apihelp-query+recentchanges-param-type": "Quels types de modification afficher.",
+       "apihelp-query+recentchanges-param-toponly": "Lister uniquement les modifications qui sont de la dernière révision.",
+       "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-param-prop": "Quelles propriétés récupérer :\n;pageid:ID de page de chaque redirection.\n;title:Titre de chaque redirection.\n;fragment:Fragment de chaque redirection, s’il y en a un.",
+       "apihelp-query+redirects-param-namespace": "Inclure uniquement les pages dans ces espaces de nom.",
+       "apihelp-query+redirects-param-limit": "Combien de redirections renvoyer.",
+       "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 début, fin ou limite.\n# Obtenir des données sur un ensemble de révisions en donnant leurs IDs et leurs ids de révision.",
+       "apihelp-query+revisions-paraminfo-singlepageonly": "Utilisable uniquement avec une seule page (mode #2).",
+       "apihelp-query+revisions-param-startid": "À quel ID de révision démarrer l’énumération.",
+       "apihelp-query+revisions-param-endid": "Arrêter l’énumération des révisions à cet ID.",
+       "apihelp-query+revisions-param-start": "À quel horodatage de révision démarrer l’énumération.",
+       "apihelp-query+revisions-param-end": "Énumérer jusqu’à cet horodatage.",
+       "apihelp-query+revisions-param-user": "Inclure uniquement les révisions faites par l’utilisateur.",
+       "apihelp-query+revisions-param-excludeuser": "Exclure les révisions faites par l’utilisateur.",
+       "apihelp-query+revisions-param-tag": "Lister uniquement les révisions marquées avec cette balise.",
+       "apihelp-query+revisions-param-token": "Quels jetons obtenir pour chaque révision.",
+       "apihelp-query+revisions-example-content": "Obtenir des données avec le contenu pour la dernière révision des titres « API » et « Page principale »",
+       "apihelp-query+revisions-example-last5": "Obtenir les 5 dernières révisions de la « Page principale »",
+       "apihelp-query+revisions-example-first5": "Obtenir les 5 premières révisions de la « Page principale »",
+       "apihelp-query+revisions-example-first5-after": "Obtenir les 5 premières révisions de la « Page principale » faites après le 01/05/2006",
+       "apihelp-query+revisions-example-first5-not-localhost": "Obtenir les 5 premières révisions de la « Page principale » qui n’ont pas été faites par l’utilisateur anonyme « 127.0.0.1 »",
+       "apihelp-query+revisions-example-first5-user": "Obtenir les 5 premières révisions de la « Page principale » qui ont été faites par l’utilisateur « MédiaWiki par défaut »",
+       "apihelp-query+revisions+base-param-prop": "Quelles propriétés obtenir pour chaque révision :\n;ids:L’ID de la révision.\n;flags:Marques de la révision (mineure).\n;timestamp:L’horodatage de la révision.\n;user:Utilisateur ayant fait la révision.\n;userid:ID de l’utilisateur ayant créé la révision.\n;size:Taille (en octets) de la révision.\n;sha1:SHA-1 (base 16) de la révision.\n;contentmodel:ID du modèle de contenu de la révision.\n;comment:Commentaire par l’utilisateur de la révision.\n;parsedcomment:Commentaire analysé par l’utilisateur de la révision.\n;content:Texte de la révision.\n;tags:Balises de la révision.",
+       "apihelp-query+revisions+base-param-limit": "Limiter le nombre de révisions retournées.",
+       "apihelp-query+revisions+base-param-expandtemplates": "Développer les modèles dans le contenu de la révision (nécessite $1prop=content).",
+       "apihelp-query+revisions+base-param-generatexml": "Générer l’arbre d’analyse XML pour le contenu de la révision (nécessite $1prop=content).",
+       "apihelp-query+revisions+base-param-parse": "Analyser le contenu de la révision (nécessite $1prop=content). Pour des raisons de performance, si cette option est utilisée, $1limit est forcé à 1.",
+       "apihelp-query+revisions+base-param-section": "Récupérer uniquement le contenu de ce numéro de section.",
+       "apihelp-query+revisions+base-param-diffto": "ID de révision à comparer à chaque révision. Utiliser « prev », « next » et « cur » pour la version précédente, suivante et actuelle respectivement.",
+       "apihelp-query+revisions+base-param-difftotext": "Texte auquel comparer chaque révision. Compare uniquement un nombre limité de révisions. Écrase $1diffto. Si $1section est positionné, seule cette section sera comparée avec ce texte",
+       "apihelp-query+revisions+base-param-contentformat": "Format de sérialisation utilisé pour $1difftotext et attendu pour la sortie du contenu.",
+       "apihelp-query+search-description": "Effectuer une recherche en texte intégral.",
+       "apihelp-query+search-param-search": "Rechercher les titres (ou le contenu) de toutes les pages ayant cette valeur.",
+       "apihelp-query+search-param-namespace": "Rechercher uniquement dans ces espaces de nom.",
+       "apihelp-query+search-param-what": "Quel type de recherche effectuer.",
+       "apihelp-query+search-param-info": "Quelles métadonnées renvoyer.",
+       "apihelp-query+search-param-prop": "Quelles propriétés renvoyer :\n;size:Ajoute la taille de la page en octets.\n;wordcount:Ajoute le nombre de mots de la page.\n;timestamp:Ajoute l’horodatage de la dernière modification de la page.\n;snippet:Ajoute un extrait analysé de la page.\n;titlesnippet:Ajoute un extrait analysé du titre de la page.\n;redirectsnippet:Ajoute un extrait analysé du titre de la redirection.\n;redirecttitle:Ajoute le titre de la redirection correspondante.\n;sectionsnippet:Ajoute un extrait analysé du titre de la section correspondante.\n;sectiontitle:Ajoute le titre de la section correspondante.\n;score:<span class=\"apihelp-deprecated\">Obsolète et ignoré.</span>\n;hasrelated:<span class=\"apihelp-deprecated\">Obsolète et ignoré.</span>",
+       "apihelp-query+search-param-limit": "Combien de pages renvoyer au total.",
+       "apihelp-query+search-param-interwiki": "Inclure les résultats interwiki dans la recherche, s’ils sont disponibles.",
+       "apihelp-query+search-param-backend": "Quel serveur de recherche utiliser, si ce n’est pas celui par défaut.",
+       "apihelp-query+search-example-simple": "Rechercher « signification »",
+       "apihelp-query+search-example-text": "Rechercher des textes pour « signification »",
+       "apihelp-query+search-example-generator": "Obtenir les informations sur les pages renvoyées par une recherche de « signification »",
+       "apihelp-query+siteinfo-description": "Renvoyer les informations générales sur le site.",
        "apihelp-format-example-generic": "Mettre en forme le résultat de la requête dans le format $1",
        "apihelp-dbg-description": "Extraire les données au format de var_export() de PHP.",
        "apihelp-dbgfm-description": "Extraire les données au format de var_export() de PHP (affiché proprement en HTML).",
        "apihelp-yamlfm-description": "Extraire les données YAML (affiché proprement en HTML).",
        "api-format-title": "Résultat de l’API de MédiaWiki",
        "api-format-prettyprint-header": "Vous regardez 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 format pour modifier le format de sortie. Pour voir la représentation non HTML du format $1, mettez format=$2.\n\nVoyez la [https://www.mediawiki.org/wiki/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 MédiaWiki",
+       "api-help-title": "Aide de l’API de MediaWiki",
        "api-help-lead": "Ceci est une page d’aide de l’API de MédiaWiki générée automatiquement.\n\nDocumentation et exemples : https://www.mediawiki.org/wiki/API",
        "api-help-main-header": "Module principal",
        "api-help-flag-deprecated": "Ce module est obsolète.",
index 8363d0d..0d4e3ae 100644 (file)
@@ -2,11 +2,21 @@
        "@metadata": {
                "authors": [
                        "Guycn2",
-                       "Amire80"
+                       "Amire80",
+                       "Inkbug"
                ]
        },
        "apihelp-main-param-action": "איזו פעולה לבצע.",
        "apihelp-main-param-format": "התבנית של הפלט.",
+       "apihelp-block-description": "חסימת משתמש.",
+       "apihelp-block-param-user": "שם משתמש, כתובת IP, או טווח IP שהנך רוצה לחסום.",
+       "apihelp-block-param-reason": "סיבה לחסימה.",
+       "apihelp-createaccount-param-name": "שם משתמש.",
+       "apihelp-delete-example-simple": "מחיקת הדף הראשי",
+       "apihelp-edit-param-minor": "עריכה משנית.",
+       "apihelp-edit-example-edit": "עריכת דף",
+       "apihelp-emailuser-description": "שליחת דוא\"ל למשתמש.",
+       "apihelp-expandtemplates-param-title": "כותרת הדף.",
        "apihelp-help-description": "הצגת עזרה עבור היחידות שצוינו.",
        "apihelp-help-param-toc": "לכלול תוכן עניינים בפלט HTML.",
        "apihelp-query+categories-param-limit": "כמה קטגוריות להחזיר.",
index 46da945..a06db94 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Shirayuki"
+                       "Shirayuki",
+                       "2nd-player"
                ]
        },
        "apihelp-main-param-action": "実行する操作です。",
        "apihelp-main-param-servedby": "リクエストを処理したホスト名を結果に含めます。",
        "apihelp-main-param-curtimestamp": "現在のタイムスタンプを結果に含めます。",
        "apihelp-main-param-uselang": "メッセージの翻訳に使用する言語です。コードの一覧は [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] に siprop=languages を付けることで取得できます。\"user\" を指定することで現在の利用者の個人設定の言語を、\"content\" を指定することでこのウィキの本文の言語を使用することもできます。",
+       "apihelp-block-description": "利用者をブロックします。",
+       "apihelp-block-param-nocreate": "アカウントの作成を禁止します。",
+       "apihelp-createaccount-description": "新しい利用者アカウントを作成します。",
+       "apihelp-createaccount-param-password": "パスワード ($1mailpassword が設定されると無視されます)。",
+       "apihelp-createaccount-param-token": "最初のリクエストで得られたアカウント作成用トークンです。",
+       "apihelp-createaccount-param-email": "利用者の電子メールアドレス (任意)。",
+       "apihelp-createaccount-param-mailpassword": "設定されると (その値を問わず)、ランダムなパスワードがその利用者に電子メールで送られます。",
+       "apihelp-createaccount-example-mail": "利用者「testuser」を作成し、ランダムに生成されたパスワードをメールで送る",
+       "apihelp-delete-description": "ページを削除します。",
+       "apihelp-delete-param-title": "削除するページ名です。 $1pageid とは同時に使用できません。",
+       "apihelp-delete-param-pageid": "削除するページIDです。 $1title とは同時に使用できません。",
+       "apihelp-delete-param-watch": "そのページをウォッチリストに追加します。",
+       "apihelp-delete-param-unwatch": "そのページをウォッチリストから除去します。",
+       "apihelp-delete-example-simple": "「Main Page」を削除する",
+       "apihelp-disabled-description": "このモジュールは無効化されています。",
+       "apihelp-edit-param-title": "編集するページ名です。$1pageid とは同時に使用できません。",
+       "apihelp-edit-param-pageid": "編集するページIDです。$1title とは同時に使用できません。",
+       "apihelp-edit-param-text": "ページの本文。",
+       "apihelp-edit-param-createonly": "すでにそのページが存在する場合は編集を行いません。",
+       "apihelp-edit-param-nocreate": "そのページが存在しない場合にエラーを返します。",
+       "apihelp-edit-param-watch": "そのページをウォッチリストに追加します。",
+       "apihelp-edit-param-unwatch": "そのページをウォッチリストから除去します。",
+       "apihelp-edit-param-token": "このトークンは常に最後のパラメーターとして、または少なくとも $1text パラメーターより後に送信されるべきです。",
+       "apihelp-emailuser-description": "利用者に電子メールを送信します。",
+       "apihelp-emailuser-param-target": "送信先の利用者名。",
+       "apihelp-emailuser-param-text": "電子メールの本文。",
+       "apihelp-emailuser-param-ccme": "電子メールの複製を自分にも送信します。",
        "apihelp-help-description": "指定したモジュールのヘルプを表示します。",
        "apihelp-help-param-modules": "ヘルプを表示するモジュールです (action= パラメーターおよび format= パラメーターの値、または \"main\")。\"+\" を使用して下位モジュールを指定できます。",
        "apihelp-help-param-submodules": "指定したモジュールの下位モジュールのヘルプを含めます。",
        "apihelp-help-example-recursive": "すべてのヘルプを1つのページに",
        "apihelp-help-example-help": "ヘルプ モジュール自身のヘルプ",
        "apihelp-help-example-query": "2つの下位モジュールのヘルプ",
+       "apihelp-login-param-name": "利用者名。",
+       "apihelp-login-param-password": "パスワード。",
+       "apihelp-move-description": "ページを移動します。",
+       "apihelp-move-param-from": "移動するページのページ名です。 $1fromid とは同時に使用できません。",
+       "apihelp-move-param-fromid": "移動するページのページIDです。 $1from とは同時に使用できません。",
+       "apihelp-move-param-to": "移動後のページ名。",
+       "apihelp-move-param-reason": "移動の理由。",
+       "apihelp-move-param-movetalk": "存在する場合、トークページも移動します。",
+       "apihelp-move-param-movesubpages": "可能であれば、サブページも移動します。",
+       "apihelp-move-param-noredirect": "転送ページを作成しません。",
+       "apihelp-move-param-watch": "そのページと転送ページをウォッチリストに追加します。",
+       "apihelp-move-param-unwatch": "そのページと転送ページをウォッチリストから除去します。",
+       "apihelp-move-example-move": "「Badtitle」を「Goodtitle」に転送ページを残さず移動",
        "apihelp-format-example-generic": "クエリの結果を $1 形式に整形します",
        "apihelp-dbg-description": "データを PHP の var_export() 形式で出力します。",
        "apihelp-dbgfm-description": "データを PHP の var_export() 形式 (HTML に埋め込んだ形式) で出力します。",
index b3a0a08..515ab8b 100644 (file)
        "apihelp-query+allcategories-param-from": "Од која категорија да почне набројувањето.",
        "apihelp-query+allcategories-param-to": "На која категорија да запре набројувањето.",
        "apihelp-query+allcategories-param-dir": "Насока на подредувањето.",
+       "apihelp-query+alllinks-param-namespace": "Именскиот простор што се набројува.",
+       "apihelp-query+alllinks-param-limit": "Колку вкупно ставки да се дадат.",
+       "apihelp-query+alllinks-param-dir": "Насока на исписот.",
+       "apihelp-query+alllinks-example-B": "Списока на наслови со врски, вклучувајќи ги отсутните, со назнаки на нивните страници, почнувајќи од Б",
+       "apihelp-query+alllinks-example-unique": "Испиши единствени наслови со врски",
+       "apihelp-query+alllinks-example-unique-generator": "Ги дава сите наслови со врски, означувајќи ги отсутните",
+       "apihelp-query+alllinks-example-generator": "Дава страници што ги содржат врските",
+       "apihelp-query+allmessages-description": "Дава пораки од ова мрежно место.",
+       "apihelp-query+allmessages-param-filter": "Дај само пораки со називи што ја содржат оваа низа.",
+       "apihelp-query+allmessages-param-customised": "Дај само пораки во оваа состојба на прилагоденост.",
+       "apihelp-query+allmessages-param-lang": "Дај само пораки на овој јазик.",
+       "apihelp-query+allmessages-param-from": "Дај ги пораките што почнуваат од оваа порака.",
+       "apihelp-query+allmessages-param-to": "Дај пораки што завршуваат со оваа порака.",
+       "apihelp-query+allmessages-param-title": "Назив на страницата што ќе се користи во контекст кога се расчленува порака (за можноста $1enableparser).",
+       "apihelp-query+allmessages-param-prefix": "Дај пораки со оваа претставка.",
+       "apihelp-query+allmessages-example-ipb": "Прикажи ги пораките што започнуваат со „ipb-“",
+       "apihelp-query+allmessages-example-de": "Прикажи ги пораките „август“ и „главна страница“ на германски",
+       "apihelp-query+allpages-description": "Наброј ги сите страници последователно во даден именски простор.",
+       "apihelp-query+allpages-param-from": "Наслов на страницата од која ќе почне набројувањето.",
+       "apihelp-query+allpages-param-to": "Наслов на страницата на која ќе запре набројувањето.",
+       "apihelp-query+allpages-param-prefix": "Пребарај ги сите наслови на страници што почнуваат со оваа вредност.",
+       "apihelp-query+allpages-param-namespace": "Именскиот простор што се набројува.",
+       "apihelp-query+allpages-param-filterredir": "Кои страници да се испишат.",
+       "apihelp-query+allpages-param-minsize": "Ограничи на страници со барем олку бајти.",
+       "apihelp-query+allpages-param-maxsize": "Ограничи на страници со највеќе олку бајти.",
+       "apihelp-query+allpages-param-prtype": "Ограничи на само заштитени страници.",
        "apihelp-query+backlinks-example-simple": "Прикажи врски до [[Главна страница|Главната страница]]",
        "apihelp-query+backlinks-example-generator": "Дава информации за страниците што водат до [[Главна страница|Главната страница]]",
        "apihelp-query+blocks-description": "Список на сите блокирани корисници и IP-адреси",
index 27eaa94..4dc23e5 100644 (file)
@@ -1,9 +1,12 @@
 {
        "@metadata": {
                "authors": [
-                       "Vitorvicentevalente"
+                       "Vitorvicentevalente",
+                       "Fúlvio"
                ]
        },
+       "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [https://www.mediawiki.org/wiki/API:Main_page Documentação]\n* [https://www.mediawiki.org/wiki/API:FAQ FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista de discussão]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Anúncios da API]\n* [https://bugzilla.wikimedia.org/buglist.cgi?component=API&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&order=bugs.delta_ts Erros e solicitações]\n</div>\n<strong>Estado:</strong> Todas as funcionalidades mostradas nesta página deveriam estar a funcionar, mas a API ainda está em activo desenvolvimento, e pode ser alterada a qualquer momento. Inscreva-se na [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ lista de discussão mediawiki-api-announce] para ser informado acerca das actualizações.\n\n<strong>Solicitações erradas:</strong> Quando solicitações erradas são enviadas à API, um cabeçalho em HTTP será enviado com a chave \"MediaWiki-API-Error\" e, em seguida, tanto o valor do cabeçalho quanto o código de erro retornado serão definidos com o mesmo valor. Para mais informação, consulte https://www.mediawiki.org/wiki/API:Errors_and_warnings.",
+       "apihelp-main-param-action": "Qual acção a executar.",
        "apihelp-main-param-format": "O formato de saída.",
        "apihelp-block-description": "Bloquear um utilizador.",
        "apihelp-block-param-user": "Nome de utilizador(a), endereço ou gama de IP que pretende bloquear.",
diff --git a/includes/api/i18n/sr-ec.json b/includes/api/i18n/sr-ec.json
new file mode 100644 (file)
index 0000000..32a6765
--- /dev/null
@@ -0,0 +1,8 @@
+{
+       "@metadata": {
+               "authors": [
+                       "Milicevic01"
+               ]
+       },
+       "apihelp-block-param-reason": "Разлог блокирање."
+}
index ae40cd9..4ac5531 100644 (file)
        "apihelp-filerevert-param-comment": "Ladda upp kommentar.",
        "apihelp-help-example-recursive": "All hjälp på en sida",
        "apihelp-help-example-help": "Hjälp för själva hjälpmodulen",
+       "apihelp-query+stashimageinfo-description": "Returnerar filinformation för temporära filer.",
+       "apihelp-query+stashimageinfo-param-filekey": "Nyckel som identifierar en tidigare uppladdning som lagrats temporärt.",
+       "apihelp-query+stashimageinfo-example-simple": "Returnerar information för en temporär fil",
+       "apihelp-upload-param-filekey": "Nyckel som identifierar en tidigare uppladdning som lagrats temporärt.",
+       "apihelp-upload-param-stash": "Om angiven, kommer servern inte att lägga till filen till centralförvaret och lagra den temporärt.",
        "api-help-main-header": "Huvudmodul",
        "api-help-flag-deprecated": "Denna modul är föråldrad.",
        "api-help-flag-internal": "<strong>Denna modul är intern eller instabil.</strong> Dess funktion kan ändras utan föregående meddelande.",
index b894fee..6357418 100644 (file)
@@ -71,6 +71,7 @@
        "apihelp-edit-param-contentmodel": "新内容的内容模型。",
        "apihelp-edit-example-edit": "编辑一个页面",
        "apihelp-edit-example-prepend": "页面中预置_&#95;NOTOC_&#95;",
+       "apihelp-edit-example-undo": "通过13585撤销修订版本13579并自动填写编辑摘要",
        "apihelp-emailuser-description": "电子邮件联系一位用户。",
        "apihelp-emailuser-param-target": "电子邮件的目标用户。",
        "apihelp-emailuser-param-subject": "主题页眉。",
        "apihelp-login-param-domain": "域名(可选)。",
        "apihelp-login-example-gettoken": "检索登录令牌",
        "apihelp-login-example-login": "登录",
+       "apihelp-logout-example-logout": "退出当前用户",
        "apihelp-move-description": "移动一个页面。",
        "apihelp-move-param-reason": "移动原因。",
        "apihelp-move-param-movetalk": "移动讨论页,如果存在。",
        "apihelp-move-param-noredirect": "不要创建重定向。",
        "apihelp-move-param-ignorewarnings": "忽略任何警告。",
        "apihelp-opensearch-param-search": "搜索字符串。",
+       "apihelp-opensearch-param-limit": "要返回的结果最大数。",
        "apihelp-opensearch-param-namespace": "搜索的名字空间。",
        "apihelp-opensearch-param-suggest": "如果[https://www.mediawiki.org/wiki/Manual:$wgEnableOpenSearchSuggest $wgEnableOpenSearchSuggest]设置为false则不做任何事情。",
        "apihelp-opensearch-param-format": "输出格式。",
        "apihelp-query+allcategories-param-from": "要作为枚举起始点的类别。",
        "apihelp-query+allcategories-param-to": "要作为枚举终止点的类别。",
        "apihelp-query+allcategories-param-limit": "要返回多少个类别。",
+       "apihelp-query+alldeletedrevisions-paraminfo-useronly": "只可以与$3user一起使用。",
+       "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "不能与$3user一起使用。",
+       "apihelp-query+alldeletedrevisions-param-from": "从此标题开始列出。",
+       "apihelp-query+alldeletedrevisions-param-to": "列出至此标题为止。",
        "apihelp-query+alldeletedrevisions-param-namespace": "只列出此名字空间的页面。",
+       "apihelp-query+alldeletedrevisions-param-miser-user-namespace": "'''注意:'''由于[https://www.mediawiki.org/wiki/Manual:$wgMiserMode miser模式],同时使用$1user和$1namespace将导致继续前返回少于“$1limit”个结果,在极端条件下可能不返回任何结果。",
        "apihelp-query+allfileusages-param-dir": "罗列所采用的方向。",
        "apihelp-query+allfileusages-example-unique": "列出唯一性的文件标题",
        "apihelp-query+allfileusages-example-unique-generator": "获取所有文件标题,并标记出缺失者",
        "apihelp-query+allimages-param-sha1": "图像的 SHA1 哈希。覆盖$1sha1base36。",
        "apihelp-query+allimages-param-limit": "共计要返回多少图像。",
        "apihelp-query+allimages-example-B": "显示以字母“B”开始的文件列表",
+       "apihelp-query+allimages-example-generator": "显示有关4个以“T”开头的文件的信息",
        "apihelp-query+alllinks-example-generator": "获取包含这些链接的页面",
        "apihelp-query+allmessages-description": "返回来自该站点的消息。",
        "apihelp-query+allmessages-param-messages": "要输出的哪些消息。\"*\" (默认值) 表示所有消息。",
        "apihelp-query+allpages-param-minsize": "限于至少这么多字节的页面。",
        "apihelp-query+allpages-param-maxsize": "限于至多这么多字节的页面。",
        "apihelp-query+allpages-param-prtype": "仅限于受保护页面。",
+       "apihelp-query+allpages-param-limit": "返回的总计页面数。",
        "apihelp-query+allredirects-description": "列出至一个名字空间的重定向。",
        "apihelp-query+allredirects-param-namespace": "要列举的名字空间。",
+       "apihelp-query+allredirects-param-limit": "返回的总计项目数。",
        "apihelp-query+allredirects-example-unique-generator": "获得所有目标页面,标记丢失的",
        "apihelp-query+allredirects-example-generator": "获得包含重定向的页面",
        "apihelp-query+alltransclusions-param-namespace": "要列举的名字空间。",
        "apihelp-query+allusers-param-witheditsonly": "只列出有编辑的用户。",
        "apihelp-query+allusers-param-activeusers": "只列出最近$1天内活跃的用户。",
        "apihelp-query+allusers-example-Y": "列出以Y开头的用户",
+       "apihelp-query+backlinks-param-title": "要搜索的标题。不能与$1pageid一起使用。",
+       "apihelp-query+backlinks-param-pageid": "要搜索的页面ID。不能与$1title一起使用。",
+       "apihelp-query+backlinks-param-namespace": "要列举的名字空间。",
        "apihelp-query+backlinks-example-simple": "显示至[[首页]]的链接",
        "apihelp-query+backlinks-example-generator": "获取关于链接至[[首页]]的页面的信息",
        "apihelp-query+blocks-description": "列出所有被封禁的用户和IP地址。",
        "apihelp-query+categorymembers-example-simple": "获取[[:Category:Physics]]中的前10个页面。",
        "apihelp-query+categorymembers-example-generator": "获取关于[[:Category:Physics]]中的前10个页面的页面信息。",
        "apihelp-query+contributors-example-simple": "显示[[首页]]的贡献",
+       "apihelp-query+deletedrevisions-example-titles": "列出[[首页]]和[[Talk:首页]]的已删除修订,包含内容",
        "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|模式}}:$2",
+       "apihelp-query+deletedrevs-param-from": "从此标题开始列出。",
+       "apihelp-query+deletedrevs-param-to": "列出至此标题为止。",
        "apihelp-query+deletedrevs-param-namespace": "只列出此名字空间的页面。",
        "apihelp-query+deletedrevs-example-mode1": "列出最近已删除的对首页和Talk:首页的贡献,带内容(模式1)",
        "apihelp-query+deletedrevs-example-mode2": "列出由Bob作出的最近50次已删除贡献(模式2)",
        "apihelp-query+extlinks-param-limit": "返回多少链接。",
        "apihelp-query+exturlusage-param-limit": "返回多少页面。",
        "apihelp-query+exturlusage-example-simple": "显示链接至http://www.mediawiki.org的页面",
+       "apihelp-query+filearchive-param-sha1": "图片的SHA1哈希值。覆盖$1sha1base36。",
+       "apihelp-query+filearchive-param-sha1base36": "基于base 36的图片的SHA1哈希值(用于MediaWiki)。",
        "apihelp-query+filearchive-example-simple": "显示已删除文件列表",
        "apihelp-query+fileusage-param-prop": "要获取的属性:\n;pageid:每个页面的页面ID。\n;title:每个页面的标题。\n;redirect:标记作为重定向的页面。",
        "apihelp-query+fileusage-param-namespace": "只包括这些名字空间的页面。",
        "apihelp-query+images-param-limit": "返回多少文件。",
        "apihelp-query+images-example-simple": "获取[[首页]]使用的文件列表",
        "apihelp-query+images-example-generator": "获取有关[[首页]]使用的文件的信息",
+       "apihelp-query+imageusage-param-namespace": "要列举的名字空间。",
        "apihelp-query+imageusage-example-simple": "显示使用[[:File:Albert Einstein Head.jpg]]的页面",
        "apihelp-query+imageusage-example-generator": "获取有关使用[[:File:Albert Einstein Head.jpg]]的页面的信息",
        "apihelp-query+info-description": "获取基本页面信息。",
        "apihelp-query+recentchanges-description": "枚举最近更改。",
        "apihelp-query+recentchanges-param-user": "只列出此用户的更改。",
        "apihelp-query+recentchanges-param-excludeuser": "不要列出此用户的更改。",
+       "apihelp-query+recentchanges-param-tag": "只列出带此标签的更改。",
        "apihelp-query+recentchanges-param-token": "请改用[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]。",
        "apihelp-query+recentchanges-example-simple": "最近更改列表",
        "apihelp-query+redirects-param-namespace": "只包含这些名字空间的页面。",
        "apihelp-query+siteinfo-example-interwiki": "获取本地跨wiki前缀列表",
        "apihelp-query+tags-description": "列出更改标签。",
        "apihelp-query+tags-example-simple": "可用标签列表",
+       "apihelp-query+templates-param-namespace": "只显示此名字空间的模板。",
        "apihelp-query+templates-param-limit": "返回多少模板。",
        "apihelp-query+templates-param-templates": "只列出这些模板。对于检查某一页面使用某一模板很有用。",
        "apihelp-query+templates-example-simple": "从[[首页]]获取模板",
        "apihelp-query+templates-example-generator": "获取有关[[首页]]中的模板页面的信息",
        "apihelp-query+templates-example-namespaces": "从[[首页]]获取用户和模板名字空间中的模板",
+       "apihelp-query+tokens-param-type": "要请求的令牌类型。",
        "apihelp-query+transcludedin-param-namespace": "至包含这些名字空间的页面。",
        "apihelp-query+transcludedin-param-limit": "返回多少。",
        "apihelp-query+transcludedin-example-simple": "获取嵌入[[首页]]的页面列表",
        "apihelp-query+watchlistraw-description": "获取登录用户的监视列表的所有页面。",
        "apihelp-query+watchlistraw-param-namespace": "只列出指定名字空间的页面。",
        "apihelp-revisiondelete-description": "删除和恢复修订版本。",
+       "apihelp-revisiondelete-param-hide": "每次修订要隐藏的东西。",
+       "apihelp-revisiondelete-param-show": "每次修订要恢复显示的东西。",
        "apihelp-revisiondelete-param-reason": "删除或恢复的原因。",
        "apihelp-rollback-example-simple": "回退由用户Example对[[首页]]做出的最近编辑",
        "apihelp-rollback-example-summary": "回退由IP用户192.0.2.5对[[首页]]做出的最近编辑,带编辑摘要“回退破坏”,并将这些编辑和回退标记为“机器人”",
        "apihelp-upload-param-watch": "监视页面。",
        "apihelp-upload-param-ignorewarnings": "忽略任何警告。",
        "apihelp-upload-param-file": "文件内容。",
+       "apihelp-upload-param-stash": "如果设置,服务器将不会添加文件至存储库并暂时藏匿。",
        "apihelp-upload-param-chunk": "大块内容。",
        "apihelp-upload-example-url": "从URL上传",
        "apihelp-userrights-param-user": "用户名。",
        "apihelp-userrights-example-user": "将用户FooBot添加至“机器人”用户组,并从“管理员”和“行政员”组移除",
        "apihelp-watch-example-watch": "监视页面“首页”",
        "apihelp-watch-example-unwatch": "取消监视页面“首页”",
+       "apihelp-dbg-description": "输出数据为PHP的var_export()格式。",
+       "apihelp-dump-description": "输出数据为PHP的var_dump()格式。",
+       "apihelp-json-description": "输出数据为JSON格式。",
        "apihelp-none-description": "不输出任何东西。",
-       "apihelp-yaml-description": "以YAML格式输出数据。",
+       "apihelp-php-description": "输出数据为序列化PHP格式。",
+       "apihelp-txt-description": "输出数据为PHP的print_r()格式。",
+       "apihelp-wddx-description": "输出数据为WDDX格式。",
+       "apihelp-xml-description": "输出数据为XML格式。",
+       "apihelp-yaml-description": "输出数据为YAML格式。",
        "api-format-title": "MediaWiki API 结果",
        "api-orm-param-props": "要查询的字段。",
        "api-help-title": "MediaWiki API 帮助",
        "api-help-param-multi-max": "值的最高数字是{{PLURAL:$1|$1}}(对于机器人则是{{PLURAL:$2|$2}})。",
        "api-help-param-default": "默认:$1",
        "api-help-param-default-empty": "默认:<span class=\"apihelp-empty\">(空)</span>",
+       "api-help-param-token": "从[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]取回的“$1”令牌",
        "api-help-param-disabled-in-miser-mode": "由于[https://www.mediawiki.org/wiki/Manual:$wgMiserMode miser模式]而禁用。",
        "api-help-param-limited-in-miser-mode": "'''注意:'''由于[https://www.mediawiki.org/wiki/Manual:$wgMiserMode miser模式],使用这个可能导致继续前返回少于“$1limit”个结果;极端情况下可能不会返回任何结果。",
        "api-help-param-continue": "什么时候更多结果可用什么时候继续使用。",
diff --git a/includes/cache/MapCacheLRU.php b/includes/cache/MapCacheLRU.php
deleted file mode 100644 (file)
index 95e3af7..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-<?php
-/**
- * Per-process memory cache for storing items.
- *
- * 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 Cache
- */
-
-/**
- * Handles a simple LRU key/value map with a maximum number of entries
- *
- * Use ProcessCacheLRU if hierarchical purging is needed or objects can become stale
- *
- * @see ProcessCacheLRU
- * @ingroup Cache
- * @since 1.23
- */
-class MapCacheLRU {
-       /** @var array */
-       protected $cache = array(); // (key => value)
-
-       protected $maxCacheKeys; // integer; max entries
-
-       /**
-        * @param int $maxKeys Maximum number of entries allowed (min 1).
-        * @throws MWException When $maxCacheKeys is not an int or =< 0.
-        */
-       public function __construct( $maxKeys ) {
-               if ( !is_int( $maxKeys ) || $maxKeys < 1 ) {
-                       throw new MWException( __METHOD__ . " must be given an integer and >= 1" );
-               }
-               $this->maxCacheKeys = $maxKeys;
-       }
-
-       /**
-        * Set a key/value pair.
-        * This will prune the cache if it gets too large based on LRU.
-        * If the item is already set, it will be pushed to the top of the cache.
-        *
-        * @param string $key
-        * @param mixed $value
-        * @return void
-        */
-       public function set( $key, $value ) {
-               if ( array_key_exists( $key, $this->cache ) ) {
-                       $this->ping( $key ); // push to top
-               } elseif ( count( $this->cache ) >= $this->maxCacheKeys ) {
-                       reset( $this->cache );
-                       $evictKey = key( $this->cache );
-                       unset( $this->cache[$evictKey] );
-               }
-               $this->cache[$key] = $value;
-       }
-
-       /**
-        * Check if a key exists
-        *
-        * @param string $key
-        * @return bool
-        */
-       public function has( $key ) {
-               return array_key_exists( $key, $this->cache );
-       }
-
-       /**
-        * Get the value for a key.
-        * This returns null if the key is not set.
-        * If the item is already set, it will be pushed to the top of the cache.
-        *
-        * @param string $key
-        * @return mixed
-        */
-       public function get( $key ) {
-               if ( array_key_exists( $key, $this->cache ) ) {
-                       $this->ping( $key ); // push to top
-                       return $this->cache[$key];
-               } else {
-                       return null;
-               }
-       }
-
-       /**
-        * Clear one or several cache entries, or all cache entries
-        *
-        * @param string|array $keys
-        * @return void
-        */
-       public function clear( $keys = null ) {
-               if ( $keys === null ) {
-                       $this->cache = array();
-               } else {
-                       foreach ( (array)$keys as $key ) {
-                               unset( $this->cache[$key] );
-                       }
-               }
-       }
-
-       /**
-        * Push an entry to the top of the cache
-        *
-        * @param string $key
-        */
-       protected function ping( $key ) {
-               $item = $this->cache[$key];
-               unset( $this->cache[$key] );
-               $this->cache[$key] = $item;
-       }
-}
index 6face4f..43e00cd 100644 (file)
@@ -1059,6 +1059,7 @@ class MessageCache {
                wfProfileIn( __METHOD__ );
                if ( !$title || !$title instanceof Title ) {
                        global $wgTitle;
+                       wfDebugLog( 'GlobalTitleFail', __METHOD__ . ' called by ' . wfGetAllCallers() . ' with no title set.' );
                        $title = $wgTitle;
                }
                // Sometimes $wgTitle isn't set either...
index 059f18c..d620be9 100644 (file)
@@ -140,7 +140,7 @@ class RequestContext implements IContextSource {
                if ( $this->title === null ) {
                        global $wgTitle; # fallback to $wg till we can improve this
                        $this->title = $wgTitle;
-                       wfDebugLog( 'GlobalTitleFail', __METHOD__ . ' called by ' . wfGetCaller() . ' with no title set.' );
+                       wfDebugLog( 'GlobalTitleFail', __METHOD__ . ' called by ' . wfGetAllCallers() . ' with no title set.' );
                }
 
                return $this->title;
index 34132aa..18cd39f 100644 (file)
  * @ingroup Database
  */
 
-/**
- * Base interface for all DBMS-specific code. At a bare minimum, all of the
- * following must be implemented to support MediaWiki
- *
- * @file
- * @ingroup Database
- */
-interface DatabaseType {
-       /**
-        * Get the type of the DBMS, as it appears in $wgDBtype.
-        *
-        * @return string
-        */
-       function getType();
-
-       /**
-        * Open a connection to the database. Usually aborts on failure
-        *
-        * @param string $server Database server host
-        * @param string $user Database user name
-        * @param string $password Database user password
-        * @param string $dbName Database name
-        * @return bool
-        * @throws DBConnectionError
-        */
-       function open( $server, $user, $password, $dbName );
-
-       /**
-        * Fetch the next row from the given result object, in object form.
-        * Fields can be retrieved with $row->fieldname, with fields acting like
-        * member variables.
-        * If no more rows are available, false is returned.
-        *
-        * @param ResultWrapper|stdClass $res Object as returned from DatabaseBase::query(), etc.
-        * @return stdClass|bool
-        * @throws DBUnexpectedError Thrown if the database returns an error
-        */
-       function fetchObject( $res );
-
-       /**
-        * Fetch the next row from the given result object, in associative array
-        * form. Fields are retrieved with $row['fieldname'].
-        * If no more rows are available, false is returned.
-        *
-        * @param ResultWrapper $res Result object as returned from DatabaseBase::query(), etc.
-        * @return array|bool
-        * @throws DBUnexpectedError Thrown if the database returns an error
-        */
-       function fetchRow( $res );
-
-       /**
-        * Get the number of rows in a result object
-        *
-        * @param mixed $res A SQL result
-        * @return int
-        */
-       function numRows( $res );
-
-       /**
-        * Get the number of fields in a result object
-        * @see http://www.php.net/mysql_num_fields
-        *
-        * @param mixed $res A SQL result
-        * @return int
-        */
-       function numFields( $res );
-
-       /**
-        * Get a field name in a result object
-        * @see http://www.php.net/mysql_field_name
-        *
-        * @param mixed $res A SQL result
-        * @param int $n
-        * @return string
-        */
-       function fieldName( $res, $n );
-
-       /**
-        * Get the inserted value of an auto-increment row
-        *
-        * The value inserted should be fetched from nextSequenceValue()
-        *
-        * Example:
-        * $id = $dbw->nextSequenceValue( 'page_page_id_seq' );
-        * $dbw->insert( 'page', array( 'page_id' => $id ) );
-        * $id = $dbw->insertId();
-        *
-        * @return int
-        */
-       function insertId();
-
-       /**
-        * Change the position of the cursor in a result object
-        * @see http://www.php.net/mysql_data_seek
-        *
-        * @param mixed $res A SQL result
-        * @param int $row
-        */
-       function dataSeek( $res, $row );
-
-       /**
-        * Get the last error number
-        * @see http://www.php.net/mysql_errno
-        *
-        * @return int
-        */
-       function lastErrno();
-
-       /**
-        * Get a description of the last error
-        * @see http://www.php.net/mysql_error
-        *
-        * @return string
-        */
-       function lastError();
-
-       /**
-        * mysql_fetch_field() wrapper
-        * Returns false if the field doesn't exist
-        *
-        * @param string $table Table name
-        * @param string $field Field name
-        *
-        * @return Field
-        */
-       function fieldInfo( $table, $field );
-
-       /**
-        * Get information about an index into an object
-        * @param string $table Table name
-        * @param string $index Index name
-        * @param string $fname Calling function name
-        * @return mixed Database-specific index description class or false if the index does not exist
-        */
-       function indexInfo( $table, $index, $fname = __METHOD__ );
-
-       /**
-        * Get the number of rows affected by the last write query
-        * @see http://www.php.net/mysql_affected_rows
-        *
-        * @return int
-        */
-       function affectedRows();
-
-       /**
-        * Wrapper for addslashes()
-        *
-        * @param string $s String to be slashed.
-        * @return string Slashed string.
-        */
-       function strencode( $s );
-
-       /**
-        * Returns a wikitext link to the DB's website, e.g.,
-        *   return "[http://www.mysql.com/ MySQL]";
-        * Should at least contain plain text, if for some reason
-        * your database has no website.
-        *
-        * @return string Wikitext of a link to the server software's web site
-        */
-       function getSoftwareLink();
-
-       /**
-        * A string describing the current software version, like from
-        * mysql_get_server_info().
-        *
-        * @return string Version information from the database server.
-        */
-       function getServerVersion();
-
-       /**
-        * A string describing the current software version, and possibly
-        * other details in a user-friendly way. Will be listed on Special:Version, etc.
-        * Use getServerVersion() to get machine-friendly information.
-        *
-        * @return string Version information from the database server
-        */
-       function getServerInfo();
-}
-
 /**
  * Interface for classes that implement or wrap DatabaseBase
  * @ingroup Database
@@ -216,7 +36,7 @@ interface IDatabase {
  * Database abstraction object
  * @ingroup Database
  */
-abstract class DatabaseBase implements IDatabase, DatabaseType {
+abstract class DatabaseBase implements IDatabase {
        /** Number of times to re-try an operation in case of deadlock */
        const DEADLOCK_TRIES = 4;
 
index dd2e813..9257ffe 100644 (file)
@@ -787,6 +787,10 @@ class DatabaseSqlite extends DatabaseBase {
                        // https://bugs.php.net/bug.php?id=63419
                        // There was already a similar report for SQLite3::escapeString, bug #62361:
                        // https://bugs.php.net/bug.php?id=62361
+                       // There is an additional bug regarding sorting this data after insert
+                       // on older versions of sqlite shipped with ubuntu 12.04
+                       // https://bugzilla.wikimedia.org/show_bug.cgi?id=72367
+                       wfDebugLog( __CLASS__, __FUNCTION__ . ': Quoting value containing null byte. For consistency all binary data should have been first processed with self::encodeBlob()' );
                        return "x'" . bin2hex( $s ) . "'";
                } else {
                        return $this->mConn->quote( $s );
index eeb2fec..0fb2d09 100644 (file)
@@ -410,7 +410,10 @@ class LoadBalancer {
 
                if ( $result == -1 || is_null( $result ) ) {
                        # Timed out waiting for slave, use master instead
-                       wfDebug( __METHOD__ . ": Timed out waiting for slave #$index pos {$this->mWaitForPos}\n" );
+                       $server = $this->mServers[$index];
+                       $msg = __METHOD__ . ": Timed out waiting on $server pos {$this->mWaitForPos}";
+                       wfDebug( "$msg\n" );
+                       wfDebugLog( 'DBPerformance', "$msg:\n" . wfBacktrace( true ) );
                        $ok = false;
                } else {
                        wfDebug( __METHOD__ . ": Done\n" );
index b99ffb6..9aa4ca8 100644 (file)
@@ -451,10 +451,13 @@ class FSFileBackend extends FileBackendStore {
                // Create the directory and its parents as needed...
                $this->trapWarnings();
                if ( !wfMkdirParents( $dir ) ) {
+                       wfDebugLog( 'FSFileBackend', __METHOD__ . ": cannot create directory $dir" );
                        $status->fatal( 'directorycreateerror', $params['dir'] ); // fails on races
                } elseif ( !is_writable( $dir ) ) {
+                       wfDebugLog( 'FSFileBackend',  __METHOD__ . ": directory $dir is read-only" );
                        $status->fatal( 'directoryreadonlyerror', $params['dir'] );
                } elseif ( !is_readable( $dir ) ) {
+                       wfDebugLog( 'FSFileBackend',  __METHOD__ . ": directory $dir is not readable" );
                        $status->fatal( 'directorynotreadableerror', $params['dir'] );
                }
                $this->untrapWarnings();
index 7563d64..c82be50 100644 (file)
@@ -471,6 +471,8 @@ abstract class File {
        public function getThumbnailBucket( $desiredWidth, $page = 1 ) {
                global $wgThumbnailBuckets, $wgThumbnailMinimumBucketDistance;
 
+               wfDebugLog( 'thumbnail', 'thumbnail buckets ' . json_encode( $wgThumbnailBuckets ) );
+
                $imageWidth = $this->getWidth( $page );
 
                if ( $imageWidth === false ) {
index d0db084..202edef 100644 (file)
@@ -6,11 +6,13 @@
                        "Muhammed taha"
                ]
        },
+       "config-desc": "دامەزرێنەرەکە بۆ میدیاویکی",
+       "config-title": "دامەزرانی میدیاویکی $1",
        "config-information": "زانیاری",
        "config-your-language": "زمانەکەت:",
        "config-wiki-language": "زمانی ویکی:",
        "config-back": "→ گەڕانەوە",
-       "config-continue": "بەردەوامبوون ←",
+       "config-continue": "بەردەوام بە ←",
        "config-page-language": "زمان",
        "config-page-welcome": "بەخێربێیت بۆ میدیاویکی!",
        "config-page-dbconnect": "پەیوەندی دەکات بەبنکەی زانیارییەکان",
        "config-page-upgradedoc": "نوێدەکرێتەوە",
        "config-page-existingwiki": "ویکی پێشوو",
        "config-restart": "بەڵێ، دەستی پێ بکەرەوە",
-       "config-env-php": "PHP $1 دابەزێندرا.",
-       "config-env-php-toolow": "PHP $1 دابەزێندرا.\nھەرچۆنێک بێت میدیاویکی پێویستی بە PHP $2 یان بەرزتر ھەیە.",
+       "config-env-php": "PHP $1 دامەزراوە.",
+       "config-apc": "[http://www.php.net/apc APC] دامەزراوە",
+       "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] دامەزراوە",
+       "config-db-type": "جۆری داتابەیس:",
+       "config-db-host": "خانەخوێی داتابەیس:",
        "config-db-name": "ناوی بنکەدراوە:",
+       "config-db-install-account": "ھەژماری بەکارھێنەری بۆ دامەزراندن",
        "config-db-username": "ناوی بەکارھێنەری بنکەدراوە:",
        "config-db-password": "تێپەڕوشەی بنکەدراوە",
        "config-site-name": "ناوی ویکی:",
        "config-ns-generic": "پرۆژە",
+       "config-admin-name": "ناوی بەکارھێنەرییەکەت:",
        "config-admin-password": "تێپەڕوشە:",
+       "config-admin-password-confirm": "دووبارە تێپەڕوشە:",
        "config-admin-email": "ناونیشانی ئیمەیل:",
+       "config-profile-wiki": "ویکیی کراوە",
+       "config-profile-no-anon": "دروستکردنی ھەژمارە پێویستە",
+       "config-profile-fishbowl": "تەنھا دەستکاریکەری ڕێگەپێدراوە",
+       "config-license-pd": "پاوانی گشتی",
+       "config-email-settings": "ڕێکخستنەکانی ئیمەیڵ",
        "config-install-step-done": "کرا",
        "config-help": "یارمەتی",
        "mainpagetext": "'''میدیاویکی بە سەرکەوتوویی دامەزرا.'''",
diff --git a/includes/libs/MapCacheLRU.php b/includes/libs/MapCacheLRU.php
new file mode 100644 (file)
index 0000000..2a7ee2a
--- /dev/null
@@ -0,0 +1,123 @@
+<?php
+/**
+ * Per-process memory cache for storing items.
+ *
+ * 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 Cache
+ */
+
+/**
+ * Handles a simple LRU key/value map with a maximum number of entries
+ *
+ * Use ProcessCacheLRU if hierarchical purging is needed or objects can become stale
+ *
+ * @see ProcessCacheLRU
+ * @ingroup Cache
+ * @since 1.23
+ */
+class MapCacheLRU {
+       /** @var array */
+       protected $cache = array(); // (key => value)
+
+       protected $maxCacheKeys; // integer; max entries
+
+       /**
+        * @param int $maxKeys Maximum number of entries allowed (min 1).
+        * @throws Exception When $maxCacheKeys is not an int or =< 0.
+        */
+       public function __construct( $maxKeys ) {
+               if ( !is_int( $maxKeys ) || $maxKeys < 1 ) {
+                       throw new Exception( __METHOD__ . " must be given an integer and >= 1" );
+               }
+               $this->maxCacheKeys = $maxKeys;
+       }
+
+       /**
+        * Set a key/value pair.
+        * This will prune the cache if it gets too large based on LRU.
+        * If the item is already set, it will be pushed to the top of the cache.
+        *
+        * @param string $key
+        * @param mixed $value
+        * @return void
+        */
+       public function set( $key, $value ) {
+               if ( array_key_exists( $key, $this->cache ) ) {
+                       $this->ping( $key ); // push to top
+               } elseif ( count( $this->cache ) >= $this->maxCacheKeys ) {
+                       reset( $this->cache );
+                       $evictKey = key( $this->cache );
+                       unset( $this->cache[$evictKey] );
+               }
+               $this->cache[$key] = $value;
+       }
+
+       /**
+        * Check if a key exists
+        *
+        * @param string $key
+        * @return bool
+        */
+       public function has( $key ) {
+               return array_key_exists( $key, $this->cache );
+       }
+
+       /**
+        * Get the value for a key.
+        * This returns null if the key is not set.
+        * If the item is already set, it will be pushed to the top of the cache.
+        *
+        * @param string $key
+        * @return mixed
+        */
+       public function get( $key ) {
+               if ( array_key_exists( $key, $this->cache ) ) {
+                       $this->ping( $key ); // push to top
+                       return $this->cache[$key];
+               } else {
+                       return null;
+               }
+       }
+
+       /**
+        * Clear one or several cache entries, or all cache entries
+        *
+        * @param string|array $keys
+        * @return void
+        */
+       public function clear( $keys = null ) {
+               if ( $keys === null ) {
+                       $this->cache = array();
+               } else {
+                       foreach ( (array)$keys as $key ) {
+                               unset( $this->cache[$key] );
+                       }
+               }
+       }
+
+       /**
+        * Push an entry to the top of the cache
+        *
+        * @param string $key
+        */
+       protected function ping( $key ) {
+               $item = $this->cache[$key];
+               unset( $this->cache[$key] );
+               $this->cache[$key] = $item;
+       }
+}
index ee696c3..73e76f7 100644 (file)
@@ -47,7 +47,8 @@ class ObjectFactory {
         * expanded by invoking them with no arguments before passing the
         * resulting value on to the constructor/callable. This can be used to
         * pass DatabaseBase instances or other live objects to the
-        * constructor/callable.
+        * constructor/callable. This behavior can be suppressed by adding
+        * closure_expansion => false to the specification.
         *
         * @param array $spec Object specification
         * @return object
@@ -59,14 +60,18 @@ class ObjectFactory {
        public static function getObjectFromSpec( $spec ) {
                $args = isset( $spec['args'] ) ? $spec['args'] : array();
 
-               $args = array_map( function ( $value ) {
-                       if ( is_object( $value ) && $value instanceof Closure ) {
-                               // If an argument is a Closure, call it.
-                               return $value();
-                       } else {
-                               return $value;
-                       }
-               }, $args );
+               if ( !isset( $spec['closure_expansion'] ) ||
+                       $spec['closure_expansion'] === true
+               ) {
+                       $args = array_map( function ( $value ) {
+                               if ( is_object( $value ) && $value instanceof Closure ) {
+                                       // If an argument is a Closure, call it.
+                                       return $value();
+                               } else {
+                                       return $value;
+                               }
+                       }, $args );
+               }
 
                if ( isset( $spec['class'] ) ) {
                        $clazz = $spec['class'];
index dda5254..f09d101 100644 (file)
@@ -126,7 +126,7 @@ class RunningStat implements Countable {
        }
 
        /**
-        * Get the estimated stanard deviation.
+        * Get the estimated standard deviation.
         *
         * The standard deviation of a statistical population is the square root of
         * its variance. It shows shows how much variation from the mean exists. In
diff --git a/includes/libs/Xhprof.php b/includes/libs/Xhprof.php
new file mode 100644 (file)
index 0000000..1ad01cc
--- /dev/null
@@ -0,0 +1,443 @@
+<?php
+/**
+ * @section LICENSE
+ * 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
+ */
+
+/**
+ * Convenience class for working with XHProf
+ * <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.
+ * @since 1.25
+ */
+class Xhprof {
+
+       /**
+        * @var array $config
+        */
+       protected $config;
+
+       /**
+        * Hierarchical profiling data returned by xhprof.
+        * @var array $hieraData
+        */
+       protected $hieraData;
+
+       /**
+        * Per-function inclusive data.
+        * @var array $inclusive
+        */
+       protected $inclusive;
+
+       /**
+        * Per-function inclusive and exclusive data.
+        * @var array $complete
+        */
+       protected $complete;
+
+       /**
+        * Configuration data can contain:
+        * - flags:   Optional flags to add additional information to the
+        *            profiling data collected.
+        *            (XHPROF_FLAGS_NO_BUILTINS, XHPROF_FLAGS_CPU,
+        *            XHPROF_FLAGS_MEMORY)
+        * - exclude: Array of function names to exclude from profiling.
+        * - include: Array of function names to include in profiling.
+        * - sort:    Key to sort per-function reports on.
+        *
+        * Note: When running under HHVM, xhprof will always behave as though the
+        * XHPROF_FLAGS_NO_BUILTINS flag has been used unless the
+        * Eval.JitEnableRenameFunction option is enabled for the HHVM process.
+        *
+        * @param array $config
+        */
+       public function __construct( array $config = array() ) {
+               $this->config = array_merge(
+                       array(
+                               'flags' => 0,
+                               'exclude' => array(),
+                               'include' => null,
+                               'sort' => 'wt',
+                       ),
+                       $config
+               );
+
+               xhprof_enable( $this->config['flags'], array(
+                       'ignored_functions' => $this->config['exclude']
+               ) );
+       }
+
+       /**
+        * Stop collecting profiling data.
+        *
+        * Only the first invocation of this method will effect the internal
+        * object state. Subsequent calls will return the data collected by the
+        * initial call.
+        *
+        * @return array Collected profiling data (possibly cached)
+        */
+       public function stop() {
+               if ( $this->hieraData === null ) {
+                       $this->hieraData = $this->pruneData( xhprof_disable() );
+               }
+               return $this->hieraData;
+       }
+
+       /**
+        * Load raw data from a prior run for analysis.
+        * Stops any existing data collection and clears internal caches.
+        *
+        * Any 'include' filters configured for this Xhprof instance will be
+        * enforced on the data as it is loaded. 'exclude' filters will however
+        * not be enforced as they are an XHProf intrinsic behavior.
+        *
+        * @param array $data
+        * @see getRawData()
+        */
+       public function loadRawData( array $data ) {
+               $this->stop();
+               $this->inclusive = null;
+               $this->complete = null;
+               $this->hieraData = $this->pruneData( $data );
+       }
+
+       /**
+        * Get raw data collected by xhprof.
+        *
+        * If data collection has not been stopped yet this method will halt
+        * collection to gather the profiling data.
+        *
+        * Each key in the returned array is an edge label for the call graph in
+        * the form "caller==>callee". There is once special case edge labled
+        * simply "main()" which represents the global scope entry point of the
+        * application.
+        *
+        * XHProf will collect different data depending on the flags that are used:
+        * - ct:    Number of matching events seen.
+        * - wt:    Inclusive elapsed wall time for this event in microseconds.
+        * - cpu:   Inclusive elapsed cpu time for this event in microseconds.
+        *          (XHPROF_FLAGS_CPU)
+        * - mu:    Delta of memory usage from start to end of callee in bytes.
+        *          (XHPROF_FLAGS_MEMORY)
+        * - pmu:   Delta of peak memory usage from start to end of callee in
+        *          bytes. (XHPROF_FLAGS_MEMORY)
+        * - alloc: Delta of amount memory requested from malloc() by the callee,
+        *          in bytes. (XHPROF_FLAGS_MALLOC)
+        * - free:  Delta of amount of memory passed to free() by the callee, in
+        *          bytes. (XHPROF_FLAGS_MALLOC)
+        *
+        * @return array
+        * @see stop()
+        * @see getInclusiveMetrics()
+        * @see getCompleteMetrics()
+        */
+       public function getRawData() {
+               return $this->stop();
+       }
+
+       /**
+        * Convert an xhprof data key into an array of ['parent', 'child']
+        * function names.
+        *
+        * The resulting array is left padded with nulls, so a key
+        * with no parent (eg 'main()') will return [null, 'function'].
+        *
+        * @return array
+        */
+       public static function splitKey( $key ) {
+               return array_pad( explode( '==>', $key, 2 ), -2, null );
+       }
+
+       /**
+        * Remove data for functions that are not included in the 'include'
+        * configuration array.
+        *
+        * @param array $data Raw xhprof data
+        * @return array
+        */
+       protected function pruneData( $data ) {
+               if ( !$this->config['include'] ) {
+                       return $data;
+               }
+
+               $want = array_fill_keys( $this->config['include'], true );
+               $want['main()'] = true;
+
+               $keep = array();
+               foreach ( $data as $key => $stats ) {
+                       list( $parent, $child ) = self::splitKey( $key );
+                       if ( isset( $want[$parent] ) || isset( $want[$child] ) ) {
+                               $keep[$key] = $stats;
+                       }
+               }
+               return $keep;
+       }
+
+       /**
+        * Get the inclusive metrics for each function call. Inclusive metrics
+        * for given function include the metrics for all functions that were
+        * called from that function during the measurement period.
+        *
+        * If data collection has not been stopped yet this method will halt
+        * collection to gather the profiling data.
+        *
+        * See getRawData() for a description of the metric that are returned for
+        * each funcition call. The values for the wt, cpu, mu and pmu metrics are
+        * arrays with these values:
+        * - total: Cumulative value
+        * - min: Minimum value
+        * - mean: Mean (average) value
+        * - max: Maximum value
+        * - variance: Variance (spread) of the values
+        *
+        * @return array
+        * @see getRawData()
+        * @see getCompleteMetrics()
+        */
+       public function getInclusiveMetrics() {
+               if ( $this->inclusive === null ) {
+                       // Make sure we have data to work with
+                       $this->stop();
+
+                       $main = $this->hieraData['main()'];
+                       $hasCpu = isset( $main['cpu'] );
+                       $hasMu = isset( $main['mu'] );
+                       $hasAlloc = isset( $main['alloc'] );
+
+                       $this->inclusive = array();
+                       foreach ( $this->hieraData as $key => $stats ) {
+                               list( $parent, $child ) = self::splitKey( $key );
+                               if ( !isset( $this->inclusive[$child] ) ) {
+                                       $this->inclusive[$child] = array(
+                                               'ct' => 0,
+                                               'wt' => new RunningStat(),
+                                       );
+                                       if ( $hasCpu ) {
+                                               $this->inclusive[$child]['cpu'] = new RunningStat();
+                                       }
+                                       if ( $hasMu ) {
+                                               $this->inclusive[$child]['mu'] = new RunningStat();
+                                               $this->inclusive[$child]['pmu'] = new RunningStat();
+                                       }
+                                       if ( $hasAlloc ) {
+                                               $this->inclusive[$child]['alloc'] = new RunningStat();
+                                               $this->inclusive[$child]['free'] = new RunningStat();
+                                       }
+                               }
+
+                               $this->inclusive[$child]['ct'] += $stats['ct'];
+                               foreach ( $stats as $stat => $value ) {
+                                       if ( $stat === 'ct' ) {
+                                               continue;
+                                       }
+
+                                       if ( !isset( $this->inclusive[$child][$stat] ) ) {
+                                               // Ignore unknown stats
+                                               continue;
+                                       }
+
+                                       for ( $i = 0; $i < $stats['ct']; $i++ ) {
+                                               $this->inclusive[$child][$stat]->push(
+                                                       $value / $stats['ct']
+                                               );
+                                       }
+                               }
+                       }
+
+                       // Convert RunningStat instances to static arrays and add
+                       // percentage stats.
+                       foreach ( $this->inclusive as $func => $stats ) {
+                               foreach ( $stats as $name => $value ) {
+                                       if ( $value instanceof RunningStat ) {
+                                               $total = $value->m1 * $value->n;
+                                               $this->inclusive[$func][$name] = array(
+                                                       'total' => $total,
+                                                       'min' => $value->min,
+                                                       'mean' => $value->m1,
+                                                       'max' => $value->max,
+                                                       'variance' => $value->m2,
+                                                       'percent' => 100 * $total / $main[$name],
+                                               );
+                                       }
+                               }
+                       }
+
+                       uasort( $this->inclusive, self::makeSortFunction(
+                               $this->config['sort'], 'total'
+                       ) );
+               }
+               return $this->inclusive;
+       }
+
+       /**
+        * Get the inclusive and exclusive metrics for each function call.
+        *
+        * If data collection has not been stopped yet this method will halt
+        * collection to gather the profiling data.
+        *
+        * In addition to the normal data contained in the inclusive metrics, the
+        * metrics have an additional 'exclusive' measurement which is the total
+        * minus the totals of all child function calls.
+        *
+        * @return array
+        * @see getRawData()
+        * @see getInclusiveMetrics()
+        */
+       public function getCompleteMetrics() {
+               if ( $this->complete === null ) {
+                       // Start with inclusive data
+                       $this->complete = $this->getInclusiveMetrics();
+
+                       foreach ( $this->complete as $func => $stats ) {
+                               foreach ( $stats as $stat => $value ) {
+                                       if ( $stat === 'ct' ) {
+                                               continue;
+                                       }
+                                       // Initialize exclusive data with inclusive totals
+                                       $this->complete[$func][$stat]['exclusive'] = $value['total'];
+                               }
+                               // Add sapce for call tree information to be filled in later
+                               $this->complete[$func]['calls'] = array();
+                               $this->complete[$func]['subcalls'] = array();
+                       }
+
+                       foreach( $this->hieraData as $key => $stats ) {
+                               list( $parent, $child ) = self::splitKey( $key );
+                               if ( $parent !== null ) {
+                                       // Track call tree information
+                                       $this->complete[$child]['calls'][$parent] = $stats;
+                                       $this->complete[$parent]['subcalls'][$child] = $stats;
+                               }
+
+                               if ( isset( $this->complete[$parent] ) ) {
+                                       // Deduct child inclusive data from exclusive data
+                                       foreach ( $stats as $stat => $value ) {
+                                               if ( $stat === 'ct' ) {
+                                                       continue;
+                                               }
+
+                                               if ( !isset( $this->complete[$parent][$stat] ) ) {
+                                                       // Ignore unknown stats
+                                                       continue;
+                                               }
+
+                                               $this->complete[$parent][$stat]['exclusive'] -= $value;
+                                       }
+                               }
+                       }
+
+                       uasort( $this->complete, self::makeSortFunction(
+                               $this->config['sort'], 'exclusive'
+                       ) );
+               }
+               return $this->complete;
+       }
+
+       /**
+        * Get a list of all callers of a given function.
+        *
+        * @param string $function Function name
+        * @return array
+        * @see getEdges()
+        */
+       public function getCallers( $function ) {
+               $edges = $this->getCompleteMetrics();
+               if ( isset( $edges[$function]['calls'] ) ) {
+                       return array_keys( $edges[$function]['calls'] );
+               } else {
+                       return array();
+               }
+       }
+
+       /**
+        * Get a list of all callees from a given function.
+        *
+        * @param string $function Function name
+        * @return array
+        * @see getEdges()
+        */
+       public function getCallees( $function ) {
+               $edges = $this->getCompleteMetrics();
+               if ( isset( $edges[$function]['subcalls'] ) ) {
+                       return array_keys( $edges[$function]['subcalls'] );
+               } else {
+                       return array();
+               }
+       }
+
+       /**
+        * Find the critical path for the given metric.
+        *
+        * @param string $metric Metric to find critical path for
+        * @return array
+        */
+       public function getCriticalPath( $metric = 'wt' ) {
+               $this->stop();
+               $func = 'main()';
+               $path = array(
+                       $func => $this->hieraData[$func],
+               );
+               while ( $func ) {
+                       $callees = $this->getCallees( $func );
+                       $maxCallee = null;
+                       $maxCall = null;
+                       foreach ( $callees as $callee ) {
+                               $call = "{$func}==>{$callee}";
+                               if ( $maxCall === null ||
+                                       $this->hieraData[$call][$metric] >
+                                               $this->hieraData[$maxCall][$metric]
+                               ) {
+                                       $maxCallee = $callee;
+                                       $maxCall = $call;
+                               }
+                       }
+                       if ( $maxCall !== null ) {
+                               $path[$maxCall] = $this->hieraData[$maxCall];
+                       }
+                       $func = $maxCallee;
+               }
+               return $path;
+       }
+
+       /**
+        * Make a closure to use as a sort function. The resulting function will
+        * sort by descending numeric values (largest value first).
+        *
+        * @param string $key Data key to sort on
+        * @param string $sub Sub key to sort array values on
+        * @return Closure
+        */
+       public static function makeSortFunction( $key, $sub ) {
+               return function ( $a, $b ) use ( $key, $sub ) {
+                       if ( isset( $a[$key] ) && isset( $b[$key] ) ) {
+                               // Descending sort: larger values will be first in result.
+                               // Assumes all values are numeric.
+                               // Values for 'main()' will not have sub keys
+                               $valA = is_array( $a[$key] ) ? $a[$key][$sub] : $a[$key];
+                               $valB = is_array( $b[$key] ) ? $b[$key][$sub] : $b[$key];
+                               return $valB - $valA;
+                       } else {
+                               // Sort datum with the key before those without
+                               return isset( $a[$key] ) ? -1 : 1;
+                       }
+               };
+       }
+}
diff --git a/includes/libs/cdb/CdbException.php b/includes/libs/cdb/CdbException.php
new file mode 100644 (file)
index 0000000..6cda529
--- /dev/null
@@ -0,0 +1,26 @@
+<?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
+ */
+
+/**
+ * Exception for Cdb errors.
+ * This explicitly doesn't subclass MWException to encourage reuse.
+ */
+class CdbException extends Exception {
+}
diff --git a/includes/libs/cdb/CdbFunctions.php b/includes/libs/cdb/CdbFunctions.php
new file mode 100644 (file)
index 0000000..e74924c
--- /dev/null
@@ -0,0 +1,97 @@
+<?php
+/**
+ * This is a port of D.J. Bernstein's CDB to PHP. It's based on the copy that
+ * appears in PHP 5.3. Changes are:
+ *    * Error returns replaced with exceptions
+ *    * Exception thrown if sizes or offsets are between 2GB and 4GB
+ *    * Some variables renamed
+ *
+ * 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
+ */
+
+/**
+ * Common functions for readers and writers
+ */
+class CdbFunctions {
+       /**
+        * Take a modulo of a signed integer as if it were an unsigned integer.
+        * $b must be less than 0x40000000 and greater than 0
+        *
+        * @param int $a
+        * @param int $b
+        *
+        * @return int
+        */
+       public static function unsignedMod( $a, $b ) {
+               if ( $a & 0x80000000 ) {
+                       $m = ( $a & 0x7fffffff ) % $b + 2 * ( 0x40000000 % $b );
+
+                       return $m % $b;
+               } else {
+                       return $a % $b;
+               }
+       }
+
+       /**
+        * Shift a signed integer right as if it were unsigned
+        * @param int $a
+        * @param int $b
+        * @return int
+        */
+       public static function unsignedShiftRight( $a, $b ) {
+               if ( $b == 0 ) {
+                       return $a;
+               }
+               if ( $a & 0x80000000 ) {
+                       return ( ( $a & 0x7fffffff ) >> $b ) | ( 0x40000000 >> ( $b - 1 ) );
+               } else {
+                       return $a >> $b;
+               }
+       }
+
+       /**
+        * The CDB hash function.
+        *
+        * @param string $s
+        *
+        * @return int
+        */
+       public static function hash( $s ) {
+               $h = 5381;
+               $len = strlen( $s );
+               for ( $i = 0; $i < $len; $i++ ) {
+                       $h5 = ( $h << 5 ) & 0xffffffff;
+                       // Do a 32-bit sum
+                       // Inlined here for speed
+                       $sum = ( $h & 0x3fffffff ) + ( $h5 & 0x3fffffff );
+                       $h =
+                               (
+                                       ( $sum & 0x40000000 ? 1 : 0 )
+                                       + ( $h & 0x80000000 ? 2 : 0 )
+                                       + ( $h & 0x40000000 ? 1 : 0 )
+                                       + ( $h5 & 0x80000000 ? 2 : 0 )
+                                       + ( $h5 & 0x40000000 ? 1 : 0 )
+                               ) << 30
+                               | ( $sum & 0x3fffffff );
+                       $h ^= ord( $s[$i] );
+                       $h &= 0xffffffff;
+               }
+
+               return $h;
+       }
+}
diff --git a/includes/libs/cdb/CdbReader.php b/includes/libs/cdb/CdbReader.php
new file mode 100644 (file)
index 0000000..0ca9b9d
--- /dev/null
@@ -0,0 +1,82 @@
+<?php
+/**
+ * Native CDB file reader and writer.
+ *
+ * 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
+ */
+
+/**
+ * Read from a CDB file.
+ * Native and pure PHP implementations are provided.
+ * http://cr.yp.to/cdb.html
+ */
+abstract class CdbReader {
+       /**
+        * The file handle
+        */
+       protected $handle;
+
+       /**
+        * Open a file and return a subclass instance
+        *
+        * @param string $fileName
+        *
+        * @return CdbReader
+        */
+       public static function open( $fileName ) {
+               return self::haveExtension() ?
+                       new CdbReaderDBA( $fileName ) :
+                       new CdbReaderPHP( $fileName );
+       }
+
+       /**
+        * Returns true if the native extension is available
+        *
+        * @return bool
+        */
+       public static function haveExtension() {
+               if ( !function_exists( 'dba_handlers' ) ) {
+                       return false;
+               }
+               $handlers = dba_handlers();
+               if ( !in_array( 'cdb', $handlers ) || !in_array( 'cdb_make', $handlers ) ) {
+                       return false;
+               }
+
+               return true;
+       }
+
+       /**
+        * Create the object and open the file
+        *
+        * @param string $fileName
+        */
+       abstract public function __construct( $fileName );
+
+       /**
+        * Close the file. Optional, you can just let the variable go out of scope.
+        */
+       abstract public function close();
+
+       /**
+        * Get a value with a given key. Only string values are supported.
+        *
+        * @param string $key
+        */
+       abstract public function get( $key );
+}
diff --git a/includes/libs/cdb/CdbReaderDBA.php b/includes/libs/cdb/CdbReaderDBA.php
new file mode 100644 (file)
index 0000000..e0cab73
--- /dev/null
@@ -0,0 +1,44 @@
+<?php
+/**
+ * DBA-based CDB reader/writer
+ *
+ * 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
+ */
+
+/**
+ * Reader class which uses the DBA extension
+ */
+class CdbReaderDBA extends CdbReader {
+       public function __construct( $fileName ) {
+               $this->handle = dba_open( $fileName, 'r-', 'cdb' );
+               if ( !$this->handle ) {
+                       throw new CdbException( 'Unable to open CDB file "' . $fileName . '"' );
+               }
+       }
+
+       public function close() {
+               if ( isset( $this->handle ) ) {
+                       dba_close( $this->handle );
+               }
+               unset( $this->handle );
+       }
+
+       public function get( $key ) {
+               return dba_fetch( $key, $this->handle );
+       }
+}
diff --git a/includes/libs/cdb/CdbReaderPHP.php b/includes/libs/cdb/CdbReaderPHP.php
new file mode 100644 (file)
index 0000000..e448414
--- /dev/null
@@ -0,0 +1,214 @@
+<?php
+/**
+ * This is a port of D.J. Bernstein's CDB to PHP. It's based on the copy that
+ * appears in PHP 5.3. Changes are:
+ *    * Error returns replaced with exceptions
+ *    * Exception thrown if sizes or offsets are between 2GB and 4GB
+ *    * Some variables renamed
+ *
+ * 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
+ */
+
+/**
+ * CDB reader class
+ */
+class CdbReaderPHP extends CdbReader {
+       /** The filename */
+       protected $fileName;
+
+       /* number of hash slots searched under this key */
+       protected $loop;
+
+       /* initialized if loop is nonzero */
+       protected $khash;
+
+       /* initialized if loop is nonzero */
+       protected $kpos;
+
+       /* initialized if loop is nonzero */
+       protected $hpos;
+
+       /* initialized if loop is nonzero */
+       protected $hslots;
+
+       /* initialized if findNext() returns true */
+       protected $dpos;
+
+       /* initialized if cdb_findnext() returns 1 */
+       protected $dlen;
+
+       /**
+        * @param string $fileName
+        * @throws CdbException
+        */
+       public function __construct( $fileName ) {
+               $this->fileName = $fileName;
+               $this->handle = fopen( $fileName, 'rb' );
+               if ( !$this->handle ) {
+                       throw new CdbException( 'Unable to open CDB file "' . $this->fileName . '".' );
+               }
+               $this->findStart();
+       }
+
+       public function close() {
+               if ( isset( $this->handle ) ) {
+                       fclose( $this->handle );
+               }
+               unset( $this->handle );
+       }
+
+       /**
+        * @param mixed $key
+        * @return bool|string
+        */
+       public function get( $key ) {
+               // strval is required
+               if ( $this->find( strval( $key ) ) ) {
+                       return $this->read( $this->dlen, $this->dpos );
+               } else {
+                       return false;
+               }
+       }
+
+       /**
+        * @param string $key
+        * @param int $pos
+        * @return bool
+        */
+       protected function match( $key, $pos ) {
+               $buf = $this->read( strlen( $key ), $pos );
+
+               return $buf === $key;
+       }
+
+       protected function findStart() {
+               $this->loop = 0;
+       }
+
+       /**
+        * @throws CdbException
+        * @param int $length
+        * @param int $pos
+        * @return string
+        */
+       protected function read( $length, $pos ) {
+               if ( fseek( $this->handle, $pos ) == -1 ) {
+                       // This can easily happen if the internal pointers are incorrect
+                       throw new CdbException(
+                               'Seek failed, file "' . $this->fileName . '" may be corrupted.' );
+               }
+
+               if ( $length == 0 ) {
+                       return '';
+               }
+
+               $buf = fread( $this->handle, $length );
+               if ( $buf === false || strlen( $buf ) !== $length ) {
+                       throw new CdbException(
+                               'Read from CDB file failed, file "' . $this->fileName . '" may be corrupted.' );
+               }
+
+               return $buf;
+       }
+
+       /**
+        * Unpack an unsigned integer and throw an exception if it needs more than 31 bits
+        * @param string $s
+        * @throws CdbException
+        * @return mixed
+        */
+       protected function unpack31( $s ) {
+               $data = unpack( 'V', $s );
+               if ( $data[1] > 0x7fffffff ) {
+                       throw new CdbException(
+                               'Error in CDB file "' . $this->fileName . '", integer too big.' );
+               }
+
+               return $data[1];
+       }
+
+       /**
+        * Unpack a 32-bit signed integer
+        * @param string $s
+        * @return int
+        */
+       protected function unpackSigned( $s ) {
+               $data = unpack( 'va/vb', $s );
+
+               return $data['a'] | ( $data['b'] << 16 );
+       }
+
+       /**
+        * @param string $key
+        * @return bool
+        */
+       protected function findNext( $key ) {
+               if ( !$this->loop ) {
+                       $u = CdbFunctions::hash( $key );
+                       $buf = $this->read( 8, ( $u << 3 ) & 2047 );
+                       $this->hslots = $this->unpack31( substr( $buf, 4 ) );
+                       if ( !$this->hslots ) {
+                               return false;
+                       }
+                       $this->hpos = $this->unpack31( substr( $buf, 0, 4 ) );
+                       $this->khash = $u;
+                       $u = CdbFunctions::unsignedShiftRight( $u, 8 );
+                       $u = CdbFunctions::unsignedMod( $u, $this->hslots );
+                       $u <<= 3;
+                       $this->kpos = $this->hpos + $u;
+               }
+
+               while ( $this->loop < $this->hslots ) {
+                       $buf = $this->read( 8, $this->kpos );
+                       $pos = $this->unpack31( substr( $buf, 4 ) );
+                       if ( !$pos ) {
+                               return false;
+                       }
+                       $this->loop += 1;
+                       $this->kpos += 8;
+                       if ( $this->kpos == $this->hpos + ( $this->hslots << 3 ) ) {
+                               $this->kpos = $this->hpos;
+                       }
+                       $u = $this->unpackSigned( substr( $buf, 0, 4 ) );
+                       if ( $u === $this->khash ) {
+                               $buf = $this->read( 8, $pos );
+                               $keyLen = $this->unpack31( substr( $buf, 0, 4 ) );
+                               if ( $keyLen == strlen( $key ) && $this->match( $key, $pos + 8 ) ) {
+                                       // Found
+                                       $this->dlen = $this->unpack31( substr( $buf, 4 ) );
+                                       $this->dpos = $pos + 8 + $keyLen;
+
+                                       return true;
+                               }
+                       }
+               }
+
+               return false;
+       }
+
+       /**
+        * @param mixed $key
+        * @return bool
+        */
+       protected function find( $key ) {
+               $this->findStart();
+
+               return $this->findNext( $key );
+       }
+}
+
diff --git a/includes/libs/cdb/CdbWriter.php b/includes/libs/cdb/CdbWriter.php
new file mode 100644 (file)
index 0000000..b0a90c3
--- /dev/null
@@ -0,0 +1,96 @@
+<?php
+/**
+ * Native CDB file reader and writer.
+ *
+ * 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
+ */
+
+/**
+ * Write to a CDB file.
+ * Native and pure PHP implementations are provided.
+ * http://cr.yp.to/cdb.html
+ */
+abstract class CdbWriter {
+       /**
+        * The file handle
+        */
+       protected $handle;
+
+       /**
+        * File we'll be writing to when we're done
+        * @var string
+        */
+       protected $realFileName;
+
+       /**
+        * File we write to temporarily until we're done
+        * @var string
+        */
+       protected $tmpFileName;
+
+       /**
+        * Open a writer and return a subclass instance.
+        * The user must have write access to the directory, for temporary file creation.
+        *
+        * @param string $fileName
+        *
+        * @return CdbWriterDBA|CdbWriterPHP
+        */
+       public static function open( $fileName ) {
+               return CdbReader::haveExtension() ?
+                       new CdbWriterDBA( $fileName ) :
+                       new CdbWriterPHP( $fileName );
+       }
+
+       /**
+        * Create the object and open the file
+        *
+        * @param string $fileName
+        */
+       abstract public function __construct( $fileName );
+
+       /**
+        * Set a key to a given value. The value will be converted to string.
+        * @param string $key
+        * @param string $value
+        */
+       abstract public function set( $key, $value );
+
+       /**
+        * Close the writer object. You should call this function before the object
+        * goes out of scope, to write out the final hashtables.
+        */
+       abstract public function close();
+
+       /**
+        * If the object goes out of scope, close it for sanity
+        */
+       public function __destruct() {
+               if ( isset( $this->handle ) ) {
+                       $this->close();
+               }
+       }
+
+       /**
+        * Are we running on Windows?
+        * @return bool
+        */
+       protected function isWindows() {
+               return substr( php_uname(), 0, 7 ) == 'Windows';
+       }
+}
diff --git a/includes/libs/cdb/CdbWriterDBA.php b/includes/libs/cdb/CdbWriterDBA.php
new file mode 100644 (file)
index 0000000..1de371d
--- /dev/null
@@ -0,0 +1,52 @@
+<?php
+/**
+ * DBA-based CDB reader/writer
+ *
+ * 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
+ */
+
+/**
+ * Writer class which uses the DBA extension
+ */
+class CdbWriterDBA extends CdbWriter {
+       public function __construct( $fileName ) {
+               $this->realFileName = $fileName;
+               $this->tmpFileName = $fileName . '.tmp.' . mt_rand( 0, 0x7fffffff );
+               $this->handle = dba_open( $this->tmpFileName, 'n', 'cdb_make' );
+               if ( !$this->handle ) {
+                       throw new CdbException( 'Unable to open CDB file for write "' . $fileName . '"' );
+               }
+       }
+
+       public function set( $key, $value ) {
+               return dba_insert( $key, $value, $this->handle );
+       }
+
+       public function close() {
+               if ( isset( $this->handle ) ) {
+                       dba_close( $this->handle );
+               }
+               if ( $this->isWindows() ) {
+                       unlink( $this->realFileName );
+               }
+               if ( !rename( $this->tmpFileName, $this->realFileName ) ) {
+                       throw new CdbException( 'Unable to move the new CDB file into place.' );
+               }
+               unset( $this->handle );
+       }
+}
diff --git a/includes/libs/cdb/CdbWriterPHP.php b/includes/libs/cdb/CdbWriterPHP.php
new file mode 100644 (file)
index 0000000..bfc0d87
--- /dev/null
@@ -0,0 +1,234 @@
+<?php
+/**
+ * This is a port of D.J. Bernstein's CDB to PHP. It's based on the copy that
+ * appears in PHP 5.3. Changes are:
+ *    * Error returns replaced with exceptions
+ *    * Exception thrown if sizes or offsets are between 2GB and 4GB
+ *    * Some variables renamed
+ *
+ * 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
+ */
+
+/**
+ * CDB writer class
+ */
+class CdbWriterPHP extends CdbWriter {
+       protected $hplist;
+
+       protected $numentries;
+
+       protected $pos;
+
+       /**
+        * @param string $fileName
+        */
+       public function __construct( $fileName ) {
+               $this->realFileName = $fileName;
+               $this->tmpFileName = $fileName . '.tmp.' . mt_rand( 0, 0x7fffffff );
+               $this->handle = fopen( $this->tmpFileName, 'wb' );
+               if ( !$this->handle ) {
+                       $this->throwException(
+                               'Unable to open CDB file "' . $this->tmpFileName . '" for write.' );
+               }
+               $this->hplist = array();
+               $this->numentries = 0;
+               $this->pos = 2048; // leaving space for the pointer array, 256 * 8
+               if ( fseek( $this->handle, $this->pos ) == -1 ) {
+                       $this->throwException( 'fseek failed in file "' . $this->tmpFileName . '".' );
+               }
+       }
+
+       /**
+        * @param string $key
+        * @param string $value
+        */
+       public function set( $key, $value ) {
+               if ( strval( $key ) === '' ) {
+                       // DBA cross-check hack
+                       return;
+               }
+               $this->addbegin( strlen( $key ), strlen( $value ) );
+               $this->write( $key );
+               $this->write( $value );
+               $this->addend( strlen( $key ), strlen( $value ), CdbFunctions::hash( $key ) );
+       }
+
+       /**
+        * @throws CdbException
+        */
+       public function close() {
+               $this->finish();
+               if ( isset( $this->handle ) ) {
+                       fclose( $this->handle );
+               }
+               if ( $this->isWindows() && file_exists( $this->realFileName ) ) {
+                       unlink( $this->realFileName );
+               }
+               if ( !rename( $this->tmpFileName, $this->realFileName ) ) {
+                       $this->throwException( 'Unable to move the new CDB file into place.' );
+               }
+               unset( $this->handle );
+       }
+
+       /**
+        * @throws CdbException
+        * @param string $buf
+        */
+       protected function write( $buf ) {
+               $len = fwrite( $this->handle, $buf );
+               if ( $len !== strlen( $buf ) ) {
+                       $this->throwException( 'Error writing to CDB file "' . $this->tmpFileName . '".' );
+               }
+       }
+
+       /**
+        * @throws CdbException
+        * @param int $len
+        */
+       protected function posplus( $len ) {
+               $newpos = $this->pos + $len;
+               if ( $newpos > 0x7fffffff ) {
+                       $this->throwException(
+                               'A value in the CDB file "' . $this->tmpFileName . '" is too large.' );
+               }
+               $this->pos = $newpos;
+       }
+
+       /**
+        * @param int $keylen
+        * @param int $datalen
+        * @param int $h
+        */
+       protected function addend( $keylen, $datalen, $h ) {
+               $this->hplist[] = array(
+                       'h' => $h,
+                       'p' => $this->pos
+               );
+
+               $this->numentries++;
+               $this->posplus( 8 );
+               $this->posplus( $keylen );
+               $this->posplus( $datalen );
+       }
+
+       /**
+        * @throws CdbException
+        * @param int $keylen
+        * @param int $datalen
+        */
+       protected function addbegin( $keylen, $datalen ) {
+               if ( $keylen > 0x7fffffff ) {
+                       $this->throwException( 'Key length too long in file "' . $this->tmpFileName . '".' );
+               }
+               if ( $datalen > 0x7fffffff ) {
+                       $this->throwException( 'Data length too long in file "' . $this->tmpFileName . '".' );
+               }
+               $buf = pack( 'VV', $keylen, $datalen );
+               $this->write( $buf );
+       }
+
+       /**
+        * @throws CdbException
+        */
+       protected function finish() {
+               // Hack for DBA cross-check
+               $this->hplist = array_reverse( $this->hplist );
+
+               // Calculate the number of items that will be in each hashtable
+               $counts = array_fill( 0, 256, 0 );
+               foreach ( $this->hplist as $item ) {
+                       ++$counts[255 & $item['h']];
+               }
+
+               // Fill in $starts with the *end* indexes
+               $starts = array();
+               $pos = 0;
+               for ( $i = 0; $i < 256; ++$i ) {
+                       $pos += $counts[$i];
+                       $starts[$i] = $pos;
+               }
+
+               // Excessively clever and indulgent code to simultaneously fill $packedTables
+               // with the packed hashtables, and adjust the elements of $starts
+               // to actually point to the starts instead of the ends.
+               $packedTables = array_fill( 0, $this->numentries, false );
+               foreach ( $this->hplist as $item ) {
+                       $packedTables[--$starts[255 & $item['h']]] = $item;
+               }
+
+               $final = '';
+               for ( $i = 0; $i < 256; ++$i ) {
+                       $count = $counts[$i];
+
+                       // The size of the hashtable will be double the item count.
+                       // The rest of the slots will be empty.
+                       $len = $count + $count;
+                       $final .= pack( 'VV', $this->pos, $len );
+
+                       $hashtable = array();
+                       for ( $u = 0; $u < $len; ++$u ) {
+                               $hashtable[$u] = array( 'h' => 0, 'p' => 0 );
+                       }
+
+                       // Fill the hashtable, using the next empty slot if the hashed slot
+                       // is taken.
+                       for ( $u = 0; $u < $count; ++$u ) {
+                               $hp = $packedTables[$starts[$i] + $u];
+                               $where = CdbFunctions::unsignedMod(
+                                       CdbFunctions::unsignedShiftRight( $hp['h'], 8 ), $len );
+                               while ( $hashtable[$where]['p'] ) {
+                                       if ( ++$where == $len ) {
+                                               $where = 0;
+                                       }
+                               }
+                               $hashtable[$where] = $hp;
+                       }
+
+                       // Write the hashtable
+                       for ( $u = 0; $u < $len; ++$u ) {
+                               $buf = pack( 'vvV',
+                                       $hashtable[$u]['h'] & 0xffff,
+                                       CdbFunctions::unsignedShiftRight( $hashtable[$u]['h'], 16 ),
+                                       $hashtable[$u]['p'] );
+                               $this->write( $buf );
+                               $this->posplus( 8 );
+                       }
+               }
+
+               // Write the pointer array at the start of the file
+               rewind( $this->handle );
+               if ( ftell( $this->handle ) != 0 ) {
+                       $this->throwException( 'Error rewinding to start of file "' . $this->tmpFileName . '".' );
+               }
+               $this->write( $final );
+       }
+
+       /**
+        * Clean up the temp file and throw an exception
+        *
+        * @param string $msg
+        * @throws CdbException
+        */
+       protected function throwException( $msg ) {
+               if ( $this->handle ) {
+                       fclose( $this->handle );
+                       unlink( $this->tmpFileName );
+               }
+               throw new CdbException( $msg );
+       }
+}
index bc9e917..d9327fb 100644 (file)
@@ -348,9 +348,9 @@ class ThumbnailImage extends MediaTransformOutput {
                        throw new MWException( __METHOD__ . ' called in the old style' );
                }
 
-               $alt = empty( $options['alt'] ) ? '' : $options['alt'];
+               $alt = isset( $options['alt'] ) ? $options['alt'] : '';
 
-               $query = empty( $options['desc-query'] ) ? '' : $options['desc-query'];
+               $query = isset( $options['desc-query'] ) ? $options['desc-query'] : '';
 
                if ( !empty( $options['custom-url-link'] ) ) {
                        $linkAttribs = array( 'href' => $options['custom-url-link'] );
index cdf8da1..40b40d1 100644 (file)
@@ -49,7 +49,7 @@ class ObjectCacheSessionHandler {
 
        /**
         * Get the cache storage object to use for session storage
-        * @return ObjectCache
+        * @return BagOStuff
         */
        static function getCache() {
                global $wgSessionCacheType;
index 7794fae..6c15993 100644 (file)
@@ -267,17 +267,15 @@ class LinkHolderArray {
         * Replace <!--LINK--> link placeholders with actual links, in the buffer
         *
         * @param string $text
-        * @return array Array of link CSS classes, indexed by PDBK.
         */
        public function replace( &$text ) {
                wfProfileIn( __METHOD__ );
 
-               /** @todo FIXME: replaceInternal doesn't return a value */
-               $colours = $this->replaceInternal( $text );
+               $this->replaceInternal( $text );
                $this->replaceInterwiki( $text );
 
                wfProfileOut( __METHOD__ );
-               return $colours;
+
        }
 
        /**
index 07a104b..d310836 100644 (file)
@@ -224,6 +224,9 @@ class Parser {
         */
        public $mInParse = false;
 
+       /** @var SectionProfiler */
+       protected $mProfiler;
+
        /**
         * @param array $conf
         */
@@ -365,6 +368,8 @@ class Parser {
                        $this->mPreprocessor = null;
                }
 
+               $this->mProfiler = new SectionProfiler();
+
                wfRunHooks( 'ParserClearState', array( &$this ) );
                wfProfileOut( __METHOD__ );
        }
@@ -526,6 +531,19 @@ class Parser {
                        $limitReport = str_replace( array( '-', '&' ), array( '‐', '&amp;' ), $limitReport );
                        $text .= "\n<!-- \n$limitReport-->\n";
 
+                       // Add on template profiling data
+                       $dataByFunc = $this->mProfiler->getFunctionStats();
+                       uasort( $dataByFunc, function( $a, $b ) {
+                               return $a['elapsed'] < $b['elapsed']; // descending order
+                       } );
+                       $profileReport = "Top template expansion time report (%,ms,calls,template)\n";
+                       foreach ( array_slice( $dataByFunc, 0, 10 ) as $item ) {
+                               $profileReport .= sprintf( "%6.2f%% %3.6f %6d - %s\n",
+                                       $item['percent'], $item['elapsed'], $item['calls'],
+                                       htmlspecialchars($item['name'] ) );
+                       }
+                       $text .= "\n<!-- \n$profileReport-->\n";
+
                        if ( $this->mGeneratedPPNodeCount > $this->mOptions->getMaxGeneratedPPNodeCount() / 10 ) {
                                wfDebugLog( 'generated-pp-node-count', $this->mGeneratedPPNodeCount . ' ' .
                                        $this->mTitle->getPrefixedDBkey() );
@@ -3473,7 +3491,7 @@ class Parser {
                $args = ( null == $piece['parts'] ) ? array() : $piece['parts'];
                wfProfileOut( __METHOD__ . '-setup' );
 
-               $titleProfileIn = null; // profile templates
+               $profileSection = null; // profile templates
 
                # SUBST
                wfProfileIn( __METHOD__ . '-modifiers' );
@@ -3594,11 +3612,7 @@ class Parser {
 
                # Load from database
                if ( !$found && $title ) {
-                       if ( !Profiler::instance()->isPersistent() ) {
-                               # Too many unique items can kill profiling DBs/collectors
-                               $titleProfileIn = __METHOD__ . "-title-" . $title->getPrefixedDBkey();
-                               wfProfileIn( $titleProfileIn ); // template in
-                       }
+                       $profileSection = $this->mProfiler->scopedProfileIn( $title->getPrefixedDBkey() );
                        wfProfileIn( __METHOD__ . '-loadtpl' );
                        if ( !$title->isExternal() ) {
                                if ( $title->isSpecialPage()
@@ -3680,8 +3694,8 @@ class Parser {
                # Recover the source wikitext and return it
                if ( !$found ) {
                        $text = $frame->virtualBracketedImplode( '{{', '|', '}}', $titleWithSpaces, $args );
-                       if ( $titleProfileIn ) {
-                               wfProfileOut( $titleProfileIn ); // template out
+                       if ( $profileSection ) {
+                               $this->mProfiler->scopedProfileOut( $profileSection );
                        }
                        wfProfileOut( __METHOD__ );
                        return array( 'object' => $text );
@@ -3707,8 +3721,8 @@ class Parser {
                        $isLocalObj = false;
                }
 
-               if ( $titleProfileIn ) {
-                       wfProfileOut( $titleProfileIn ); // template out
+               if ( $profileSection ) {
+                       $this->mProfiler->scopedProfileOut( $profileSection );
                }
 
                # Replace raw HTML by a placeholder
@@ -5317,11 +5331,9 @@ class Parser {
         *
         * @param string $text
         * @param int $options
-        *
-        * @return array Array of link CSS classes, indexed by PDBK.
         */
        public function replaceLinkHolders( &$text, $options = 0 ) {
-               return $this->mLinkHolders->replace( $text );
+               $this->mLinkHolders->replace( $text );
        }
 
        /**
index 4c12b10..078b66b 100644 (file)
@@ -80,18 +80,6 @@ abstract class Profiler {
         */
        abstract public function isStub();
 
-       /**
-        * Return whether this profiler stores data
-        *
-        * Called by Parser::braceSubstitution. If true, the parser will not
-        * generate per-title profiling sections, to avoid overloading the
-        * profiling data collector.
-        *
-        * @see Profiler::logData()
-        * @return bool
-        */
-       abstract public function isPersistent();
-
        /**
         * @param string $id
         */
@@ -159,6 +147,8 @@ abstract class Profiler {
        abstract public function getOutput();
 
        /**
+        * Get data for the debugging toolbar.
+        *
         * @return array
         */
        abstract public function getRawData();
index 3625db6..911b926 100644 (file)
  * @ingroup Profiler
  */
 class ProfilerSimpleDB extends ProfilerStandard {
-       public function isPersistent() {
-               return true;
-       }
-
        /**
         * Log the whole profiling data into the database.
         */
index 2671376..ad16a18 100644 (file)
  * @ingroup Profiler
  */
 class ProfilerSimpleUDP extends ProfilerStandard {
-       public function isPersistent() {
-               return true;
-       }
-
        public function logData() {
                global $wgUDPProfilerHost, $wgUDPProfilerPort, $wgUDPProfilerFormatString;
 
index 4825f7a..b873806 100644 (file)
@@ -47,11 +47,14 @@ class ProfilerStandard extends Profiler {
 
        /**
         * @param array $params
+        *   - initTotal : set to false to omit -total/-setup entries (which use request start time)
         */
        public function __construct( array $params ) {
                parent::__construct( $params );
 
-               $this->addInitialStack();
+               if ( !isset( $params['initTotal'] ) || $params['initTotal'] ) {
+                       $this->addInitialStack();
+               }
        }
 
        /**
@@ -63,16 +66,6 @@ class ProfilerStandard extends Profiler {
                return false;
        }
 
-       /**
-        * Return whether this profiler stores data
-        *
-        * @see Profiler::logData()
-        * @return bool
-        */
-       public function isPersistent() {
-               return false;
-       }
-
        /**
         * Add the inital item in the stack.
         */
index e81f579..43e2193 100644 (file)
@@ -31,10 +31,6 @@ class ProfilerStub extends Profiler {
                return true;
        }
 
-       public function isPersistent() {
-               return false;
-       }
-
        public function profileIn( $fn ) {
        }
 
diff --git a/includes/profiler/ProfilerXhprof.php b/includes/profiler/ProfilerXhprof.php
new file mode 100644 (file)
index 0000000..5e70aa9
--- /dev/null
@@ -0,0 +1,477 @@
+<?php
+/**
+ * @section LICENSE
+ * 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
+ */
+
+/**
+ * Profiler wrapper for XHProf extension.
+ *
+ * Mimics the output of ProfilerSimpleText, ProfilerSimpleUDP or
+ * ProfilerSimpleTrace but using data collected via the XHProf PHP extension.
+ * This Profiler also produces data compatable with the debugging toolbar.
+ *
+ * To mimic ProfilerSimpleText results:
+ * @code
+ * $wgProfiler['class'] = 'ProfilerXhprof';
+ * $wgProfiler['flags'] = XHPROF_FLAGS_NO_BUILTINS;
+ * $wgProfiler['log'] = 'text';
+ * $wgProfiler['visible'] = true;
+ * @endcode
+ *
+ * To mimic ProfilerSimpleUDP results:
+ * @code
+ * $wgProfiler['class'] = 'ProfilerXhprof';
+ * $wgProfiler['flags'] = XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_NO_BUILTINS;
+ * $wgProfiler['log'] = 'udpprofile';
+ * @endcode
+ *
+ * Similar to ProfilerSimpleTrace results, report the most expensive path
+ * through the application:
+ * @code
+ * $wgProfiler['class'] = 'ProfilerXhprof';
+ * $wgProfiler['flags'] = XHPROF_FLAGS_NO_BUILTINS;
+ * $wgProfiler['log'] = 'critpath';
+ * $wgProfiler['visible'] = true;
+ * @endcode
+ *
+ * Rather than obeying wfProfileIn() and wfProfileOut() calls placed in the
+ * application code, ProfilerXhprof profiles all functions using the XHProf
+ * PHP extenstion. For PHP5 users, this extension can be installed via PECL or
+ * your operating system's package manager. XHProf support is built into HHVM.
+ *
+ * To restrict the functions for which profiling data is collected, you can
+ * use either a whitelist ($wgProfiler['include']) or a blacklist
+ * ($wgProfiler['exclude']) containing an array of function names. The
+ * blacklist funcitonality is built into HHVM and will completely exclude the
+ * named functions from profiling collection. The whitelist is implemented by
+ * Xhprof class and will filter the data collected by XHProf before reporting.
+ * See documentation for the Xhprof class and the XHProf extension for
+ * additional information.
+ *
+ * Data reported to debug toolbar via getRawData() can be restricted by
+ * setting $wgProfiler['toolbarCutoff'] to a minumum cumulative wall clock
+ * percentage. Functions in the call graph which contribute less than this
+ * percentage to the total wall clock time measured will be excluded from the
+ * data sent to debug toolbar. The default cutoff is 0.1 (1/1000th of the
+ * total time measured).
+ *
+ * @author Bryan Davis <bd808@wikimedia.org>
+ * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
+ * @ingroup Profiler
+ * @see Xhprof
+ * @see https://php.net/xhprof
+ * @see https://github.com/facebook/hhvm/blob/master/hphp/doc/profiling.md
+ */
+class ProfilerXhprof extends Profiler {
+
+       /**
+        * @var Xhprof $xhprof
+        */
+       protected $xhprof;
+
+       /**
+        * Type of report to send when logData() is called.
+        * @var string $logType
+        */
+       protected $logType;
+
+       /**
+        * Should profile report sent to in page content be visible?
+        * @var bool $visible
+        */
+       protected $visible;
+
+       /**
+        * Minimum wall time precentage for a fucntion to be reported to the debug
+        * toolbar via getRawData().
+        * @var float $toolbarCutoff
+        */
+       protected $toolbarCutoff;
+
+       /**
+        * @param array $params
+        * @see Xhprof::__construct()
+        */
+       public function __construct( array $params = array() ) {
+               $params = array_merge(
+                       array(
+                               'log' => 'text',
+                               'visible' => false,
+                               'toolbarCutoff' => 0.1,
+                       ),
+                       $params
+               );
+               parent::__construct( $params );
+               $this->logType = $params['log'];
+               $this->visible = $params['visible'];
+               $this->xhprof = new Xhprof( $params );
+       }
+
+       public function isStub() {
+               return false;
+       }
+
+       /**
+        * No-op for xhprof profiling.
+        *
+        * Use the 'include' configuration key instead if you need to constrain
+        * the functions that are profiled.
+        *
+        * @param string $functionname
+        */
+       public function profileIn( $functionname ) {
+               global $wgDebugFunctionEntry;
+               if ( $wgDebugFunctionEntry ) {
+                       $this->debug( "Entering {$functionname}" );
+               }
+       }
+
+       /**
+        * No-op for xhprof profiling.
+        *
+        * Use the 'include' configuration key instead if you need to constrain
+        * the functions that are profiled.
+        *
+        * @param string $functionname
+        */
+       public function profileOut( $functionname ) {
+               global $wgDebugFunctionEntry;
+               if ( $wgDebugFunctionEntry ) {
+                       $this->debug( "Exiting {$functionname}" );
+               }
+       }
+
+       /**
+        * No-op for xhprof profiling.
+        */
+       public function close() {
+       }
+
+       /**
+        * Get data for the debugging toolbar.
+        *
+        * @return array
+        * @see https://www.mediawiki.org/wiki/Debugging_toolbar
+        */
+       public function getRawData() {
+               $metrics = $this->xhprof->getCompleteMetrics();
+               $endEpoch = $this->getTime();
+               $profile = array();
+
+               foreach ( $metrics as $fname => $stats ) {
+                       if ( $stats['wt']['percent'] < $this->toolbarCutoff ) {
+                               // Ignore functions which are not significant contributors
+                               // to the total elapsed time.
+                               continue;
+                       }
+
+                       $record = array(
+                               'name' => $fname,
+                               'calls' => $stats['ct'],
+                               'elapsed' => $stats['wt']['total'] / 1000,
+                               'percent' => $stats['wt']['percent'],
+                               'memory' => isset( $stats['mu'] ) ? $stats['mu']['total'] : 0,
+                               'min' => $stats['wt']['min'] / 1000,
+                               'max' => $stats['wt']['max'] / 1000,
+                               'overhead' => array_reduce(
+                                       $stats['subcalls'],
+                                       function( $carry, $item ) {
+                                               return $carry + $item['ct'];
+                                       },
+                                       0
+                               ),
+                               'periods' => array(),
+                       );
+
+                       // We are making up periods based on the call segments we have.
+                       // What we don't have is the start time for each call (which
+                       // actually may be a collection of multiple calls from the
+                       // caller). We will pretend that all the calls happen sequentially
+                       // and finish at the end of the end of the request.
+                       foreach ( $stats['calls'] as $call ) {
+                               $avgElapsed = $call['wt'] / 1000 / $call['ct'];
+                               $avgMem = isset( $call['mu'] ) ? $call['mu'] / $call['ct'] : 0;
+                               $start = $endEpoch - $avgElapsed;
+                               for ( $i = 0; $i < $call['ct']; $i++ ) {
+                                       $callStart = $start + ( $avgElapsed * $i );
+                                       $record['periods'][] = array(
+                                               'start' => $callStart,
+                                               'end' => $callStart + $avgElapsed,
+                                               'memory' => $avgMem,
+                                               'subcalls' => 0,
+                                       );
+                               }
+                       }
+
+                       $profile[] = $record;
+               }
+               return $profile;
+       }
+
+       /**
+        * Log the data to some store or even the page output.
+        */
+       public function logData() {
+               if ( $this->logType === 'text' ) {
+                       $this->logText();
+               } elseif ( $this->logType === 'udpprofile' ) {
+                       $this->logToUdpprofile();
+               } elseif ( $this->logType === 'critpath' ){
+                       $this->logCriticalPath();
+               } else {
+                       wfLogWarning(
+                               "Unknown ProfilerXhprof log type '{$this->logType}'"
+                       );
+               }
+       }
+
+       /**
+        * Write a brief profile report to stdout.
+        */
+       protected function logText() {
+               if ( $this->templated ) {
+                       $ct = $this->getContentType();
+                       if ( $ct === 'text/html' && $this->visible ) {
+                               $prefix = '<pre>';
+                               $suffix = '</pre>';
+                       } elseif ( $ct === 'text/javascript' || $ct === 'text/css' ) {
+                               $prefix = "\n/*";
+                               $suffix = "*/\n";
+                       } else {
+                               $prefix = "<!--";
+                               $suffix = "-->\n";
+                       }
+
+                       print $this->getSummaryReport( $prefix, $suffix );
+               }
+       }
+
+       /**
+        * Send collected information to a udpprofile daemon.
+        *
+        * @see http://git.wikimedia.org/tree/operations%2Fsoftware.git/master/udpprofile
+        * @see $wgUDPProfilerHost
+        * @see $wgUDPProfilerPort
+        * @see $wgUDPProfilerFormatString
+        */
+       protected function logToUdpprofile() {
+               global $wgUDPProfilerHost, $wgUDPProfilerPort;
+               global $wgUDPProfilerFormatString;
+
+               if ( !function_exists( 'socket_create' ) ) {
+                       return;
+               }
+
+               $metrics = $this->xhprof->getInclusiveMetrics();
+
+               $sock = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP );
+               $buffer = '';
+               $bufferSize = 0;
+               foreach ( $metrics as $func => $data ) {
+                       if ( strpos( $func, '@' ) !== false ) {
+                               continue; // ignore cyclic re-entries to functions
+                       }
+                       $line = sprintf( $wgUDPProfilerFormatString,
+                               $this->getProfileID(),
+                               $data['ct'],
+                               isset( $data['cpu'] ) ? $data['cpu']['total'] : 0,
+                               isset( $data['cpu'] ) ? $data['cpu']['variance'] : 0,
+                               $data['wt']['total'] / 1000,
+                               $data['wt']['variance'],
+                               $func,
+                               isset( $data['mu'] ) ? $data['mu']['total'] : 0
+                       );
+                       $lineLength = strlen( $line );
+                       if ( $lineLength + $bufferSize > 1400 ) {
+                               // Line would exceed max packet size, send packet before
+                               // appending to buffer.
+                               socket_sendto( $sock, $buffer, $bufferSize, 0,
+                                       $wgUDPProfilerHost, $wgUDPProfilerPort
+                               );
+                               $buffer = '';
+                               $bufferSize = 0;
+                       }
+                       $buffer .= $line;
+                       $bufferSize += $lineLength;
+               }
+               // Send final buffer
+               socket_sendto( $sock, $buffer, $bufferSize, 0x100 /* EOF */,
+                       $wgUDPProfilerHost, $wgUDPProfilerPort
+               );
+       }
+
+       /**
+        * Write a critical path report to stdout.
+        */
+       protected function logCriticalPath() {
+               if ( $this->templated ) {
+                       $ct = $this->getContentType();
+                       if ( $ct === 'text/html' && $this->visible ) {
+                               $prefix = '<pre>Critical path:';
+                               $suffix = '</pre>';
+                       } elseif ( $ct === 'text/javascript' || $ct === 'text/css' ) {
+                               $prefix = "\n/* Critical path:";
+                               $suffix = "*/\n";
+                       } else {
+                               $prefix = "<!-- Critical path:";
+                               $suffix = "-->\n";
+                       }
+
+                       print $this->getCriticalPathReport( $prefix, $suffix );
+               }
+       }
+
+       /**
+        * Get the content type of the current request.
+        * @return string
+        */
+       protected function getContentType() {
+               foreach ( headers_list() as $header ) {
+                       if ( preg_match( '#^content-type: (\w+/\w+);?#i', $header, $m ) ) {
+                               return $m[1];
+                       }
+               }
+               return 'application/octet-stream';
+       }
+
+       /**
+        * Returns a profiling output to be stored in debug file
+        *
+        * @return string
+        */
+       public function getOutput() {
+               return $this->getFunctionReport();
+       }
+
+       /**
+        * Get a report of profiled functions sorted by inclusive wall clock time
+        * in descending order.
+        *
+        * Each line of the report includes this data:
+        * - Function name
+        * - Number of times function was called
+        * - Total wall clock time spent in function in microseconds
+        * - Minimum wall clock time spent in function in microseconds
+        * - Average wall clock time spent in function in microseconds
+        * - Maximum wall clock time spent in function in microseconds
+        * - Percentage of total wall clock time spent in function
+        * - Total delta of memory usage from start to end of function in bytes
+        *
+        * @return string
+        */
+       protected function getFunctionReport() {
+               $data = $this->xhprof->getInclusiveMetrics();
+               uasort( $data, Xhprof::makeSortFunction( 'wt', 'total' ) );
+
+               $width = 140;
+               $nameWidth = $width - 65;
+               $format = "%-{$nameWidth}s %6d %9d %9d %9d %9d %7.3f%% %9d";
+               $out = array();
+               $out[] = sprintf( "%-{$nameWidth}s %6s %9s %9s %9s %9s %7s %9s",
+                       'Name', 'Calls', 'Total', 'Min', 'Each', 'Max', '%', 'Mem'
+               );
+               foreach ( $data as $func => $stats ) {
+                       $out[] = sprintf( $format,
+                               $func,
+                               $stats['ct'],
+                               $stats['wt']['total'],
+                               $stats['wt']['min'],
+                               $stats['wt']['mean'],
+                               $stats['wt']['max'],
+                               $stats['wt']['percent'],
+                               isset( $stats['mu'] ) ? $stats['mu']['total'] : 0
+                       );
+               }
+               return implode( "\n", $out );
+       }
+
+       /**
+        * Get a brief report of profiled functions sorted by inclusive wall clock
+        * time in descending order.
+        *
+        * Each line of the report includes this data:
+        * - Percentage of total wall clock time spent in function
+        * - Total wall clock time spent in function in seconds
+        * - Number of times function was called
+        * - Function name
+        *
+        * @param string $header Header text to prepend to report
+        * @param string $footer Footer text to append to report
+        * @return string
+        */
+       protected function getSummaryReport( $header = '', $footer = '' ) {
+               $data = $this->xhprof->getInclusiveMetrics();
+               uasort( $data, Xhprof::makeSortFunction( 'wt', 'total' ) );
+
+               $format = '%6.2f%% %3.6f %6d - %s';
+               $out = array( $header );
+               foreach ( $data as $func => $stats ) {
+                       $out[] = sprintf( $format,
+                               $stats['wt']['percent'],
+                               $stats['wt']['total'] / 1e6,
+                               $stats['ct'],
+                               $func
+                       );
+               }
+               $out[] = $footer;
+               return implode( "\n", $out );
+       }
+
+       /**
+        * Get a brief report of the most costly code path by wall clock time.
+        *
+        * Each line of the report includes this data:
+        * - Total wall clock time spent in function in seconds
+        * - Function name
+        *
+        * @param string $header Header text to prepend to report
+        * @param string $footer Footer text to append to report
+        * @return string
+        */
+       protected function getCriticalPathReport( $header = '', $footer = '' ) {
+               $data = $this->xhprof->getCriticalPath();
+
+               $out = array( $header );
+               $out[] = sprintf( "%7s %9s %9s %6s %4s",
+                       'Time%', 'Time', 'Mem', 'Calls', 'Name'
+               );
+
+               $format = '%6.2f%% %9.6f %9d %6d %s%s';
+               $total = null;
+               $nest = 0;
+               foreach ( $data as $key => $stats ) {
+                       list( $parent, $child ) = Xhprof::splitKey( $key );
+                       if ( $total === null ) {
+                               $total = $stats;
+                       }
+                       $out[] = sprintf( $format,
+                               100 * $stats['wt'] / $total['wt'],
+                               $stats['wt'] / 1e6,
+                               isset( $stats['mu'] ) ? $stats['mu'] : 0,
+                               $stats['ct'],
+                               //$nest ? str_repeat( ' ', $nest - 1 ) . '┗ ' : '',
+                               $nest ? str_repeat( ' ', $nest - 1 ) . '└─' : '',
+                               $child
+                       );
+                       $nest++;
+               }
+               $out[] = $footer;
+               return implode( "\n", $out );
+       }
+}
diff --git a/includes/profiler/SectionProfiler.php b/includes/profiler/SectionProfiler.php
new file mode 100644 (file)
index 0000000..a418d30
--- /dev/null
@@ -0,0 +1,108 @@
+<?php
+/**
+ * Arbitrary section name based PHP profiling.
+ *
+ * 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 Profiler
+ * @author Aaron Schulz
+ */
+
+/**
+ * Custom PHP profiler for parser/DB type section names that xhprof/xdebug can't handle
+ *
+ * @TODO: refactor implementation by moving Profiler code to here when non-automatic
+ * profiler support is dropped.
+ *
+ * @since 1.25
+ */
+class SectionProfiler {
+       /** @var ProfilerStandard */
+       protected $profiler;
+
+       public function __construct() {
+               // This does *not* care about PHP request start time
+               $this->profiler = new ProfilerStandard( array( 'initTotal' => false ) );
+       }
+
+       /**
+        * @param string $section
+        * @return ScopedCallback
+        */
+       public function scopedProfileIn( $section ) {
+               $profiler = $this->profiler;
+               $sc = new ScopedCallback( function() use ( $profiler, $section ) {
+                       $profiler->profileOut( $section );
+               } );
+               $profiler->profileIn( $section );
+
+               return $sc;
+       }
+
+       /**
+        * @param ScopedCallback $section
+        */
+       public function scopedProfileOut( ScopedCallback &$section ) {
+               $section = null;
+       }
+
+       /**
+        * Get the raw and collated breakdown data for each method
+        *
+        * The percent time for each time is based on the current "total" time
+        * used is based on all methods so far. This method can therefore be
+        * called several times in between several profiling calls without the
+        * delays in usage of the profiler skewing the results. A "-total" entry
+        * is always included in the results.
+        *
+        * @return array List of method entries arrays, each having:
+        *   - name     : method name
+        *   - calls    : the number of method calls
+        *   - elapsed  : real time ellapsed (ms)
+        *   - percent  : percent real time
+        *   - memory   : memory used (bytes)
+        *   - min      : min real time of all calls (ms)
+        *   - max      : max real time of all calls (ms)
+        */
+       public function getFunctionStats() {
+               $data = $this->profiler->getRawData();
+
+               $memoryTotal = 0;
+               $elapsedTotal = 0;
+               foreach ( $data as $item ) {
+                       $memoryTotal += $item['memory'];
+                       $elapsedTotal += $item['elapsed'];
+               }
+
+               foreach ( $data as &$item ) {
+                       $item['percent'] = $item['elapsed'] / $elapsedTotal * 100;
+               }
+               unset( $item );
+
+               $data[] = array(
+                       'name' => '-total',
+                       'calls' => 1,
+                       'elapsed' => $elapsedTotal,
+                       'percent' => 100,
+                       'memory' => $memoryTotal,
+                       'min' => $elapsedTotal,
+                       'max' => $elapsedTotal
+               );
+
+               return $data;
+       }
+}
index b110bda..1531f69 100644 (file)
@@ -414,7 +414,11 @@ class SpecialPageFactory {
                                // @deprecated, officially since 1.18, unofficially since forever
                                wfDeprecated( "Array syntax for \$wgSpecialPages is deprecated ($className), " .
                                        "define a subclass of SpecialPage instead.", '1.18' );
-                               $page = MWFunction::newObj( $className, $rec );
+                               $page = ObjectFactory::getObjectFromSpec( array(
+                                       'class' => $className,
+                                       'args' => $rec,
+                                       'closure_expansion' => false,
+                               ) );
                        } elseif ( $rec instanceof SpecialPage ) {
                                $page = $rec; //XXX: we should deep clone here
                        } else {
index e6d8f1c..58b51b3 100644 (file)
@@ -440,11 +440,11 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                $message = $this->msg( 'recentchangestext' )->inContentLanguage();
                if ( !$message->isDisabled() ) {
                        $this->getOutput()->addWikiText(
-                               Html::rawElement( 'p',
-                                       array( 'lang' => $wgContLang->getCode(), 'dir' => $wgContLang->getDir() ),
+                               Html::rawElement( 'div',
+                                       array( 'lang' => $wgContLang->getHtmlCode(), 'dir' => $wgContLang->getDir() ),
                                        "\n" . $message->plain() . "\n"
                                ),
-                               /* $lineStart */ false,
+                               /* $lineStart */ true,
                                /* $interface */ false
                        );
                }
diff --git a/includes/utils/AutoloadGenerator.php b/includes/utils/AutoloadGenerator.php
new file mode 100644 (file)
index 0000000..ee2c77a
--- /dev/null
@@ -0,0 +1,271 @@
+<?php
+
+/**
+ * Accepts a list of files and directories to search for
+ * php files and generates $wgAutoloadLocalClasses or $wgAutoloadClasses
+ * lines for all detected classes. These lines are written out
+ * to an autoload.php file in the projects provided basedir.
+ *
+ * Usage:
+ *
+ *     $gen = new AutoloadGenerator( __DIR__ );
+ *     $gen->readDir( __DIR__ . '/includes' );
+ *     $gen->readFile( __DIR__ . '/foo.php' )
+ *     $gen->generateAutoload();
+ */
+class AutoloadGenerator {
+       /**
+        * @var string Root path of the project being scanned for classes
+        */
+       protected $basepath;
+
+       /**
+        * @var ClassCollector Helper class extracts class names from php files
+        */
+       protected $collector;
+
+       /**
+        * @var array Map of file shortpath to list of FQCN detected within file
+        */
+       protected $classes = array();
+
+       /**
+        * @var string The global variable to write output to
+        */
+       protected $variableName = 'wgAutoloadClasses';
+
+       /**
+        * @var array Map of FQCN to relative path(from self::$basepath)
+        */
+       protected $overrides = array();
+
+       /**
+        * @param string $basepath Root path of the project being scanned for classes
+        * @param array|string $flags
+        *
+        *  local - If this flag is set $wgAutoloadLocalClasses will be build instead
+        *          of $wgAutoloadClasses
+        */
+       public function __construct( $basepath, $flags = array() ) {
+               if ( !is_array( $flags ) ) {
+                       $flags = array( $flags );
+               }
+               $this->basepath = realpath( $basepath );
+               $this->collector = new ClassCollector;
+               if ( in_array( 'local', $flags ) ) {
+                       $this->variableName = 'wgAutoloadLocalClasses';
+               }
+       }
+
+       /**
+        * Force a class to be autoloaded from a specific path, regardless of where
+        * or if it was detected.
+        *
+        * @param string $fqcn FQCN to force the location of
+        * @param string $inputPath Full path to the file containing the class
+        */
+       public function forceClassPath( $fqcn, $inputPath ) {
+               $path = realpath( $inputPath );
+               if ( !$path ) {
+                       throw new \Exception( "Invalid path: $inputPath" );
+               }
+               $len = strlen( $this->basepath );
+               if ( substr( $path, 0, $len ) !== $this->basepath ) {
+                       throw new \Exception( "Path is not within basepath: $inputPath" );
+               }
+               $shortpath = substr( $path, $len );
+               $this->overrides[$fqcn] = $shortpath;
+       }
+
+       /**
+        * @var string $inputPath Path to a php file to find classes within
+        */
+       public function readFile( $inputPath ) {
+               $path = realpath( $inputPath );
+               if ( !$path ) {
+                       throw new \Exception( "Invalid path: $inputPath" );
+               }
+               $len = strlen( $this->basepath );
+               if ( substr( $path, 0, $len ) !== $this->basepath ) {
+                       throw new \Exception( "Path is not within basepath: $inputPath" );
+               }
+               $result = $this->collector->getClasses(
+                       file_get_contents( $path )
+               );
+               if ( $result ) {
+                       $shortpath = substr( $path, $len );
+                       $this->classes[$shortpath] = $result;
+               }
+       }
+
+       /**
+        * @param string $dir Path to a directory to recursively search
+        *  for php files with either .php or .inc extensions
+        */
+       public function readDir( $dir ) {
+               $it = new RecursiveDirectoryIterator( realpath( $dir ) );
+               $it = new RecursiveIteratorIterator( $it );
+
+               foreach ( $it as $path => $file ) {
+                       $ext = pathinfo( $path, PATHINFO_EXTENSION );
+                       // some older files in mw use .inc
+                       if ( $ext === 'php' || $ext === 'inc' ) {
+                               $this->readFile( $path );
+                       }
+               }
+       }
+
+       /**
+        * Write out all known classes to autoload.php in
+        * the provided basedir
+        */
+       public function generateAutoload() {
+               $content = array();
+
+               // We need to generate a line each rather than exporting the
+               // full array so __DIR__ can be prepended to all the paths
+               $format = "%s => __DIR__ . %s,";
+               foreach ( $this->classes as $path => $contained ) {
+                       $exportedPath = var_export( $path, true );
+                       foreach ( $contained as $fqcn ) {
+                               $content[$fqcn] = sprintf(
+                                       $format,
+                                       var_export( $fqcn, true ),
+                                       $exportedPath
+                               );
+                       }
+               }
+
+               foreach ( $this->overrides as $fqcn => $path ) {
+                       $content[$fqcn] = sprintf(
+                               $format,
+                               var_export( $fqcn, true ),
+                               var_export( $path, true )
+                       );
+               }
+
+               // sort for stable output
+               ksort( $content );
+
+               $output = implode( "\n\t", $content );
+               file_put_contents(
+                       $this->basepath . '/autoload.php',
+                       <<<EOD
+<?php
+// This file is generated, do not adjust manually
+
+global \${$this->variableName};
+
+\${$this->variableName} = array(
+       {$output}
+);
+EOD
+               );
+       }
+}
+
+/**
+ * Reads PHP code and returns the FQCN of every class defined within it.
+ */
+class ClassCollector {
+
+       /**
+        * @var string Current namespace
+        */
+       protected $namespace = '';
+
+       /**
+        * @var array List of FQCN detected in this pass
+        */
+       protected $classes;
+
+       /**
+        * @var array Token from token_get_all() that started an expect sequence
+        */
+       protected $startToken;
+
+       /**
+        * @var array List of tokens that are members of the current expect sequence
+        */
+       protected $tokens;
+
+       /**
+        * @var string $code PHP code (including <?php) to detect class names from
+        * @return array List of FQCN detected within the tokens
+        */
+       public function getClasses( $code ) {
+               $this->namespace = '';
+               $this->classes = array();
+               $this->startToken = null;
+               $this->tokens = array();
+
+               foreach ( token_get_all( $code ) as $token ) {
+                       if ( $this->startToken === null ) {
+                               $this->tryBeginExpect( $token );
+                       } else {
+                               $this->tryEndExpect( $token );
+                       }
+               }
+
+               return $this->classes;
+       }
+
+       /**
+        * Determine if $token begins the next expect sequence.
+        *
+        * @param array $token
+        */
+       protected function tryBeginExpect( $token ) {
+               if ( is_string( $token ) ) {
+                       return;
+               }
+               switch( $token[0] ) {
+               case T_NAMESPACE:
+               case T_CLASS:
+               case T_INTERFACE:
+                       $this->startToken = $token;
+               }
+       }
+
+       /**
+        * Accepts the next token in an expect sequence
+        *
+        * @param array
+        */
+       protected function tryEndExpect( $token ) {
+               switch( $this->startToken[0] ) {
+               case T_NAMESPACE:
+                       if ( $token === ';' || $token === '{' ) {
+                               $this->namespace = $this->implodeTokens() . '\\';
+                       } else {
+                               $this->tokens[] = $token;
+                       }
+                       break;
+
+               case T_CLASS:
+               case T_INTERFACE:
+                       $this->tokens[] = $token;
+                       if ( is_array( $token ) && $token[0] === T_STRING ) {
+                               $this->classes[] = $this->namespace . $this->implodeTokens();
+                       }
+               }
+       }
+
+       /**
+        * Returns the string representation of the tokens within the
+        * current expect sequence and resets the sequence.
+        *
+        * @return string
+        */
+       protected function implodeTokens() {
+               $content = array();
+               foreach ( $this->tokens as $token ) {
+                       $content[] = is_string( $token ) ? $token : $token[1];
+               }
+
+               $this->tokens = array();
+               $this->startToken = null;
+
+               return trim( implode( '', $content ), " \n\t" );
+       }
+}
diff --git a/includes/utils/Cdb.php b/includes/utils/Cdb.php
deleted file mode 100644 (file)
index 3ceb620..0000000
+++ /dev/null
@@ -1,163 +0,0 @@
-<?php
-/**
- * Native CDB file reader and writer.
- *
- * 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
- */
-
-/**
- * Read from a CDB file.
- * Native and pure PHP implementations are provided.
- * http://cr.yp.to/cdb.html
- */
-abstract class CdbReader {
-       /**
-        * The file handle
-        */
-       protected $handle;
-
-       /**
-        * Open a file and return a subclass instance
-        *
-        * @param string $fileName
-        *
-        * @return CdbReader
-        */
-       public static function open( $fileName ) {
-               return self::haveExtension() ?
-                       new CdbReaderDBA( $fileName ) :
-                       new CdbReaderPHP( $fileName );
-       }
-
-       /**
-        * Returns true if the native extension is available
-        *
-        * @return bool
-        */
-       public static function haveExtension() {
-               if ( !function_exists( 'dba_handlers' ) ) {
-                       return false;
-               }
-               $handlers = dba_handlers();
-               if ( !in_array( 'cdb', $handlers ) || !in_array( 'cdb_make', $handlers ) ) {
-                       return false;
-               }
-
-               return true;
-       }
-
-       /**
-        * Create the object and open the file
-        *
-        * @param string $fileName
-        */
-       abstract public function __construct( $fileName );
-
-       /**
-        * Close the file. Optional, you can just let the variable go out of scope.
-        */
-       abstract public function close();
-
-       /**
-        * Get a value with a given key. Only string values are supported.
-        *
-        * @param string $key
-        */
-       abstract public function get( $key );
-}
-
-/**
- * Write to a CDB file.
- * Native and pure PHP implementations are provided.
- */
-abstract class CdbWriter {
-       /**
-        * The file handle
-        */
-       protected $handle;
-
-       /**
-        * File we'll be writing to when we're done
-        * @var string
-        */
-       protected $realFileName;
-
-       /**
-        * File we write to temporarily until we're done
-        * @var string
-        */
-       protected $tmpFileName;
-
-       /**
-        * Open a writer and return a subclass instance.
-        * The user must have write access to the directory, for temporary file creation.
-        *
-        * @param string $fileName
-        *
-        * @return CdbWriterDBA|CdbWriterPHP
-        */
-       public static function open( $fileName ) {
-               return CdbReader::haveExtension() ?
-                       new CdbWriterDBA( $fileName ) :
-                       new CdbWriterPHP( $fileName );
-       }
-
-       /**
-        * Create the object and open the file
-        *
-        * @param string $fileName
-        */
-       abstract public function __construct( $fileName );
-
-       /**
-        * Set a key to a given value. The value will be converted to string.
-        * @param string $key
-        * @param string $value
-        */
-       abstract public function set( $key, $value );
-
-       /**
-        * Close the writer object. You should call this function before the object
-        * goes out of scope, to write out the final hashtables.
-        */
-       abstract public function close();
-
-       /**
-        * If the object goes out of scope, close it for sanity
-        */
-       public function __destruct() {
-               if ( isset( $this->handle ) ) {
-                       $this->close();
-               }
-       }
-
-       /**
-        * Are we running on Windows?
-        * @return bool
-        */
-       protected function isWindows() {
-               return substr( php_uname(), 0, 7 ) == 'Windows';
-       }
-}
-
-/**
- * Exception for Cdb errors.
- * This explicitly doesn't subclass MWException to encourage reuse.
- */
-class CdbException extends Exception {
-}
diff --git a/includes/utils/CdbDBA.php b/includes/utils/CdbDBA.php
deleted file mode 100644 (file)
index efcaf21..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-<?php
-/**
- * DBA-based CDB reader/writer
- *
- * 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
- */
-
-/**
- * Reader class which uses the DBA extension
- */
-class CdbReaderDBA extends CdbReader {
-       public function __construct( $fileName ) {
-               $this->handle = dba_open( $fileName, 'r-', 'cdb' );
-               if ( !$this->handle ) {
-                       throw new CdbException( 'Unable to open CDB file "' . $fileName . '"' );
-               }
-       }
-
-       public function close() {
-               if ( isset( $this->handle ) ) {
-                       dba_close( $this->handle );
-               }
-               unset( $this->handle );
-       }
-
-       public function get( $key ) {
-               return dba_fetch( $key, $this->handle );
-       }
-}
-
-/**
- * Writer class which uses the DBA extension
- */
-class CdbWriterDBA extends CdbWriter {
-       public function __construct( $fileName ) {
-               $this->realFileName = $fileName;
-               $this->tmpFileName = $fileName . '.tmp.' . mt_rand( 0, 0x7fffffff );
-               $this->handle = dba_open( $this->tmpFileName, 'n', 'cdb_make' );
-               if ( !$this->handle ) {
-                       throw new CdbException( 'Unable to open CDB file for write "' . $fileName . '"' );
-               }
-       }
-
-       public function set( $key, $value ) {
-               return dba_insert( $key, $value, $this->handle );
-       }
-
-       public function close() {
-               if ( isset( $this->handle ) ) {
-                       dba_close( $this->handle );
-               }
-               if ( $this->isWindows() ) {
-                       unlink( $this->realFileName );
-               }
-               if ( !rename( $this->tmpFileName, $this->realFileName ) ) {
-                       throw new CdbException( 'Unable to move the new CDB file into place.' );
-               }
-               unset( $this->handle );
-       }
-}
diff --git a/includes/utils/CdbPHP.php b/includes/utils/CdbPHP.php
deleted file mode 100644 (file)
index 19d747a..0000000
+++ /dev/null
@@ -1,494 +0,0 @@
-<?php
-/**
- * This is a port of D.J. Bernstein's CDB to PHP. It's based on the copy that
- * appears in PHP 5.3. Changes are:
- *    * Error returns replaced with exceptions
- *    * Exception thrown if sizes or offsets are between 2GB and 4GB
- *    * Some variables renamed
- *
- * 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
- */
-
-/**
- * Common functions for readers and writers
- */
-class CdbFunctions {
-       /**
-        * Take a modulo of a signed integer as if it were an unsigned integer.
-        * $b must be less than 0x40000000 and greater than 0
-        *
-        * @param int $a
-        * @param int $b
-        *
-        * @return int
-        */
-       public static function unsignedMod( $a, $b ) {
-               if ( $a & 0x80000000 ) {
-                       $m = ( $a & 0x7fffffff ) % $b + 2 * ( 0x40000000 % $b );
-
-                       return $m % $b;
-               } else {
-                       return $a % $b;
-               }
-       }
-
-       /**
-        * Shift a signed integer right as if it were unsigned
-        * @param int $a
-        * @param int $b
-        * @return int
-        */
-       public static function unsignedShiftRight( $a, $b ) {
-               if ( $b == 0 ) {
-                       return $a;
-               }
-               if ( $a & 0x80000000 ) {
-                       return ( ( $a & 0x7fffffff ) >> $b ) | ( 0x40000000 >> ( $b - 1 ) );
-               } else {
-                       return $a >> $b;
-               }
-       }
-
-       /**
-        * The CDB hash function.
-        *
-        * @param string $s
-        *
-        * @return int
-        */
-       public static function hash( $s ) {
-               $h = 5381;
-               $len = strlen( $s );
-               for ( $i = 0; $i < $len; $i++ ) {
-                       $h5 = ( $h << 5 ) & 0xffffffff;
-                       // Do a 32-bit sum
-                       // Inlined here for speed
-                       $sum = ( $h & 0x3fffffff ) + ( $h5 & 0x3fffffff );
-                       $h =
-                               (
-                                       ( $sum & 0x40000000 ? 1 : 0 )
-                                       + ( $h & 0x80000000 ? 2 : 0 )
-                                       + ( $h & 0x40000000 ? 1 : 0 )
-                                       + ( $h5 & 0x80000000 ? 2 : 0 )
-                                       + ( $h5 & 0x40000000 ? 1 : 0 )
-                               ) << 30
-                               | ( $sum & 0x3fffffff );
-                       $h ^= ord( $s[$i] );
-                       $h &= 0xffffffff;
-               }
-
-               return $h;
-       }
-}
-
-/**
- * CDB reader class
- */
-class CdbReaderPHP extends CdbReader {
-       /** The filename */
-       protected $fileName;
-
-       /* number of hash slots searched under this key */
-       protected $loop;
-
-       /* initialized if loop is nonzero */
-       protected $khash;
-
-       /* initialized if loop is nonzero */
-       protected $kpos;
-
-       /* initialized if loop is nonzero */
-       protected $hpos;
-
-       /* initialized if loop is nonzero */
-       protected $hslots;
-
-       /* initialized if findNext() returns true */
-       protected $dpos;
-
-       /* initialized if cdb_findnext() returns 1 */
-       protected $dlen;
-
-       /**
-        * @param string $fileName
-        * @throws CdbException
-        */
-       public function __construct( $fileName ) {
-               $this->fileName = $fileName;
-               $this->handle = fopen( $fileName, 'rb' );
-               if ( !$this->handle ) {
-                       throw new CdbException( 'Unable to open CDB file "' . $this->fileName . '".' );
-               }
-               $this->findStart();
-       }
-
-       public function close() {
-               if ( isset( $this->handle ) ) {
-                       fclose( $this->handle );
-               }
-               unset( $this->handle );
-       }
-
-       /**
-        * @param mixed $key
-        * @return bool|string
-        */
-       public function get( $key ) {
-               // strval is required
-               if ( $this->find( strval( $key ) ) ) {
-                       return $this->read( $this->dlen, $this->dpos );
-               } else {
-                       return false;
-               }
-       }
-
-       /**
-        * @param string $key
-        * @param int $pos
-        * @return bool
-        */
-       protected function match( $key, $pos ) {
-               $buf = $this->read( strlen( $key ), $pos );
-
-               return $buf === $key;
-       }
-
-       protected function findStart() {
-               $this->loop = 0;
-       }
-
-       /**
-        * @throws CdbException
-        * @param int $length
-        * @param int $pos
-        * @return string
-        */
-       protected function read( $length, $pos ) {
-               if ( fseek( $this->handle, $pos ) == -1 ) {
-                       // This can easily happen if the internal pointers are incorrect
-                       throw new CdbException(
-                               'Seek failed, file "' . $this->fileName . '" may be corrupted.' );
-               }
-
-               if ( $length == 0 ) {
-                       return '';
-               }
-
-               $buf = fread( $this->handle, $length );
-               if ( $buf === false || strlen( $buf ) !== $length ) {
-                       throw new CdbException(
-                               'Read from CDB file failed, file "' . $this->fileName . '" may be corrupted.' );
-               }
-
-               return $buf;
-       }
-
-       /**
-        * Unpack an unsigned integer and throw an exception if it needs more than 31 bits
-        * @param string $s
-        * @throws CdbException
-        * @return mixed
-        */
-       protected function unpack31( $s ) {
-               $data = unpack( 'V', $s );
-               if ( $data[1] > 0x7fffffff ) {
-                       throw new CdbException(
-                               'Error in CDB file "' . $this->fileName . '", integer too big.' );
-               }
-
-               return $data[1];
-       }
-
-       /**
-        * Unpack a 32-bit signed integer
-        * @param string $s
-        * @return int
-        */
-       protected function unpackSigned( $s ) {
-               $data = unpack( 'va/vb', $s );
-
-               return $data['a'] | ( $data['b'] << 16 );
-       }
-
-       /**
-        * @param string $key
-        * @return bool
-        */
-       protected function findNext( $key ) {
-               if ( !$this->loop ) {
-                       $u = CdbFunctions::hash( $key );
-                       $buf = $this->read( 8, ( $u << 3 ) & 2047 );
-                       $this->hslots = $this->unpack31( substr( $buf, 4 ) );
-                       if ( !$this->hslots ) {
-                               return false;
-                       }
-                       $this->hpos = $this->unpack31( substr( $buf, 0, 4 ) );
-                       $this->khash = $u;
-                       $u = CdbFunctions::unsignedShiftRight( $u, 8 );
-                       $u = CdbFunctions::unsignedMod( $u, $this->hslots );
-                       $u <<= 3;
-                       $this->kpos = $this->hpos + $u;
-               }
-
-               while ( $this->loop < $this->hslots ) {
-                       $buf = $this->read( 8, $this->kpos );
-                       $pos = $this->unpack31( substr( $buf, 4 ) );
-                       if ( !$pos ) {
-                               return false;
-                       }
-                       $this->loop += 1;
-                       $this->kpos += 8;
-                       if ( $this->kpos == $this->hpos + ( $this->hslots << 3 ) ) {
-                               $this->kpos = $this->hpos;
-                       }
-                       $u = $this->unpackSigned( substr( $buf, 0, 4 ) );
-                       if ( $u === $this->khash ) {
-                               $buf = $this->read( 8, $pos );
-                               $keyLen = $this->unpack31( substr( $buf, 0, 4 ) );
-                               if ( $keyLen == strlen( $key ) && $this->match( $key, $pos + 8 ) ) {
-                                       // Found
-                                       $this->dlen = $this->unpack31( substr( $buf, 4 ) );
-                                       $this->dpos = $pos + 8 + $keyLen;
-
-                                       return true;
-                               }
-                       }
-               }
-
-               return false;
-       }
-
-       /**
-        * @param mixed $key
-        * @return bool
-        */
-       protected function find( $key ) {
-               $this->findStart();
-
-               return $this->findNext( $key );
-       }
-}
-
-/**
- * CDB writer class
- */
-class CdbWriterPHP extends CdbWriter {
-       protected $hplist;
-
-       protected $numentries;
-
-       protected $pos;
-
-       /**
-        * @param string $fileName
-        */
-       public function __construct( $fileName ) {
-               $this->realFileName = $fileName;
-               $this->tmpFileName = $fileName . '.tmp.' . mt_rand( 0, 0x7fffffff );
-               $this->handle = fopen( $this->tmpFileName, 'wb' );
-               if ( !$this->handle ) {
-                       $this->throwException(
-                               'Unable to open CDB file "' . $this->tmpFileName . '" for write.' );
-               }
-               $this->hplist = array();
-               $this->numentries = 0;
-               $this->pos = 2048; // leaving space for the pointer array, 256 * 8
-               if ( fseek( $this->handle, $this->pos ) == -1 ) {
-                       $this->throwException( 'fseek failed in file "' . $this->tmpFileName . '".' );
-               }
-       }
-
-       /**
-        * @param string $key
-        * @param string $value
-        */
-       public function set( $key, $value ) {
-               if ( strval( $key ) === '' ) {
-                       // DBA cross-check hack
-                       return;
-               }
-               $this->addbegin( strlen( $key ), strlen( $value ) );
-               $this->write( $key );
-               $this->write( $value );
-               $this->addend( strlen( $key ), strlen( $value ), CdbFunctions::hash( $key ) );
-       }
-
-       /**
-        * @throws CdbException
-        */
-       public function close() {
-               $this->finish();
-               if ( isset( $this->handle ) ) {
-                       fclose( $this->handle );
-               }
-               if ( $this->isWindows() && file_exists( $this->realFileName ) ) {
-                       unlink( $this->realFileName );
-               }
-               if ( !rename( $this->tmpFileName, $this->realFileName ) ) {
-                       $this->throwException( 'Unable to move the new CDB file into place.' );
-               }
-               unset( $this->handle );
-       }
-
-       /**
-        * @throws CdbException
-        * @param string $buf
-        */
-       protected function write( $buf ) {
-               $len = fwrite( $this->handle, $buf );
-               if ( $len !== strlen( $buf ) ) {
-                       $this->throwException( 'Error writing to CDB file "' . $this->tmpFileName . '".' );
-               }
-       }
-
-       /**
-        * @throws CdbException
-        * @param int $len
-        */
-       protected function posplus( $len ) {
-               $newpos = $this->pos + $len;
-               if ( $newpos > 0x7fffffff ) {
-                       $this->throwException(
-                               'A value in the CDB file "' . $this->tmpFileName . '" is too large.' );
-               }
-               $this->pos = $newpos;
-       }
-
-       /**
-        * @param int $keylen
-        * @param int $datalen
-        * @param int $h
-        */
-       protected function addend( $keylen, $datalen, $h ) {
-               $this->hplist[] = array(
-                       'h' => $h,
-                       'p' => $this->pos
-               );
-
-               $this->numentries++;
-               $this->posplus( 8 );
-               $this->posplus( $keylen );
-               $this->posplus( $datalen );
-       }
-
-       /**
-        * @throws CdbException
-        * @param int $keylen
-        * @param int $datalen
-        */
-       protected function addbegin( $keylen, $datalen ) {
-               if ( $keylen > 0x7fffffff ) {
-                       $this->throwException( 'Key length too long in file "' . $this->tmpFileName . '".' );
-               }
-               if ( $datalen > 0x7fffffff ) {
-                       $this->throwException( 'Data length too long in file "' . $this->tmpFileName . '".' );
-               }
-               $buf = pack( 'VV', $keylen, $datalen );
-               $this->write( $buf );
-       }
-
-       /**
-        * @throws CdbException
-        */
-       protected function finish() {
-               // Hack for DBA cross-check
-               $this->hplist = array_reverse( $this->hplist );
-
-               // Calculate the number of items that will be in each hashtable
-               $counts = array_fill( 0, 256, 0 );
-               foreach ( $this->hplist as $item ) {
-                       ++$counts[255 & $item['h']];
-               }
-
-               // Fill in $starts with the *end* indexes
-               $starts = array();
-               $pos = 0;
-               for ( $i = 0; $i < 256; ++$i ) {
-                       $pos += $counts[$i];
-                       $starts[$i] = $pos;
-               }
-
-               // Excessively clever and indulgent code to simultaneously fill $packedTables
-               // with the packed hashtables, and adjust the elements of $starts
-               // to actually point to the starts instead of the ends.
-               $packedTables = array_fill( 0, $this->numentries, false );
-               foreach ( $this->hplist as $item ) {
-                       $packedTables[--$starts[255 & $item['h']]] = $item;
-               }
-
-               $final = '';
-               for ( $i = 0; $i < 256; ++$i ) {
-                       $count = $counts[$i];
-
-                       // The size of the hashtable will be double the item count.
-                       // The rest of the slots will be empty.
-                       $len = $count + $count;
-                       $final .= pack( 'VV', $this->pos, $len );
-
-                       $hashtable = array();
-                       for ( $u = 0; $u < $len; ++$u ) {
-                               $hashtable[$u] = array( 'h' => 0, 'p' => 0 );
-                       }
-
-                       // Fill the hashtable, using the next empty slot if the hashed slot
-                       // is taken.
-                       for ( $u = 0; $u < $count; ++$u ) {
-                               $hp = $packedTables[$starts[$i] + $u];
-                               $where = CdbFunctions::unsignedMod(
-                                       CdbFunctions::unsignedShiftRight( $hp['h'], 8 ), $len );
-                               while ( $hashtable[$where]['p'] ) {
-                                       if ( ++$where == $len ) {
-                                               $where = 0;
-                                       }
-                               }
-                               $hashtable[$where] = $hp;
-                       }
-
-                       // Write the hashtable
-                       for ( $u = 0; $u < $len; ++$u ) {
-                               $buf = pack( 'vvV',
-                                       $hashtable[$u]['h'] & 0xffff,
-                                       CdbFunctions::unsignedShiftRight( $hashtable[$u]['h'], 16 ),
-                                       $hashtable[$u]['p'] );
-                               $this->write( $buf );
-                               $this->posplus( 8 );
-                       }
-               }
-
-               // Write the pointer array at the start of the file
-               rewind( $this->handle );
-               if ( ftell( $this->handle ) != 0 ) {
-                       $this->throwException( 'Error rewinding to start of file "' . $this->tmpFileName . '".' );
-               }
-               $this->write( $final );
-       }
-
-       /**
-        * Clean up the temp file and throw an exception
-        *
-        * @param string $msg
-        * @throws CdbException
-        */
-       protected function throwException( $msg ) {
-               if ( $this->handle ) {
-                       fclose( $this->handle );
-                       unlink( $this->tmpFileName );
-               }
-               throw new CdbException( $msg );
-       }
-}
index 9fb4c19..fa7eebe 100644 (file)
@@ -26,14 +26,15 @@ class MWFunction {
         * @param string $class
         * @param array $args
         * @return object
+        * @deprecated 1.25 Use ObjectFactory::getObjectFromSpec() instead
         */
        public static function newObj( $class, $args = array() ) {
-               if ( !count( $args ) ) {
-                       return new $class;
-               }
+               wfDeprecated( __METHOD__, '1.25' );
 
-               $ref = new ReflectionClass( $class );
-
-               return $ref->newInstanceArgs( $args );
+               return ObjectFactory::getObjectFromSpec( array(
+                       'class' => $class,
+                       'args' => $args,
+                       'closure_expansion' => false,
+               ) );
        }
 }
index 1a09818..39e62f5 100644 (file)
@@ -279,27 +279,22 @@ class KkConverter extends LanguageConverter {
         * @return string
         */
        function translate( $text, $toVariant ) {
-               global $wgLanguageCode;
                $text = parent::translate( $text, $toVariant );
 
                switch ( $toVariant ) {
                        case 'kk-cyrl':
                        case 'kk-kz':
                                $letters = KK_L_UC . KK_L_LC . 'ʺʹ#0123456789';
-                               $wgLanguageCode = 'kk';
                                break;
                        case 'kk-latn':
                        case 'kk-tr':
                                $letters = KK_C_UC . KK_C_LC . '№0123456789';
-                               $wgLanguageCode = 'kk-Latn';
                                break;
                        case 'kk-arab':
                        case 'kk-cn':
                                $letters = KK_C_UC . KK_C_LC . /*KK_L_UC.KK_L_LC.'ʺʹ'.*/',;\?%\*№0123456789';
-                               $wgLanguageCode = 'kk-Arab';
                                break;
                        default:
-                               $wgLanguageCode = 'kk';
                                return $text;
                }
                // disable conversion variables like $1, $2...
index d176033..5025c36 100644 (file)
        "sunday": "Sunnandæg",
        "monday": "Mōnandæg",
        "tuesday": "Tīwesdæg",
-       "wednesday": "Wēdnesdæg",
+       "wednesday": "Wōdnesdæg",
        "thursday": "Þunresdæg",
        "friday": "Frigedæg",
        "saturday": "Sæterndæg",
        "sun": "Sun",
        "mon": "Mōn",
        "tue": "Tīw",
-       "wed": "Wēd",
+       "wed": "Wōd",
        "thu": "Þun",
        "fri": "Fri",
        "sat": "Sæt",
index eb4226a..44cd1ee 100644 (file)
@@ -51,7 +51,7 @@
        "tog-enotifminoredits": "Səhifələrdə kiçik dəyişikliklər olsa belə, mənə e-məktub göndər",
        "tog-enotifrevealaddr": "Xəbərdarlıq e-məktublarında mənim e-poçt ünvanımı göstər",
        "tog-shownumberswatching": "İzləyən istifadəçilərin sayını göstər",
-       "tog-oldsig": "Hazırkı imza:",
+       "tog-oldsig": "İndiki imza:",
        "tog-fancysig": "Vikimətn şəklində imza (avtomatik keçid yaratmadan)",
        "tog-uselivepreview": "Canlı sınaq baxışı xüsusiyyətindən istifadə et (JavaScript tələb edir, sınaq mərhələsindədir)",
        "tog-forceeditsummary": "Qısa məzmunu boş saxladıqda mənə bildir",
        "hidetoc": "gizlə",
        "collapsible-collapse": "Gizlə",
        "collapsible-expand": "Göstər",
+       "confirmable-yes": "Bəli",
+       "confirmable-no": "Xeyr",
        "thisisdeleted": "$1 bax və ya bərpa et?",
        "viewdeleted": "$1 göstərilsin?",
        "restorelink": "{{PLURAL:$1|bir silinmiş redaktəyə|$1 silinmiş redaktəyə}}",
        "namespaceprotected": "Sizin adlarında $1 olan məqalələrdə redaktə etməyə icazəniz yoxdur.",
        "customcssprotected": "Bu səhifəni redaktə etmə izniniz yoxdur, çünki bu səhifə başqa bir istifadəçinin fərdi parametrlərinə sahibdir.",
        "customjsprotected": "Bu Java Script səhifəsini redaktə etmə izniniz yoxdur, çünki bu səhifə başqa bir istifadəçinin fərdi parametrlərinə sahibdir.",
-       "mycustomcssprotected": "Bu CSS ssəhifəsini redaktə etmə izniniz yoxdur.",
-       "mycustomjsprotected": "Bu JavaScript səhifəsini redaktə etmə izniniz yoxdur.",
-       "myprivateinfoprotected": "Sizin özəl məlumatlarınızı redaktə etmə izniniz yoxdur.",
+       "mycustomcssprotected": "Bu CSS ssəhifəsini redaktə etmək səlahiyyətiniz yoxdur.",
+       "mycustomjsprotected": "Bu JavaScript səhifəsini redaktə etmək səlahiyyətiniz yoxdur.",
+       "myprivateinfoprotected": "Sizin şəxsi məlumatlarınızı redaktə etmək səlahiyyətiniz yoxdur.",
        "mypreferencesprotected": "Seçimlərinizi redaktə etmək üçün izniniz yoxdur.",
        "ns-specialprotected": "Xüsusi səhifələr redaktə oluna bilməz.",
        "titleprotected": "Bu adda səhifənin yaradılması istifadəçi [[User:$1|$1]] tərəfindən qadağan edilmişdir.\nGöstərilən səbəb: \"''$2''\".",
        "remembermypassword": "Məni bu kompyuterdə xatırla (maksimum $1 {{PLURAL:$1|gün|gün}})",
        "userlogin-remembermypassword": "Sistemdə qal",
        "userlogin-signwithsecure": "Etibarlı bağlantıdan istifadə edin",
-       "yourdomainname": "Sizin domain",
+       "yourdomainname": "Sizin domeniniz:",
        "password-change-forbidden": "Bu vikidə parolunuzu dəyişdirə bilməzsiniz.",
        "externaldberror": "Verilənlər bazasının doğruluğunu yoxlamada xəta baş verib və yaxud sizin xarici istifadəçi qeydiyyatını yeniləmək hüququnuz yoxdur.",
        "login": "Daxil ol",
        "nav-login-createaccount": "Daxil ol / hesab yarat",
-       "userlogin": "Daxil ol və ya istifadəçi yarat",
+       "userlogin": "Daxil ol və ya qeydiyyatdan keç",
        "userloginnocreate": "Daxil ol",
        "logout": "Çıxış",
        "userlogout": "Çıxış",
        "gotaccountlink": "Daxil olun",
        "userlogin-resetlink": "Daxilolma məlumatlarınızı unutmusunuz?",
        "userlogin-resetpassword-link": "Parolu unutdunuzmu?",
-       "userlogin-loggedin": "Siz artıq {{GENDER:$1|$1}} kimi daxil olmusunuz.\nAşağıdakı formadan istifadə edərək, baÄ\9fqa bir istifadÉ\99çi kimi daxil ola bilÉ\99rsiniz.",
+       "userlogin-loggedin": "Siz artıq {{GENDER:$1|$1}} kimi daxil olmusunuz.\nAşağıdakı formadan istifadə edərək, baÅ\9fqa bir istifadÉ\99çi kimi daxil ola bilÉ\99rsiniz.",
        "userlogin-createanother": "Başqa bir istifadəçi hesabı yarat",
        "createacct-emailrequired": "E-poçt ünvanı",
        "createacct-emailoptional": "E-poçt ünvanı (istəyə bağlı)",
        "suspicious-userlogout": "Sizin çıxış üçün cəhdiniz uğursuz alındı. Bu, brouzerin yaxud proksi-keşləmənin düzgün işləməməsindən qaynaqlanır.",
        "createacct-another-realname-tip": "Gərçək adınız istəyə bağlıdır.\nƏgər gərçək adınızı göstərsəniz, çalışmalarınıza müraciət etmək üçün istifadə ediləcəkdir.",
        "pt-login": "Daxil ol",
+       "pt-login-button": "Daxil ol",
        "pt-createaccount": "Akkaunt yarat",
        "pt-userlogout": "Çıxış",
        "php-mail-error-unknown": "PHP-nin mail() funksiyasında naməlum xəta",
index 493f818..c74cfe8 100644 (file)
        "hidetoc": "گیزلت",
        "collapsible-collapse": "ییغیشلات",
        "collapsible-expand": "گئنیشلت",
+       "confirmable-yes": "هن",
+       "confirmable-no": "یوْخ",
        "thisisdeleted": "$1-نا باخ یا اوْنو قایتار؟",
        "viewdeleted": "$1 گؤستریلسین؟",
        "restorelink": "{{PLURAL:$1|بیر|$1}} سیلینمیش دَییشیکلیک",
        "gotaccount": "اؤنجه‌دن حسابینیز وارمی؟ $1.",
        "gotaccountlink": "گیریش",
        "userlogin-resetlink": "گیریش بیلگیلرینیزی اونوتموسونوز؟",
-       "userlogin-resetpassword-link": "رمزینیزی صیفیرلایین",
+       "userlogin-resetpassword-link": "رمزینیزی اونوتموسوز مو؟",
+       "userlogin-createanother": "بیر باشقا حساب یارات",
        "createacct-emailrequired": "ایمیل آدرسی",
        "createacct-emailoptional": "ایمیل آدرسی (ایستگه باغلی)",
        "createacct-email-ph": "ایمیل آدرسینیزی داخیل ائدین",
+       "createacct-another-email-ph": "ایمیل آدرسینیزی داخیل ائدین",
        "createaccountmail": "بیر گئچیجی راست‌گله رمز ایشلت و اونو آشاغیدا بللندیرن ایمیل آدرسینه گؤندر",
        "createacct-realname": "دوغرو آد (ایستگه باغلی)",
        "createaccountreason": "نَدَن‌لیک:",
        "createacct-captcha": "امنیت یوخلاماسی",
        "createacct-imgcaptcha-ph": "اوست‌ده‌کی گؤردوگونوز یازی‌نی داخیل ائدین",
        "createacct-submit": "حسابینیزی یارادین",
+       "createacct-another-submit": "بیر باشقا حساب یارات",
        "createacct-benefit-heading": "{{SITENAME}} سیزین کیمی آدام‌لارین الی ایله یارانیب‌دیر.",
        "createacct-benefit-body1": "{{PLURAL:$1|دَییشیکلیک}}",
        "createacct-benefit-body2": "{{PLURAL:$1|صحیفه}}",
        "edit-gone-missing": "صحیفنی یئنی لمک مومکون دئییل.\nچوخ گومان کی، صحیفه سیلینمیش‌دیر.",
        "edit-conflict": "سیزله برابر دییشدیرمه",
        "edit-no-change": "سیزین دییشدیر قئیده آلینمامیش‌دیر. بئله کی، متنده هئچ بیر دییشدیر ائدیلممیش‌دیر.",
+       "postedit-confirmation-created": "به صفحه یارانیب‌دیر.",
        "postedit-confirmation-saved": "سیزین دَییشدیرمه‌نیز قئید اولونوب‌دور.",
        "edit-already-exists": "یئنی صحیفنی یاراتماق مومکون دئییل.\nبئله کی، بو آددا صحیفه آرتیق مؤوجوددور.",
        "defaultmessagetext": "دفالت دانیشیق متنی",
        "revdelete-hide-user": "دَییشدیرن یازارین ایستیفاده‌چی آدینی/آی‌پی اونوانینی گیزله",
        "revdelete-hide-restricted": "بیلگی‌لری ایدارچی‌لردن ده گیزله",
        "revdelete-radio-same": "(ديَیشدیرمه)",
-       "revdelete-radio-set": "بلی",
-       "revdelete-radio-unset": "یوخ",
+       "revdelete-radio-set": "گیزلی",
+       "revdelete-radio-unset": "گؤرونن",
        "revdelete-suppress": "بیلگی‌لری ایداره‌چیلردن ده گیزله",
        "revdelete-unsuppress": "برپا اولونان وئرسیا‌لار اوزرین‌دن محدودیت‌لری قال‌دیر",
        "revdelete-log": "ندن:",
        "prefs-email": "ایمیل ترجیحلری",
        "prefs-rendering": "گؤرونوش",
        "saveprefs": "قئید ائت",
-       "restoreprefs": "بوتون ایلک ترجیحلری قایتار",
+       "restoreprefs": "بوتون ایلک ترجیحلری قایتار",
        "prefs-editing": "دَییشدیرمک‌ده",
        "rows": "سطرلر:",
        "columns": "سوتونلار",
        "badsiglength": "ایمضانیز چوخ اوزون‌دور.\nاو گرک {{PLURAL:$1|بیر|$1}} حرف‌دن اوزون اولمایا.",
        "yourgender": "جینس:",
        "gender-unknown": "بیلیندیرمه‌میش",
-       "gender-male": "آقا",
-       "gender-female": "خانیم",
+       "gender-male": "کیشی",
+       "gender-female": "قادین",
        "prefs-help-gender": "ایستگه یاغلی: یازیلیم‌لا، دوزگون جنسیته ایلگی‌لی آدرس وئرمک اوچون ایشنیر.\nبو بیلگی، عمومی اولاجاق‌دیر.",
        "email": "ایمیل",
        "prefs-help-realname": "اصلی آد ایستگه باغلی‌دیر.\nاگر اونو وئرماغی سئچسز، سیزین ایشلرینیزی سیزه مونتسب ائدن‌ده، بو اصلی آد ایشلنه‌جک‌دیر.",
        "prefs-signature": "ایمضا",
        "prefs-dateformat": "تاریخ فورمتی",
        "prefs-timeoffset": "ساعات قورشاغینین فرقی",
-       "prefs-advancedediting": "عمومی",
+       "prefs-advancedediting": "گنل تنظیم‌لر",
        "prefs-editor": "دَییشدیرن",
        "prefs-preview": "اؤن‌گؤستریش",
        "prefs-advancedrc": "گلیشمیش سئچَنکلر",
        "license-nopreview": "(اؤن‌گؤستریش یوخدور)",
        "upload_source_url": "(بیر گئچرلی و عموم گؤره بیلن اینترنت آدرسی)",
        "upload_source_file": "(بیلگی‌سایارینیزدا بیر فایل)",
+       "listfiles-delete": "سیل",
        "listfiles-summary": "بۇ اؤزل صحیفه، بۆتون یۆکله‌نیلن فایل‌لاری گؤستریر.",
        "listfiles_search_for": "مئدیا آدی اوچون آختار:",
        "imgfile": "فایل",
        "randomincategory": "بؤلمه‌ده راست‌گله صحیفه",
        "randomincategory-invalidcategory": "«$1» بیر گئچرلی بؤلمه آدی دئییل.",
        "randomincategory-nopages": "[[:Category:$1|$1]] بؤلمه‌سین‌ده، هئچ صحیفه یوخدور.",
+       "randomincategory-category": "بؤلمه:",
+       "randomincategory-legend": "بؤلمه‌ده راست‌گله صفحه",
        "randomredirect": "راست‌گله یول‌لاندیرما",
        "randomredirect-nopages": "«$1» آدفضاسیندا هئچ بیر یول‌لاندیرما یوخدور.",
        "statistics": "آمارلار",
        "querypage-disabled": "پِرفورمانس اوچون بو اؤزل صحیفه باغلانیب‌دیر.",
        "booksources": "کیتاب قایناقلاری",
        "booksources-search-legend": "کیتاب قایناقلارین آختار",
+       "booksources-search": "آختار",
        "booksources-text": "آشاغیدا یئنی و ایشلنمیش کیتاب‌لار ساتان خاریجی کئچیدلرده سیز آختاردیغینیز کیتاب حاقیندا علاوه معلومات آلا بیلرسیز:",
        "booksources-invalid-isbn": "وئریلن ISBN اعتبارسیز کیمی گؤرونور؛ اورجینال قایناق‌دان کوپیالاما اشکالار اوچون نظارت ائدین.",
        "specialloguserlabel": "ایجراچی",
        "autoblockid": "اوتوماتیک باغلانما #$1",
        "block": "ایستیفادچینی باغلاما",
        "unblock": "ایستیفاده‌چی‌نین باغلانماسین گؤتور",
-       "blockip": "ایستیفاده چی نی باغلا",
+       "blockip": " {{GENDER:$1|ایشلدن}}ی باغلا",
        "blockip-legend": "ایستیفادچی نی باغلا",
        "blockiptext": "آشاغی‌داکی فورمو ایستیفاده ائده‌رک مویین بیر ایپنین و یا قئیدیات‌دان کئچمیش ایستیفاده‌چی‌نین دییشیک‌لیک ائتمه‌سینی مانعه تؤره‌ده بیلرسینیز. بو یالنیز واندالیزمی قارشی‌سینی آلماق اوچون و [[{{MediaWiki:Policy-url}}|قایدا‌لارا]] اویغون اولا‌راق ائدیلمه‌لی. آشاغییا موتلق قاداغا ایله علاقه‌دار بیر شرح یازین. (نومونه:-بو-صحیفه‌لرده واندالیزم ائتمیش‌دیر).",
        "ipaddressorusername": "آی-پی عونوانی و یا ایستیفاده‌چی آدی",
        "import": "صحیفه‌لری ایدخال ائت",
        "importinterwiki": "ویکیلر اراسی چیخارما",
        "import-interwiki-text": "ایچه کؤچورمک اوچون بیر wiki و صحیفه باش‌لیغی سئچین.\nرئویزیون تاریخ‌لری و یازارلارین آدلاری قورونا‌جاق.\nبوتون ویکیلئراراسی ایچه کؤچورمه حرکت‌لری [[Special:Log/import|ایچه کؤچورمه گوندلیگینده]] یازیلماقدا‌دیر.",
+       "import-interwiki-sourcepage": "قایناق صفحه:",
        "import-interwiki-history": "صحیفه‌نین دییشمه تاریخچه‌لری‌نین هامی‌سینی کؤچور",
        "import-interwiki-templates": "بوتون شابلون‌لارلا بیرلیکده",
        "import-interwiki-submit": "ایچری توکمه اولسون",
        "watchlistedit-raw-done": "ایزله‌دیکلرینیز گونجل‌لندی.",
        "watchlistedit-raw-added": "{{PLURAL:$1|بیر|$1}} باشلیق آرلیریلدی:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|بیر|$1}} باشلیق چیخاریلدی:",
+       "watchlistedit-clear-titles": "باشلیق‌لار:",
        "watchlisttools-view": "ایلگیلی دَییشیکلیکلره باخین",
        "watchlisttools-edit": "ایزله‌دیکلره باخ و اونلاری دَییشدیر",
        "watchlisttools-raw": "چیی ایزله‌دیکلری دَییشدیر",
        "duplicate-defaultsort": "'''دیقت:''' احتیمال ائدیلن «$2» دفالت آچاری، قاباقکی «$1» دفالت آچارینی گئچرسیز ائدیر.",
        "version": "نوسخه‌",
        "version-extensions": "قورولموش گنیشلندیرمه‌لر",
-       "version-skins": "قابیقلار",
+       "version-skins": "یوکلنمیش قابیق‌لار",
        "version-specialpages": "اؤزل صحیفه‌لر",
        "version-parserhooks": "آیریشدیران چنگل‌لری",
        "version-variables": "دَییشینلر",
        "version-hook-name": "چنگه‌لین آدی",
        "version-hook-subscribedby": "طرفیندن گیریش‌‌میش",
        "version-version": "(نسخه $1)",
+       "version-no-ext-name": "[آد سیز]",
        "version-license": "مِدیاویکی لیسانسی",
        "version-ext-license": "لیسانس",
+       "version-skin-colheader-name": "قابیق",
+       "version-ext-colheader-version": "سۆروم",
+       "version-ext-colheader-license": "لیسانس",
+       "version-ext-colheader-description": "آچیقلاما",
+       "version-ext-colheader-credits": "یازیچی‌لار",
        "version-poweredby-credits": "بو wیکی ' ''[https://www.mediawiki.org/ مئدیاwیکی]'ع' پروقرامی ایستیفاده ائدیله‌رک يارادیلمیشدیر، یاازارلار © 2001-$1 $2.",
        "version-poweredby-others": "آیریلار",
        "version-credits-summary": "بو ایستفاده چیلر دییشدیر لرینه گوره [[Special:Version|مئدیاویکی]] تانیش ائدیرم.",
        "htmlform-no": "یوخ",
        "htmlform-yes": "بلی",
        "htmlform-chosen-placeholder": "بیر سئچمه سئچین",
+       "htmlform-cloner-create": "چوْخراق آرتیر",
+       "htmlform-cloner-delete": "سیل",
        "sqlite-has-fts": "$1 بوتون یازی آختارما دستگی‌له",
        "sqlite-no-fts": "$1 بوتون یازی آختارماماق‌لا",
        "logentry-delete-delete": "$1، $3 صحیفه‌سینی {{GENDER:$2|سیلدی}}",
        "duration-centuries": "{{PLURAL:$1|بیر|$1}} یوز-ایل",
        "duration-millennia": "{{PLURAL:$1|بیر|$1}} مین‌ایل",
        "rotate-comment": "عکس $1 {{PLURAL:$1|درجه}} ساعات عقربه‌لری ایستیقامتینده فیرلاندیریلب‌دیر",
+       "expand_templates_output": "سوْنوج",
+       "expand_templates_ok": "اوْلسون",
+       "expand_templates_remove_comments": "باخیش‌لاری سیل",
        "expand_templates_generate_rawhtml": "چیی اچ‌تی‌ام‌ال گؤستر",
-       "expand_templates_preview": "اؤن‌گؤستریش"
+       "expand_templates_preview": "اؤن‌گؤستریش",
+       "pagelang-name": "صفحه",
+       "pagelang-language": "دیل",
+       "pagelang-select-lang": "دیل سئچمه‌سی",
+       "mediastatistics-table-count": "فایل‌لارین سایی",
+       "mediastatistics-header-unknown": "بیلینمه‌ین",
+       "mediastatistics-header-bitmap": "بیت‌مپ گؤرونتولر",
+       "mediastatistics-header-audio": "سس",
+       "mediastatistics-header-video": "ویدیولار",
+       "mediastatistics-header-office": "دفتر"
 }
index 28bdb68..56e6cbc 100644 (file)
        "filerenameerror": "Немагчыма перайменаваць файл «$1» у «$2».",
        "filedeleteerror": "Немагчыма выдаліць файл «$1».",
        "directorycreateerror": "Немагчыма стварыць дырэкторыю «$1».",
+       "directoryreadonlyerror": "Тэчка «$1» толькі для чытаньня.",
+       "directorynotreadableerror": "Тэчка «$1» не чытаецца.",
        "filenotfound": "Немагчыма знайсьці файл «$1».",
        "unexpected": "Нечаканае значэньне: «$1»=«$2».",
        "formerror": "Памылка: не атрымалася адаслаць зьвесткі формы",
        "api-error-stashzerolength": "Сэрвэр ня змог схаваць файл, бо ён мае нулявы памер.",
        "api-error-stashnotloggedin": "Вы мусіце ўвайсьці ў сыстэму, каб захоўваць файлы ў схованку загрузкі.",
        "api-error-stashwrongowner": "Файл, да якога вы спрабуеце атрымаць доступ у схованцы, не належыць вам.",
+       "api-error-stashnosuchfilekey": "Ключ файла, да якога вы спрабуеце атрымаць доступ у схованцы, не існуе.",
        "api-error-timeout": "Сэрвэр не адказаў у чаканы тэрмін.",
        "api-error-unclassified": "Узьнікла невядомая памылка",
        "api-error-unknown-code": "Невядомая памылка: «$1».",
index fe7d7ad..1415b2c 100644 (file)
@@ -23,7 +23,8 @@
                        "아라",
                        "Gazimagomedov",
                        "StanProg",
-                       "Bjankuloski06"
+                       "Bjankuloski06",
+                       "Vodnokon4e"
                ]
        },
        "tog-underline": "Подчертаване на препратките:",
        "otherlanguages": "На други езици",
        "redirectedfrom": "(пренасочване от $1)",
        "redirectpagesub": "Пренасочваща страница",
+       "redirectto": "Пренасочване към:",
        "lastmodifiedat": "Последна промяна на страницата: $2, $1.",
        "viewcount": "Страницата е била преглеждана {{PLURAL:$1|един път|$1 пъти}}.",
        "protectedpage": "Защитена страница",
        "ok": "Добре",
        "pagetitle": "$1 — {{SITENAME}}",
        "retrievedfrom": "Взето от „$1“.",
-       "youhavenewmessages": "Имате $1 ($2).",
+       "youhavenewmessages": "{{PLURAL:$3|Имате}} $1 ($2).",
        "youhavenewmessagesfromusers": "Имате $1 от {{PLURAL:$3|друг потребител|$3 потребители}} ($2).",
        "youhavenewmessagesmanyusers": "Имате $1 от много потребители ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|ново съобщение|999=нови съобщения}}",
        "viewsourcetext": "Можете да разгледате и да копирате кодa на страницата:",
        "viewyourtext": "Можете да прегледате и копирате изходния код на '''вашите редакции''' на тази страница:",
        "protectedinterface": "Тази страница съдържа текст, нужен за работата на системата. Тя е защитена против редактиране, за да се предотвратят възможни злоупотреби.\nЗа извършване на промяна за всички уикита, посетете [//translatewiki.net/ translatewiki.net], проектът за локализация на MediaWiki.",
-       "editinginterface": "'''Внимание:''' Редактирате страница, която се използва за интерфейса на софтуера. Промяната й ще повлияе на външния вид на уикито.\nЗа превеждане, обмислете използването на [//translatewiki.net/ translatewiki.net], проектът за локализиране на MediaWiki.",
+       "editinginterface": "<strong>Внимание:</strong> Редактирате страница, която се използва за текстовия интерфейс на софтуера. Промяната й ще повлияе на външния вид на уикито.",
+       "translateinterface": "За да добавите или промените преводи за всички уикита, моля, използвайте [//translatewiki.net/ translatewiki.net], локализиращия проект на МедияУики.",
        "cascadeprotected": "Тази страница е защитена против редактиране, защото е включена в {{PLURAL:$1|следната страница, която от своя страна има|следните страници, които от своя страна имат}} каскадна защита:\n$2",
        "namespaceprotected": "Нямате права за редактиране на страници в именно пространство '''$1'''.",
        "customcssprotected": "Нямате права за редактиране на тази CSS страница, защото тя съдържа чужди потребителски настройки.",
        "createaccount-text": "Някой е създал сметка за $2 в {{SITENAME}} ($4) и е посочил този адрес за електронна поща. Паролата за „$2“ е „$3“. Необходимо е да влезете в системата и да смените паролата си.\n\nМожете да пренебрегнете това съобщение, ако сметката е създадена по грешка.",
        "login-throttled": "Направили сте твърде много опити да въведете паролата за тази сметка.\nНеобходимо е да изчакате $1 преди да опитате отново.",
        "login-abort-generic": "Влизането беше неуспешно - Прекратено",
+       "login-migrated-generic": "Вашата сметка е бил преместена и потребителското Ви име вече не съществува в това уики.",
        "loginlanguagelabel": "Език: $1",
        "suspicious-userlogout": "Заявката ви за излизане от системата беше отхвърлена, тъй като изглежда е била изпратена погрешка от браузъра или кеширащото прокси.",
        "createacct-another-realname-tip": "Истинското име е незадължително.\nВ случай, че бъде избрабо да се попълни, ще бъде използвано за да му се приписват приносите в уикито.",
        "resetpass-submit-cancel": "Отказ",
        "resetpass-wrong-oldpass": "Невалидна временна или текуща парола.\nВъзможно е вече успешно да сте сменили паролата си или да сте поискали нова временна парола.",
        "resetpass-recycled": "Моля, променете паролата си с такава, различна от текущата.",
+       "resetpass-temp-emailed": "Вие сте влезли в системата с помощта на временен код, който е изпратен чрез електронна поща.\nЗа да завършите влизането в системата, трябва да въведете нова парола тук:",
        "resetpass-temp-password": "Временна парола:",
        "resetpass-abort-generic": "Промяната на паролата беше прекъсната от използвано разширение.",
        "resetpass-expired": "Срокът на валидност на паролата е изтекъл. Изберете нова парола за влизане.",
+       "resetpass-expired-soft": "Вашата парола е изтекла и трябва да бъде променена. Моля, въведете нова парола сега или натиснете бутона \"{{int:resetpass-submit-cancel}}\" за да я промените по-късно.",
+       "resetpass-validity-soft": "Моля, въведете нова парола сега или натиснете бутона \"{{int:resetpass-submit-cancel}}\" за да я промените по-късно.",
        "passwordreset": "Възстановяване на парола",
        "passwordreset-text-one": "Попълването на формуляра ще доведе до възстановяване на паролата.",
-       "passwordreset-text-many": "{{PLURAL:$1|Ð\97а Ð²Ñ\8aзÑ\81Ñ\82ановÑ\8fване Ð½Ð° Ð¿Ð°Ñ\80олаÑ\82а Ðµ Ð½ÐµÐ¾Ð±Ñ\85одимо Ð´Ð° Ñ\81е Ð¿Ð¾Ð¿Ñ\8aлни едно от полетата.}}",
+       "passwordreset-text-many": "{{PLURAL:$1|Ð\97а Ð¿Ð¾Ð»Ñ\83Ñ\87аване Ð½Ð° Ð²Ñ\80еменна Ð¿Ð°Ñ\80ола Ð¿Ð¾ ÐµÐ»ÐµÐºÑ\82Ñ\80онна Ð¿Ð¾Ñ\89а Ðµ Ð½ÐµÐ¾Ð±Ñ\85одимо Ð´Ð° Ð¿Ð¾Ð¿Ñ\8aлниÑ\82е едно от полетата.}}",
        "passwordreset-legend": "Възстановяване на парола",
        "passwordreset-disabled": "Възстановяването на паролата е изключено в това уики.",
        "passwordreset-emaildisabled": "Функционалността за електронна поща е изключена в това уики.",
        "changeemail-none": "(няма)",
        "changeemail-password": "Парола за {{SITENAME}}:",
        "changeemail-submit": "Промяна на е-пощата",
+       "changeemail-throttled": "Направили сте твърде много опити за влизане в системата. \nМоля, изчакайте $1 преди следващия опит.",
        "resettokens": "Изчистване на маркерите",
        "resettokens-no-tokens": "Няма маркери за изчистване.",
        "resettokens-legend": "Изчистване на маркерите",
        "version-ext-colheader-description": "Описание",
        "version-ext-colheader-credits": "Автори",
        "version-license-title": "Лиценз за $1",
-       "version-poweredby-credits": "Това Ñ\83ики Ñ\81е Ð·Ð°Ð´Ð²Ð¸Ð¶Ð´Ð²Ð° Ð¾Ñ\82 '''[https://www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
+       "version-poweredby-credits": "Това Ñ\83ики Ñ\80абоÑ\82и Ð¿Ð¾ Ñ\81оÑ\84Ñ\82Ñ\83еÑ\80а Ð½Ð° <strong>[https://www.mediawiki.org/ MediaWiki]</strong>, copyright © 2001-$1 $2.",
        "version-poweredby-others": "други",
        "version-poweredby-translators": "преводачи в translatewiki.net",
        "version-credits-summary": "Бихме искали да изкажем признателност на следните хора за техните приноси към [[Special:Version|MediaWiki]].",
index 3cd8d75..91f08a2 100644 (file)
        "recentchanges": "這般其改變",
        "recentchanges-summary": "敆維基茲頁跟蹤這般其改變。",
        "recentchanges-label-newpage": "茲蜀萆修改創建新其蜀頁",
-       "recentchanges-label-minor": "是蜀萆過幼修改",
+       "recentchanges-label-minor": "是蜀萆過幼修改",
        "recentchanges-label-bot": "茲蜀萆修改是機器人做其",
        "rclistfrom": "顯示由$3 $2開始其新其改變",
        "rcshowhideminor": "$1過幼修改",
index f23330b..f572a60 100644 (file)
        "filerenameerror": "Nebylo možné přejmenovat soubor „$1“ na „$2“.",
        "filedeleteerror": "Nebylo možné smazat soubor „$1“.",
        "directorycreateerror": "Nelze vytvořit adresář „$1“.",
+       "directoryreadonlyerror": "Adresář „$1“ je pouze pro čtení.",
+       "directorynotreadableerror": "Adresář „$1“ nelze číst.",
        "filenotfound": "Nebylo možné najít soubor „$1“.",
        "unexpected": "Neočekávaná hodnota: \"$1\"=\"$2\".",
        "formerror": "Chyba: nebylo možné odeslat formulář",
index eecd71f..fdde405 100644 (file)
        "filerenameerror": "Die Datei „$1“ konnte nicht nach „$2“ umbenannt werden.",
        "filedeleteerror": "Die Datei „$1“ konnte nicht gelöscht werden.",
        "directorycreateerror": "Das Verzeichnis „$1“ konnte nicht angelegt werden.",
+       "directoryreadonlyerror": "Das Wörterbuch „$1“ ist schreibgeschützt.",
+       "directorynotreadableerror": "Das Wörterbuch „$1“ ist nicht lesbar.",
        "filenotfound": "Die Datei „$1“ wurde nicht gefunden.",
        "unexpected": "Unerwarteter Wert: „$1“ = „$2“",
        "formerror": "Fehler: Die Eingaben konnten nicht verarbeitet werden.",
        "prefs-tabs-navigation-hint": "Tipp: Du kannst die linke und rechte Pfeiltasten benutzen, um zwischen den Registerkarten in der Reiterliste zu navigieren.",
        "email-address-validity-valid": "Diese E-Mail-Adresse scheint gültig zu sein.",
        "email-address-validity-invalid": "Eine gültige E-Mail-Adresse ist erforderlich.",
-       "userrights": "Benutzerrechteverwaltung",
+       "userrights": "Benutzerrechte verwalten",
        "userrights-lookup-user": "Gruppenzugehörigkeit verwalten",
        "userrights-user-editname": "Benutzername:",
        "editusergroup": "Benutzerrechte bearbeiten",
index 95472a5..f36a000 100644 (file)
        "november-date": "Tışrino Peyên $1",
        "december-date": "Kanun $1",
        "pagecategories": "{{PLURAL:$1|Kategoriye|Kategoriy}}",
-       "category_header": "Pelê ke kategoriya \"$1\" miyan derê",
+       "category_header": "Pelê ke kategoriya \"$1\" derê",
        "subcategories": "Kategoriyê bınêni",
-       "category-media-header": "Dosyeyê ke kategoriya \"$1\" miyan derê",
+       "category-media-header": "Dosyeyê ke kategoriya \"$1\" derê",
        "category-empty": "''Ena kategoriye de hewna qet nuştey ya zi medya çıniyê.''",
        "hidden-categories": "{{PLURAL:$1|Kategoriya nımıtiye|Kategoriyê nımıtey}}",
        "hidden-category-category": "Kategoriyê nımıtey",
index c18adfc..5d4a2bf 100644 (file)
        "otherlanguages": "Σε άλλες γλώσσες",
        "redirectedfrom": "(Ανακατεύθυνση από $1)",
        "redirectpagesub": "Σελίδα ανακατεύθυνσης",
+       "redirectto": "Ανακατεύθυνση σε:",
        "lastmodifiedat": "Η σελίδα αυτή τροποποιήθηκε τελευταία φορά στις $1, στις $2.",
        "viewcount": "Αυτή η σελίδα έχει προσπελαστεί {{PLURAL:$1|μια φορά|$1 φορές}}.",
        "protectedpage": "Προστατευμένη σελίδα",
        "pool-timeout": "Χρόνος αναμονής για το κλείδωμα",
        "pool-queuefull": "Η ουρά της δεξαμενής διεργασιών είναι πλήρης",
        "pool-errorunknown": "Άγνωστο σφάλμα",
+       "pool-servererror": "Η υπηρεσία καταμετρητή ομαδοποίησης δεν είναι διαθέσιμη ($1).",
        "aboutsite": "Σχετικά με {{SITENAME}}",
        "aboutpage": "Project:Σχετικά",
        "copyright": "Το περιεχόμενο είναι διαθέσιμο σύμφωνα με την $1 εκτός αν αναφέρεται διαφορετικά.",
        "viewyourtext": "Μπορείτε να προβάλετε και να αντιγράψετε τον κώδικα των '''επεξεργασιών σας''' σε αυτήν τη σελίδα:",
        "protectedinterface": "Αυτή η σελίδα παρέχει κείμενο διεπαφής για το λογισμικό σε αυτό το wiki, και έχει κλειδωθεί για αποτροπή τυχόν βανδαλισμού.\n\nΓια να προσθέσετε ή να αλλάξετε τις μεταφράσεις για όλα τα wikis, παρακαλούμε χρησιμοποιήστε  [//translatewiki.net/ translatewiki.net], το εγχείρημα τοπικοποίησης του  MediaWiki.",
        "editinginterface": "<strong>Προειδοποίηση:</strong> Επεξεργάζεστε μια σελίδα η οποία χρησιμοποιείται για να παρέχει κείμενο διεπαφής για το λογισμικό. Αλλαγές σε αυτήν τη σελίδα θα επηρεάσουν την εμφάνιση της διεπαφής χρήστη για άλλους χρήστες αυτού του wiki.",
+       "translateinterface": "Για να προσθέσετε ή να αλλάξετε τις μεταφράσεις για όλα τα wiki, παρακαλούμε χρησιμοποιήστε το [//translatewiki.net/ translatewiki.net], το έργο τοπικοποίησης του MediaWiki.",
        "cascadeprotected": "Αυτή η σελίδα έχει προστατευθεί από επεξεργασία, επειδή περιλαμβάνεται {{PLURAL:$1|στην ακόλουθη σελίδα, που είναι προστατευμένη|στις ακόλουθες σελίδες, που είναι προστατευμένες}} με ενεργοποιημένη τη «διαδοχική» προστασία στο:\n$2",
        "namespaceprotected": "Δεν έχετε άδεια να επεξεργάζεστε σελίδες στον τομέα '''$1'''.",
        "customcssprotected": "Δεν έχετε δικαιώματα για να επεξεργαστείτε αυτή τη σελίδα CSS, επειδή περιέχει προσωπικές ρυθμίσεις άλλου χρήστη.",
        "createaccount-text": "Κάποιος δημιούργησε έναν λογαριασμό για τη διεύθυνση email σας στο {{SITENAME}} ($4) με το όνομα \"$2\", με κωδικό πρόσβασης \"$3\". Θα πρέπει να συνδεθείτε και να αλλάξετε τον κωδικό πρόσβασής σας τώρα.\n\nΜπορείτε να αγνοήσετε αυτό το μήνυμα, αν αυτός ο λογαριασμός δημιουργήθηκε εσφαλμένα.",
        "login-throttled": "Κάνατε πάρα πολλές πρόσφατες απόπειρες σύνδεσης.\nΠαρακαλούμε περιμένετε $1 προτού ξαναδοκιμάσετε.",
        "login-abort-generic": "Η είσοδος δεν πέτυχε - Ματαιώθηκε",
+       "login-migrated-generic": "Ο λογαριασμός σας έχει μεταναστεύσει, και το όνομα χρήστη σας δεν υπάρχει πλέον σε αυτό το wiki.",
        "loginlanguagelabel": "Γλώσσα: $1",
        "suspicious-userlogout": "Το αίτημα αποσύνδεσής σας απερρίφθη επειδή φαίνεται ότι στάλθηκε από ένα λανθασμένο φυλλομετρητή (browser) ή διακομιστή προσωρινής αποθήκευσης.",
        "createacct-another-realname-tip": "Το πραγματικό όνομα είναι προαιρετικό\nΑν επιλέξετε να το δώσετε, αυτό θα μπορεί να χρησιμοποιηθεί για να αναγνωριστεί η δουλειά σας.",
        "content-model-text": "απλό κείμενο",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "duplicate-args-category": "Σελίδες που χρησιμοποιούν διπλές παραμέτρους σε κλήσεις προτύπων",
+       "duplicate-args-category-desc": "Η σελίδα περιέχει κλήσεις πρότυπων που χρησιμοποιούν διπλές παραμέτρους, όπως <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "Προειδοποίηση: Αυτή η σελίδα περιέχει πάρα πολύ ακριβό αναλυτή λειτουργικών κλήσεων.\n\nΠρέπει να περιέχει λιγότερες από $2 {{PLURAL:$2|κλήση|κλήσεις}}, τώρα {{PLURAL:$1|υπάρχει $1 κλήση|υπάρχουν $1 κλήσεις}}.",
        "expensive-parserfunction-category": "Σελίδες με πάρα πολλές ακριβές λεξιαναλυτικές λειτουργικές κλήσεις",
        "post-expand-template-inclusion-warning": "'''Προειδοποίηση:''' Το μέγεθος συμπερίληψης προτύπων είναι πολύ μεγάλο.\nΚάποια πρότυπα δεν θα συμπεριληφθούν.",
        "revdelete-show-file-confirm": "Είστε σίγουροι ότι θέλετε να δείτε μία διεγραμμένη αναθεώρηση του αρχείου \"<nowiki>$1</nowiki>\" από τις $2 στις $3;",
        "revdelete-show-file-submit": "Ναι",
        "revdelete-selected-text": "{{PLURAL:$1|Επιλεγμένη έκδοση|Επιλεγμένες εκδόσεις}} της [[:$2]]:",
+       "revdelete-selected-file": "{{PLURAL:$1|Επιλεγμένη έκδοση αρχείου|Επιλεγμένες εκδόσεις αρχείου}} του [[:$2]]:",
        "logdelete-selected": "{{PLURAL:$1|Επιλεγμένο γεγονός αρχείου καταγραφής|Επιλεγμένα γεγονότα αρχείου καταγραφής}}:",
        "revdelete-confirm": "Παρακαλούμε επιβεβαιώστε ότι σκοπεύετε να το κάνετε αυτό, ότι αντιλαμβάνεσθε τις συνέπειες, και ότι το κάνετε σύμφωνα με την [[{{MediaWiki:Policy-url}}|πολιτική]].",
        "revdelete-suppress-text": "Η καταστολή μπορεί να χρησιμοποιηθεί <strong> μόνο </strong> για τις ακόλουθες περιπτώσεις:\n* Ενδεχόμενη συκοφαντική δυσφήμιση\n* Ακατάλληλες προσωπικές πληροφορίες\n*: <em>διευθύνσεις κατοικίας και αριθμοί τηλεφώνου, αριθμοί ταυτότητας, κλπ. </em>",
        "shown-title": "Εμφάνιση $1 {{PLURAL:$1|αποτελέσματος|αποτελεσμάτων}} ανά σελίδα",
        "viewprevnext": "Εμφάνιση ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "'''Υπάρχει μια σελίδα που ονομάζεται «[[:$1]]» σε αυτό το wiki.'''",
-       "searchmenu-new": "'''Δημιουργήστε τη σελίδα «[[:$1]]» σε αυτό το wiki!'''",
+       "searchmenu-new": "<strong>Δημιουργήστε τη σελίδα «[[:$1]]» σε αυτό το wiki!</strong>\n{{PLURAL:$2|0=|Δείτε επίσης τη σελίδα που βρέθηκε με την αναζήτησή σας.|Δείτε επίσης τα αποτελέσματα της αναζήτησης που βρέθηκαν.}}",
        "searchprofile-articles": "Σελίδες περιεχομένου",
        "searchprofile-images": "Πολυμέσα",
        "searchprofile-everything": "Οτιδήποτε",
        "searchall": "όλα",
        "showingresults": "Παρακάτω {{PLURAL:$1|εμφανίζεται μέχρι <strong>1</strong> αποτέλεσμα|εμφανίζονται μέχρι <strong>$1</strong> αποτελέσματα}} ξεκινώντας από το Νο <strong>$2</strong>.",
        "showingresultsinrange": "Παρακάτω {{PLURAL:$1|εμφανίζεται μέχρι <strong>1</strong> αποτέλεσμα|εμφανίζονται μέχρι <strong>$1</strong> αποτελέσματα}} σε εύρος από το Νο <strong>$2</strong> μέχρι το Νο <strong>$3</strong>.",
+       "search-showingresults": "{{PLURAL:$5|Αποτέλεσμα <strong>$1</strong> από <strong>$3</strong>|Αποτελέσματα <strong>$1 - $2</strong> από <strong>$3</strong>}}",
        "search-nonefound": "Δεν υπάρχουν αποτελέσματα που να ικανοποιούν το ερώτημα.",
        "powersearch-legend": "Αναλυτική αναζήτηση",
        "powersearch-ns": "Αναζήτηση στις περιοχές ονομάτων:",
        "powersearch-togglelabel": "Έλεγχος:",
        "powersearch-toggleall": "Όλες",
        "powersearch-togglenone": "Καμία",
+       "powersearch-remember": "Διατήρηση επιλογής για μελλοντικές αναζητήσεις",
        "search-external": "Εξωτερική αναζήτηση",
        "searchdisabled": "Η αναζήτηση για τον ιστότοπο \"{{SITENAME}}\" είναι απενεργοποιημένη. Μπορείτε να αναζητήσετε μέσω του Google εν τω μεταξύ. Σημειώστε ότι οι κατάλογοί τους για το περιεχόμενο του ιστοτόπου \"{{SITENAME}}\" μπορεί να είναι απαρχαιωμένοι.",
        "search-error": "Παρουσιάστηκε σφάλμα κατά την αναζήτηση:$1",
        "gender-female": "Γυναίκα",
        "prefs-help-gender": "Η ρύθμιση αυτή της προτίμησης είναι προαιρετική.\nΤο λογισμικό χρησιμοποιεί την τιμή αυτής της παραμέτρου για να απευθύνεται προς εσάς και για να αναφέρεται σε σας όταν απευθύνεται σε άλλους, χρησιμοποιώντας το κατάλληλο γραμματικό γένος.\nΑυτή η πληροφορία θα είναι δημόσια.",
        "email": "Ηλεκτρονικό ταχυδρομείο",
-       "prefs-help-realname": "* Πραγματικό όνομα (προαιρετικό): εφόσον εισάγετε το όνομά σας, αυτό θα μπορεί να χρησιμοποιηθεί για να αναγνωριστεί η δουλειά σας.",
+       "prefs-help-realname": "Το πραγματικό όνομα είναι προαιρετικό.\nΕφόσον παρέχεται, μπορεί να χρησιμοποιηθεί για να αναγνωριστεί το έργο σας.",
        "prefs-help-email": "Το ηλεκτρονικό ταχυδρομείο είναι προαιρετικό, ωστόσο δίνει τη δυνατότητα να σας αποσταλεί ένας νέος κωδικός στην περίπτωση που ξεχάσετε τον κωδικό σας.",
        "prefs-help-email-others": "Μπορείτε επίσης να επιλέξετε να αφήσετε τους  άλλους να επικοινωνήσουν  μαζί σας μέσω της σελίδας χρήστη ή συζήτησης  χωρίς να χρειάζεται να αποκαλύψετε την ταυτότητά σας.",
        "prefs-help-email-required": "Απαιτείται διεύθυνση ηλεκτρονικού ταχυδρομείου.",
        "right-deletedtext": "Εμφάνιση διεγραμμένου κειμένου και αλλαγών ανάμεσα στις διεγραμμένες εκδόσεις",
        "right-browsearchive": "Αναζήτηση στις διαγραμμένες σελίδες",
        "right-undelete": "Ανάκληση διαγραφής μίας σελίδας",
-       "right-suppressrevision": "Î\95Ï\80ιθεÏ\8eÏ\81ηÏ\83η ÎºÎ±Î¹ Î±Ï\80οκαÏ\84άÏ\83Ï\84αÏ\83η Î±Î½Î±Î¸ÎµÏ\89Ï\81ήÏ\83εÏ\89ν ÎºÏ\81Ï\85μμένÏ\89ν Î±Ï\80Ï\8c Ï\84οÏ\85Ï\82 Î´Î¹Î±Ï\87ειÏ\81ιÏ\83Ï\84έÏ\82",
+       "right-suppressrevision": "ΠÏ\81οβολή, Î±Ï\80Ï\8cκÏ\81Ï\85Ï\88η ÎºÎ±Î¹ ÎµÏ\80ανεμÏ\86άνιÏ\83η Ï\83Ï\85γκεκÏ\81ιμένÏ\89ν Î±Î½Î±Î¸ÎµÏ\89Ï\81ήÏ\83εÏ\89ν Ï\83ελίδÏ\89ν Î±Ï\80Ï\8c ÎºÎ¬Î¸Îµ Ï\87Ï\81ήÏ\83Ï\84η",
        "right-viewsuppressed": "Προβολή αναθεωρήσεων κρυμμένων από κάθε χρήστη",
        "right-suppressionlog": "Προβολή ιδιωτικών καταγραφών",
        "right-block": "Φραγή άλλων χρηστών από την επεξεργασία",
        "right-editmyusercss": "Επεξεργασία των ιδιωτικών αρχείων CSS χρήστη",
        "right-editmyuserjs": "Επεξεργασία των ιδιωτικών αρχείων JavaScript χρήστη",
        "right-viewmywatchlist": "Προβολή της δικής σας λίστα παρακολούθησης",
+       "right-editmywatchlist": "Επεξεργασία της δικής σας λίστας παρακολούθησής. Σημειώστε ότι κάποιες ενέργειες θα εξακολουθούν να προσθέτουν σελίδες, ακόμα και χωρίς αυτό το δικαίωμα.",
        "right-viewmyprivateinfo": "Δείτε τα προσωπικά σας δεδομένα (π.χ. διεύθυνση ηλεκτρονικού ταχυδρομείου, πραγματικό όνομα)",
        "right-editmyprivateinfo": "Επεξεργαστείτε τα προσωπικά σας δεδομένα (π.χ. διεύθυνση ηλεκτρονικού ταχυδρομείου, πραγματικό όνομα)",
        "right-editmyoptions": "Επεξεργασία των προτιμήσεών σας",
        "action-createpage": "να δημιουργήσετε σελίδες",
        "action-createtalk": "να δημιουργήσετε σελίδες συζήτησης",
        "action-createaccount": "να δημιουργήσετε αυτό το λογαριασμό χρήστη",
+       "action-history": "προβολή ιστορικού αυτή της σελίδας",
        "action-minoredit": "να σημειώσετε αυτή την επεξεργασία σαν «μικρής κλίμακας»",
        "action-move": "να μετακινήσετε αυτή τη σελίδα",
        "action-move-subpages": "να μετακινήσετε αυτή τη σελίδα, καθώς και τις υποσελίδες της",
        "recentchanges-label-plusminus": "Μεταβολή του μεγέθους της σελίδας σε bytes",
        "recentchanges-legend-heading": "'''Υπόμνημα:'''",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (δείτε [[Special:NewPages|κατάλογος νέων σελίδων]])",
-       "rcnotefrom": "Παρακάτω είναι οι αλλαγές από τις <strong>$2</strong>  (εμφανίζονται μέχρι <strong>$1</strong> ).",
+       "rcnotefrom": "Παρακάτω {{PLURAL:$5|είναι η αλλαγή|είναι οι αλλαγές}} από <strong>$3, $4</strong> (έως <strong>$1</strong> που εμφανίζεται).",
        "rclistfrom": "Εμφάνιση νέων αλλαγών αρχίζοντας από τις $3 στις $2",
        "rcshowhideminor": "$1 μικροεπεξεργασιών",
        "rcshowhideminor-show": "Εμφάνιση",
        "booksources": "Πηγές βιβλίων",
        "booksources-search-legend": "Αναζήτηση για πηγές βιβλίων",
        "booksources-isbn": "ISBN:",
+       "booksources-search": "Αναζήτηση",
        "booksources-text": "Παρακάτω είναι μια λίστα συνδέσμων σε άλλους ιστοτόπους οι οποίοι πωλούν νέα και μεταχειρισμένα βιβλία, και μπορεί επίσης να έχουν περισσότερες πληροφορίες για βιβλία για τα οποία ψάχνετε:",
        "booksources-invalid-isbn": "Το δοσμένο ISBN δεν φαίνεται να είναι έγκυρο· ελέγξτε για λάθη κατά την αντιγραφή από την αρχική πηγή.",
        "specialloguserlabel": "",
        "listgrouprights-namespaceprotection-namespace": "Ονοματοχώρος",
        "listgrouprights-namespaceprotection-restrictedto": "Δικαίωμα(τα) που επιτρέπει(ουν) σε χρήστη να επεξεργαστεί",
        "trackingcategories": "Παρακολούθηση κατηγοριών",
+       "trackingcategories-msg": "Κατηγορία παρακολούθησης",
        "trackingcategories-name": "Όνομα μηνύματος",
        "trackingcategories-desc": "Κριτήρια συμπερίληψης κατηγορίας",
+       "noindex-category-desc": "Η σελίδα δεν καταλογογραφείται από ρομπότ, επειδή έχει τη μαγική λέξη <code><nowiki>__NOINDEX__</nowiki></code> σε αυτή και είναι σε ένα χώρο ονομάτων όπου αυτή η ετικέτα επιτρέπεται.",
+       "index-category-desc": "Η σελίδα έχει ένα <code><nowiki>__INDEX__</nowiki></code> (και είναι σε ένα χώρο ονομάτων όπου η ετικέτα επιτρέπεται), και ως εκ τούτου καταλογογραφείται από ρομπότ, ενώ κανονικά δεν θα γινόταν.",
        "post-expand-template-inclusion-category-desc": "Το μέγεθος της σελίδας είναι μεγαλύτερο από <code>$wgMaxArticleSize</code> μετά την επέκταση όλων των προτύπων, έτσι ώστε ορισμένα πρότυπα δεν έχουν αναπτυχθεί.",
+       "post-expand-template-argument-category-desc": "Η σελίδα είναι μεγαλύτερη από <code>$wgMaxArticleSize</code> μετά την επέκταση της μεταβλητής ενός προτύπου (κάτι σε τρίπλές αγκύλες, όπως <code>{{{Foo}}}</code>).",
+       "broken-file-category-desc": "Η σελίδα περιέχει ένα σπασμένο σύνδεσμο αρχείου (σύνδεσμο για να ενσωμάτωση ενός αρχείου, ενώ το αρχείο δεν υπάρχει).",
        "hidden-category-category-desc": "Η κατηγορία περιέχει <code><nowiki>__HIDDENCAT__</nowiki></code> στο περιεχόμενο της σελίδας της, που την εμποδίζει εκ προεπιλογής να εμφανίζεται στο πλαίσιο συνδέσμων κατηγοριών των σελίδων.",
        "trackingcategories-nodesc": "Καμία διαθέσιμη περιγραφή.",
        "trackingcategories-disabled": "Η κατηγορία είναι απενεργοποιημένη",
        "delete-toobig": "Αυτή η σελίδα έχει μεγάλο ιστορικό τροποποιήσεων, πάνω από $1 {{PLURAL:$1|τροποποίηση|τροποποιήσεις}}.\nΗ διαγραφή τέτοιων σελίδων έχει περιοριστεί για την αποφυγή τυχαίας αναστάτωσης του {{SITENAME}}.",
        "delete-warning-toobig": "Αυτή η σελίδα έχει μεγάλο ιστορικό τροποποιήσεων, πάνω από $1 {{PLURAL:$1|τροποποίηση|τροποποιήσεις}}.\nΗ διαγραφή της μπορεί να αναστατώσει τη λειτουργία της βάσης δεδομένων του {{SITENAME}}. Συνιστούμε μεγάλη προσοχή.",
        "deleteprotected": "Δεν μπορείτε να διαγράψετε αυτή τη σελίδα επειδή είναι προστατευόμενη.",
+       "deleting-backlinks-warning": "\"'Προσοχή:\"' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Άλλες σελίδες]] συνδέουν ή ενσωματώνουν τη σελίδα που πρόκειται να διαγράψετε.",
        "rollback": "Επαναφορά επεξεργασιών",
        "rollback_short": "Επαναφορά",
        "rollbacklink": "αναστροφή",
index 341f626..45c7105 100644 (file)
        "filerenameerror": "Could not rename file \"$1\" to \"$2\".",
        "filedeleteerror": "Could not delete file \"$1\".",
        "directorycreateerror": "Could not create directory \"$1\".",
+       "directoryreadonlyerror": "Directory \"$1\" is read-only.",
+       "directorynotreadableerror": "Directory \"$1\" is not readable.",
        "filenotfound": "Could not find file \"$1\".",
        "unexpected": "Unexpected value: \"$1\"=\"$2\".",
        "formerror": "Error: Could not submit form.",
        "movepage-moved-redirect": "A redirect has been created.",
        "movepage-moved-noredirect": "The creation of a redirect has been suppressed.",
        "articleexists": "A page of that name already exists, or the name you have chosen is not valid.\nPlease choose another name.",
-       "cantmove-titleprotected": "You cannot move a page to this location because the new title has been protected from creation",
+       "cantmove-titleprotected": "You cannot move a page to this location because the new title has been protected from creation.",
        "movetalk": "Move associated talk page",
        "move-subpages": "Move subpages (up to $1)",
        "move-talk-subpages": "Move subpages of talk page (up to $1)",
        "delete_and_move_confirm": "Yes, delete the page",
        "delete_and_move_reason": "Deleted to make way for move from \"[[$1]]\"",
        "selfmove": "Source and destination titles are the same;\ncannot move a page over itself.",
-       "immobile-source-namespace": "Cannot move pages in namespace \"$1\"",
-       "immobile-target-namespace": "Cannot move pages into namespace \"$1\"",
+       "immobile-source-namespace": "Cannot move pages in namespace \"$1\".",
+       "immobile-target-namespace": "Cannot move pages into namespace \"$1\".",
        "immobile-target-namespace-iw": "Interwiki link is not a valid target for page move.",
        "immobile-source-page": "This page is not movable.",
        "immobile-target-page": "Cannot move to that destination title.",
        "bad-target-model": "The desired destination uses a different content model. Cannot convert from $1 to $2.",
-       "imagenocrossnamespace": "Cannot move file to non-file namespace",
-       "nonfile-cannot-move-to-file": "Cannot move non-file to file namespace",
-       "imagetypemismatch": "The new file extension does not match its type",
-       "imageinvalidfilename": "The target filename is invalid",
+       "imagenocrossnamespace": "Cannot move file to non-file namespace.",
+       "nonfile-cannot-move-to-file": "Cannot move non-file to file namespace.",
+       "imagetypemismatch": "The new file extension does not match its type.",
+       "imageinvalidfilename": "The target filename is invalid.",
        "fix-double-redirects": "Update any redirects that point to the original title",
        "move-leave-redirect": "Leave a redirect behind",
        "protectedpagemovewarning": "<strong>Warning:</strong> This page has been protected so that only users with administrator privileges can move it.\nThe latest log entry is provided below for reference:",
index e5804b1..1556350 100644 (file)
        "filerenameerror": "Ei saanud faili \"$1\" failiks \"$2\" ümber nimetada.",
        "filedeleteerror": "Faili nimega \"$1\" ei ole võimalik kustutada.",
        "directorycreateerror": "Kataloogi \"$1\" ei saanud luua.",
+       "directoryreadonlyerror": "Kataloog \"$1\" on kirjutuskaitstud.",
+       "directorynotreadableerror": "Kataloog \"$1\" pole loetav.",
        "filenotfound": "Faili nimega \"$1\" ei leitud.",
        "unexpected": "Ootamatu väärtus: \"$1\"=\"$2\".",
        "formerror": "Viga: vormi ei saanud salvestada",
index 2383859..03ca92b 100644 (file)
        "listingcontinuesabbrev": "(ادامه)",
        "index-category": "صفحه‌های نمایه‌شده",
        "noindex-category": "صفحه‌های نمایه‌نشده",
-       "broken-file-category": "صفحات دارای پیوند خراب به پرونده",
+       "broken-file-category": "صفحه‌های دارای پیوند خراب به پرونده",
        "about": "درباره",
        "article": "صفحهٔ محتوایی",
        "newwindow": "(در پنجرهٔ تازه باز می‌شود)",
index 15eeca8..236c94a 100644 (file)
        "filerenameerror": "Impossible de renommer le fichier « $1 » en « $2 ».",
        "filedeleteerror": "Impossible de supprimer le fichier « $1 ».",
        "directorycreateerror": "Impossible de créer le dossier « $1 ».",
+       "directoryreadonlyerror": "Le répertoire « $1 » est en lecture seule.",
+       "directorynotreadableerror": "Le répertoire « $1 » n’est pas lisible.",
        "filenotfound": "Impossible de trouver le fichier « $1 ».",
        "unexpected": "Valeur inattendue : « $1 » = « $2 ».",
        "formerror": "Erreur : Impossible de soumettre le formulaire.",
        "delete_and_move_reason": "Page supprimée pour permettre le renommage depuis « [[$1]] »",
        "selfmove": "Les titres d'origine et de destination sont les mêmes ;\nimpossible de renommer une page sur elle-même.",
        "immobile-source-namespace": "Vous ne pouvez pas renommer les pages dans l'espace de noms « $1 »",
-       "immobile-target-namespace": "Vous ne pouvez pas renommer des pages vers l'espace de noms « $1 »",
+       "immobile-target-namespace": "Vous ne pouvez pas renommer des pages vers l’espace de noms « $1 ».",
        "immobile-target-namespace-iw": "Les destinations interwikis ne sont pas une cible valide pour les déplacements.",
        "immobile-source-page": "Cette page n'est pas renommable.",
        "immobile-target-page": "Il n'est pas possible de renommer la page vers ce titre.",
        "bad-target-model": "La destination souhaitée utilise un autre modèle de contenu. Impossible de convertir de $1 vers $2.",
        "imagenocrossnamespace": "Impossible de renommer un fichier vers un espace de noms autre que fichier.",
-       "nonfile-cannot-move-to-file": "Impossible de renommer quelque chose d'autre qu'un fichier vers l'espace de noms fichier.",
+       "nonfile-cannot-move-to-file": "Impossible de renommer quelque chose d'autre qu’un fichier vers l’espace de noms fichier.",
        "imagetypemismatch": "La nouvelle extension de ce fichier ne correspond pas à son type.",
        "imageinvalidfilename": "Le nom du fichier cible est incorrect",
        "fix-double-redirects": "Mettre à jour les redirections pointant vers le titre original",
        "logentry-delete-delete": "$1 {{GENDER:$2|a supprimé}} la page $3",
        "logentry-delete-restore": "$1 {{GENDER:$2|a restauré}} la page $3",
        "logentry-delete-event": "$1 {{GENDER:$2|a modifié}} la visibilité {{PLURAL:$5|d'un événement du journal|de $5 événements du journal}} sur $3: $4",
-       "logentry-delete-revision": "$1 {{GENDER:$2|a modifié}} la visibilité {{PLURAL:$5|d'une révision|de $5 révisions}} sur la page $3: $4",
+       "logentry-delete-revision": "$1 {{GENDER:$2|a modifié}} la visibilité {{PLURAL:$5|d'une révision|de $5 révisions}} sur la page $3 : $4",
        "logentry-delete-event-legacy": "$1 {{GENDER:$2|a modifié}} la visibilité des événements du journal sur $3",
        "logentry-delete-revision-legacy": "$1 {{GENDER:$2|a modifié}} la visibilité des révisions sur la page $3",
        "logentry-suppress-delete": "$1 {{GENDER:$2|a supprimé}} la page $3",
index 5e3d63e..6adc493 100644 (file)
        "confirmemail_body": "Immen, nei gedachten jo, hat him by {{SITENAME}} oanmelde as \"$2\", mei dit netpostadres ($1).\n\nHjirtroch komme ek de netpostfunksjes fan {{SITENAME}} foar jo beskikber. Iepenje de neikommende keppeling om te befêstigjen dat jo wier josels by {{SITENAME}} mei dit netpostadres oanmelde hawwe:\n\n$3\n\nAt jo dat *net* wienen, brûk dy keppeling dan net, en klik hjir:\n\n$5\n\nDizze befêstigingskoade ferrint dan op $4.",
        "scarytranscludetoolong": "[URL-adres is te lang]",
        "confirmrecreate": "Sûnt jo begûn binne dizze side te bewurkjen, hat meidogger [[User:$1|$1]] ([[User talk:$1|oerlis]]) de side wiske. De reden dy't derfoar jûn waard wie:\n: ''$2''\nWolle jo de side wier op 'e nij skriuwe?",
-       "confirm_purge_button": "Okee",
-       "confirm-watch-button": "Okee",
-       "confirm-unwatch-button": "Okee",
+       "confirm_purge_button": "OK",
+       "confirm-watch-button": "OK",
+       "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Dizze side fan myn folchlist ôfhelje",
        "imgmultipageprev": "side werom",
        "imgmultipagenext": "folgjende side →",
        "version-software": "Ynsteld software",
        "version-software-product": "Produkt",
        "version-software-version": "Ferzje",
+       "redirect-value": "Wearde:",
        "redirect-file": "Triemnamme",
        "fileduplicatesearch": "Sykje op duplikaten",
        "fileduplicatesearch-legend": "Sykje op duplikaten",
        "duration-minutes": "$1 {{PLURAL:$1|minút|minuten}}",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|sekonde|sekonden}}",
        "limitreport-walltime-value": "$1 {{PLURAL:$1|sekonde|sekonden}}",
-       "expand_templates_ok": "Okee",
+       "expand_templates_ok": "OK",
        "expand_templates_remove_comments": "Berjochten fuorthelje",
        "pagelang-language": "Taal",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%)"
index f2c38c2..85fc18e 100644 (file)
        "filerenameerror": "שינוי השם של \"$1\" ל־\"$2\" נכשל.",
        "filedeleteerror": "מחיקת \"$1\" נכשלה.",
        "directorycreateerror": "יצירת התיקייה \"$1\" נכשלה.",
+       "directoryreadonlyerror": "התיקייה \"$1\" היא לקריאה בלבד.",
+       "directorynotreadableerror": "התיקייה \"$1\" אינה ניתנת לקריאה.",
        "filenotfound": "הקובץ \"$1\" לא נמצא.",
        "unexpected": "ערך לא צפוי: \"$1\"=\"$2\"",
        "formerror": "שגיאה: לא ניתן היה לשלוח את הטופס.",
        "excontent": "התוכן היה: \"$1\"",
        "excontentauthor": "התוכן היה: \"$1\" ({{GENDER:$2|והתורם היחיד היה|והתורמת היחידה הייתה}} \"[[Special:Contributions/$2|$2]]\")",
        "exbeforeblank": "התוכן לפני שרוקן היה: \"$1\"",
-       "delete-confirm": "מחיקת $1",
+       "delete-confirm": "מחיקת \"$1\"",
        "delete-legend": "מחיקה",
        "historywarning": "<strong>אזהרה:</strong> לדף שאתם עומדים למחוק יש היסטוריית שינויים של {{PLURAL:$1|גרסה אחת|$1 גרסאות}}:",
        "confirmdeletetext": "אתם עומדים למחוק דף יחד עם כל ההיסטוריה שלו.\n\nאנא אשרו שזה אכן מה שאתם מתכוונים לעשות, שאתם מבינים את התוצאות של מעשה כזה, ושהמעשה מבוצע בהתאם ל[[{{MediaWiki:Policy-url}}|נוהלי האתר]].",
index 0b3807d..2ee1fb0 100644 (file)
        "autosumm-replace": "tekst stranice se zamjenjuje s '$1'",
        "autoredircomment": "preusmjeravanje na [[$1]]",
        "autosumm-new": "nova stranica: $1",
+       "autosumm-newblank": "stvorena prazna stranica",
        "lag-warn-normal": "Moguće je da izmjene nastale posljednjih $1 {{PLURAL:$1|sekundu|sekundi}} neće biti vidljive na ovom popisu.",
        "lag-warn-high": "Zbog kašnjenja baze podataka, moguće je da promjene napravljene u posljednjih $1 {{PLURAL:$1|sekundu|sekunde|sekundi}} nisu prikazane u popisu.",
        "watchlistedit-normal-title": "Uredi popis praćenja",
index 8a90e4a..685de7b 100644 (file)
        "exif-exposuretime": "Exposure time",
        "exif-exposuretime-format": "$1 sec ($2)",
        "exif-fnumber": "F a Numero",
-       "exif-exposureprogram": "Exposure Program",
-       "exif-spectralsensitivity": "Spectral sensitivity",
-       "exif-isospeedratings": "ISO speed rating",
+       "exif-exposureprogram": "Programa ti panakailatakan",
+       "exif-spectralsensitivity": "Espektral a sensitibidad",
+       "exif-isospeedratings": "Grado ti kapardas ti ISO",
        "exif-shutterspeedvalue": "APEX Shutter speed",
        "exif-aperturevalue": "Apex aperture",
        "exif-brightnessvalue": "Kalawag ti APEX",
        "exif-exposurebiasvalue": "Exposure bias",
-       "exif-maxaperturevalue": "Maximum land aperture",
+       "exif-maxaperturevalue": "Kangato ti apertura ti daga",
        "exif-subjectdistance": "Kaadayo ti suheto",
        "exif-meteringmode": "Panagmetro a moda",
        "exif-lightsource": "Paggapuan ti lawag",
        "exif-focalplaneyresolution": "Focal plane Y resolution",
        "exif-focalplaneresolutionunit": "Focal plane resolution unit",
        "exif-subjectlocation": "Lokasion ti suheto",
-       "exif-exposureindex": "Exposure index",
-       "exif-sensingmethod": "Sensing method",
-       "exif-filesource": "Nagtaudan ti papeles",
-       "exif-scenetype": "Kita i senario",
+       "exif-exposureindex": "Pagsurotan ti panakailatakan",
+       "exif-sensingmethod": "Pamay-an ti panagrikna",
+       "exif-filesource": "Taudan ti papeles",
+       "exif-scenetype": "Kita ti senario",
        "exif-customrendered": "Naiduma a panagproseso ti ladawan",
-       "exif-exposuremode": "Exposure mode",
+       "exif-exposuremode": "Moda ti panakailatakan",
        "exif-whitebalance": "Pagtimbangan ti puraw",
        "exif-digitalzoomratio": "Digital zoom ratio",
        "exif-focallengthin35mmfilm": "Focal length iti 35 mm a film",
-       "exif-scenecapturetype": "Scene capture type",
-       "exif-gaincontrol": "Scene control",
+       "exif-scenecapturetype": "Kita ti panagala iti senario",
+       "exif-gaincontrol": "Panagtengngel ti senario",
        "exif-contrast": "Contrast",
        "exif-saturation": "Saturation",
        "exif-sharpness": "Kalawag",
        "exif-imageuniqueid": "Naisangsangayan nga ID ti ladawan",
        "exif-gpsversionid": "Etiketa a bersion ti GPS",
        "exif-gpslatituderef": "Amianan wenno Abagatan a Latitud",
-       "exif-gpslatitude": "Latitude",
+       "exif-gpslatitude": "Latitud",
        "exif-gpslongituderef": "Daya wenno Laud a Longitud",
        "exif-gpslongitude": "Longitud",
        "exif-gpsaltituderef": "Reperensia ti kangato",
        "exif-gpsdop": "Kasayaat ti panagrukod",
        "exif-gpsspeedref": "Yunit ti kapardas",
        "exif-gpsspeed": "Kapaspas ti pangawat ti GPS",
-       "exif-gpstrackref": "Reperensia iti direksion ti panaggunay",
+       "exif-gpstrackref": "Reperensia iti direksion ti kuti",
        "exif-gpstrack": "Direksion ti kuti",
        "exif-gpsimgdirectionref": "Reperensia iti direksion ti ladawan",
        "exif-gpsimgdirection": "Direksion ti ladawan",
        "exif-rightscertificate": "Sertipikado ti panagtaripato kadagiti karbengan",
        "exif-copyrighted": "Kasasaad ti karbengan ti kopia",
        "exif-copyrightowner": "Akinkukua ti karbengan ti kopia",
-       "exif-usageterms": "Dagiti termino ti panag-usar",
+       "exif-usageterms": "Dagiti termino ti panagusar",
        "exif-webstatement": "Insasao ti karbengan ti kopia nga addaan iti online",
        "exif-originaldocumentid": "Naisangayan nga ID iti kinasigud a dokumento",
        "exif-licenseurl": "URL para iti lisensia ti karbengan ti kopia",
        "exif-subjectdistancerange-1": "Makro",
        "exif-subjectdistancerange-2": "Asideg a pinagkita",
        "exif-subjectdistancerange-3": "Adayo a pinagkita",
-       "exif-gpslatitude-n": "Amianan a latitude",
-       "exif-gpslatitude-s": "Abagatan a latitude",
-       "exif-gpslongitude-e": "Daya a longitude",
-       "exif-gpslongitude-w": "Abagatan a longitude",
+       "exif-gpslatitude-n": "Amianan a latitud",
+       "exif-gpslatitude-s": "Abagatan a latitud",
+       "exif-gpslongitude-e": "Daya a longitud",
+       "exif-gpslongitude-w": "Abagatan a longitud",
        "exif-gpsaltitude-above-sealevel": "$1 {{PLURAL:$1|a metro|kadagiti metro}} a nangatngato ngem ti baybay",
        "exif-gpsaltitude-below-sealevel": "$1 {{PLURAL:$1|a metro|kadagiti metro}} a nababbaba ngem ti baybay",
        "exif-gpsstatus-a": "Agrukrukoden",
-       "exif-gpsstatus-v": "Panag-rukod ken pannakabin ti pang-usar ti sabali",
+       "exif-gpsstatus-v": "Panagrukod ken interoperabilidad",
        "exif-gpsmeasuremode-2": "2-kalawa pagrukod",
        "exif-gpsmeasuremode-3": "3-kalawa pagrukod",
        "exif-gpsspeed-k": "Dagiti kilometro kada oras",
        "exif-gpsdop-good": "Nalaing ($1)",
        "exif-gpsdop-moderate": "Natimbeng ($1)",
        "exif-gpsdop-fair": "Nasayaat ($1)",
-       "exif-gpsdop-poor": "Makukurangan ($1)",
+       "exif-gpsdop-poor": "Makurkurangan ($1)",
        "exif-objectcycle-a": "Agsapa laeng",
        "exif-objectcycle-p": "Rabii laeng",
        "exif-objectcycle-b": "Agsapa ken rabii",
        "logentry-upload-overwrite": "Ni $1 ket {{GENDER:$2|inkargana}} ti baro a bersion ti $3",
        "logentry-upload-revert": "Ni $1 ket {{GENDER:$2|inkargana}} ti $3",
        "rightsnone": "(awan)",
-       "revdelete-summary": "pakabuklan ti panagurnos",
+       "revdelete-summary": "Pakabuklan ti inurnos",
        "feedback-bugornote": "No sisasagakan nga agibaga ti teknikal a pakirut a naisalaysay pangngaasi nga [$1 ireporta ti parikut].\nNupay kasta, mausarmo ti nalaka a porma dita baba. Ti komentario nga itedmo ket mainayon iti panid \"[$3 $2], a mairaman ti naganmo nga agar-aramat ken no ania ti pagbasabasa nga us-sarem.",
        "feedback-subject": "Suheto:",
        "feedback-message": "Mensahe:",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (napakabaelan)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 ('''nabaldado''')",
        "mediastatistics": "Estadistika ti midia",
+       "mediastatistics-summary": "Estadistika a maipanggep dagiti kita ti naikarga a papeles. Daytoy ket mangiraman laeng ti kinaudi a bersion ti papeles. Dagiti bersion ti papeles a daan wenno naikkat ket saan a mairaman.",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 a byte|$1 kadagiti bytes}} ($2; $3%)",
        "mediastatistics-table-mimetype": "Kita ti MIME",
        "mediastatistics-table-extensions": "Dagiti mabalin pagpaatiddog",
index ed1c57e..09825c3 100644 (file)
@@ -75,7 +75,8 @@
                        "Lucas2",
                        "Taxandru",
                        "C.R.",
-                       "Elitre"
+                       "Elitre",
+                       "Laurentius"
                ]
        },
        "tog-underline": "Sottolinea i collegamenti:",
        "filerenameerror": "Impossibile rinominare il file \"$1\" in \"$2\".",
        "filedeleteerror": "Impossibile cancellare il file \"$1\".",
        "directorycreateerror": "Impossibile creare la directory \"$1\".",
+       "directoryreadonlyerror": "La directory \"$1\" è di sola lettura.",
+       "directorynotreadableerror": "La directory \"$1\" non è leggibile.",
        "filenotfound": "Impossibile trovare il file \"$1\".",
        "unexpected": "Valore imprevisto: \"$1\"=\"$2\".",
        "formerror": "Errore: impossibile inviare il modulo",
        "deadendpagestext": "Le pagine indicate di seguito sono prive di collegamenti verso altre pagine di {{SITENAME}}.",
        "protectedpages": "Pagine protette",
        "protectedpages-indef": "Solo protezioni infinite",
-       "protectedpages-summary": "Questa pagina elenca le pagine esistenti che sono attualmente protette. Per un'elenco di titoli protetti dalla creazione, vedi [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
+       "protectedpages-summary": "Questa pagina elenca le pagine esistenti che sono attualmente protette. Per un elenco di titoli protetti dalla creazione, vedi [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Solo protezioni ricorsive",
        "protectedpages-noredirect": "Nascondi redirect",
        "protectedpagesempty": "Al momento non vi sono pagine protette",
        "protectedpages-unknown-timestamp": "Sconosciuto",
        "protectedpages-unknown-performer": "Utente sconosciuto",
        "protectedtitles": "Titoli protetti",
-       "protectedtitles-summary": "Questa pagina elenca i titoli che sono attualmente protetti dalla creazione. Per un'elenco di pagine esistenti che sono protette, vedi [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
+       "protectedtitles-summary": "Questa pagina elenca i titoli che sono attualmente protetti dalla creazione. Per un elenco di pagine esistenti che sono protette, vedi [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
        "protectedtitlesempty": "Al momento non esistono titoli protetti con i parametri specificati.",
        "listusers": "Elenco degli utenti",
        "listusers-editsonly": "Mostra solo utenti con dei contributi",
index f422a47..dd14b35 100644 (file)
        "nov": "Teş",
        "dec": "Gağ",
        "pagecategories": "{{PLURAL:$1|Kategoriye|Kategoriy}}",
-       "category_header": "Pelê ke kategoriya \"$1\" miyan derê",
+       "category_header": "Pelê ke kategoriya \"$1\" derê",
        "subcategories": "Kategoriyê bınêni",
        "category-media-header": "Medyawa ke kategoriya \"$1\" dera",
        "category-empty": "''Na kategoriye de hona qet nustey ya ki medya çinê.''",
index 2040d3e..9645330 100644 (file)
        "badaccess": "आज्ञा गल्ती",
        "badaccess-group0": "अहाँकेँ आग्रह कएल क्रियाकेँ करबाक अनुमति नै अछि।",
        "badaccess-groups": "जइ क्रियाक अहाँ आग्रह केने छी से मात्र किछु प्रयोक्ता लेल सुरक्षित अछि {{PLURAL:$2|संवर्ग|संवर्ग सभमे एकटा}}: $1",
-       "versionrequired": "मà¥\80डियाविà¤\95à¥\80à¤\95 संस्करण $1 चाही",
-       "versionrequiredtext": "à¤\90 à¤ªà¤¨à¥\8dनाà¤\95 à¤ªà¥\8dरयà¥\8bà¤\97 à¤²à¥\87ल à¤®à¥\80डियाविà¤\95à¥\80à¤\95 à¤¸à¤\82सà¥\8dà¤\95रण $1 à¤\9aाहà¥\80।\nदà¥\87à¤\96à¥\82 ee [[Special:Version|version page]]",
+       "versionrequired": "मिडियाविà¤\95à¥\80à¤\95ऽ संस्करण $1 चाही",
+       "versionrequiredtext": "à¤\90 à¤ªà¤¨à¥\8dनाà¤\95 à¤ªà¥\8dरयà¥\8bà¤\97 à¤²à¥\87ल à¤®à¤¿à¤¡à¤¿à¤¯à¤¾à¤µà¤¿à¤\95à¥\80à¤\95ऽ à¤¸à¤\82सà¥\8dà¤\95रण $1 à¤\9aाहà¥\80।\nदà¥\87à¤\96à¥\82 [[Special:Version|पà¥\83षà¥\8dठ à¤­à¤°à¥\8dसन]]",
        "ok": "ठीक अछि",
        "pagetitle-view-mainpage": "{{अन्तर्जाल}}",
        "backlinksubtitle": "← $1",
        "retrievedfrom": "प्राप्ति स्थल \"$1\"",
        "youhavenewmessages": "अहाँ लग अछि $1 ($2).",
-       "youhavenewmessagesfromusers": "अहाके लेल {{PLURAL:$3|एक अन्य सदस्य|$3 अन्य सदस्यसभ}} के $1 छि । ($2)",
-       "youhavenewmessagesmanyusers": "à¤\85हाà¤\95à¥\87 $1 à¤\9bि à¥¤ ($2)",
-       "newmessageslinkplural": "{{PLURAL:$1|एगो नया पत्र|999=नया पत्र}}",
-       "newmessagesdifflinkplural": "$1 {{PLURAL:$1|परिवर्तन|परिवर्तन सभ}}",
-       "youhavenewmessagesmulti": "$1 à¤ªà¤° à¤\85हाà¤\81 à¤²à¥\87ल à¤¨à¤µ à¤¸à¤¨à¥\8dदà¥\87श अछि",
-       "editsection": "सà¤\82पादन करू",
+       "youhavenewmessagesfromusers": "{{PLURAL:$4|अहाँके लेल}} $1 सँ {{PLURAL:$3|अन्य प्रयोक्ता|$3 प्रयोक्तासभ}} ($2)।",
+       "youhavenewmessagesmanyusers": "à¤\85हाà¤\81à¤\95à¥\87 $1 à¤¸à¤\81 à¤¬à¤¹à¥\81त à¤ªà¥\8dरयà¥\8bà¤\95à¥\8dता à¤¸à¤­ ($2)।",
+       "newmessageslinkplural": "{{PLURAL:$1|एगो नयाँ पत्र|999=नयाँ पत्र}}",
+       "newmessagesdifflinkplural": "अन्तिम {{PLURAL:$1|परिवर्त्तन|999=परिवर्त्तन सभ}}",
+       "youhavenewmessagesmulti": "$1 à¤ªà¤° à¤\85हाà¤\81 à¤²à¥\87ल à¤¨à¤µ à¤ªà¤¤à¥\8dर अछि",
+       "editsection": "समà¥\8dपादन करू",
        "editold": "सम्पादित करू",
        "viewsourceold": "जड़ि देखू",
        "editlink": "सम्पादन करू",
        "viewsourcelink": "जड़ि देखू",
-       "editsectionhint": "सà¤\82पादन शाखा: $1",
+       "editsectionhint": "समà¥\8dपादन शाखा: $1",
        "toc": "विषय-सूची",
        "showtoc": "देखाऊ",
        "hidetoc": "नुकाऊ",
        "confirmable-confirm": "कि {{GENDER:$1|अहाँ}} छी?",
        "confirmable-yes": "हँ",
        "confirmable-no": "नै",
-       "thisisdeleted": "देखू वा जाउ $1?",
-       "viewdeleted": "देखू $1?",
+       "thisisdeleted": "$1 देखू वा फेर सँ आनु?",
+       "viewdeleted": "$1 के देखाऊ?",
        "restorelink": "{{PLURAL:$1|एकटा मेटाएल सम्पादन|$1 मेटाएल सम्पादन सभ}}",
        "feedlinks": "सूचक:",
        "feed-invalid": "अमान्य सूचक प्रकार मासुल",
        "feed-unavailable": "अधिकृत सूचक उपलब्ध नै अछि",
-       "site-rss-feed": "$1 आरएसएस फीड",
-       "site-atom-feed": "$1 à¤\85णà¥\81 à¤«à¥\80ड",
-       "page-rss-feed": "\"$1\" à¤\86र.à¤\8fस.à¤\8fस. à¤¸à¥\82à¤\9aना",
-       "page-atom-feed": "\"$1\" à¤\85णà¥\81 à¤¸à¥\82़à¤\9aना",
+       "site-rss-feed": "$1 आर.एस.एस. सूचक",
+       "site-atom-feed": "$1 à¤\85णà¥\81 à¤¸à¥\82à¤\9aà¤\95",
+       "page-rss-feed": "\"$1\" à¤\86र.à¤\8fस.à¤\8fस. à¤¸à¥\82à¤\9aà¤\95",
+       "page-atom-feed": "\"$1\" à¤\85णà¥\81 à¤¸à¥\82à¤\9aà¤\95",
        "feed-atom": "अणु",
        "feed-rss": "आर.एस.एस.",
-       "red-link-title": "$1 (पनà¥\8dना उपलब्ध नै अछि)",
+       "red-link-title": "$1 (पà¥\83षà¥\8dठ उपलब्ध नै अछि)",
        "sort-descending": "घटैत क्रममे छाँटू",
        "sort-ascending": "बढ़ैत क्रममे छाँटू",
-       "nstab-main": "पà¥\83षà¥\8dठ",
-       "nstab-user": "à¤\89पयà¥\8bà¤\97à¤\95रà¥\8dताà¤\95 पृष्ठ",
-       "nstab-media": "मà¥\80डिया à¤ªà¤¨à¥\8dना",
-       "nstab-special": "विशिषà¥\8dà¤\9f à¤ªà¤¨à¥\8dना",
-       "nstab-project": "परियà¥\8bà¤\9cना à¤ªà¤¨à¥\8dना",
-       "nstab-image": "फाà¤\87ल",
-       "nstab-mediawiki": "सà¤\82दà¥\87श",
-       "nstab-template": "नमà¥\82ना",
-       "nstab-help": "सहायता à¤ªà¤¨à¥\8dना",
+       "nstab-main": "पनà¥\8dना",
+       "nstab-user": "पà¥\8dरयà¥\8bà¤\95à¥\8dता पृष्ठ",
+       "nstab-media": "मिडिया à¤ªà¥\83षà¥\8dठ",
+       "nstab-special": "विशà¥\87ष à¤ªà¥\83षà¥\8dठ",
+       "nstab-project": "परियà¥\8bà¤\9cना à¤ªà¥\83षà¥\8dठ",
+       "nstab-image": "सà¤\82à¤\9aिà¤\95ा",
+       "nstab-mediawiki": "पतà¥\8dर",
+       "nstab-template": "à¤\86à¤\95à¥\83ति",
+       "nstab-help": "सहायता à¤ªà¥\83षà¥\8dठ",
        "nstab-category": "संवर्ग",
-       "nosuchaction": "एहेन कोनो क्रिया नै",
+       "nosuchaction": "एहेन कोनो क्रिया नै अछि",
        "nosuchactiontext": "ऐ सार्वत्रिक विभव संकेत द्वारा निर्दिष्ट क्रिया अमान्य अछि।\nअहाँ सार्वत्रिक विभव संकेतक गलत टंकण केने हएब, वा कोनो गलत लिंकक पाछाँ गेल हएब।\nई {{अन्तर्जाल}} प्रयोक्ता द्वारा प्रयुक्त तंत्रांशमे स्थित कोनो दोषक संकेत सेहो कऽ सकैए।",
-       "nosuchspecialpage": "à¤\8fहà¥\87न à¤\95à¥\8bनà¥\8b à¤µà¤¿à¤¶à¥\87ष à¤ªà¤¨à¥\8dना à¤¨à¥\88",
+       "nosuchspecialpage": "à¤\8fहà¥\87न à¤\95à¥\8bनà¥\8b à¤µà¤¿à¤¶à¥\87ष à¤ªà¥\83षà¥\8dठ à¤¨à¥\88 à¤\85à¤\9bि",
        "nospecialpagetext": "<strong> अहाँ एकटा अमान्य पन्नाक आग्रह केने छी। </strong>\nमान्य विशेष पन्नाक सूची एतए अछि [[Special:SpecialPages|{{int:specialpages}}]]।",
        "error": "भ्रम",
        "databaseerror": "दत्तनिधि भ्रम",
        "blocked-mailpassword": "अहाँक अनिकेत सम्पादन लेल प्रतिबन्धित अछि, आ दुरुपयोग रोकबा लेल कूटशब्द प्रत्याहरण सेवा ऐ लेल उपलब्ध नै अछि।",
        "eauthentsent": "एकटा पावती ई-पत्र निर्धारित ई-पत्र संकेतपर पठा देल गेल अछि।\nऐ खातापर कोनो दोसर ई-पत्र पठाएल जएबासँ पहिने, अहाँकेँ ऐ ई-पत्रक निर्देशक पालन करए पड़त, जइसँ ई पुष्ट भऽ सकए जे ई खाता वास्तवमे अहींक अछि।",
        "throttled-mailpassword": "एकटा कूटशब्द स्मारक पहिनहिये पठाएल गेल अछि, {{PLURAL:$1|घण्टा|$1 घण्टा}}क भीतर।\nदुरुपयोग रोकबा लेल, मात्र एकटा कूटशब्द {{PLURAL:$1|घण्टा|$1 घण्टा}}मे पठाएल जाएत।",
-       "mailerror": "à¤\88-पतà¥\8dर à¤ªà¤ à¥\87बामà¥\87 à¤¦à¤¿à¤\95à¥\8dà¤\95त: $1",
-       "acct_creation_throttle_hit": "à¤\90 à¤µà¤¿à¤\95à¥\80à¤\95 à¤\86à¤\97नà¥\8dतà¥\81à¤\95 à¤\85हाà¤\81à¤\95 à¤\85निà¤\95à¥\87तà¤\95 à¤ªà¥\8dरयà¥\8bà¤\97सà¤\81 à¤\95ालà¥\8dहि à¤¬à¤¨à¥\87लनà¥\8dहि à¤\85à¤\9bि {{PLURAL:$1|1 à¤\96ाता|$1 à¤\96ाता}}",
-       "emailauthenticated": "à¤\85हाà¤\81à¤\95 à¤\88-पतà¥\8dर à¤¸à¤\82à¤\95à¥\87त $2 à¤\95à¥\87à¤\81 $3 à¤ªà¤° सत्यापित भेल।",
-       "emailnotauthenticated": "अहाँक ई-पत्र संकेत अखन धरि सत्यापित नै भेल अछि।",
-       "noemailprefs": "à¤\88 à¤¸à¤­ à¤\89तà¥\8dपाद à¤\95ाà¤\9c à¤\95ऽ à¤¸à¤\95à¤\8f à¤¤à¥\88 à¤²à¥\87ल à¤\8fà¤\95à¤\9fा à¤\88-पतà¥\8dर à¤¸à¤\82à¤\95à¥\87तà¤\95 à¤¨à¤¿à¤°à¥\8dदà¥\87श à¤\85पन à¤µà¤¿à¤\95लà¥\8dपमà¥\87 à¤\95रà¥\82।",
-       "emailconfirmlink": "à¤\85पन à¤\88-पतà¥\8dर à¤¸à¤\82à¤\95à¥\87त à¤¸à¤¤à¥\8dयापित à¤\95रà¥\82",
-       "invalidemailaddress": "à¤\85मानà¥\8dय à¤ªà¥\8dरारà¥\82पà¤\95 à¤\95ारण à¤\90 à¤\88-पतà¥\8dर à¤¸à¤\82à¤\95à¥\87तà¤\95à¥\87à¤\81 à¤¸à¥\8dवà¥\80à¤\95ार à¤¨à¥\88 à¤\95à¤\8fल à¤\9cा à¤¸à¤\95à¥\88à¤\8f।\nà¤\8fà¤\95à¤\9fा à¤®à¤¾à¤¨à¥\8dय à¤\88-पतà¥\8dर à¤¸à¤\82à¤\95à¥\87त à¤²à¤¿à¤\96à¥\82 à¤µà¤¾ à¤\93à¤\87 à¤¸à¥\8dथानà¤\95à¥\87à¤\81 à¤\96ालà¥\80 à¤\95रà¥\82।",
-       "cannotchangeemail": "à¤\96ाता à¤\88-पतà¥\8dर à¤¸à¤\82à¤\95à¥\87त à¤\90 à¤µà¤¿à¤\95à¥\80पर बदलल नै जा सकैए।",
-       "emaildisabled": "à¤\88 à¤¸à¤¾à¤\87à¤\9f ई-पत्र नै पठाएत।",
+       "mailerror": "à¤\88-पतà¥\8dर à¤ªà¤ à¥\87बामà¥\87 à¤¤à¥\8dरà¥\81à¤\9fà¥\80: $1",
+       "acct_creation_throttle_hit": "à¤\85हाà¤\81à¤\95à¥\87 à¤\86à¤\87॰पि. à¤ªà¤¤à¤¾à¤¸à¤\81 à¤\86à¤\8fल à¤\86à¤\97à¤\82तà¥\81à¤\95 à¤\9aà¥\8cबà¥\80स à¤\98णà¥\8dà¤\9fा à¤¸à¤\81 à¤¬à¥\88सà¥\80 à¤\88 à¤µà¤¿à¤\95िमà¥\87 {{PLURAL:$1|à¤\8fà¤\95 à¤\96ाता|$1 à¤\96ाता}} à¤¬à¤¨à¥\8cलà¤\95 à¤\85à¤\9bि, à¤\87 à¤¸à¤®à¤¯à¤¾à¤µà¤§à¤¿à¤®à¥\87 à¤\88 à¤\85धिà¤\95तम à¤¸à¤¿à¤®à¤¾ à¤\9bà¥\80। à¤\85तà¤\83 à¤\85à¤\96न à¤\88 à¤\86à¤\87॰पि. à¤ªà¤¤à¤¾à¤\95à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95रà¤\8f à¤µà¤¾à¤²à¤¾ à¤\86à¤\97à¤\82तà¥\81à¤\95 à¤\86र à¤\95à¥\8bनà¥\8b à¤\96ाता à¤¨à¥\88 à¤\96à¥\8bà¤\87ल à¤¸à¤\95à¤\8fत à¤\85à¤\9bि à¥¤",
+       "emailauthenticated": "à¤\85हाà¤\81à¤\95 à¤\88-पतà¥\8dर à¤¸à¤\82à¤\95à¥\87त $2 à¤\95à¥\87à¤\81 $3 à¤¬à¤\9cà¥\87 सत्यापित भेल।",
+       "emailnotauthenticated": "अहाँक ई-पत्र संकेत अखन धरि सत्यापित नै भेल अछि।\nनिचा देल गेल कोनो सुविधा के लेल अहाँके ई-पत्र नै भेजल जाएत।",
+       "noemailprefs": "à¤\87 à¤¸à¥\81विधा à¤¸à¤­ à¤\95ऽ à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95रà¤\8f à¤\95à¥\87 à¤²à¥\87ल à¤\85पन à¤µà¤¿à¤\95लà¥\8dपमà¥\87 à¤\88-पतà¥\8dर à¤ªà¤¤à¤¾ à¤°à¤¾à¤\96à¥\81।",
+       "emailconfirmlink": "à¤\85पन à¤\88-पतà¥\8dर à¤¸à¤\82à¤\95à¥\87त à¤¸à¤¤à¥\8dयापित à¤\95रà¥\81",
+       "invalidemailaddress": "à¤\85मानà¥\8dय à¤ªà¥\8dरारà¥\82पà¤\95 à¤\95ारण à¤\90 à¤\88-पतà¥\8dर à¤¸à¤\82à¤\95à¥\87तà¤\95à¥\87à¤\81 à¤¸à¥\8dवà¥\80à¤\95ार à¤¨à¥\88 à¤\95à¤\8fल à¤\9cा à¤¸à¤\95à¥\88à¤\8f।\nà¤\8fà¤\95à¤\9fा à¤®à¤¾à¤¨à¥\8dय à¤\88-पतà¥\8dर à¤¸à¤\82à¤\95à¥\87त à¤²à¤¿à¤\96à¥\82 à¤µà¤¾ à¤\93à¤\87 à¤¸à¥\8dथानà¤\95à¥\87à¤\81 à¤\96ालà¥\80 à¤\95रà¥\81।",
+       "cannotchangeemail": "à¤\96ाता à¤\88-पतà¥\8dर à¤¸à¤\82à¤\95à¥\87त à¤\90 à¤µà¤¿à¤\95िपर बदलल नै जा सकैए।",
+       "emaildisabled": "à¤\88 à¤\85नà¥\8dतरà¥\8dà¤\9cाल ई-पत्र नै पठाएत।",
        "accountcreated": "खाता खुजि गेल",
-       "accountcreatedtext": "$1 लेल प्रयोक्ता खाता खुजि गेल।",
+       "accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|वार्ता]]) के लेल खाता खोलल गेल अछि।",
        "createaccount-title": "{{अन्तर्जाल}} लेल खाता निर्माण",
        "createaccount-text": "कियो अहाँक ई-पत्र संकेत लेल एकटा खाता {{अन्तर्जाल}} पर खोललन्हि ($4) नाम भेल \"$2\", कूटशब्द भेल \"$3\"।\nअहाँ सम्प्रवेश करू आ अपन कूटशब्द बदलू।\n\nअहाँ ऐ संदेशकेँ बिसरि सकै छी, जँ ई खाता भ्रमवश बनल हुअए।",
        "login-throttled": "अहाँ ढ़ेर रास सम्प्रवेश प्रयास केलहुँ।\nफेर प्रयास करबासँ पहिने कने काल थम्हू।",
        "login-abort-generic": "अहाँक सम्प्रवेश सफल नै भेल- खतम",
+       "login-migrated-generic": "अहाँके खाता माइग्रेट कएल गेल अछि, आर अहाँके प्रयोक्ता नाम आब ई विकिमे नै अछि।",
        "loginlanguagelabel": "भाषा : $1",
        "suspicious-userlogout": "अहाँक निष्क्रमणक अनुरोध नै मानल गेल कारण ई लागल जे ई पुरान गवेषकक लागि वा दोसराइत उपस्मृति द्वारा पठाओल गेल छल।",
        "createacct-another-realname-tip": "मूल नाम वैकल्पिक अछि।\nजँ अहाँ एकरा देबा लेल प्रयोग करै छी, ई अहाँकेँ काजक श्रेय देबा लेल एकर प्रयोग कएल जाएत।",
        "pt-login-button": "सम्प्रवेश",
        "pt-createaccount": "खाता खोलू",
        "pt-userlogout": "निष्क्रमण",
-       "php-mail-error-unknown": "पी.एच.पी.क संदेश कार्य() मे अज्ञात दोष",
-       "user-mail-no-addy": "बिन ई-पत्र संकेतक ई-पत्र पठेबाक प्रयास",
-       "user-mail-no-body": "एकटा खाली वा बहुत कनिका ई-पत्र भेजवाक प्रयास कल गेल ।",
+       "php-mail-error-unknown": "पी.एच.पी.कऽ समाद कार्य() मे अज्ञात दोष भेल।",
+       "user-mail-no-addy": "बिन ई-पत्र संकेतक ई-पत्र पठेबाक प्रयास कएल गेल।",
+       "user-mail-no-body": "एकटा खाली वा बहुत कनिका ई-पत्र भेजवाक प्रयास कल गेल।",
        "changepassword": "कूटशब्द बदलू",
-       "resetpass_announce": "à¤\85हाà¤\81à¤\95 à¤\85सà¥\8dथायà¥\80 à¤\88-पतà¥\8dर à¤µà¤¿à¤§à¥\8dयादà¥\87शसà¤\81 à¤¸à¤®à¥\8dपà¥\8dरवà¥\87श à¤\95à¥\87नà¥\87 à¤\9bà¥\80।\nसमà¥\8dपà¥\8dरवà¥\87श à¤¸à¤®à¥\8dपà¥\82रà¥\8dण à¤\95रबा à¤²à¥\87ल, à¤\85हाà¤\81 à¤\8fà¤\95à¤\9fा à¤¨à¤µ à¤\95à¥\82à¤\9fशबà¥\8dद à¤\8fतà¤\8f à¤¨à¤¿à¤°à¥\8dधारित à¤\95रà¥\82:",
+       "resetpass_announce": "समà¥\8dपà¥\8dरवà¥\87श à¤¸à¤®à¥\8dपà¥\82रà¥\8dण à¤\95रबा à¤²à¥\87ल, à¤\85हाà¤\81 à¤\8fà¤\95à¤\9fा à¤¨à¤µ à¤\95à¥\82à¤\9fशबà¥\8dद à¤\8fतà¤\8f à¤¨à¤¿à¤°à¥\8dधारित à¤\95रà¥\81।",
        "resetpass_text": "<!-- पाठ एतऽ लिखू -->",
        "resetpass_header": "खाता कूटशब्द बदलू",
        "oldpassword": "पुरान कूटशब्द",
        "retypenew": "नव कूटशब्द फेरसँ टंकित करू",
        "resetpass_submit": "कूटशब्द बनाउ आ सम्प्रवेश करू",
        "changepassword-success": "अहाँक कूटशब्द सफलतासँ बदलि देल गेल!",
-       "changepassword-throttled": "अहाँ ढ़ेर रास सम्प्रवेश प्रयास केलहुँ।\nफेर प्रयास करबासँ पहिने कने काल थम्हू।",
-       "resetpass_forbidden": "à¤\95à¥\82à¤\9fशबà¥\8dद à¤¸à¤­ à¤¨à¥\88 à¤¬à¤¦à¤²à¤² à¤\9cा à¤¸à¤\95à¥\88à¤\8f।",
-       "resetpass-no-info": "à¤\85हाà¤\81à¤\95à¥\87à¤\81 à¤\90 à¤ªà¤¨à¥\8dनाà¤\95à¥\87à¤\81 à¤ªà¤¢à¤¼à¤¬à¤¾à¤²à¥\87 सम्प्रवेशित हुअए पड़त।",
+       "changepassword-throttled": "अहाँ ढ़ेर रास सम्प्रवेश प्रयास केलहुँ।\nफेर प्रयास $1 करबासँ पहिने कने काल थम्हू।",
+       "resetpass_forbidden": "कूटशब्द नै बदलल जा सकैए।",
+       "resetpass-no-info": "à¤\85हाà¤\81à¤\95à¥\87à¤\81 à¤\90 à¤ªà¤¨à¥\8dनाà¤\95à¥\87à¤\81 à¤¸à¥\8bà¤\9dà¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95रबालà¥\87ल सम्प्रवेशित हुअए पड़त।",
        "resetpass-submit-loggedin": "कूटशब्द बदलू",
        "resetpass-submit-cancel": "खतम करू",
        "resetpass-wrong-oldpass": "अमान्य अस्थायी वा अखुनका कूटशब्द।\nअहाँ पहिनहिये सफलतासँ कूटशब्द बदलि लेने छी वा एकटा नव अस्थायी कूटशब्द लेल आग्रह केने छी।",
-       "resetpass-recycled": "रीसेट करएके लेल नयाँ कूटशब्दमे कृपया अपन वर्तमान कूटशब्द नै द के नयाँ देल जाउ।",
-       "resetpass-temp-password": "तात्कालिक कूटशब्द",
-       "resetpass-abort-generic": "कूटशब्दमें बदलाव कोनो एक्सटेंशन द्वारा रोक देल गएल अछि ।",
-       "resetpass-expired": "अहाँके कूटशब्दक वैधता अवधि खत्तम भ गेल अछि । कृपया सम्प्रवेशित करवाक लेल नयाँ कूटशब्द राखु।",
+       "resetpass-recycled": "रीसेट करएके लेल नयाँ कूटशब्दमे कृपया अपन वर्तमान कूटशब्द नै द के नयाँ कूटशब्द देल जाउ।",
+       "resetpass-temp-emailed": "अहाँ अखन एकटा अस्थायी ई-पत्र कोड सँ सम्प्रवेशित केनए छी। सम्प्रवेश पूर्ण करए के लेल अहाँ के एतए नयाँ कूटशब्द राखए पडत:",
+       "resetpass-temp-password": "तात्कालिक कूटशब्द:",
+       "resetpass-abort-generic": "कूटशब्दमे बदलाव कोनो एक्सटेंशनद्वारा रोकल गएल अछि।",
+       "resetpass-expired": "अहाँके कूटशब्दक वैधता अवधि खत्तम भऽ गेल अछि । कृपया सम्प्रवेशित करवाक लेल नयाँ कूटशब्द राखु।",
+       "resetpass-expired-soft": "अहाँके कूटशब्दकऽ वैधता अवधि समाप्त भऽ गेल आर कूटशब्द परिवार्तान करवाक आवश्यकता अछि। कृपया एगो नव कूटशब्द राखु, वा पाछु रिसेट करवाक लेल \"{{int:resetpass-submit-cancel}}\" क्लिक करु।",
        "passwordreset": "कूटशब्द फेरसँ बनाउ",
        "passwordreset-text-one": "अपन कूटशब्द रीसेट करवाक लेल इ फारम भरु ।",
        "passwordreset-text-many": "{{PLURAL:$1|ई-पत्रके माध्यमसऽ एकटा अस्थायी कूटशब्द पावैलेल कोनो एकटा डिब्बा भरु ।}}",
index 35266cb..19a78c3 100644 (file)
        "searchresultshead": "Fikarohana",
        "stub-threshold": "Fetra ambony ho an'i <a href=\"#\" class=\"stub\">rohim-bangovango</a> (oktety):",
        "stub-threshold-disabled": "Tsy alefa",
-       "recentchangesdays": "Isa ny andro ho ampiseho eo amin'ny fanovàna farany",
+       "recentchangesdays": "Isan'ny andro ho aseho amin'ny fiovana farany:",
        "recentchangesdays-max": "($1 andro{{PLURAL:$1||}} fara-faha betsany)",
        "recentchangescount": "Isan'ny fanovana haseho (tsipalotra) :",
        "prefs-help-recentchangescount": "Misy ny fiovana farany, ny tantaram-pejy ary ny laogy",
        "enhancedrc-since-last-visit": "$1 ({{PLURAL:$1|hatry ny famangiana farany}})",
        "enhancedrc-history": "tantara",
        "recentchanges": "Fiovana farany",
-       "recentchanges-legend": "Safidy ny fanovàna farany",
+       "recentchanges-legend": "Safidin'ny fiovana farany",
        "recentchanges-summary": "Jereo eto amin'ity pejy ity izay vao niova vao haingana teto amin'ity wiki ity.",
        "recentchanges-noresult": "Tsy misy fanovana miady amin'ny fepe-potoana napetraka.",
-       "recentchanges-feed-description": "Arao ny fanovàna farany amin'ity wiki ity anaty topa",
+       "recentchanges-feed-description": "Hanaraka ny fiovana faran'ny wiki anaty topaka.",
        "recentchanges-label-newpage": "Namorona pejy vaovao io fanovana io",
        "recentchanges-label-minor": "Kely fotsiny ity fanovana ity",
        "recentchanges-label-bot": "Nataon'ny rôbô ity fanovana ity.",
        "tooltip-n-mainpage-description": "hitsidika ny renipejy",
        "tooltip-n-portal": "Ny mombamomba ny tetikasa",
        "tooltip-n-currentevents": "Hikaroka torohay fototra mikasika ny vaovao",
-       "tooltip-n-recentchanges": "Lisitra ny fanovàna farany efa vita eto amin'ity wiki ity",
+       "tooltip-n-recentchanges": "Lisitry ny fiovana farany eto amin'ny wiki",
        "tooltip-n-randompage": "Hjery pejy aki-sendra",
        "tooltip-n-help": "fanoroana",
        "tooltip-t-whatlinkshere": "Lisitra ny pejy wiki mirohy eto",
index a931417..7df7fe3 100644 (file)
        "filerenameerror": "Не можев да ја преименувам податотеката „$1“ во „$2“.",
        "filedeleteerror": "Не може да се избрише податотеката „$1“.",
        "directorycreateerror": "Не можеше да се создаде именикот „$1“.",
+       "directoryreadonlyerror": "Папката „$1“ не е запислива.",
+       "directorynotreadableerror": "Папката „$1“ не е читлива.",
        "filenotfound": "Не може да се најде податотеката „$1“.",
        "unexpected": "Неочекувана вредност: „$1“=„$2“.",
        "formerror": "Грешка: не можам да го испратам образецот",
index 7f81062..f762469 100644 (file)
        "filerenameerror": "Nun se può rinnummenare 'o file \"$1\" into \"$2\".",
        "filedeleteerror": "Nun se pô scancellà 'o file \"$1\"",
        "directorycreateerror": "Nun se può crià 'a cartella \"$1\".",
+       "directoryreadonlyerror": "'A cartella \"$1\" è de lettura surtanto.",
+       "directorynotreadableerror": "'A cartella \"$1\" nun se può liegge.",
        "filenotfound": "Nun se può truvà 'o file \"$1\".",
        "unexpected": "Valore imprevisto: \"$1\"=\"$2\".",
        "formerror": "Sbàglio: nun se può mannà 'o modulo",
index edf5578..f0b4437 100644 (file)
        "filerenameerror": "Klarte ikke å døpe om filen «$1» til «$2».",
        "filedeleteerror": "Klarte ikke å slette filen «$1».",
        "directorycreateerror": "Klarte ikke å opprette mappe «$1».",
+       "directoryreadonlyerror": "Folder \"$1\" er skrivebeskyttet.",
+       "directorynotreadableerror": "Folder \"$1\" er ikke lesbar.",
        "filenotfound": "Klarte ikke å finne filen «$1».",
        "unexpected": "Uventet verdi: «$1»=«$2».",
        "formerror": "Feil: klarte ikke å sende skjema",
        "unknown_extension_tag": "Ukjent tilleggsmerking «$1»",
        "duplicate-defaultsort": "Advarsel: Standardsorteringen «$2» tar over for den tidligere sorteringen «$1».",
        "duplicate-displaytitle": "<strong>Advarsel:</strong> Visningstittel \"$2\" erstatter tidligere visningstittel \"$1\".",
+       "invalid-indicator-name": "<p>Feil:</strong> Sidestatus-indikatornes <code>navn</code>-attributt kan ikke være tomt.",
        "version": "Versjon",
        "version-extensions": "Installerte utvidelser",
        "version-skins": "Installerte drakter",
        "revdelete-uname-unhid": "brukernavn synlig",
        "revdelete-restricted": "begrensninger gjelder også administratorer",
        "revdelete-unrestricted": "fjernet begrensninger for administratorer",
+       "logentry-merge-merge": "$1 {{GENDER:$2|slo sammen}} $3 i $4 (versjonene t.o.m. $5)",
        "logentry-move-move": "$1 {{GENDER:$2|flyttet}} siden $3 til $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|flyttet}} siden $3 til $4 uten å etterlate en omdirigering",
        "logentry-move-move_redir": "$1 {{GENDER:$2|flyttet}} siden $3 til $4 over en omdirigering",
        "api-error-stashfailed": "Internal error: tjeneren greide ikke å lagre midlertidig fil.",
        "api-error-publishfailed": "Intern feil: Tjeneren greide ikke å publisere midlertidig fil.",
        "api-error-stasherror": "Det oppstod en feil mens filen ble lastet opp til stash.",
+       "api-error-stashedfilenotfound": "Den temporære filen ble ikke funnet ved forsøk på å laste den opp fra lageret.",
+       "api-error-stashpathinvalid": "Stien som den temporære filen skulle vært funnet via var ugyldig.",
+       "api-error-stashfilestorage": "Det oppsto en feil når filen skulle lastes opp til lageret.",
+       "api-error-stashzerolength": "Tjenermaskinen kunne i lagre den temporære filen fordi den hadde null lengde.",
+       "api-error-stashnotloggedin": "Du må være innlogget for å lagre filene i opplastingslageret.",
        "api-error-timeout": "Serveren svarte ikke innenfor forventet tid.",
        "api-error-unclassified": "En ukjent feil har oppstått",
        "api-error-unknown-code": "Ukjent feil: \"$1\"",
index 87a6aea..20d4915 100644 (file)
        "confirmemail_loggedin": "Uw e-mailadres is nu bevestigd.",
        "confirmemail_subject": "Bevestiging e-mailadres voor {{SITENAME}}",
        "confirmemail_body": "Iemand, waarschijnlijk u, met het IP-adres $1,\nheeft zich met dit e-mailadres geregistreerd als gebruiker \"$2\" op {{SITENAME}}.\n\nOpen de volgende koppeling in uw webbrowser om te bevestigen dat u deze gebruiker bent en om de e-mailmogelijkheden op {{SITENAME}} te activeren:\n\n$3\n\nAls u uzelf *niet* hebt aangemeld, volg dan de volgende koppeling om de bevestiging van uw e-mailadres te annuleren:\n\n$5\n\nDe bevestigingscode vervalt op $4.",
-       "confirmemail_body_changed": "Iemand, waarschijnlijk u, met het IP-adres $1,\nheeft het het e-mailadres geregistreerd voor gebruiker \"$2\" op {{SITENAME}} gewijzigd naar dit e-mailadres.\n\nOpen de volgende koppeling in uw webbrowser om te bevestigen dat u deze gebruiker bent en om de e-mailmogelijkheden op {{SITENAME}} opnieuw te activeren:\n\n$3\n\nAls u uzelf *niet* hebt aangemeld, volg dan de volgende koppeling om de bevestiging van uw e-mailadres te annuleren:\n\n$5\n\nDe bevestigingscode vervalt op $4.",
-       "confirmemail_body_set": "Iemand, waarschijnlijk u, met het IP-adres $1,\nheeft het het e-mailadres voor gebruiker \"$2\" op {{SITENAME}} ingesteld op dit e-mailadres.\n\nKlik op de volgende koppeling of open deze in uw webbrowser om te bevestigen dat u deze gebruiker bent en om de e-mailmogelijkheden op {{SITENAME}} opnieuw te activeren:\n\n$3\n\nAls deze gebruiker *niet* aan u toebehoort, klik dan op de volgende koppeling om de bevestiging van uw e-mailadres te annuleren:\n\n$5\n\nDe bevestigingscode vervalt op $4.",
+       "confirmemail_body_changed": "Iemand, waarschijnlijk u, met het IP-adres $1,\nheeft het e-mailadres geregistreerd voor gebruiker \"$2\" op {{SITENAME}} gewijzigd naar dit e-mailadres.\n\nOpen de volgende koppeling in uw webbrowser om te bevestigen dat u deze gebruiker bent en om de e-mailmogelijkheden op {{SITENAME}} opnieuw te activeren:\n\n$3\n\nAls u uzelf *niet* hebt aangemeld, volg dan de volgende koppeling om de bevestiging van uw e-mailadres te annuleren:\n\n$5\n\nDe bevestigingscode vervalt op $4.",
+       "confirmemail_body_set": "Iemand, waarschijnlijk u, met het IP-adres $1,\nheeft het e-mailadres voor gebruiker \"$2\" op {{SITENAME}} ingesteld op dit e-mailadres.\n\nKlik op de volgende koppeling of open deze in uw webbrowser om te bevestigen dat u deze gebruiker bent en om de e-mailmogelijkheden op {{SITENAME}} opnieuw te activeren:\n\n$3\n\nAls deze gebruiker *niet* aan u toebehoort, klik dan op de volgende koppeling om de bevestiging van uw e-mailadres te annuleren:\n\n$5\n\nDe bevestigingscode vervalt op $4.",
        "confirmemail_invalidated": "De e-mailbevestiging is geannuleerd",
        "invalidateemail": "E-mailbevestiging annuleren",
        "scarytranscludedisabled": "[Interwiki-invoeging van sjablonen is uitgeschakeld]",
index 0759c08..bf39363 100644 (file)
@@ -70,7 +70,8 @@
                        "Darellur",
                        "Michał Sobkowski",
                        "Py64",
-                       "Nanaki"
+                       "Nanaki",
+                       "Alan ffm"
                ]
        },
        "tog-underline": "Podkreślenie linków:",
        "revdelete-uname-unhid": "wycofano ukrycie nazwy użytkownika",
        "revdelete-restricted": "ograniczono widoczność dla administratorów",
        "revdelete-unrestricted": "wycofano ograniczenie widoczności dla administratorów",
+       "logentry-merge-merge": "$1 {{GENDER:$2|scalił|scaliła}} stronę $3 do $4 (wersje do $5)",
        "logentry-move-move": "$1 {{GENDER:$2|przeniósł|przeniosła}} stronę $3 do $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|przeniósł|przeniosła}} stronę $3 na $4, bez pozostawienia przekierowania pod starym tytułem",
        "logentry-move-move_redir": "$1 {{GENDER:$2|przeniósł|przeniosła}} stronę $3 na $4 w miejsce przekierowania",
index 47e8040..5d1bffb 100644 (file)
        "filerenameerror": "A l'é pa podusse cangeje nòm a l'archivi «$1» an «$2».",
        "filedeleteerror": "A l'é pa podusse scancelé l'archivi «$1».",
        "directorycreateerror": "A l'é pa podusse creé ël dossié «$1».",
+       "directoryreadonlyerror": "Ël dossié «$1» a l'é mach an letura.",
+       "directorynotreadableerror": "Ël dossié «$1» as peul nen les-se.",
        "filenotfound": "A l'é pa trovasse l'archivi «$1».",
        "unexpected": "Valor che i së spetavo pa: «$1»=«$2».",
        "formerror": "Eror: A l'é nen podusse mandé ël formolari.",
index 4747ded..fc640b9 100644 (file)
        "filerenameerror": "Não foi possível alterar o nome do ficheiro \"$1\" para \"$2\".",
        "filedeleteerror": "Não foi possível eliminar o ficheiro \"$1\".",
        "directorycreateerror": "Não foi possível criar o diretório \"$1\".",
+       "directoryreadonlyerror": "O diretório \"$1\" é apenas de leitura.",
+       "directorynotreadableerror": "O diretório \"$1\" não é legível.",
        "filenotfound": "Não foi possível encontrar o ficheiro \"$1\".",
        "unexpected": "Valor não esperado: \"$1\"=\"$2\".",
        "formerror": "Erro: Não foi possível enviar o formulário",
index b9d586c..e254fa5 100644 (file)
        "filecopyerror": "Parameters:\n* $1 - source file name\n* $2 - destination file name",
        "filerenameerror": "Parameters:\n* $1 - old file name\n* $2 - new file name",
        "filedeleteerror": "Parameters:\n* $1 - file name",
-       "directorycreateerror": "Parameters:\n* $1 - directory name",
+       "directorycreateerror": "Error message returned when the directory cannot be created. Parameters:\n* $1 - directory name",
+       "directoryreadonlyerror": "Error message returned when the directory is read-only. Parameters:\n* $1 - directory name",
+       "directorynotreadableerror": "Error message returned when the directory isn't readable. Parameters:\n* $1 - directory name",
        "filenotfound": "Parameters:\n* $1 - file name",
        "unexpected": "This message indicates the value $2 is unexpected for $1. Parameters:\n* $1 - name\n* $2 - value",
        "formerror": "Generic error message show to a user when they try to submit information that could not be processed for any reason.",
index b8e413b..0cae5ff 100644 (file)
        "filerenameerror": "Fișierul \"$1\" nu a putut fi mutat la \"$2\".",
        "filedeleteerror": "Fișierul \"$1\" nu a putut fi șters.",
        "directorycreateerror": "Nu se poate crea directorul \"$1\".",
+       "directoryreadonlyerror": "Dosarul „$1” este doar în citire.",
+       "directorynotreadableerror": "Dosarul „$1” nu poate fi citit.",
        "filenotfound": "Fișierul „$1” nu a putut fi găsit.",
        "unexpected": "Valoare neașteptată: „$1”=„$2”.",
        "formerror": "Eroare: datele nu au putut fi trimise",
        "upload-failure-subj": "Problemă la trimitere",
        "upload-failure-msg": "A apărut o problemă cu încărcarea de la [$2]:\n\n$1",
        "upload-warning-subj": "Avertizare la încărcare",
-       "upload-warning-msg": "A apărut o problemă în timpul încărcării de la [$2]. Vă puteți întoarce la [[Special:Upload/stash/$1|formularul de trimitere]]pentru a corecta această problemă.",
+       "upload-warning-msg": "A apărut o problemă în timpul încărcării de la [$2]. Vă puteți întoarce la [[Special:Upload/stash/$1|formularul de trimitere]] pentru a corecta această problemă.",
        "upload-proto-error": "Protocol incorect",
        "upload-proto-error-text": "Importul de la distanță necesită adrese URL care încep cu <code>http://</code> sau <code>ftp://</code>.",
        "upload-file-error": "Eroare internă",
        "zip-wrong-format": "Fișierul specificat nu era un fișier de tip ZIP.",
        "zip-bad": "Fișierul este un fișier corupt de tip ZIP, fiind imposibil de citit.\nNu poate fi verificat în mod corespunzător în vederea securității.",
        "zip-unsupported": "Fișierul este unul de tip ZIP cu caracteristici neacceptate de MediaWiki.\nNu poate fi verificat în mod corespunzător în vederea securității.",
-       "uploadstash": "Fișiere trimise în așteptare",
-       "uploadstash-summary": "Această pagină oferă acces la fișierele care sunt încărcate (sau în curs de încărcare) dar nu sunt încă publicate pe wiki. Aceste fișiere nu sunt vizibile nimănui cu excepția celui care le-a încărcat.",
-       "uploadstash-clear": "Șterge fișierele în așteptare",
-       "uploadstash-nofiles": "Nu aveți fișiere în lista de așteptare.",
+       "uploadstash": "Fișiere în depozitul temporar",
+       "uploadstash-summary": "Această pagină oferă acces la fișierele care sunt încărcate sau sunt în curs de încărcare, dar nu sunt încă publicate pe wiki. Aceste fișiere nu sunt vizibile nimănui, cu excepția celui care le-a încărcat.",
+       "uploadstash-clear": "Șterge fișierele din depozitul temporar",
+       "uploadstash-nofiles": "Nu aveți fișiere în depozitul temporar.",
        "uploadstash-badtoken": "Execuția acestei acțiuni nu a reușit, probabil deoarece informațiile dumneavoastră de identificare au expirat. Încercați din nou.",
        "uploadstash-errclear": "Golirea fișierelor nu a reușit.",
        "uploadstash-refresh": "Reîmprospătează lista de fișiere",
        "api-error-overwrite": "Nu este permisă suprascrierea unui fișier existent.",
        "api-error-stashfailed": "Eroare internă: serverul nu a putut stoca fișierul temporar.",
        "api-error-publishfailed": "Eroare internă: serverul nu a putut publica fișierul temporar.",
+       "api-error-stasherror": "A apărut o eroare la încărcarea fișierului în depozitul temporar.",
+       "api-error-stashedfilenotfound": "Fișierul din depozitul temporar nu a fost găsit când s-a încercat încărcarea sa.",
+       "api-error-stashpathinvalid": "Calea unde ar fi trebuit să fie găsit fișierul din depozitul temporar nu este validă.",
+       "api-error-stashfilestorage": "A apărut o eroare la stocarea fișierului în depozitul temporar.",
+       "api-error-stashzerolength": "Serverul nu a putut depozita temporar fișierul, deoarece are o mărime egală cu zero.",
+       "api-error-stashnotloggedin": "Trebuie să vă autentificați pentru a salva fișiere în depozitul temporar.",
+       "api-error-stashwrongowner": "Fișierul pe care încercați să-l accesați din depozitul temporar nu vă aparține.",
+       "api-error-stashnosuchfilekey": "Cheia fișierului pe care încercați să-l accesați din depozitul temporar nu există.",
        "api-error-timeout": "Serverul nu a răspuns în timp util.",
        "api-error-unclassified": "A apărut o eroare necunoscută.",
        "api-error-unknown-code": "Eroare necunoscută: „$1”",
index 984ed55..32cab6e 100644 (file)
                        "Nirovulf",
                        "Striking Blue",
                        "Fitoschido",
-                       "MaxBioHazard"
+                       "MaxBioHazard",
+                       "Tourorist"
                ]
        },
        "tog-underline": "Подчёркивание ссылок:",
-       "tog-hideminor": "СкÑ\80Ñ\8bваÑ\82Ñ\8c Ð¼Ð°Ð»Ñ\8bе Ð¿Ñ\80авки Ð² Ñ\81пиÑ\81ке свежих правок",
+       "tog-hideminor": "СкÑ\80Ñ\8bваÑ\82Ñ\8c Ð¼Ð°Ð»Ñ\8bе Ð¿Ñ\80авки Ð¸Ð· Ñ\81пиÑ\81ка свежих правок",
        "tog-hidepatrolled": "Скрывать патрулированные правки в списке свежих правок",
        "tog-newpageshidepatrolled": "Скрывать отпатрулированные страницы в списке новых страниц",
        "tog-extendwatchlist": "Расширенный список наблюдения, включающий все изменения, а не только последние",
        "filerenameerror": "Невозможно переименовать файл «$1» в «$2».",
        "filedeleteerror": "Невозможно удалить файл «$1».",
        "directorycreateerror": "Невозможно создать директорию «$1».",
+       "directoryreadonlyerror": "Каталог «$1» доступен только для чтения.",
+       "directorynotreadableerror": "Каталог «$1» не читается.",
        "filenotfound": "Невозможно найти файл «$1».",
        "unexpected": "Неподходящее значение: «$1»=«$2».",
        "formerror": "Ошибка: невозможно передать данные формы",
        "search-relatedarticle": "Связанный",
        "searchrelated": "связанный",
        "searchall": "все",
-       "showingresults": "Ниже {{PLURAL:$1|1=показан результат|показаны  результаты}} с № '''$2''' и вплоть до № '''$1'''.",
+       "showingresults": "Ниже {{PLURAL:$1|1=показан <strong>1</strong> результат|показан  <strong>$1</strong> результат|показано <strong>$1</strong> результата|показаны <strong>$1</strong> результатов}}, начиная с № <strong>$2</strong>.",
        "showingresultsinrange": "Ниже показано до {{PLURAL:$1|<strong>1</strong> результата|<strong>$1</strong> результата|<strong>$1</strong> результатов}} в диапазоне от <strong>$2</strong> до <strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Результат <strong>$1</strong> из <strong>$3</strong>|Результаты <strong>$1 — $2</strong> из <strong>$3</strong>}}",
        "search-nonefound": "Соответствий запросу не найдено.",
        "right-browsearchive": "поиск удалённых страниц",
        "right-undelete": "восстановление страниц",
        "right-suppressrevision": "просмотр, сокрытие и восстановление скрытых версий страниц",
-       "right-viewsuppressed": "Ð\9fросмотр версий, скрытых от всех участников",
+       "right-viewsuppressed": "просмотр версий, скрытых от всех участников",
        "right-suppressionlog": "просмотр частных журналов",
        "right-block": "установка ограничений на редактирование для других участников",
        "right-blockemail": "установка запрета на отправку электронной почты",
        "pagelang-language": "Язык",
        "pagelang-use-default": "Использовать язык по умолчанию",
        "pagelang-select-lang": "Выберите язык",
-       "right-pagelang": "Ð\98змениÑ\82Ñ\8c Ñ\8fзÑ\8bк страницы",
+       "right-pagelang": "изменение Ñ\8fзÑ\8bка страницы",
        "action-pagelang": "изменять язык страницы",
        "log-name-pagelang": "Журнал изменения языка",
        "log-description-pagelang": "Это журнал изменений в языках страницы.",
index 3969358..7892473 100644 (file)
@@ -16,7 +16,7 @@
        "tog-showtoolbar": "Aratâ bara di halati trâ alâxiri",
        "tog-editondblclick": "Alâxeaști frândzâli pri-tu click duplo",
        "tog-editsectiononrightclick": "Activeadzâ alâxirea a secțiuniloru pri-tu click ndreapta pi titlu a secțiunâľei",
-       "tog-watchcreations": "Adavgâ frândzâli pi cari li adar și fișierele pi cari li ncari la lista a ńia di frândzâ avinati",
+       "tog-watchcreations": "Adavgâ frândzâli pi cari li adaru și fișierili pi cari li ancarcu la lista a ńia di frândzâ avinati",
        "tog-watchdefault": "Adavgâ frândzâli și fișierili pi cari li alâxescu la lista a ńia di avinari",
        "tog-watchmoves": "Adavgâ frândzâli și fișierili pi cari li dau numâ noao la lista a ńia di avinari",
        "tog-watchdeletion": "Adavgâ frândzâli și fișierili pi cari li aștergu la lista a ńia di avinari",
        "readonly": "Baza di dati easti blocatâ (ncľisâ) la nyrâpseari",
        "missingarticle-rev": "(versiuniľea#: $1)",
        "missingarticle-diff": "(Dif: $1, $2)",
+       "internalerror": "Sfalmâ di nuntru",
+       "internalerror_info": "Sfalmâ di nuntru: $1",
+       "filecopyerror": "Fișierlu \"$1\" nu putu s-hibâ copiatu \"$2\".",
+       "filerenameerror": "Fișierlu \"$1\" nu putu s-hibâ mutatu \"$2\".",
+       "filedeleteerror": "Fișierlu \"$1\" nu si putu s-hibâ aștersu.",
+       "directorycreateerror": "Nu s-poati si s-facâ directorlu \"$1\".",
+       "directoryreadonlyerror": "Directorlu \"$1\" easti mași trâ adghivâsiri.",
+       "directorynotreadableerror": "Directorlu \"$1\" nu s-poati si s-adghivâseascâ.",
+       "filenotfound": "Fișierlu \"$1\" nu si putu s-hibâ aflatu.",
        "badtitle": "Titlu alatusu",
        "viewsource": "Vez-u textu",
        "viewsource-title": "Vedz ivurlu trâ $1",
        "userlogin-yourname-ph": "Bagâ-u numa a ta di utilizatoru",
        "createacct-another-username-ph": "Bagâ-u numa di utilizatoru",
        "yourpassword": "Zboru cľeae:",
-       "userlogin-yourpassword": "Zboarâ acrifo (parolâ)",
+       "userlogin-yourpassword": "Zboru acrifo (parolâ)",
        "userlogin-yourpassword-ph": "Bagâ-u parola (zboru acrifo)",
        "createacct-yourpassword-ph": "Bagâ-u parola (zboru acrifo)",
        "yourpasswordagain": "Bagâ-u cľeae diznou:",
        "gotaccountlink": "Leagâ-ti",
        "userlogin-resetlink": "U agârșii parola i numa di utilizatoru?",
        "userlogin-resetpassword-link": "U agârșii parola?",
+       "userlogin-helplink2": "Agiutoru la ligari",
+       "userlogin-createanother": "Adrari contu nou",
        "createacct-emailrequired": "Adresâ di carti electronicâ",
        "createacct-emailoptional": "Adresâ di carti electronicâ (opționalu)",
        "createacct-email-ph": "Bagâ-u adresa a ta di carti electronicâ",
        "createacct-another-email-ph": "Bagâ-u adresa di carti electronicâ",
+       "createaccountmail": "Ufiliseaști unâ parolâ (zboru acrifo) pirastica și u pitreați la adresa di e-mail cari u dzâț tini",
        "createacct-realname": "Numa realâ (opționalu)",
        "createaccountreason": "Furńie:",
        "createacct-reason": "Furńie",
+       "createacct-reason-ph": "Câ ți feci altu contu",
+       "createacct-captcha": "Duchimie (provâ) di securitati",
+       "createacct-imgcaptcha-ph": "Bagâ lu textu pi cari lu vedz disuprâ",
+       "createacct-submit": "Adrari contu-ț",
+       "createacct-another-submit": "Adrari altu contu",
+       "createacct-benefit-heading": "{{SITENAME}} s-feasi cu oamińi ca tini.",
+       "createacct-benefit-body1": "{{PLURAL:$1|alâxiri|alâxiri|di alâxiri}}",
+       "createacct-benefit-body2": "{{PLURAL:$1|frândzâ|frândzâ|de frândzâ}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|contribuitoru proaspitu|contribuitori proaspiț|di contribuitori proaspiț}}",
+       "badretype": "Zboarâli acrifo pi cari lâ bâgaș nu suntu unâ.",
+       "userexists": "Numa di utilizatoru pi cari u bâgaș ari nica aoa. Ti oru, ľea altâ numâ.",
+       "loginerror": "Sfalmâ di ligari",
+       "createacct-error": "Sfalmâ la adrarea a contlui",
+       "createaccounterror": "Nu s-putu si s-facâ contu: $1",
+       "loginsuccesstitle": "Ligarea s-bitisi ghini",
+       "loginsuccess": "'''Ti ligai la {{SITENAME}} ca „$1”.'''",
+       "loginlanguagelabel": "Limbâ: $1",
+       "pt-login": "Leagâ-ti",
+       "pt-login-button": "Leagâ-ti",
+       "pt-createaccount": "Fă contu (isape)",
+       "pt-userlogout": "Dizleagâ-ti",
+       "bold_sample": "Scriari groasâ (bold)",
+       "bold_tip": "Scriari groasâ (bold)",
+       "italic_sample": "Scriari aplicatâ (italic)",
+       "italic_tip": "Scriari aplicatâ (italic)",
+       "link_sample": "Titlu a ligâturiľei",
+       "link_tip": "Ligâturâ di nuntru",
+       "extlink_sample": "http://www.example.com titlu a ligâturiľei",
        "summary": "Rezumatu:",
        "minoredit": "Aestâ easti unâ alâxiri minorâ (ńicâ)",
        "watchthis": "Mutrea-u frândzâ aestâ",
index cd7d6aa..5556cd9 100644 (file)
        "autosumm-replace": "Сирэй иһэ уларытыллыбыт: '$1'",
        "autoredircomment": "Утаарыы: [[$1]]",
        "autosumm-new": "'$1' ыйааһыннаах саҥа сирэй оҥоһулунна",
+       "autosumm-newblank": "Кураанах сирэй оҥоһулунна",
        "size-bytes": "$1 байт",
        "lag-warn-normal": "$1 {{PLURAL:$1|сөкүүндэ|сөкүүндэ}} иһинэн оҥоһуллубут уларытыылар манна көстүө суохтарын сөп.",
        "lag-warn-high": "Синхронизация лаппа хойутуур буолан кэнники $1 {{PLURAL:$1|сөкүүндэ|сөкүүндэ}} иһинэн оҥоһуллубут уларытыылар манна көстүө суохтарын сөп.",
index 662f189..a03a4cb 100644 (file)
        "edit-gone-missing": "Mpussìbbili aggiurnari la pàggina.\nPari ca fu scancillata.",
        "edit-conflict": "Cunflittu di edizzioni.",
        "edit-no-change": "La mudifica fu ignurata pirchì nu foru appurtati canci ntô testu.",
+       "postedit-confirmation-created": "La pàggina fu criata.",
        "postedit-confirmation-saved": "Lu canciamentu fu sarbatu.",
        "edit-already-exists": "Mpussìbbili criari na pàggina nova.\nEsisti ggià.",
        "expensive-parserfunction-warning": "Accura: Sta pàggina cunteni troppi chiamati ê parser functions.\n\nAvissi a èssiri menu di $2, ô mumentu ci {{PLURAL:$1|nn'è $1|nni sunnu $1}}.",
index 6e39183..b08f81d 100644 (file)
        "filerenameerror": "Datoteke »$1« ni mogoče preimenovati v »$2«.",
        "filedeleteerror": "Datoteke »$1« ni mogoče izbrisati.",
        "directorycreateerror": "Ne morem ustvariti direktorija »$1«.",
+       "directoryreadonlyerror": "Mapa »$1« je samo za branje.",
+       "directorynotreadableerror": "Mapa »$1« ni berljiva.",
        "filenotfound": "Datoteke »$1« ne najdem.",
        "unexpected": "Nepričakovana vrednost: \"$1\"=\"$2\".",
        "formerror": "Napaka: obrazca ni mogoče predložiti",
index 5684954..39de585 100644 (file)
        "viewsourcetext": "Можете читати и копирати садржај ове странице:",
        "viewyourtext": "Можете да погледате и копирате извор '''ваших измена''' на овој страници:",
        "protectedinterface": "Ова страница садржи текст корисничког окружења за софтвер на овом викију и заштићена је ради спречавања злоупотребе.\nДа бисте додали или изменили преводе свих викија, посетите [//translatewiki.net/ Транслејтвики], пројекат за локализацију Медијавикија.",
-       "editinginterface": "<strong>Упозорење:</strong> уређујете страницу која се користи за приказивање текста корисничког окружења.\nИзмене на овој страници ће утицати на све кориснике овог викија.\nДа бисте додали или изменили преводе свих викија, посетите [//translatewiki.net/ Транслејтвики], пројекат за локализацију Медијавикија.",
+       "editinginterface": "<strong>Упозорење:</strong> уређујете страницу која се користи за приказивање текста корисничког окружења.\nИзмене на овој страници ће утицати на све кориснике овог викија.",
+       "translateinterface": "Да додате или промените преводе за све викије, посетите [//translatewiki.net/ Транслејтвики], пројекат за локализацију Медијавикија.",
        "cascadeprotected": "Ова страница је закључана јер садржи {{PLURAL:$1|следећу страницу која је заштићена|следеће странице које су заштићене}} „преносивом“ заштитом:\n$2",
        "namespaceprotected": "Немате дозволу да уређујете странице у именском простору '''$1'''.",
        "customcssprotected": "Немате дозволу да мењате ову CSS страницу јер садржи личне поставке другог корисника.",
        "revdelete-confirm": "Потврдите да намеравате ово урадити, да разумете последице и да то чините у складу с [[{{MediaWiki:Policy-url}}|правилима]].",
        "revdelete-suppress-text": "Сакривање измена би требало користити '''само''' у следећим случајевима:\n* Злонамерни или погрдни подаци\n* Неприкладни лични подаци\n*: ''кућна адреса и број телефона, број банковне картице итд.''",
        "revdelete-legend": "Ограничења видљивости",
-       "revdelete-hide-text": "Текст измене",
+       "revdelete-hide-text": "СакÑ\80иÑ\98 Ñ\82екст измене",
        "revdelete-hide-image": "Сакриј садржај датотеке",
        "revdelete-hide-name": "Сакриј радњу и одредиште",
        "revdelete-hide-comment": "Опис измене",
        "search-result-category-size": "{{PLURAL:$1|1 члан|$1 члана|$1 чланова}}, ({{PLURAL:$2|1 поткатегорија|$2 поткатегорије|$2 поткатегорија}}, {{PLURAL:$3|1 датотека|$3 датотеке|$3 датотека}})",
        "search-redirect": "(преусмерење $1)",
        "search-section": "(одељак $1)",
+       "search-category": "(категорија $1)",
        "search-suggest": "Да ли сте мислили на: $1",
        "search-interwiki-caption": "Братски пројекти",
        "search-interwiki-default": "Резултати са $1:",
        "randomincategory-nopages": "Нема страница у категорији [[:Category:$1|$1]].",
        "randomincategory-category": "Категорија:",
        "randomredirect": "Случајно преусмерење",
-       "randomredirect-nopages": "Ð\9dема Ð¿Ñ\80еÑ\83Ñ\81меÑ\80еÑ\9aа Ñ\83 Ð¸Ð¼ÐµÐ½Ñ\81ком Ð¿Ñ\80оÑ\81Ñ\82оÑ\80Ñ\83 â\80\9e$1â\80\9d.",
+       "randomredirect-nopages": "Ð\9dема Ð¿Ñ\80еÑ\83Ñ\81меÑ\80еÑ\9aа Ñ\83 Ð¸Ð¼ÐµÐ½Ñ\81ком Ð¿Ñ\80оÑ\81Ñ\82оÑ\80Ñ\83 â\80\9e$1â\80\9c.",
        "statistics": "Статистике",
        "statistics-header-pages": "Странице",
        "statistics-header-edits": "Измене",
        "tooltip-feed-atom": "Атом довод ове странице",
        "tooltip-t-contributions": "Погледајте списак доприноса овог корисника",
        "tooltip-t-emailuser": "Пошаљите е-поруку овом кориснику",
+       "tooltip-t-info": "Више информација о овој страници",
        "tooltip-t-upload": "Пошаљите датотеке",
        "tooltip-t-specialpages": "Списак свих посебних страница",
        "tooltip-t-print": "Верзија ове странице за штампање",
        "revdelete-uname-unhid": "корисничко име је откривено",
        "revdelete-restricted": "примењена ограничења за администраторе",
        "revdelete-unrestricted": "уклоњена ограничења за администраторе",
+       "logentry-merge-merge": "$1 је {{GENDER:$2|спојио|спојила}} $3 у $4 (све до измене $5)",
        "logentry-move-move": "$1 је {{GENDER:$2|преместио|преместила}} страницу $3 на $4",
        "logentry-move-move-noredirect": "$1 је {{GENDER:$2|преместио|преместила}} страницу $3 на $4 без остављања преусмерења",
        "logentry-move-move_redir": "$1 је {{GENDER:$2|преместио|преместила}} страницу $3 на $4 преко преусмерења",
index 57633c1..8eb2f0d 100644 (file)
        "viewsourcetext": "Možete čitati i kopirati sadržaj ove stranice:",
        "viewyourtext": "Možete da pogledate i umnožite izvor '''vaših izmena''' na ovoj stranici:",
        "protectedinterface": "Ova stranica sadrži tekst korisničkog okruženja za softver na ovom vikiju i zaštićena je radi sprečavanja zloupotrebe.\nDa biste dodali ili izmenili prevode svih vikija, posetite [//translatewiki.net/ Translejtviki], projekat za lokalizaciju Medijavikija.",
-       "editinginterface": "<strong>Upozorenje:</strong> uređujete stranicu koja se koristi za prikazivanje teksta korisničkog okruženja.\nIzmene na ovoj stranici će uticati na sve korisnike ovog vikija.\nDa biste dodali ili izmenili prevode svih vikija, posetite [//translatewiki.net/ Translejtviki], projekat za lokalizaciju Medijavikija.",
+       "editinginterface": "<strong>Upozorenje:</strong> uređujete stranicu koja se koristi za prikazivanje teksta korisničkog okruženja.\nIzmene na ovoj stranici će uticati na sve korisnike ovog vikija.",
        "cascadeprotected": "Ova stranica je zaključana jer sadrži {{PLURAL:$1|sledeću stranicu koja je zaštićena|sledeće stranice koje su zaštićene}} „prenosivom“ zaštitom:\n$2",
        "namespaceprotected": "Nemate dozvolu da uređujete stranice u imenskom prostoru '''$1'''.",
        "customcssprotected": "Nemate dozvolu da menjate ovu CSS stranicu jer sadrži lične postavke drugog korisnika.",
        "revdelete-confirm": "Potvrdite da nameravate ovo uraditi, da razumete posledice i da to činite u skladu s [[{{MediaWiki:Policy-url}}|pravilima]].",
        "revdelete-suppress-text": "Sakrivanje izmena bi trebalo koristiti '''samo''' u sledećim slučajevima:\n* Zlonamerni ili pogrdni podaci\n* Neprikladni lični podaci\n*: ''kućna adresa i broj telefona, broj bankovne kartice itd.''",
        "revdelete-legend": "Ograničenja vidljivosti",
-       "revdelete-hide-text": "Tekst izmene",
+       "revdelete-hide-text": "Sakrij tekst izmene",
        "revdelete-hide-image": "Sakrij sadržaj datoteke",
        "revdelete-hide-name": "Sakrij radnju i odredište",
        "revdelete-hide-comment": "Opis izmene",
        "randomincategory-nopages": "Nema stranica u kategoriji [[:Category:$1|$1]].",
        "randomincategory-category": "Kategorija:",
        "randomredirect": "Slučajno preusmerenje",
-       "randomredirect-nopages": "Nema preusmerenja u imenskom prostoru â\80\9e$1â\80\9d.",
+       "randomredirect-nopages": "Nema preusmerenja u imenskom prostoru â\80\9e$1â\80\9c.",
        "statistics": "Statistike",
        "statistics-header-pages": "Stranice",
        "statistics-header-edits": "Izmene",
index 6b0bac8..95c062a 100644 (file)
        "filerenameerror": "Kunde inte byta namn på filen \"$1\" till \"$2\".",
        "filedeleteerror": "Kunde inte radera filen \"$1\".",
        "directorycreateerror": "Kunde inte skapa katalogen \"$1\".",
+       "directoryreadonlyerror": "Katalog \"$1\" är skrivskyddad.",
+       "directorynotreadableerror": "Katalog \"$1\" är inte läsbar.",
        "filenotfound": "Kunde inte hitta filen \"$1\".",
        "unexpected": "Oväntat värde: \"$1\"=\"$2\".",
        "formerror": "Fel: Kunde inte sända formulär",
        "api-error-stashfailed": "Internt fel: servern kunde inte lagra temporär fil.",
        "api-error-publishfailed": "Internt fel: Servern kunde inte publicera temporär fil.",
        "api-error-stasherror": "Ett fel uppstod under uppladdningen av filen till mellanlagringsfilen.",
+       "api-error-stashedfilenotfound": "Den temporära filen kunde inte hittas när den skulle laddas upp från den temporära lagringsytan.",
+       "api-error-stashpathinvalid": "Den sökväg där den temporära filen skulle ha hittats var ogiltig.",
+       "api-error-stashfilestorage": "Ett fel uppstod under lagringen av filen i den temporära lagringsytan.",
+       "api-error-stashzerolength": "Servern kunde inte lagra filen temporärt eftersom den har noll längd.",
+       "api-error-stashnotloggedin": "Du måste vara inloggad för att spara filer till den temporära ytan för uppladdningar.",
+       "api-error-stashwrongowner": "Filen du försöker komma åt i det temporära lagringsutrymmet tillhör inte dig.",
+       "api-error-stashnosuchfilekey": "Filnyckeln som du försökte komma åt i den temporära lagringsytan existerar inte.",
        "api-error-timeout": "Servern svarade inte inom förväntad tid.",
        "api-error-unclassified": "Ett okänt fel uppstod",
        "api-error-unknown-code": "Okänt fel: \"$1\"",
index 1fa4813..171415c 100644 (file)
        "viewsourcetext": "คุณสามารถดูและคัดลอกโค้ดของหน้านี้:",
        "viewyourtext": "คุณสามารถดูและคัดลอกต้นฉบับ<strong>การแก้ไขของคุณ</strong>มายังหน้านี้ได้:",
        "protectedinterface": "หน้านี้เป็นข้อความส่วนต่อประสานสำหรับซอฟต์แวร์บนวิกินี้ และถูกล็อกเพื่อป้องกันการกระทำผิด\nในการเพิ่มหรือเปลี่ยนแปลงการแปลสำหรับทุกวิกิ โปรดใช้ [//translatewiki.net/ translatewiki.net] โครงการแปลมีเดียวิกิเป็นภาษาถิ่น",
-       "editinginterface": "<strong>คำเตือน:</strong> คุณกำลังแก้ไขหน้าที่ใช้จัดหาข้อความอินเตอร์เฟซให้ซอฟต์แวร์\nการเปลี่ยนแปลงหน้านี้จะกระทบต่อสภาพปรากฏของส่วนต่อประสานผู้ใช้แก่ผู้ใช้อื่นบนวิกินี้\nในการเพิ่มหรือเปลี่ยนแปลงคำแปลสำหรับทุกวิกิ โปรดใช้ [//translatewiki.net/wiki/Main_Page?setlang=th translatewiki.net] โครงการแปลมีเดียวิกิเป็นภาษาถิ่น",
+       "editinginterface": "<strong>คำเตือน:</strong> คุณกำลังแก้ไขหน้าที่ใช้จัดหาข้อความอินเตอร์เฟซให้ซอฟต์แวร์\nการเปลี่ยนแปลงหน้านี้จะมีผลต่อสภาพปรากฏของส่วนต่อประสานผู้ใช้แก่ผู้ใช้อื่นบนวิกินี้",
+       "translateinterface": "ในการเพิ่มหรือเปลี่ยนแปลงคำแปลสำหรับทุกวิกิ โปรดใช้ [//translatewiki.net/ translatewiki.net] โครงการแปลเป็นภาษาถิ่นของมีเดียวิกิ",
        "cascadeprotected": "หน้านี้ถูกป้องกันมิให้แก้ไข เพราะถูกรวมอยู่ในหน้าซึ่งถูกล็อกโดยเปิดตัวเลือก \"ทบทุกลำดับขั้น\":\n$2",
        "namespaceprotected": "คุณไม่มีสิทธิแก้ไขหน้าในเนมสเปซ <strong>$1</strong>",
        "customcssprotected": "คุณไม่มีสิทธิแก้ไขหน้า CSS นี้ เพราะมีการตั้งค่าส่วนบุคคลของผู้ใช้อื่น",
        "createaccount-text": "มีบางคนสร้างบัญชีโดยใช้ที่อยู่อีเมลของคุณบน {{SITENAME}} ($4) โดยใช้ชื่อ \"$2\" และรหัสผ่าน \"$3\" \nคุณควรล็อกอินและเปลี่ยนรหัสผ่านทันที\n\nคุณอาจเพิกเฉยข้อความนี้ หากการสร้างบัญชีนี้เป็นความผิดพลาด",
        "login-throttled": "ที่ผ่านมาคุณพยายามล็อกอินมากครั้งเกินไป\nกรุณารอ $1 ก่อนลองอีกครั้ง",
        "login-abort-generic": "การล็อกอินของคุณไม่สำเร็จ - ล้มเลิกแล้ว",
+       "login-migrated-generic": "บัญชีของคุณถูกย้ายแล้ว และไม่มีชื่อผู้ใช้ของคุณอยู่บนวิกินี้อีก",
        "loginlanguagelabel": "ภาษา: $1",
        "suspicious-userlogout": "คำขอล็อกเอาต์ของคุณถูกปฏิเสธเพราะดูเหมือนส่งมาจากเบราว์เซอร์หรือพร็อกซีแคชที่เสีย",
        "createacct-another-realname-tip": "ไม่จำเป็นต้องใส่ชื่อจริง\nหากคุณเลือกใส่ชื่อจริง จะใช้เพื่อแสดงที่มาสำหรับงานของตน",
        "content-model-text": "ข้อความธรรมดา",
        "content-model-javascript": "จาวาสคริปต์",
        "content-model-css": "CSS",
+       "duplicate-args-category": "หน้าที่ใช้อาร์กิวเมนต์จำลองในการเรียกแม่แบบ",
        "expensive-parserfunction-warning": "<strong>คำเตือน:</strong> หน้านี้มีการเรียกใช้ฟังก์ชันแจงส่วนมากเกินไป\n\nหน้านี้ควรมีการเรียกใช้น้อยกว่า $2  ครั้ง แต่ปัจจุบันมีการเรียกใช้ $1 ครั้ง",
        "expensive-parserfunction-category": "หน้าที่มีการเรียกใช้ฟังก์ชันแจงส่วนมากเกินไป",
        "post-expand-template-inclusion-warning": "<strong>คำเตือน:</strong> แม่แบบที่นำมารวมมีขนาดใหญ่เกินไป\nจะไม่รวมบางแม่แบบเข้ามา",
        "search-result-category-size": "$1 สมาชิก ($2 หมวดหมู่ย่อย, $3 ไฟล์)",
        "search-redirect": "(เปลี่ยนทาง $1)",
        "search-section": "(ส่วน $1)",
+       "search-category": "(หมวดหมู่ $1)",
        "search-file-match": "(เนื้อหาไฟล์ตรง)",
        "search-suggest": "คุณอาจหมายถึง: $1",
        "search-interwiki-caption": "โครงการพี่น้อง",
        "gender-female": "หญิง",
        "prefs-help-gender": "เลือกตั้งค่านี้หรือไม่ก็ได้\nซอฟต์แวร์ใช้ค่านี้เพื่อติดต่อคุณและกล่าวถึงคุณโดยใช้เพศทางไวยากรณ์ที่เหมาะสมเมื่อติดต่อผู้อื่น\nสารสนเทศนี้เปิดเผยต่อสาธารณะ",
        "email": "อีเมล",
-       "prefs-help-realname": "à¹\84มà¹\88à¸\88ำà¹\80à¸\9bà¹\87à¸\99à¸\95à¹\89อà¸\87à¹\83à¸\8aà¹\89à¸\8aืà¹\88อà¸\88ริà¸\87 \nà¸\96à¹\89าà¸\84ุà¸\93à¹\80ลือà¸\81à¹\83à¸\8aà¹\89à¸\8aืà¹\88อà¸\88ริà¸\87 à¸\88ะà¹\83à¸\8aà¹\89à¹\80à¸\9eืà¹\88อà¹\83หà¹\89à¹\80à¸\81ียรà¸\95ิà¹\81à¸\81à¹\88à¸\87าà¸\99à¸\82อà¸\87คุณ",
+       "prefs-help-realname": "à¹\84มà¹\88à¸\95à¹\89อà¸\87à¹\83à¸\8aà¹\89à¸\8aืà¹\88อà¸\88ริà¸\87 \nหาà¸\81à¹\83à¸\8aà¹\89 à¸\88ะà¹\83à¸\8aà¹\89à¹\80à¸\9eืà¹\88อà¸\9aà¹\88à¸\87à¸\8aีà¹\89à¸\87าà¸\99à¸\82อà¸\87à¸\84ุà¸\93วà¹\88ามาà¸\88าà¸\81คุณ",
        "prefs-help-email": "ไม่จำเป็นต้องใส่ที่อยู่อีเมล แต่จำเป็นสำหรับการตั้งรหัสผ่านใหม่หากคุณลืมรหัสผ่าน",
        "prefs-help-email-others": "คุณยังสามารถเลือกให้ผู้อื่นติดต่อคุณโดยอีเมลผ่านลิงก์บนหน้าผู้ใช้หรือหน้าพูดคุยกับผู้ใช้ของคุณ\nไม่เปิดเผยที่อยู่อีเมลของคุณเมื่อผู้ใช้อื่นติดต่อคุณ",
        "prefs-help-email-required": "ต้องการที่อยู่อีเมล",
        "movepagetalktext": "หน้าพูดคุยของหน้านี้จะถูกเปลี่ยนชื่อตามไปโดยอัตโนมัติ '''เว้นแต่:'''\n*มีหน้าพูดคุยภายใต้ชื่อใหม่อยู่แล้ว หรือ\n*คุณไม่เลือกกล่องด้านล่าง\n\nหากเกิดกรณีเหล่านี้ คุณจะต้องย้ายหรือรวมหน้าเองหากต้องการเปลี่ยนชื่อตามในภายหลัง",
        "movearticle": "เปลี่ยนชื่อ",
        "moveuserpage-warning": "'''คำเตือน''' คุณกำลังย้ายหน้าผู้ใช้ โปรดทราบว่าหน้าผู้ใช้เท่านั้นที่จะถูกเปลี่ยนชื่อ แต่ผู้ใช้จะ'''ไม่'''ถูกเปลี่ยนชื่อ",
+       "movecategorypage-warning": "<strong>คำเตือน:</strong> คุณกำลังย้ายหน้าหมวดหมู่ โปรดทราบว่า จะย้ายเฉพาะหน้าและทุกหน้าในหมวดหมู่เก่าจะ<em>ไม่</em>ถูกจัดเข้าหมวดหมู่ใหม่",
        "movenologintext": "ถ้าต้องการเปลี่ยนชื่อหน้านี้ ต้องเป็นผู้ใช้ลงทะเบียนและ[[Special:UserLogin|ล็อกอิน]]",
        "movenotallowed": "คุณไม่มีสิทธิเปลี่ยนชื่อหน้า",
        "movenotallowedfile": "คุณไม่มีสิทธิย้ายไฟล์",
        "cant-move-user-page": "คุณไม่มีสิทธิย้ายหน้าผู้ใช้ (แยกจากหน้าย่อย)",
        "cant-move-to-user-page": "คุณไม่มีสิทธิย้ายหน้าใด ๆ ไปเป็นหน้าผู้ใช้ (ยกเว้นหน้าย่อยของผู้ใช้)",
+       "cant-move-category-page": "คุณไม่มีสิทธิย้ายหน้าหมวดหมู่",
+       "cant-move-to-category-page": "คุณไม่มีสิทธิย้ายหน้าไปหน้าหมวดหมู่",
        "newtitle": "ไปชื่อเรื่องใหม่:",
        "move-watch": "เฝ้าดูหน้าต้นทางและหน้าปลายทาง",
        "movepagebtn": "เปลี่ยนชื่อ",
        "importlogpage": "ปูมการนำเข้า",
        "importlogpagetext": "นำเข้าไฟล์จากวิกิอื่น โดยผ่านทางผู้ดูแลระบบ",
        "import-logentry-upload": "นำเข้า [[$1]] ผ่านการอัปโหลดแล้ว",
-       "import-logentry-upload-detail": "$1 {{PLURAL:$1|รุ่นการแก้ไข|รุ่นการแก้ไข}}",
+       "import-logentry-upload-detail": "นำเข้า $1 {{PLURAL:$1|รุ่นการแก้ไข|รุ่นการแก้ไข}}",
        "import-logentry-interwiki": "นำเข้าข้ามวิกิ $1 แล้ว",
-       "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|รุ่นการแก้ไข|รุ่นการแก้ไข}}จาก $2",
+       "import-logentry-interwiki-detail": "นำเข้า $1 {{PLURAL:$1|รุ่นการแก้ไข|รุ่นการแก้ไข}}จาก $2",
        "javascripttest": "การทดสอบจาวาสคริปต์",
        "javascripttest-title": "กำลังดำเนินงานทดสอบ $1",
        "javascripttest-pagetext-noframework": "หน้านี้สงวนไว้สำหรับดำเนินงานการทดสอบจาวาสคริปต์",
        "tooltip-pt-mycontris": "รายการหน้าที่คุณเขียน",
        "tooltip-pt-login": "ไม่จำเป็นต้องล็อกอินในการแก้ไข แต่แนะนำอย่างยิ่งให้ล็อกอิน",
        "tooltip-pt-logout": "ล็อกเอาต์",
+       "tooltip-pt-createaccount": "สนับสนุนให้คุณสร้างบัญชีและล็อกอิน แต่ไม่บังคับ",
        "tooltip-ca-talk": "อภิปรายเกี่ยวกับหน้าเนื้อหา",
        "tooltip-ca-edit": "คุณสามารถแก้ไขหน้านี้ได้ โปรดใช้ปุ่มตัวอย่างก่อนบันทึก",
        "tooltip-ca-addsection": "เริ่มส่วนใหม่",
        "tooltip-feed-atom": "ฟีดอะตอม (Atom) ของหน้านี้",
        "tooltip-t-contributions": "รายการเรื่องที่เขียนโดยผู้ใช้นี้",
        "tooltip-t-emailuser": "ส่งอีเมลถึงผู้ใช้นี้",
+       "tooltip-t-info": "สารสนเทศเพิ่มเติมเกี่ยวกับหน้านี้",
        "tooltip-t-upload": "อัปโหลดไฟล์",
        "tooltip-t-specialpages": "รายการหน้าพิเศษทั้งหมด",
        "tooltip-t-print": "รุ่นที่พร้อมพิมพ์ของหน้านี้",
index 8dcc5d8..879e8ef 100644 (file)
        "edit-no-change": "Текстта үзгәешләр ясалмау сәбәпле, сезнең үзгәртү кире кагыла.",
        "edit-already-exists": "Яңа бит төзеп булмый.\nУл инде бар.",
        "editwarning-warning": "Башка биткә күчү вакытында бу мәкаләгә керткән үзгәрешләр югалырга мөмкин.\nӘгәрдә сез теркәлгән булсагыз, бу искәрмәне сез «Көйләнмәләрем» өлешендә үзгәртә аласыз.",
+       "duplicate-args-category": "Калыпны чакыруда кабатлап торган аргументларны кулланган битләр",
        "expensive-parserfunction-warning": "'''Игътибар:''' бу биттә хәтерне еш кулланучы функцияләр артык күп.\n\nЧикләү: $2 {{PLURAL:$2|1=куллану}}, бу очракта {{PLURAL:$1|$1 тапкыр}} башкарырга рөхсәт ителә.",
        "expensive-parserfunction-category": "Хәтерне еш кулланучы функцияләр күп булган битләр",
        "post-expand-template-inclusion-warning": "'''Игътибар:''' Кулланылучы үрнәкләр артык зур.\nКайберләре кабызылмаячак.",
index e534258..b1fc802 100644 (file)
        "nolicense": "Відсутнє",
        "licenses-edit": "Редагувати параметри ліцензії",
        "license-nopreview": "(Попередній перегляд недоступний)",
-       "upload_source_url": "(ви Ð²Ð¸Ð±Ñ\80али правильну, публічно доступну інтернет-адресу)",
+       "upload_source_url": "(введÑ\96Ñ\82Ñ\8c правильну, публічно доступну інтернет-адресу)",
        "upload_source_file": " (файл на вашому комп'ютері)",
        "listfiles-delete": "видалити",
        "listfiles-summary": "Ця спеціальна сторінка показує всі завантажені файли.",
index 60d9cf6..59d636c 100644 (file)
@@ -19,7 +19,8 @@
                        "محبوب عالم",
                        "පසිඳු කාවින්ද",
                        "아라",
-                       "Calak"
+                       "Calak",
+                       "عرفان ارشد"
                ]
        },
        "tog-underline": "ربط کی خط کشیدگی:",
        "newwindow": "(نـئی ونـڈو میـں)",
        "cancel": "منسوخ",
        "moredotdotdot": "اور...",
+       "morenotlisted": "یہ فہرست مکمل نہیں ہے-",
        "mypage": "میرا صفحہ",
        "mytalk": "میری گفتگو",
        "anontalk": "اس IP کیلیے بات چیت",
        "permalink": "مستقل کڑی",
        "print": "طباعت",
        "view": "منظر",
+       "view-foreign": "$1 پر دیکھیں",
        "edit": "ترمیم",
+       "edit-local": "ترمیم مقامی وضاحت",
        "create": "تخلیق",
+       "create-local": "ادخال مقامی وضاحت",
        "editthispage": "اس صفحہ میں ترمیم کریں",
        "create-this-page": "صفحہ ہٰذا تخلیق کیجئے",
        "delete": "حذف",
        "deletethispage": "یہ صفحہ حذف کریں",
+       "undeletethispage": "یہ صفحہ بحال کریں",
        "undelete_short": "بحال {{PLURAL:$1|ایک ترمیم|$1 ترامیم}}",
        "protect": "محفوظ",
        "protect_change": "تبدیل کرو",
index 78f36cd..4cb1ff4 100644 (file)
        "filerenameerror": "无法将文件“$1”重命名为“$2”。",
        "filedeleteerror": "无法删除文件“$1”。",
        "directorycreateerror": "无法创建目录“$1”。",
+       "directoryreadonlyerror": "目录“$1”是只读的。",
+       "directorynotreadableerror": "目录“$1”无法读取。",
        "filenotfound": "找不到文件“$1”。",
        "unexpected": "非正常值:“$1”=“$2”。",
        "formerror": "错误:无法提交表单",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
        "duplicate-args-category": "调用重复模板参数的页面",
-       "duplicate-args-category-desc": "页面包含使用重复参数的模板调用,例如<code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code>或<code><nowiki>{{foo|bar|1=baz}}</nowiki></code>。",
+       "duplicate-args-category-desc": "页面包含调用了重复参数的模板,例如<code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code>或<code><nowiki>{{foo|bar|1=baz}}</nowiki></code>。",
        "expensive-parserfunction-warning": "<strong>警告:</strong>这个页面有太多高昂的语法功能调用。\n\n它应该少过$2次呼叫,现在有$1次呼叫。",
        "expensive-parserfunction-category": "页面中有太多耗费的语法功能呼叫",
        "post-expand-template-inclusion-warning": "'''警告:'''包含模板大小过大。\n一些模板将不会包含。",
index 60dea73..94ce5a1 100644 (file)
@@ -72,9 +72,9 @@
        "tog-editondblclick": "開啟滑鼠雙擊編輯頁面",
        "tog-editsectiononrightclick": "開啟滑鼠右鍵點選章節標題編輯",
        "tog-watchcreations": "將我建立的頁面和上傳的檔案加入監視清單",
-       "tog-watchdefault": "將我編輯的頁面和檔案新增至監視清單",
+       "tog-watchdefault": "將我編輯的頁面和檔案加入監視清單",
        "tog-watchmoves": "將我移動的頁面和檔案加入監視清單",
-       "tog-watchdeletion": "將我刪除的頁面和檔案新增至監視清單",
+       "tog-watchdeletion": "將我刪除的頁面和檔案加入監視清單",
        "tog-watchrollback": "將我曾經還原的頁面新增至監視清單",
        "tog-minordefault": "預設標記所有的編輯為小修訂",
        "tog-previewontop": "顯示預覽於編輯框上方",
@@ -88,7 +88,7 @@
        "tog-fancysig": "將簽名視為 Wikitext 語言 (不自動產生連結)",
        "tog-uselivepreview": "使用即時預覽 (實驗中)",
        "tog-forceeditsummary": "未填寫編輯摘要時提示我",
-       "tog-watchlisthideown": "隱藏監視清單中我自己的編輯",
+       "tog-watchlisthideown": "隱藏監視清單中我的編輯",
        "tog-watchlisthidebots": "隱藏監視清單中機器人的編輯",
        "tog-watchlisthideminor": "隱藏監視清單中的小修訂",
        "tog-watchlisthideliu": "隱藏監視清單中已登入使用者的編輯",
        "projectpage": "檢視專案頁面",
        "imagepage": "檢視檔案頁面",
        "mediawikipage": "檢視訊息頁面",
-       "templatepage": "檢視樣頁面",
+       "templatepage": "檢視樣頁面",
        "viewhelppage": "檢視說明頁面",
        "categorypage": "檢視分類頁面",
        "viewtalkpage": "檢視討論頁面",
        "nstab-project": "專案頁面",
        "nstab-image": "檔案",
        "nstab-mediawiki": "訊息",
-       "nstab-template": "樣",
+       "nstab-template": "樣",
        "nstab-help": "說明頁面",
        "nstab-category": "分類",
        "nosuchaction": "無此動作",
        "filerenameerror": "無法重新命名檔案 \"$1\" 為 \"$2\"。",
        "filedeleteerror": "無法刪除檔案 \"$1\"。",
        "directorycreateerror": "無法建立目錄 \"$1\"。",
+       "directoryreadonlyerror": "目錄 \"$1\" 為唯讀。",
+       "directorynotreadableerror": "目錄 \"$1\" 無法讀取。",
        "filenotfound": "找不到檔案 \"$1\"。",
        "unexpected": "預期之外的資料:\"$1\"=\"$2\"。",
        "formerror": "錯誤:無法送出表單。",
        "cascadeprotectedwarning": "<strong>警告:</strong>本頁已經被保護,只有擁有管理員權限的使用者才可編輯,此頁面被下列頁面引用因此連鎖保護:",
        "titleprotectedwarning": "<strong>警告:本頁面已被保護,需要 [[Special:ListGroupRights|特殊權限]] 方可建立。</strong>\n以下提供最近的日誌以便參考:",
        "templatesused": "此頁面使用了以下{{PLURAL:$1|樣版}}:",
-       "templatesusedpreview": "此預覽使用了以下{{PLURAL:$1|樣版}}:",
+       "templatesusedpreview": "此預覽使用了以下{{PLURAL:$1|樣板}}:",
        "templatesusedsection": "此頁面使用了以下{{PLURAL:$1|樣版}}:",
        "template-protected": "(受保護)",
        "template-semiprotected": "(受半保護)",
        "duplicate-args-category-desc": "該頁面包含重複使用參數的樣版呼叫,如 <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> 或 <code><nowiki>{{foo|bar|1=baz}}</nowiki>。",
        "expensive-parserfunction-warning": "<strong>警告:</strong>此頁面使用了太多消耗系統資源的解析函數。\n\n使用次數應小於 $2 次,但目前使用了 $1 次。",
        "expensive-parserfunction-category": "使用了太多消耗系統資源的分析函數的頁面",
-       "post-expand-template-inclusion-warning": "<strong>警告:</strong>引用樣板後大小超出限制。\n部份樣內容將不會被使用。",
+       "post-expand-template-inclusion-warning": "<strong>警告:</strong>引用樣板後大小超出限制。\n部份樣內容將不會被使用。",
        "post-expand-template-inclusion-category": "引用樣板後大小超出限制的頁面",
        "post-expand-template-argument-warning": "<strong>警告:</strong>此頁面有一個以上的樣版參數過長。\n過長的參數會被直接忽略。",
-       "post-expand-template-argument-category": "樣參數有部份被忽略的頁面",
-       "parser-template-loop-warning": "偵測到樣遞迴:[[$1]]",
+       "post-expand-template-argument-category": "樣參數有部份被忽略的頁面",
+       "parser-template-loop-warning": "偵測到樣遞迴:[[$1]]",
        "parser-template-recursion-depth-warning": "超出樣版遞迴深度限制 ($1)",
        "language-converter-depth-warning": "已超出語言轉換器深度限制 ($1)",
        "node-count-exceeded-category": "節點數量超出限制的頁面",
        "email": "電子郵件",
        "prefs-help-realname": "真實姓名為選填欄位。\n若提供,真實姓名可能會用來作為您的作品的署名。",
        "prefs-help-email": "電子郵件位址為選填欄位。\n但在重設密碼時會使用,而您很有可能會忘記密。",
-       "prefs-help-email-others": "æ\82¨äº¦å\8f¯ä»¥é\81¸æ\93\87è®\93å\85¶ä»\96使ç\94¨è\80\85ç\94¨é\9b»å­\90é\83µä»¶è\88\87æ\82¨è\81¯ç¹«,透過您的使用者或對話頁面上方的連結。\n您的電子郵件位址不會實際告知給其他要聯絡您的使用者。",
+       "prefs-help-email-others": "æ\82¨äº¦å\8f¯ä»¥é\81¸æ\93\87è®\93å\85¶ä»\96使ç\94¨è\80\85ç\94¨é\9b»å­\90é\83µä»¶è\88\87æ\82¨è\81¯çµ¡,透過您的使用者或對話頁面上方的連結。\n您的電子郵件位址不會實際告知給其他要聯絡您的使用者。",
        "prefs-help-email-required": "電子郵件地址是必填項目。",
        "prefs-info": "基本資訊",
        "prefs-i18n": "國際化",
        "group-sysop": "管理員",
        "group-bureaucrat": "行政員",
        "group-suppress": "監督員",
-       "group-all": "(全部)",
+       "group-all": "(全部)",
        "group-user-member": "{{GENDER:$1|使用者}}",
        "group-autoconfirmed-member": "自動確認使用者",
        "group-bot-member": "機器人",
        "listduplicatedfiles": "重複檔案清單",
        "listduplicatedfiles-summary": "此清單中包含最新版本的檔案與其他檔案重複的清單,本清單只顯示本地檔案。",
        "listduplicatedfiles-entry": "[[:File:$1|$1]] 有[[$3|其他 $2 個重複檔案]]。",
-       "unusedtemplates": "未使用的樣",
+       "unusedtemplates": "未使用的樣",
        "unusedtemplatestext": "此頁面列出所有於 {{ns:template}} 命名空間下未被其他頁面引用的樣版。\n在刪除前,仍需檢查是否有連結這些樣版的其他頁面。",
        "unusedtemplateswlh": "其他連結",
        "randompage": "隨機頁面",
        "linksearch-pat": "搜尋關鍵字:",
        "linksearch-ns": "命名空間:",
        "linksearch-ok": "搜尋",
-       "linksearch-text": "可使用萬用字元如 \"*.wikipedia.org\"。\n萬用字元必須使用在最上層網域,例如 \"*.org\".<br />\n支援的{{PLURAL:$2|通訊協定}}有:<code>$1</code> (若未指定則預設使用 http:// 通訊協定)。",
+       "linksearch-text": "可使用萬用字元如 *.wikipedia.org。\n萬用字元必須使用在最上層網域,例如 *.org 。<br />\n支援的{{PLURAL:$2|通訊協定}}有:<code>$1</code> (若未指定則預設使用 http:// 通訊協定)。",
        "linksearch-line": "$1 由 $2 所連結",
        "linksearch-error": "萬用字元僅可在主機名稱的開頭使用。",
        "listusersfrom": "顯示使用者開始自:",
        "enotif_body_intro_deleted": "{{SITENAME}} $2 已刪除頁面 $1 於 $PAGEEDITDATE,詳見 $3。",
        "enotif_body_intro_created": "{{SITENAME}} 的頁面 $1 已於 $PAGEEDITDATE 被使用者 $2 {{GENDER:$2|建立}},詳見目前的修訂 $3。",
        "enotif_body_intro_moved": "{{SITENAME}} 的頁面 $1 已於 $PAGEEDITDATE 被使用者 $2 {{GENDER:$2|移動}},詳見目前的修訂 $3。",
-       "enotif_body_intro_restored": "{{SITENAME}} 的頁面 $1 已於 $PAGEEDITDATE 被使用者 $2 {{GENDER:$2|恢復}},詳見目前的修訂 $3。",
+       "enotif_body_intro_restored": "{{SITENAME}} 的頁面 $1 已於 $PAGEEDITDATE 被使用者 $2 {{GENDER:$2|還原}},詳見目前的修訂 $3。",
        "enotif_body_intro_changed": "{{SITENAME}} 的頁面 $1 已於 $PAGEEDITDATE 被使用者 $2 {{GENDER:$2|更改}},詳見目前的修訂 $3。",
        "enotif_lastvisited": "請參考 $1 檢視自您上次檢視後所有的變更。",
        "enotif_lastdiff": "請參考 $1 檢視此變更。",
        "unblock": "解除封鎖使用者",
        "blockip": "封鎖{{GENDER:$1|使用者}}",
        "blockip-legend": "封鎖使用者",
-       "blockiptext": "填寫以下單據可封鎖特定 IP 位址或使用者名稱的存取權限。\n這個動作應用來避免破壞行為,可根據 [[{{MediaWiki:Policy-url}}|管理政策]]。\n請在下方填寫一個具體的原因 (例如:引述一段破壞頁面的事實)。",
+       "blockiptext": "填寫以下表單可封鎖特定 IP 位址或使用者名稱的存取權限。\n這個動作應用來避免破壞行為,可根據 [[{{MediaWiki:Policy-url}}|管理政策]]。\n請在下方填寫一個具體的原因 (例如:引述一段破壞頁面的事實)。",
        "ipaddressorusername": "IP 位址或使用者名稱:",
        "ipbexpiry": "期限:",
        "ipbreason": "原因:",
        "lockedbyandtime": "(由 {{GENDER:$1|$1}} 於 $2 的 $3)",
        "move-page": "移動 $1",
        "move-page-legend": "移動頁面",
-       "movepagetext": "以下表格可以用來重新命名頁面,並將該頁面的所有歷史記錄一併移至擁有新名稱的頁面。\n舊標題的頁面將會變成重新導向頁面,指向使用新標題的頁面。\n您可以選擇自動更新所有指向舊頁面的重新導向,讓它們改為指向新頁面。\n若您選擇不自動更新,請檢查有沒有[[Special:DoubleRedirects|雙重重新導向]]或[[Special:BrokenRedirects|損壞的重新導向]]需要修正。\n您有責任讓連結繼續指向正確的地方。\n\n請注意,若新的頁面名稱已經被使用,則此頁面將<strong>不會</strong>移動至該處,除非新名稱下是個重新導向頁面而且沒有任何編輯記錄。\n即是說,您可以將錯誤移動至其他名稱的頁面還原到原有名稱,但不能覆蓋任何現有的頁面。\n\n<strong>警告!</strong>\n這個動作對受歡迎的頁面來說可能是重大而唐突的更改;\n在行動前請先確認您了解移動可能帶來的後果。",
-       "movepagetext-noredirectfixer": "以下表格可以用來重新命名頁面,並將該頁面的所有歷史記錄一併移至擁有新名稱的頁面。\n舊標題的頁面將會變成重新導向頁面,指向使用新標題的頁面。\n請檢查有沒有[[Special:DoubleRedirects|雙重重新導向]]或[[Special:BrokenRedirects|損壞的重新導向]]需要修正。\n您有責任讓連結繼續指向正確的地方。\n\n請注意,若新的頁面名稱已經被使用,則此頁面將<strong>不會</strong>移動至該處,除非新名稱下是個重新導向頁面而且沒有任何編輯記錄。\n即是說,您可以將錯誤移動至其他名稱的頁面還原到原有名稱,但不能覆蓋任何現有的頁面。\n\n<strong>警告!</strong>\n這個動作對受歡迎的頁面來說可能是重大而唐突的更改;\n在行動前請先確認您了解移動可能帶來的後果。",
+       "movepagetext": "以下表單可以用來重新命名一個頁面,並將該頁面的所有歷史記錄一併移至擁有新名稱的頁面。\n舊標題的頁面將會變成重新導向頁面,指向使用新標題的頁面。\n您可以選擇自動更新所有指向舊頁面的重新導向,讓它們改為指向新頁面。\n若您選擇不自動更新,請檢查有沒有[[Special:DoubleRedirects|雙重重新導向]]或[[Special:BrokenRedirects|損壞的重新導向]]需要修正。\n您有責任讓連結繼續指向正確的地方。\n\n請注意,若新的頁面名稱已經被使用,則此頁面將<strong>不會</strong>移動至該處,除非新名稱下是個重新導向頁面而且沒有任何編輯記錄。\n即是說,您可以將錯誤移動至其他名稱的頁面還原到原有名稱,但不能覆蓋任何現有的頁面。\n\n<strong>警告!</strong>\n這個動作對受歡迎的頁面來說可能是重大而唐突的更改;\n在行動前請先確認您了解移動可能帶來的後果。",
+       "movepagetext-noredirectfixer": "以下表單可以用來重新命名一個頁面,並將該頁面的所有歷史記錄一併移至擁有新名稱的頁面。\n舊標題的頁面將會變成重新導向頁面,指向使用新標題的頁面。\n請檢查有沒有[[Special:DoubleRedirects|雙重重新導向]]或[[Special:BrokenRedirects|損壞的重新導向]]需要修正。\n您有責任讓連結繼續指向正確的地方。\n\n請注意,若新的頁面名稱已經被使用,則此頁面將<strong>不會</strong>移動至該處,除非新名稱下是個重新導向頁面而且沒有任何編輯記錄。\n即是說,您可以將錯誤移動至其他名稱的頁面還原到原有名稱,但不能覆蓋任何現有的頁面。\n\n<strong>警告!</strong>\n這個動作對受歡迎的頁面來說可能是重大而唐突的更改;\n在行動前請先確認您了解移動可能帶來的後果。",
        "movepagetalktext": "相關的的對話頁面 (如果有的話) 會自動與該頁面一起移動,<strong>除非:</strong>\n*新的名稱已有一個存在的對話頁面,或\n*您未勾選此核選方塊。\n\n在上述情況下,若有必要您必須手動移動或合併已存在的頁面。",
        "movearticle": "移動頁面:",
        "moveuserpage-warning": "<strong>警告:</strong>您正要移動使用者頁面,請注意只有使用者頁面會變更名稱,並<em>不會</em>重新命名使用者。",
        "export-addnstext": "使用命名空間新增頁面:",
        "export-addns": "新增",
        "export-download": "儲存為檔案",
-       "export-templates": "包含樣",
+       "export-templates": "包含樣",
        "export-pagelinks": "包含連結的頁面深度:",
        "allmessages": "系統訊息",
        "allmessagesname": "名稱",
        "import-interwiki-sourcewiki": "來源 Wiki:",
        "import-interwiki-sourcepage": "來源頁面:",
        "import-interwiki-history": "複製此頁的所有歷史修訂",
-       "import-interwiki-templates": "包含所有樣",
+       "import-interwiki-templates": "包含所有樣",
        "import-interwiki-submit": "匯入",
        "import-interwiki-namespace": "目標命名空間:",
        "import-interwiki-rootpage": "目標根頁面 (選填):",
        "tooltip-ca-nstab-project": "檢視專案頁面",
        "tooltip-ca-nstab-image": "檢視檔案頁面",
        "tooltip-ca-nstab-mediawiki": "檢視系統訊息",
-       "tooltip-ca-nstab-template": "檢視樣",
+       "tooltip-ca-nstab-template": "檢視樣",
        "tooltip-ca-nstab-help": "檢視說明頁面",
        "tooltip-ca-nstab-category": "檢視分類頁面",
        "tooltip-minoredit": "標記為小修訂",
        "confirmemail_success": "您的電子郵件已經被確認。您現在可以[[Special:UserLogin|登入]]並使用此網站了。",
        "confirmemail_loggedin": "已確認您的電子郵件位址。",
        "confirmemail_subject": "{{SITENAME}} 電子郵件位址確認",
-       "confirmemail_body": "不明人士 (可能是您自己,來自 IP 位址 $1)  已在 {{SITENAME}} 註冊了一個帳號 \"$2\" 並使用了此電子郵件位址。\n\n請確認這個帳號是屬於您的,並使用瀏覽器開啟下方連結以啟用在 {{SITENAME}} 上的電子郵件功能:\n\n$3\n\n若您 *未* 註冊此帳號,\n請開啟下方連結取消電子郵件確認:\n\n$5\n\n此確認代碼會於 $4 過期。",
+       "confirmemail_body": "不明人士(可能是您自己,來自 IP 位址 $1 )已在 {{SITENAME}} 註冊了一個帳號 \"$2\" 並使用了此電子郵件位址。\n\n請確認這個帳號是屬於您的,並使用瀏覽器開啟下方連結以啟用在 {{SITENAME}} 上的電子郵件功能:\n\n$3\n\n若您 *未* 註冊此帳號,\n請開啟下方連結取消電子郵件確認:\n\n$5\n\n此確認代碼會於 $4 過期。",
        "confirmemail_body_changed": "不明人士 (可能是您自己,來自 IP 位址 $1)  已將在 {{SITENAME}} 帳號 \"$2\" 的電子郵件位址更改至此。\n\n請確認這個帳號是屬於您的,並使用瀏覽器開啟下方連結以啟用在 {{SITENAME}} 上的電子郵件功能:\n\n$3\n\n若您 *未* 註冊此帳號,\n請開啟下方連結取消電子郵件確認:\n\n$5\n\n此確認代碼會於 $4 過期。",
-       "confirmemail_body_set": "不明人士 (可能是您自己,來自 IP 位址 $1)  已將在 {{SITENAME}} 帳號 \"$2\" 的電子郵件位址設定至此。\n\n請確認這個帳號是屬於您的,並使用瀏覽器開啟下方連結以啟用在 {{SITENAME}} 上的電子郵件功能:\n\n$3\n\n若您 *未* 註冊此帳號,\n請開啟下方連結取消電子郵件確認:\n\n$5\n\n此確認代碼會於 $4 過期。",
+       "confirmemail_body_set": "不明人士(可能是您自己,來自 IP 位址 $1 )已將在 {{SITENAME}} 帳號 \"$2\" 的電子郵件位址設定至此。\n\n請確認這個帳號是屬於您的,並使用瀏覽器開啟下方連結以啟用在 {{SITENAME}} 上的電子郵件功能:\n\n$3\n\n若您 *未* 註冊此帳號,\n請開啟下方連結取消電子郵件確認:\n\n$5\n\n此確認代碼會於 $4 過期。",
        "confirmemail_invalidated": "已取消電子郵件位址確認",
        "invalidateemail": "取消電子郵件確認",
        "scarytranscludedisabled": "[Interwiki 轉換代碼不可用]",
-       "scarytranscludefailed": "[樣 $1 讀取失敗]",
-       "scarytranscludefailed-httpstatus": "[樣 $1 讀取失敗:HTTP $2]",
+       "scarytranscludefailed": "[樣 $1 讀取失敗]",
+       "scarytranscludefailed-httpstatus": "[樣 $1 讀取失敗:HTTP $2]",
        "scarytranscludetoolong": "[URL 過長]",
        "deletedwhileediting": "<strong>警告:</strong>此頁在您開始編輯之後已經被刪除﹗",
        "confirmrecreate": "在您編輯的同時,使用者 [[User:$1|$1]] ([[User talk:$1|對話]]) 刪除了此頁面,原因為:\n: <em>$2</em>\n請確認您是否真的要重新建立此頁面。",
        "redirect-revision": "頁面修訂 ID",
        "redirect-file": "檔案名稱",
        "redirect-not-exists": "查無值",
-       "fileduplicatesearch": "æ\90\9cå°\8bé\87\8dè¦\86檔案",
+       "fileduplicatesearch": "æ\90\9cå°\8bé\87\8dè¤\87檔案",
        "fileduplicatesearch-summary": "依據雜湊值 (Hash) 來搜尋重複的檔案。",
        "fileduplicatesearch-legend": "搜尋重覆",
        "fileduplicatesearch-filename": "檔案名稱:",
        "fileduplicatesearch-submit": "搜尋",
        "fileduplicatesearch-info": "$1 × $2 像素<br />檔案大小:$3<br />MIME 類型:$4",
-       "fileduplicatesearch-result-1": "æª\94æ¡\88 $1 ç\84¡é\87\8dè¦\86的檔案。",
+       "fileduplicatesearch-result-1": "æª\94æ¡\88 $1 ç\84¡é\87\8dè¤\87的檔案。",
        "fileduplicatesearch-result-n": "檔案 $1 有 $2 筆重覆的檔案。",
        "fileduplicatesearch-noresults": "查無名稱為 \"$1\" 的檔案。",
        "specialpages": "特殊頁面",
        "limitreport-ppgeneratednodes": "預處理器產生節點次數",
        "limitreport-postexpandincludesize": "展開後的引用大小",
        "limitreport-postexpandincludesize-value": "$1/$2 個{{PLURAL:$2|位元組}}",
-       "limitreport-templateargumentsize": "樣參數大小",
+       "limitreport-templateargumentsize": "樣參數大小",
        "limitreport-templateargumentsize-value": "$1/$2 個{{PLURAL:$2|位元組}}",
        "limitreport-expansiondepth": "最高展開深度",
        "limitreport-expensivefunctioncount": "高消耗解析器函數次數",
-       "expandtemplates": "展開樣",
+       "expandtemplates": "展開樣",
        "expand_templates_intro": "本特殊頁面會將文字中的樣版展開,可以包含支援的解析器語法,如 <code><nowiki>{{</nowiki>#language:…}}</code> 與變數如 <code><nowiki>{{</nowiki>CURRENTDAY}}</code>。\n實際上,絕大部分在雙括號中的內容都會被展開。",
        "expand_templates_title": "上下文標題,用於 {{FULLPAGENAME}} 等:",
        "expand_templates_input": "輸入文字:",
diff --git a/maintenance/generateLocalAutoload.php b/maintenance/generateLocalAutoload.php
new file mode 100644 (file)
index 0000000..78e66b7
--- /dev/null
@@ -0,0 +1,21 @@
+<?php
+
+require_once __DIR__ . '/../includes/utils/AutoloadGenerator.php';
+
+// Mediawiki installation directory
+$base = dirname( __DIR__ );
+
+$generator = new AutoloadGenerator( $base, 'local' );
+foreach ( array( 'includes', 'languages', 'maintenance', 'mw-config' ) as $dir ) {
+       $generator->readDir( $base . '/' . $dir );
+}
+foreach ( glob( $base . '/*.php' ) as $file ) {
+       $generator->readFile( $file );
+}
+
+// This class is not defined, but might be added by the installer
+$generator->forceClassPath( 'MyLocalSettingsGenerator', "$base/mw-config/overrides.php" );
+
+// Write out the autoload
+$generator->generateAutoload();
+
index 2aaf960..ddf9ff7 100644 (file)
@@ -4,5 +4,8 @@
                        "Robin0van0der0vliet"
                ]
        },
+       "ooui-toolbar-more": "Mear",
+       "ooui-toolgroup-expand": "Mear",
+       "ooui-dialog-message-accept": "OK",
        "ooui-dialog-message-reject": "Annulearje"
 }
index 81690ab..cadc416 100644 (file)
@@ -25,5 +25,6 @@
        "ooui-dialog-message-reject": "ביטול",
        "ooui-dialog-process-error": "משהו השתבש",
        "ooui-dialog-process-dismiss": "לוותר",
-       "ooui-dialog-process-retry": "לנסות שוב"
+       "ooui-dialog-process-retry": "לנסות שוב",
+       "ooui-dialog-process-continue": "המשך"
 }
index 81a91ed..b37beae 100644 (file)
@@ -8,9 +8,12 @@
        "ooui-outline-control-move-up": "Ipangato ti banag",
        "ooui-outline-control-remove": "Ikkaten ti banag",
        "ooui-toolbar-more": "Adu pay",
+       "ooui-toolgroup-expand": "Adu pay",
+       "ooui-toolgroup-collapse": "Basbassit",
        "ooui-dialog-message-accept": "Sige",
        "ooui-dialog-message-reject": "Ukasen",
        "ooui-dialog-process-error": "Adda madi a napasamak",
        "ooui-dialog-process-dismiss": "Pugsayen",
-       "ooui-dialog-process-retry": "Padasen manen"
+       "ooui-dialog-process-retry": "Padasen manen",
+       "ooui-dialog-process-continue": "Agtuloy"
 }
index 6442342..ec86124 100644 (file)
@@ -5,7 +5,8 @@
                        "Miya",
                        "Penn Station",
                        "Shirayuki",
-                       "Takot"
+                       "Takot",
+                       "Los688"
                ]
        },
        "ooui-outline-control-move-down": "項目を下に移動させる",
@@ -18,5 +19,6 @@
        "ooui-dialog-message-reject": "キャンセル",
        "ooui-dialog-process-error": "エラーが発生しました…",
        "ooui-dialog-process-dismiss": "閉じる",
-       "ooui-dialog-process-retry": "もう一度お試しください"
+       "ooui-dialog-process-retry": "もう一度お試しください",
+       "ooui-dialog-process-continue": "続行"
 }
index b79ab50..60ef661 100644 (file)
        },
        "ooui-outline-control-move-down": "ელემენტის ქვემოთ გადატანა",
        "ooui-outline-control-move-up": "ელემენტის ზემოთ გადატანა",
-       "ooui-toolbar-more": "მეტი"
+       "ooui-outline-control-remove": "წაშლა",
+       "ooui-toolbar-more": "მეტი",
+       "ooui-toolgroup-expand": "მეტი",
+       "ooui-toolgroup-collapse": "რამდენიმე",
+       "ooui-dialog-message-accept": "კარგი",
+       "ooui-dialog-message-reject": "გაუქმება",
+       "ooui-dialog-process-error": "მოხდა რაღაც შეცდომა",
+       "ooui-dialog-process-dismiss": "დამალვა",
+       "ooui-dialog-process-retry": "კიდევ სცადეთ",
+       "ooui-dialog-process-continue": "გაგრძელება"
 }
index a7b4c08..7c7b176 100644 (file)
        "ooui-outline-control-move-up": "Item omhoog verplaatsen",
        "ooui-outline-control-remove": "Item verwijderen",
        "ooui-toolbar-more": "Meer",
+       "ooui-toolgroup-expand": "Meer",
+       "ooui-toolgroup-collapse": "Minder",
        "ooui-dialog-message-accept": "OK",
        "ooui-dialog-message-reject": "Annuleren",
        "ooui-dialog-process-error": "Er is iets misgegaan",
        "ooui-dialog-process-dismiss": "Sluiten",
-       "ooui-dialog-process-retry": "Opnieuw proberen"
+       "ooui-dialog-process-retry": "Opnieuw proberen",
+       "ooui-dialog-process-continue": "Doorgaan"
 }
index dea65eb..fbd0c8c 100644 (file)
@@ -23,6 +23,8 @@
        "ooui-outline-control-move-up": "Przenieś wyżej",
        "ooui-outline-control-remove": "Usuń element",
        "ooui-toolbar-more": "Więcej",
+       "ooui-toolgroup-expand": "Więcej",
+       "ooui-toolgroup-collapse": "Mniej",
        "ooui-dialog-message-accept": "OK",
        "ooui-dialog-message-reject": "Anuluj",
        "ooui-dialog-process-error": "Coś poszło nie tak",
index d261e2d..7b3176f 100644 (file)
@@ -18,6 +18,7 @@
        "ooui-outline-control-remove": "Remover elemento",
        "ooui-toolbar-more": "Mais",
        "ooui-toolgroup-expand": "Mais",
+       "ooui-toolgroup-collapse": "Menos",
        "ooui-dialog-message-accept": "Aceitar",
        "ooui-dialog-message-reject": "Cancelar",
        "ooui-dialog-process-error": "Algo correu mal",
index 0145017..122d4a2 100644 (file)
@@ -4,7 +4,10 @@
                        "Jayarathina",
                        "Sank",
                        "Shanmugamp7",
-                       "மதனாஹரன்"
+                       "மதனாஹரன்",
+                       "ElangoRamanujam"
                ]
-       }
+       },
+       "ooui-toolgroup-expand": "மேலும்",
+       "ooui-dialog-process-continue": "தொடரவும்"
 }
index 1110669..3fd8d36 100644 (file)
@@ -13,7 +13,8 @@
                        "Simon Shek",
                        "Spring Roll Conan",
                        "Waihorace",
-                       "Cwlin0416"
+                       "Cwlin0416",
+                       "LNDDYL"
                ]
        },
        "ooui-outline-control-move-down": "項目下移",
@@ -26,5 +27,6 @@
        "ooui-dialog-message-reject": "取消",
        "ooui-dialog-process-error": "發生不明錯誤",
        "ooui-dialog-process-dismiss": "關閉",
-       "ooui-dialog-process-retry": "再試一次"
+       "ooui-dialog-process-retry": "再試一次",
+       "ooui-dialog-process-continue": "繼續"
 }
index 4cac5e5..f633de2 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (12b66051ff)
+ * OOjs UI v0.1.0-pre (fe4076af75)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-11-06T19:08:43Z
+ * Date: 2014-11-13T22:25:27Z
  */
 /* @noflip */
 .oo-ui-rtl {
        font-size: 1em;
        font-family: sans-serif;
        background-color: #ffffff;
+       color: black;
        border: solid 1px #cccccc;
        box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #dddddd;
        border-radius: 0.25em;
        border-color: #a7dcff;
        box-shadow: 0 0 0.3em #a7dcff, 0 0 0 white;
 }
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
-       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
-}
-.oo-ui-textInputWidget input[readonly],
-.oo-ui-textInputWidget textarea[readonly] {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly],
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly] {
        color: #777777;
 }
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
-       background-color: transparent;
-}
 .oo-ui-textInputWidget.oo-ui-widget-disabled input,
-.oo-ui-textInputWidget.oo-ui-widget-disabled input:focus,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea:focus {
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea {
        color: #cccccc;
        text-shadow: 0 1px 1px #ffffff;
        border-color: #dddddd;
        background-color: #f3f3f3;
 }
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
+       background-color: transparent;
+       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
+}
 .oo-ui-textInputWidget .oo-ui-iconElement-icon,
 .oo-ui-textInputWidget .oo-ui-indicatorElement-indicator {
        opacity: 0.8;
        height: 0;
        overflow: hidden;
 }
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-load {
        width: auto;
        height: auto;
        top: 0;
        width: 100%;
        height: 100%;
 }
+.oo-ui-windowManager-modal > .oo-ui-dialog .oo-ui-window-frame {
+       visibility: hidden;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
+       visibility: visible;
+}
 .oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
        width: 100%;
        height: 100%;
             -o-transition: all 250ms ease-in-out;
                transition: all 250ms ease-in-out;
 }
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-load {
        opacity: 1;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
index a2edf03..c61b3b9 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (12b66051ff)
+ * OOjs UI v0.1.0-pre (fe4076af75)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-11-06T19:08:33Z
+ * Date: 2014-11-13T22:25:17Z
  */
 /* Instantiation */
 
index 5bf6e69..23313e5 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (12b66051ff)
+ * OOjs UI v0.1.0-pre (fe4076af75)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-11-06T19:08:43Z
+ * Date: 2014-11-13T22:25:27Z
  */
 /* @noflip */
 .oo-ui-rtl {
        font-size: 1em;
        font-family: sans-serif;
        background-color: #ffffff;
+       color: black;
        border: solid 1px #cccccc;
        box-shadow: 0 0 0 white, inset 0 0.1em 0.2em #dddddd;
        border-radius: 0.25em;
        border-color: #a7dcff;
        box-shadow: 0 0 0.3em #a7dcff, 0 0 0 white;
 }
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
-       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
-}
-.oo-ui-textInputWidget input[readonly],
-.oo-ui-textInputWidget textarea[readonly] {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly],
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly] {
        color: #777777;
 }
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
-       background-color: transparent;
-}
 .oo-ui-textInputWidget.oo-ui-widget-disabled input,
-.oo-ui-textInputWidget.oo-ui-widget-disabled input:focus,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea:focus {
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea {
        color: #cccccc;
        text-shadow: 0 1px 1px #ffffff;
        border-color: #dddddd;
        background-color: #f3f3f3;
 }
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
+       background-color: transparent;
+       background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
+}
 .oo-ui-textInputWidget .oo-ui-iconElement-icon,
 .oo-ui-textInputWidget .oo-ui-indicatorElement-indicator {
        opacity: 0.8;
        height: 0;
        overflow: hidden;
 }
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-load {
        width: auto;
        height: auto;
        top: 0;
        width: 100%;
        height: 100%;
 }
+.oo-ui-windowManager-modal > .oo-ui-dialog .oo-ui-window-frame {
+       visibility: hidden;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
+       visibility: visible;
+}
 .oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
        width: 100%;
        height: 100%;
             -o-transition: all 250ms ease-in-out;
                transition: all 250ms ease-in-out;
 }
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-load {
        opacity: 1;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
index 90355a2..f13404b 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (12b66051ff)
+ * OOjs UI v0.1.0-pre (fe4076af75)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-11-06T19:08:43Z
+ * Date: 2014-11-13T22:25:27Z
  */
 /* @noflip */
 .oo-ui-rtl {
        font-size: 1em;
        font-family: sans-serif;
        background-color: #ffffff;
+       color: black;
        border: solid 1px #cccccc;
        box-shadow: inset 0 0 0 0 #0274ff;
        border-radius: 0.1em;
        border-color: #aaaaaa;
        box-shadow: inset 0.4em 0 0 0 #0274ff;
 }
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
-       background-image: /* @embed */ url(themes/mediawiki/images/textures/pending.gif);
-}
-.oo-ui-textInputWidget input[readonly],
-.oo-ui-textInputWidget textarea[readonly] {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly],
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly] {
        color: #777777;
        text-shadow: 0 1px 1px #ffffff;
 }
-.oo-ui-textInputWidget input[readonly]:focus,
-.oo-ui-textInputWidget textarea[readonly]:focus {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly]:focus,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly]:focus {
        box-shadow: inset 0.4em 0 0 0 #cccccc;
 }
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
-       background-color: transparent;
-}
 .oo-ui-textInputWidget.oo-ui-widget-disabled input,
-.oo-ui-textInputWidget.oo-ui-widget-disabled input:focus,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea:focus {
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea {
        color: #cccccc;
        text-shadow: 0 1px 1px #ffffff;
        border-color: #dddddd;
        background-color: #f3f3f3;
 }
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
+       background-color: transparent;
+       background-image: /* @embed */ url(themes/mediawiki/images/textures/pending.gif);
+}
 .oo-ui-textInputWidget.oo-ui-iconElement input,
 .oo-ui-textInputWidget.oo-ui-iconElement textarea {
        padding-left: 2.4em;
        height: 0;
        overflow: hidden;
 }
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-load {
        width: auto;
        height: auto;
        top: 0;
        width: 100%;
        height: 100%;
 }
+.oo-ui-windowManager-modal > .oo-ui-dialog .oo-ui-window-frame {
+       visibility: hidden;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
+       visibility: visible;
+}
 .oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
        width: 100%;
        height: 100%;
             -o-transition: all 250ms ease-in-out;
                transition: all 250ms ease-in-out;
 }
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-load {
        opacity: 1;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
index cd436e2..856be2a 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (12b66051ff)
+ * OOjs UI v0.1.0-pre (fe4076af75)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-11-06T19:08:33Z
+ * Date: 2014-11-13T22:25:17Z
  */
 /**
  * @class
index 0d399f9..b901a4c 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (12b66051ff)
+ * OOjs UI v0.1.0-pre (fe4076af75)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-11-06T19:08:43Z
+ * Date: 2014-11-13T22:25:27Z
  */
 /* @noflip */
 .oo-ui-rtl {
        font-size: 1em;
        font-family: sans-serif;
        background-color: #ffffff;
+       color: black;
        border: solid 1px #cccccc;
        box-shadow: inset 0 0 0 0 #0274ff;
        border-radius: 0.1em;
        border-color: #aaaaaa;
        box-shadow: inset 0.4em 0 0 0 #0274ff;
 }
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
-       background-image: /* @embed */ url(themes/mediawiki/images/textures/pending.gif);
-}
-.oo-ui-textInputWidget input[readonly],
-.oo-ui-textInputWidget textarea[readonly] {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly],
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly] {
        color: #777777;
        text-shadow: 0 1px 1px #ffffff;
 }
-.oo-ui-textInputWidget input[readonly]:focus,
-.oo-ui-textInputWidget textarea[readonly]:focus {
+.oo-ui-textInputWidget.oo-ui-widget-enabled input[readonly]:focus,
+.oo-ui-textInputWidget.oo-ui-widget-enabled textarea[readonly]:focus {
        box-shadow: inset 0.4em 0 0 0 #cccccc;
 }
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
-.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
-       background-color: transparent;
-}
 .oo-ui-textInputWidget.oo-ui-widget-disabled input,
-.oo-ui-textInputWidget.oo-ui-widget-disabled input:focus,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea,
-.oo-ui-textInputWidget.oo-ui-widget-disabled textarea:focus {
+.oo-ui-textInputWidget.oo-ui-widget-disabled textarea {
        color: #cccccc;
        text-shadow: 0 1px 1px #ffffff;
        border-color: #dddddd;
        background-color: #f3f3f3;
 }
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending input,
+.oo-ui-textInputWidget.oo-ui-pendingElement-pending textarea {
+       background-color: transparent;
+       background-image: /* @embed */ url(themes/mediawiki/images/textures/pending.gif);
+}
 .oo-ui-textInputWidget.oo-ui-iconElement input,
 .oo-ui-textInputWidget.oo-ui-iconElement textarea {
        padding-left: 2.4em;
        height: 0;
        overflow: hidden;
 }
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-setup {
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-load {
        width: auto;
        height: auto;
        top: 0;
        width: 100%;
        height: 100%;
 }
+.oo-ui-windowManager-modal > .oo-ui-dialog .oo-ui-window-frame {
+       visibility: hidden;
+}
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
+       visibility: visible;
+}
 .oo-ui-windowManager-fullscreen > .oo-ui-dialog > .oo-ui-window-frame {
        width: 100%;
        height: 100%;
             -o-transition: all 250ms ease-in-out;
                transition: all 250ms ease-in-out;
 }
-.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready {
+.oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-load {
        opacity: 1;
 }
 .oo-ui-windowManager-modal > .oo-ui-dialog.oo-ui-window-ready > .oo-ui-window-frame {
index 387df23..d781397 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * OOjs UI v0.1.0-pre (12b66051ff)
+ * OOjs UI v0.1.0-pre (fe4076af75)
  * https://www.mediawiki.org/wiki/OOjs_UI
  *
  * Copyright 2011–2014 OOjs Team and other contributors.
  * Released under the MIT license
  * http://oojs.mit-license.org
  *
- * Date: 2014-11-06T19:08:33Z
+ * Date: 2014-11-13T22:25:17Z
  */
 ( function ( OO ) {
 
@@ -93,6 +93,30 @@ OO.ui.getLocalValue = function ( obj, lang, fallback ) {
        return undefined;
 };
 
+/**
+ * Check if a node is contained within another node
+ *
+ * Similar to jQuery#contains except a list of containers can be supplied
+ * and a boolean argument allows you to include the container in the match list
+ *
+ * @param {HTMLElement|HTMLElement[]} containers Container node(s) to search in
+ * @param {HTMLElement} contained Node to find
+ * @param {boolean} [matchContainers] Include the container(s) in the list of nodes to match, otherwise only match descendents
+ * @returns {boolean} The node is in the list of target nodes
+ */
+OO.ui.contains = function ( containers, contained, matchContainers ) {
+       var i;
+       if ( !Array.isArray( containers ) ) {
+               containers = [ containers ];
+       }
+       for ( i = containers.length - 1; i >= 0; i-- ) {
+               if ( ( matchContainers && contained === containers[i] ) || $.contains( containers[i], contained ) ) {
+                       return true;
+               }
+       }
+       return false;
+};
+
 ( function () {
        /**
         * Message store for the default implementation of OO.ui.msg
@@ -202,6 +226,7 @@ OO.ui.getLocalValue = function ( obj, lang, fallback ) {
  *
  * @constructor
  * @param {Object} [config] Configuration options
+ * @cfg {jQuery} [$pending] Element to mark as pending, defaults to this.$element
  */
 OO.ui.PendingElement = function OoUiPendingElement( config ) {
        // Configuration initialization
@@ -1438,7 +1463,6 @@ OO.ui.Widget.prototype.updateDisabled = function () {
  * @param {Object} [config] Configuration options
  * @cfg {string} [size] Symbolic name of dialog size, `small`, `medium`, `large` or `full`; omit to
  *   use #static-size
- * @fires initialize
  */
 OO.ui.Window = function OoUiWindow( config ) {
        // Configuration initialization
@@ -1820,7 +1844,7 @@ OO.ui.Window.prototype.getTeardownProcess = function () {
  * instead of display.
  *
  * @param {boolean} [show] Make window visible, omit to toggle visibility
- * @fires visible
+ * @fires toggle
  * @chainable
  */
 OO.ui.Window.prototype.toggle = function ( show ) {
@@ -2081,7 +2105,7 @@ OO.ui.Window.prototype.teardown = function ( data ) {
 
        this.getTeardownProcess( data ).execute().done( function () {
                // Force redraw by asking the browser to measure the elements' widths
-               win.$element.removeClass( 'oo-ui-window-setup' ).width();
+               win.$element.removeClass( 'oo-ui-window-load oo-ui-window-setup' ).width();
                win.$content.removeClass( 'oo-ui-window-content-setup' ).width();
                win.$element.hide();
                win.visible = false;
@@ -2094,10 +2118,9 @@ OO.ui.Window.prototype.teardown = function ( data ) {
 /**
  * Load the frame contents.
  *
- * Once the iframe's stylesheets are loaded, the `load` event will be emitted and the returned
- * promise will be resolved. Calling while loading will return a promise but not trigger a new
- * loading cycle. Calling after loading is complete will return a promise that's already been
- * resolved.
+ * Once the iframe's stylesheets are loaded the returned promise will be resolved. Calling while
+ * loading will return a promise but not trigger a new loading cycle. Calling after loading is
+ * complete will return a promise that's already been resolved.
  *
  * Sounds simple right? Read on...
  *
@@ -2126,12 +2149,13 @@ OO.ui.Window.prototype.teardown = function ( data ) {
  * All this stylesheet injection and polling magic is in #transplantStyles.
  *
  * @return {jQuery.Promise} Promise resolved when loading is complete
- * @fires load
  */
 OO.ui.Window.prototype.load = function () {
        var sub, doc, loading,
                win = this;
 
+       this.$element.addClass( 'oo-ui-window-load' );
+
        // Non-isolated windows are already "loaded"
        if ( !this.loading && !this.isolated ) {
                this.loading = $.Deferred().resolve();
@@ -2855,13 +2879,10 @@ OO.ui.WindowManager.prototype.openWindow = function ( win, data ) {
 
        // Window opening
        if ( opening.state() !== 'rejected' ) {
-               // Begin loading the window if it's not loading or loaded already - may take noticable time
-               // and we want to do this in parallel with any other preparatory actions
-               if ( !win.isLoading() && !win.isLoaded() ) {
-                       // Finish initializing the window (must be done after manager is attached to DOM)
+               if ( !win.getManager() ) {
                        win.setManager( this );
-                       preparing.push( win.load() );
                }
+               preparing.push( win.load() );
 
                if ( this.closing ) {
                        // If a window is currently closing, wait for it to complete
@@ -7477,7 +7498,9 @@ OO.ui.PopupToolGroup.prototype.onBlur = function ( e ) {
  */
 OO.ui.PopupToolGroup.prototype.onPointerUp = function ( e ) {
        // e.which is 0 for touch events, 1 for left mouse button
-       if ( !this.isDisabled() && e.which <= 1 ) {
+       // Only close toolgroup when a tool was actually selected
+       // FIXME: this duplicates logic from the parent class
+       if ( !this.isDisabled() && e.which <= 1 && this.pressed && this.pressed === this.getTargetTool( e ) ) {
                this.setActive( false );
        }
        return OO.ui.PopupToolGroup.super.prototype.onPointerUp.call( this, e );
@@ -9928,7 +9951,6 @@ OO.ui.LabelWidget.prototype.onClick = function () {
  * @constructor
  * @param {Mixed} data Option data
  * @param {Object} [config] Configuration options
- * @cfg {string} [rel] Value for `rel` attribute in DOM, allowing per-option styling
  */
 OO.ui.OptionWidget = function OoUiOptionWidget( data, config ) {
        // Configuration initialization
@@ -9951,7 +9973,6 @@ OO.ui.OptionWidget = function OoUiOptionWidget( data, config ) {
        // Initialization
        this.$element
                .data( 'oo-ui-optionWidget', this )
-               .attr( 'rel', config.rel )
                .attr( 'role', 'option' )
                .addClass( 'oo-ui-optionWidget' )
                .append( this.$label );
@@ -11493,7 +11514,10 @@ OO.mixinClass( OO.ui.MenuWidget, OO.ui.ClippableElement );
  * @param {jQuery.Event} e Key down event
  */
 OO.ui.MenuWidget.prototype.onDocumentMouseDown = function ( e ) {
-       if ( !$.contains( this.$element[0], e.target ) && ( !this.$widget || !$.contains( this.$widget[0], e.target ) ) ) {
+       if (
+               !OO.ui.contains( this.$element[0], e.target, true ) &&
+               ( !this.$widget || !OO.ui.contains( this.$widget[0], e.target, true ) )
+       ) {
                this.toggle( false );
        }
 };
index 55f2f89..14f6aee 100644 (file)
@@ -20,7 +20,7 @@
 
 .mw-changeslist-legend dt {
        float: left;
-       margin-right: 0.5em;
+       margin: 0 0.5em 0 0;
 }
 
 .mw-changeslist-legend dd {
index 592a309..499b91a 100644 (file)
 // You generally don't need to use this class if <label> is within an Agora
 // form container such as mw-ui-vform
 .mw-ui-label {
-       .agora-label-styling(); // mixins/forms.less
+       .agora-label-styling();
 }
 
 // Nesting an input  inside a label with this class
 // improves alignment, e.g.
-//     <label class="mw-ui-radio-label">
-//             <input type="radio">The label text
-//     </label>
+//
+// <label class="mw-ui-radio-label">
+//   <input type="radio">The label text
+// </label>
 .mw-ui-radio-label {
        .agora-inline-label-styling();
 }
index 7391afd..d35ec26 100644 (file)
@@ -55,7 +55,10 @@ $wgAutoloadClasses += array(
 
        # tests/phpunit/includes/api
        'ApiFormatTestBase' => "$testDir/phpunit/includes/api/format/ApiFormatTestBase.php",
+       'ApiQueryTestBase' => "$testDir/phpunit/includes/api/query/ApiQueryTestBase.php",
+       'ApiQueryContinueTestBase' => "$testDir/phpunit/includes/api/query/ApiQueryContinueTestBase.php",
        'ApiTestCase' => "$testDir/phpunit/includes/api/ApiTestCase.php",
+       'ApiTestCaseUpload' => "$testDir/phpunit/includes/api/ApiTestCaseUpload.php",
        'ApiTestContext' => "$testDir/phpunit/includes/api/ApiTestContext.php",
        'MockApi' => "$testDir/phpunit/includes/api/MockApi.php",
        'MockApiQueryBase' => "$testDir/phpunit/includes/api/MockApiQueryBase.php",
@@ -79,6 +82,9 @@ $wgAutoloadClasses += array(
        'PageORMTableForTesting' => "$testDir/phpunit/includes/db/ORMTableTest.php",
        'DatabaseTestHelper' => "$testDir/phpunit/includes/db/DatabaseTestHelper.php",
 
+       # tests/phpunit/includes/diff
+       'FakeDiffOp' => "$testDir/phpunit/includes/diff/FakeDiffOp.php",
+
        # tests/phpunit/includes/passwords
        'PasswordTestCase' => "$testDir/phpunit/includes/password/PasswordTestCase.php",
 
index f2a720e..f4d1799 100644 (file)
@@ -13,6 +13,7 @@ class MWFunctionTest extends MediaWikiTestCase {
                $args = array( $arg1, $arg2, $arg3, $arg4 );
 
                $newObject = new MWBlankClass( $arg1, $arg2, $arg3, $arg4 );
+               $this->hideDeprecated( 'MWFunction::newObj' );
                $this->assertEquals(
                        MWFunction::newObj( 'MWBlankClass', $args )->args,
                        $newObject->args
index 8ea761f..7fdefb6 100644 (file)
@@ -17,8 +17,6 @@
 
 // @todo Port the other Upload tests, and other API tests to this framework
 
-require_once 'ApiTestCaseUpload.php';
-
 /**
  * @group Database
  * @group Broken
index e486c4f..fa0e4cb 100644 (file)
@@ -23,8 +23,6 @@
  * @file
  */
 
-require_once 'ApiQueryTestBase.php';
-
 /**
  * These tests validate basic functionality of the api query module
  *
index 46f1b7b..2431761 100644 (file)
@@ -18,8 +18,6 @@
  * http://www.gnu.org/copyleft/gpl.html
  */
 
-require_once 'ApiQueryContinueTestBase.php';
-
 /**
  * @group API
  * @group Database
index 56130f1..de9965b 100644 (file)
@@ -18,8 +18,6 @@
  * http://www.gnu.org/copyleft/gpl.html
  */
 
-require_once 'ApiQueryContinueTestBase.php';
-
 /**
  * These tests validate the new continue functionality of the api query module by
  * doing multiple requests with varying parameters, merging the results, and checking
index a5f2684..ce2f70d 100644 (file)
@@ -21,9 +21,6 @@
  *
  * @file
  */
-
-require_once 'ApiQueryTestBase.php';
-
 abstract class ApiQueryContinueTestBase extends ApiQueryTestBase {
 
        /**
index ca31cf9..a5c19f9 100644 (file)
  * that hold the first tests in a pending state awaiting access to the database.
  * @group medium
  *
+ * @covers TestORMRow
  * @licence GNU GPL v2+
  * @author Jeroen De Dauw < jeroendedauw@gmail.com >
  */
-require_once __DIR__ . "/ORMRowTest.php";
-
-/**
- * @covers TestORMRow
- */
 class TestORMRowTest extends ORMRowTest {
 
        /**
index d89b89f..a685bf4 100644 (file)
@@ -1,8 +1,4 @@
 <?php
-
-//Load our FakeDiffOp
-require_once __DIR__ . DIRECTORY_SEPARATOR . 'FakeDiffOp.php';
-
 /**
  * @licence GNU GPL v2+
  * @author Adam Shorland
index 003efd2..500b7e4 100644 (file)
@@ -5,23 +5,8 @@
  */
 class BadTitleErrorTest extends MediaWikiTestCase {
 
-       protected $wgOut;
-
-       protected function setUp() {
-               parent::setUp();
-               global $wgOut;
-               $this->wgOut = clone $wgOut;
-       }
-
-       protected function tearDown() {
-               parent::tearDown();
-               global $wgOut;
-               $wgOut = $this->wgOut;
-       }
-
        public function testExceptionSetsStatusCode() {
-               global $wgOut;
-               $wgOut = $this->getMockWgOut();
+               $this->setMwGlobals( 'wgOut', $this->getMockWgOut() );
                try {
                        throw new BadTitleError();
                } catch ( BadTitleError $e ) {
index 13dcf33..9c4e4a0 100644 (file)
@@ -6,20 +6,6 @@
  */
 class ErrorPageErrorTest extends MediaWikiTestCase {
 
-       private $wgOut;
-
-       protected function setUp() {
-               parent::setUp();
-               global $wgOut;
-               $this->wgOut = clone $wgOut;
-       }
-
-       protected function tearDown() {
-               global $wgOut;
-               $wgOut = $this->wgOut;
-               parent::tearDown();
-       }
-
        private function getMockMessage() {
                $mockMessage = $this->getMockBuilder( 'Message' )
                        ->disableOriginalConstructor()
@@ -48,20 +34,18 @@ class ErrorPageErrorTest extends MediaWikiTestCase {
                $title = 'Foo';
                $params = array( 'Baz' );
 
-               global $wgOut;
-               $wgOut = $this->getMockBuilder( 'OutputPage' )
+               $mock = $this->getMockBuilder( 'OutputPage' )
                        ->disableOriginalConstructor()
                        ->getMock();
-               $wgOut->expects( $this->once() )
+               $mock->expects( $this->once() )
                        ->method( 'showErrorPage' )
                        ->with( $title, $mockMessage, $params );
-               $wgOut->expects( $this->once() )
+               $mock->expects( $this->once() )
                        ->method( 'output' );
+               $this->setMwGlobals( 'wgOut', $mock );
 
                $e = new ErrorPageError( $title, $mockMessage, $params );
                $e->report();
        }
 
-
-
 }
index bdb143f..a1cf84b 100644 (file)
@@ -6,23 +6,8 @@
  */
 class ThrottledErrorTest extends MediaWikiTestCase {
 
-       protected $wgOut;
-
-       protected function setUp() {
-               parent::setUp();
-               global $wgOut;
-               $this->wgOut = clone $wgOut;
-       }
-
-       protected function tearDown() {
-               parent::tearDown();
-               global $wgOut;
-               $wgOut = $this->wgOut;
-       }
-
        public function testExceptionSetsStatusCode() {
-               global $wgOut;
-               $wgOut = $this->getMockWgOut();
+               $this->setMwGlobals( 'wgOut', $this->getMockWgOut() );
                try {
                        throw new ThrottledError();
                } catch ( ThrottledError $e ) {
index 7657633..f0ac6ac 100644 (file)
@@ -172,18 +172,20 @@ class FormatJsonTest extends MediaWikiTestCase {
        /**
         * Test data for testParseTryFixing.
         *
-        * HHVM has a lenient json parser (yeah great idea right?) which allows
-        * trailing commas for array and object delarations among other things, so
-        * our JSON_ERROR_SYNTAX rescue block is not always triggered. It however
-        * isn't lenient in exactly the same ways as our TRY_FIXING mode, so the
-        * assertions in this test are a bit more complicated than they ideally
-        * would be:
+        * Some PHP interpreters use json-c rather than the JSON.org cannonical
+        * parser to avoid being encumbered by the "shall be used for Good, not
+        * Evil" clause of the JSON.org parser's license. By default, json-c
+        * parses in a non-strict mode which allows trailing commas for array and
+        * object delarations among other things, so our JSON_ERROR_SYNTAX rescue
+        * block is not always triggered. It however isn't lenient in exactly the
+        * same ways as our TRY_FIXING mode, so the assertions in this test are
+        * a bit more complicated than they ideally would be:
         *
-        * Optional third argument: true if hhvm parses the value without
+        * Optional third argument: true if json-c parses the value without
         * intervention, false otherwise. Defaults to true.
         *
-        * Optional fourth argument: expected cannonical JSON serialization of HHVM
-        * parsed result. Defaults to the second argument's value.
+        * Optional fourth argument: expected cannonical JSON serialization of
+        * json-c parsed result. Defaults to the second argument's value.
         */
        public static function provideParseTryFixing() {
                return array(
@@ -207,23 +209,24 @@ class FormatJsonTest extends MediaWikiTestCase {
        /**
         * @dataProvider provideParseTryFixing
         * @param string $value
-        * @param string|bool $expected Expected result with Zend PHP
-        * @param bool $hhvmParses Will HHVM parse this value without TRY_FIXING?
-        * @param string|bool $expectedHHVM Expected result with HHVM if different
-        * from the PHP5 expectation
+        * @param string|bool $expected Expected result with strict parser
+        * @param bool $jsoncParses Will json-c parse this value without TRY_FIXING?
+        * @param string|bool $expectedJsonc Expected result with lenient parser
+        * if different from the strict expectation
         */
        public function testParseTryFixing(
                $value, $expected,
-               $hhvmParses = true, $expectedHHVM = null
+               $jsoncParses = true, $expectedJsonc = null
        ) {
                // PHP5 results are always expected to have isGood() === false
                $expectedGoodStatus = false;
 
-               if ( wfIsHHVM() ) {
-                       // Use HHVM specific expected result if provided
-                       $expected = ( $expectedHHVM === null ) ? $expected : $expectedHHVM;
-                       // If HHVM parses the value natively, expect isGood() === true
-                       $expectedGoodStatus = $hhvmParses;
+               // Check to see if json parser allows trailing commas
+               if ( json_decode( '[1,]' ) !== null ) {
+                       // Use json-c specific expected result if provided
+                       $expected = ( $expectedJsonc === null ) ? $expected : $expectedJsonc;
+                       // If json-c parses the value natively, expect isGood() === true
+                       $expectedGoodStatus = $jsoncParses;
                }
 
                $st = FormatJson::parse( $value, FormatJson::TRY_FIXING );
diff --git a/tests/phpunit/includes/libs/ObjectFactoryTest.php b/tests/phpunit/includes/libs/ObjectFactoryTest.php
new file mode 100644 (file)
index 0000000..8c2f12c
--- /dev/null
@@ -0,0 +1,61 @@
+<?php
+/**
+ * @section LICENSE
+ * 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
+ */
+
+class ObjectFactoryTest extends PHPUnit_Framework_TestCase {
+
+       /**
+        * @covers ObjectFactory::getObjectFromSpec
+        */
+       public function testClosureExpansionDisabled() {
+               $obj = ObjectFactory::getObjectFromSpec( array(
+                       'class' => 'ObjectFactoryTest_Fixture',
+                       'args' => array( function (){ return 'unwrapped'; }, ),
+                       'closure_expansion' => false,
+               ) );
+               $this->assertInstanceOf( 'Closure', $obj->args[0] );
+               $this->assertSame( 'unwrapped', $obj->args[0]() );
+       }
+
+       /**
+        * @covers ObjectFactory::getObjectFromSpec
+        */
+       public function testClosureExpansionEnabled() {
+               $obj = ObjectFactory::getObjectFromSpec( array(
+                       'class' => 'ObjectFactoryTest_Fixture',
+                       'args' => array( function (){ return 'unwrapped'; }, ),
+                       'closure_expansion' => true,
+               ) );
+               $this->assertInternalType( 'string', $obj->args[0] );
+               $this->assertSame( 'unwrapped', $obj->args[0] );
+
+               $obj = ObjectFactory::getObjectFromSpec( array(
+                       'class' => 'ObjectFactoryTest_Fixture',
+                       'args' => array( function (){ return 'unwrapped'; }, ),
+               ) );
+               $this->assertInternalType( 'string', $obj->args[0] );
+               $this->assertSame( 'unwrapped', $obj->args[0] );
+       }
+}
+
+class ObjectFactoryTest_Fixture {
+       public $args;
+       public function __construct( /*...*/ ) { $this->args = func_get_args(); }
+}
diff --git a/tests/phpunit/includes/libs/XhprofTest.php b/tests/phpunit/includes/libs/XhprofTest.php
new file mode 100644 (file)
index 0000000..cc81aba
--- /dev/null
@@ -0,0 +1,321 @@
+<?php
+/**
+ * @section LICENSE
+ * 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
+ */
+
+/**
+ * @uses Xhprof
+ * @uses AutoLoader
+ * @author Bryan Davis <bd808@wikimedia.org>
+ * @copyright © 2014 Bryan Davis and Wikimedia Foundation.
+ * @since 1.25
+ */
+class XhprofTest extends PHPUnit_Framework_TestCase {
+
+       public function setUp() {
+               if ( !function_exists( 'xhprof_enable' ) ) {
+                       $this->markTestSkipped( 'No xhprof support detected.' );
+               }
+       }
+
+       /**
+        * @covers Xhprof::splitKey
+        * @dataProvider provideSplitKey
+        */
+       public function testSplitKey( $key, $expect ) {
+               $this->assertSame( $expect, Xhprof::splitKey( $key ) );
+       }
+
+       public function provideSplitKey() {
+               return array(
+                       array( 'main()', array( null, 'main()' ) ),
+                       array( 'foo==>bar', array( 'foo', 'bar' ) ),
+                       array( 'bar@1==>bar@2', array( 'bar@1', 'bar@2' ) ),
+                       array( 'foo==>bar==>baz', array( 'foo', 'bar==>baz' ) ),
+                       array( '==>bar', array( '', 'bar' ) ),
+                       array( '', array( null, '' ) ),
+               );
+       }
+
+       /**
+        * @covers Xhprof::__construct
+        * @covers Xhprof::stop
+        * @covers Xhprof::getRawData
+        * @dataProvider provideRawData
+        */
+       public function testRawData( $flags, $keys ) {
+               $xhprof = new Xhprof( array( 'flags' => $flags ) );
+               $raw = $xhprof->getRawData();
+               $this->assertArrayHasKey( 'main()', $raw );
+               foreach ( $keys as $key ) {
+                       $this->assertArrayHasKey( $key, $raw['main()'] );
+               }
+       }
+
+       public function provideRawData() {
+               $tests = array(
+                       array( 0, array( 'ct', 'wt' ) ),
+               );
+
+               if ( defined( 'XHPROF_FLAGS_CPU' ) && defined( 'XHPROF_FLAGS_CPU' ) ) {
+                       $tests[] = array( XHPROF_FLAGS_MEMORY, array(
+                               'ct', 'wt', 'mu', 'pmu',
+                       ) );
+                       $tests[] = array( XHPROF_FLAGS_CPU, array(
+                               'ct', 'wt', 'cpu',
+                       ) );
+                       $tests[] = array( XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_CPU, array(
+                                       'ct', 'wt', 'mu', 'pmu', 'cpu',
+                               ) );
+               }
+
+               return $tests;
+       }
+
+       /**
+        * @covers Xhprof::pruneData
+        */
+       public function testInclude() {
+               $xhprof = $this->getXhprofFixture( array(
+                       'include' => array( 'main()' ),
+               ) );
+               $raw = $xhprof->getRawData();
+               $this->assertArrayHasKey( 'main()', $raw );
+               $this->assertArrayHasKey( 'main()==>foo', $raw );
+               $this->assertArrayHasKey( 'main()==>xhprof_disable', $raw );
+               $this->assertSame( 3, count( $raw ) );
+       }
+
+       /**
+        * Validate the structure of data returned by
+        * Xhprof::getInclusiveMetrics(). This acts as a guard against unexpected
+        * structural changes to the returned data in lieu of using a more heavy
+        * weight typed response object.
+        *
+        * @covers Xhprof::getInclusiveMetrics
+        */
+       public function testInclusiveMetricsStructure() {
+               $metricStruct = array(
+                       'ct' => 'int',
+                       'wt' => 'array',
+                       'cpu' => 'array',
+                       'mu' => 'array',
+                       'pmu' => 'array',
+               );
+               $statStruct = array(
+                       'total' => 'numeric',
+                       'min' => 'numeric',
+                       'mean' => 'numeric',
+                       'max' => 'numeric',
+                       'variance' => 'numeric',
+                       'percent' => 'numeric',
+               );
+
+               $xhprof = $this->getXhprofFixture();
+               $metrics = $xhprof->getInclusiveMetrics();
+
+               foreach ( $metrics as $name => $metric ) {
+                       $this->assertArrayStructure( $metricStruct, $metric );
+
+                       foreach ( $metricStruct as $key => $type ) {
+                               if ( $type === 'array' ) {
+                                       $this->assertArrayStructure( $statStruct, $metric[$key] );
+                                       if ( $name === 'main()' ) {
+                                               $this->assertEquals( 100, $metric[$key]['percent'] );
+                                       }
+                               }
+                       }
+               }
+       }
+
+       /**
+        * Validate the structure of data returned by
+        * Xhprof::getCompleteMetrics(). This acts as a guard against unexpected
+        * structural changes to the returned data in lieu of using a more heavy
+        * weight typed response object.
+        *
+        * @covers Xhprof::getCompleteMetrics
+        */
+       public function testCompleteMetricsStructure() {
+               $metricStruct = array(
+                       'ct' => 'int',
+                       'wt' => 'array',
+                       'cpu' => 'array',
+                       'mu' => 'array',
+                       'pmu' => 'array',
+                       'calls' => 'array',
+                       'subcalls' => 'array',
+               );
+               $statsMetrics = array( 'wt', 'cpu', 'mu', 'pmu' );
+               $statStruct = array(
+                       'total' => 'numeric',
+                       'min' => 'numeric',
+                       'mean' => 'numeric',
+                       'max' => 'numeric',
+                       'variance' => 'numeric',
+                       'percent' => 'numeric',
+                       'exclusive' => 'numeric',
+               );
+
+               $xhprof = $this->getXhprofFixture();
+               $metrics = $xhprof->getCompleteMetrics();
+
+               foreach ( $metrics as $name => $metric ) {
+                       $this->assertArrayStructure( $metricStruct, $metric, $name );
+
+                       foreach ( $metricStruct as $key => $type ) {
+                               if ( in_array( $key, $statsMetrics ) ) {
+                                       $this->assertArrayStructure(
+                                               $statStruct, $metric[$key], $key
+                                       );
+                                       $this->assertLessThanOrEqual(
+                                               $metric[$key]['total'], $metric[$key]['exclusive']
+                                       );
+                               }
+                       }
+               }
+       }
+
+       /**
+        * @covers Xhprof::getCallers
+        * @covers Xhprof::getCallees
+        * @uses Xhprof
+        */
+       public function testEdges() {
+               $xhprof = $this->getXhprofFixture();
+               $this->assertSame( array(), $xhprof->getCallers( 'main()' ) );
+               $this->assertSame( array( 'foo', 'xhprof_disable' ),
+                       $xhprof->getCallees( 'main()' )
+               );
+               $this->assertSame( array( 'main()' ),
+                       $xhprof->getCallers( 'foo' )
+               );
+               $this->assertSame( array(), $xhprof->getCallees( 'strlen' ) );
+       }
+
+       /**
+        * @covers Xhprof::getCriticalPath
+        * @uses Xhprof
+        */
+       public function testCriticalPath() {
+               $xhprof = $this->getXhprofFixture();
+               $path = $xhprof->getCriticalPath();
+
+               $last = null;
+               foreach ( $path as $key => $value ) {
+                       list( $func, $call ) = Xhprof::splitKey( $key );
+                       $this->assertSame( $last, $func );
+                       $last = $call;
+               }
+               $this->assertSame( $last, 'bar@1' );
+       }
+
+       /**
+        * Get an Xhprof instance that has been primed with a set of known testing
+        * data. Tests for the Xhprof class should laregly be concerned with
+        * evaluating the manipulations of the data collected by xhprof rather
+        * than the data collection process itself.
+        *
+        * The returned Xhprof instance primed will be with a data set created by
+        * running this trivial program using the PECL xhprof implementation:
+        * @code
+        * function bar( $x ) {
+        *   if ( $x > 0 ) {
+        *     bar($x - 1);
+        *   }
+        * }
+        * function foo() {
+        *   for ( $idx = 0; $idx < 2; $idx++ ) {
+        *     bar( $idx );
+        *     $x = strlen( 'abc' );
+        *   }
+        * }
+        * xhprof_enable( XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY );
+        * foo();
+        * $x = xhprof_disable();
+        * var_export( $x );
+        * @endcode
+        *
+        * @return Xhprof
+        */
+       protected function getXhprofFixture( array $opts = array() ) {
+               $xhprof = new Xhprof( $opts );
+               $xhprof->loadRawData( array (
+                       'foo==>bar' => array (
+                               'ct' => 2,
+                               'wt' => 57,
+                               'cpu' => 92,
+                               'mu' => 1896,
+                               'pmu' => 0,
+                       ),
+                       'foo==>strlen' => array (
+                               'ct' => 2,
+                               'wt' => 21,
+                               'cpu' => 141,
+                               'mu' => 752,
+                               'pmu' => 0,
+                       ),
+                       'bar==>bar@1' => array (
+                               'ct' => 1,
+                               'wt' => 18,
+                               'cpu' => 19,
+                               'mu' => 752,
+                               'pmu' => 0,
+                       ),
+                       'main()==>foo' => array (
+                               'ct' => 1,
+                               'wt' => 304,
+                               'cpu' => 307,
+                               'mu' => 4008,
+                               'pmu' => 0,
+                       ),
+                       'main()==>xhprof_disable' => array (
+                               'ct' => 1,
+                               'wt' => 8,
+                               'cpu' => 10,
+                               'mu' => 768,
+                               'pmu' => 392,
+                       ),
+                       'main()' => array (
+                               'ct' => 1,
+                               'wt' => 353,
+                               'cpu' => 351,
+                               'mu' => 6112,
+                               'pmu' => 1424,
+                       ),
+               ) );
+               return $xhprof;
+       }
+
+       /**
+        * Assert that the given array has the described structure.
+        *
+        * @param array $struct Array of key => type mappings
+        * @param array $actual Array to check
+        * @param string $label
+        */
+       protected function assertArrayStructure( $struct, $actual, $label = null ) {
+               $this->assertInternalType( 'array', $actual, $label );
+               $this->assertCount( count($struct), $actual, $label );
+               foreach ( $struct as $key => $type ) {
+                       $this->assertArrayHasKey( $key, $actual );
+                       $this->assertInternalType( $type, $actual[$key] );
+               }
+       }
+}
diff --git a/tests/phpunit/includes/libs/cdb/CdbTest.php b/tests/phpunit/includes/libs/cdb/CdbTest.php
new file mode 100644 (file)
index 0000000..487ee1f
--- /dev/null
@@ -0,0 +1,90 @@
+<?php
+
+/**
+ * Test the CDB reader/writer
+ * @covers CdbWriterPHP
+ * @covers CdbWriterDBA
+ */
+class CdbTest extends MediaWikiTestCase {
+
+       protected function setUp() {
+               parent::setUp();
+               if ( !CdbReader::haveExtension() ) {
+                       $this->markTestSkipped( 'Native CDB support is not available' );
+               }
+       }
+
+       /**
+        * @group medium
+        */
+       public function testCdb() {
+               $dir = wfTempDir();
+               if ( !is_writable( $dir ) ) {
+                       $this->markTestSkipped( "Temp dir isn't writable" );
+               }
+
+               $phpcdbfile = $this->getNewTempFile();
+               $dbacdbfile = $this->getNewTempFile();
+
+               $w1 = new CdbWriterPHP( $phpcdbfile );
+               $w2 = new CdbWriterDBA( $dbacdbfile );
+
+               $data = array();
+               for ( $i = 0; $i < 1000; $i++ ) {
+                       $key = $this->randomString();
+                       $value = $this->randomString();
+                       $w1->set( $key, $value );
+                       $w2->set( $key, $value );
+
+                       if ( !isset( $data[$key] ) ) {
+                               $data[$key] = $value;
+                       }
+               }
+
+               $w1->close();
+               $w2->close();
+
+               $this->assertEquals(
+                       md5_file( $phpcdbfile ),
+                       md5_file( $dbacdbfile ),
+                       'same hash'
+               );
+
+               $r1 = new CdbReaderPHP( $phpcdbfile );
+               $r2 = new CdbReaderDBA( $dbacdbfile );
+
+               foreach ( $data as $key => $value ) {
+                       if ( $key === '' ) {
+                               // Known bug
+                               continue;
+                       }
+                       $v1 = $r1->get( $key );
+                       $v2 = $r2->get( $key );
+
+                       $v1 = $v1 === false ? '(not found)' : $v1;
+                       $v2 = $v2 === false ? '(not found)' : $v2;
+
+                       # cdbAssert( 'Mismatch', $key, $v1, $v2 );
+                       $this->cdbAssert( "PHP error", $key, $v1, $value );
+                       $this->cdbAssert( "DBA error", $key, $v2, $value );
+               }
+       }
+
+       private function randomString() {
+               $len = mt_rand( 0, 10 );
+               $s = '';
+               for ( $j = 0; $j < $len; $j++ ) {
+                       $s .= chr( mt_rand( 0, 255 ) );
+               }
+
+               return $s;
+       }
+
+       private function cdbAssert( $msg, $key, $v1, $v2 ) {
+               $this->assertEquals(
+                       $v2,
+                       $v1,
+                       $msg . ', k=' . bin2hex( $key )
+               );
+       }
+}
diff --git a/tests/phpunit/includes/utils/CdbTest.php b/tests/phpunit/includes/utils/CdbTest.php
deleted file mode 100644 (file)
index 487ee1f..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-<?php
-
-/**
- * Test the CDB reader/writer
- * @covers CdbWriterPHP
- * @covers CdbWriterDBA
- */
-class CdbTest extends MediaWikiTestCase {
-
-       protected function setUp() {
-               parent::setUp();
-               if ( !CdbReader::haveExtension() ) {
-                       $this->markTestSkipped( 'Native CDB support is not available' );
-               }
-       }
-
-       /**
-        * @group medium
-        */
-       public function testCdb() {
-               $dir = wfTempDir();
-               if ( !is_writable( $dir ) ) {
-                       $this->markTestSkipped( "Temp dir isn't writable" );
-               }
-
-               $phpcdbfile = $this->getNewTempFile();
-               $dbacdbfile = $this->getNewTempFile();
-
-               $w1 = new CdbWriterPHP( $phpcdbfile );
-               $w2 = new CdbWriterDBA( $dbacdbfile );
-
-               $data = array();
-               for ( $i = 0; $i < 1000; $i++ ) {
-                       $key = $this->randomString();
-                       $value = $this->randomString();
-                       $w1->set( $key, $value );
-                       $w2->set( $key, $value );
-
-                       if ( !isset( $data[$key] ) ) {
-                               $data[$key] = $value;
-                       }
-               }
-
-               $w1->close();
-               $w2->close();
-
-               $this->assertEquals(
-                       md5_file( $phpcdbfile ),
-                       md5_file( $dbacdbfile ),
-                       'same hash'
-               );
-
-               $r1 = new CdbReaderPHP( $phpcdbfile );
-               $r2 = new CdbReaderDBA( $dbacdbfile );
-
-               foreach ( $data as $key => $value ) {
-                       if ( $key === '' ) {
-                               // Known bug
-                               continue;
-                       }
-                       $v1 = $r1->get( $key );
-                       $v2 = $r2->get( $key );
-
-                       $v1 = $v1 === false ? '(not found)' : $v1;
-                       $v2 = $v2 === false ? '(not found)' : $v2;
-
-                       # cdbAssert( 'Mismatch', $key, $v1, $v2 );
-                       $this->cdbAssert( "PHP error", $key, $v1, $value );
-                       $this->cdbAssert( "DBA error", $key, $v2, $value );
-               }
-       }
-
-       private function randomString() {
-               $len = mt_rand( 0, 10 );
-               $s = '';
-               for ( $j = 0; $j < $len; $j++ ) {
-                       $s .= chr( mt_rand( 0, 255 ) );
-               }
-
-               return $s;
-       }
-
-       private function cdbAssert( $msg, $key, $v1, $v2 ) {
-               $this->assertEquals(
-                       $v2,
-                       $v1,
-                       $msg . ', k=' . bin2hex( $key )
-               );
-       }
-}